2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 18:57 
Аватара пользователя


22/09/09

1907
warlock66613 в сообщении #928283 писал(а):
Да, хорошее восприятие блока var очень важно - ведь именно там скрыта логика программы.
Да, по формуле Вирта: "Алгоритмы + структуры данных = программы" ;-) Разделы type и var не менее важны для понимания нетривиальной программы, чем раздел begin. Если говорить об ООП, то это прежде всего иерархия классов, а отдельные реализации свойств и методов м.б. простыми и не особо интересными для понимания программы в целом. В многопоточном программировании прежде всего интересуют общие блоки памяти, мьютексы и семафоры.
warlock66613 в сообщении #928283 писал(а):
Объявление переменной в C++ не занимает отдельной строки.
Используется синтаксис C
int n; // число вершин исходного графа
int nn; // число вершин преобразованного графа
int m; // число ребер исходного графа
int mm;  // число ребер преобразованного графа
int w;  // индекс Винера исходного графа
int ww;  // индекс Винера преобразованного графа - используется только для отладки
int h; // индекс Хосойя исходного графа
int hh; // индекс Хосойя преобразованного графа - используется только для отладки
8 строчек на 8 переменных ;-)
warlock66613 в сообщении #928283 писал(а):
вложенные функции паскаля - дурацкое излишество
Еще Вирт показал, что они очень удобны, нпр., для написания компиляторов. Благодаря им очень удобно прослеживать сложную рекурсию. А вот генерированный яками парсер без излишеств обычно является лишь вспомогательным и до релиза не доходит.
Xaositect в сообщении #928277 писал(а):
Блок - это не только процедура. Цикл, например, часто быввает тоже обособленным блоком
Отлично. С циклами в С/С++ все в порядке - они могут быть вложенными, почему же процедурные блоки обидели? ;-)

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 19:02 
Аватара пользователя


31/10/08
1244
getnextchar в случае конца строки возвращает (short int)(-1), а не "\0" как думаю многие.
Результат getnextchar (short int) , а не char. Именно для этого. Что семантически вопиющее нарушение, но именно так можно отличить ANSI символ с кодом "\0" от конца строки.

Что касается вложенных процедур. То это не плюс и не минус.
А вот отсутствие namespace в паскале это большой минус.
Вообще как я вижу модули должны иметь зоны видимости как в паскале или объектном паскале. А также должны быть namespace.
Тогда вложенные процедуры будут ненужны.

А вот отсутствие модульной структуры вызывает долгую компиляцию. Это всего лишь гипотеза. Вопрос в количественной оценке насколько долго? Насколько мне известно публикаций на эту тему не было. Этот вопрос попросту не изучен должным образом.

А вот с объявлением переменной в цикле это вопрос интересный.
Аргумент то, что в Си это безопаснее думаю не является плюсом.
Кто не знает, что после цикла использовать переменную нельзя тот и в Си ошибется и в паскале. Кто знает уже не должен. Во-вторых есть понятия самодоккументированного кода. Поэтому если в функции есть несколько циклов, то лучше их вынести в отдельные процедуры.
Тем самым ошибки с повторным использованием переменной исключается.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 19:10 
Заслуженный участник
Аватара пользователя


06/10/08
6422
bin в сообщении #928332 писал(а):
warlock66613 в сообщении #928283 писал(а):
Да, хорошее восприятие блока var очень важно - ведь именно там скрыта логика программы.
Да, по формуле Вирта: "Алгоритмы + структуры данных = программы" ;-) Разделы type и var не менее важны для понимания нетривиальной программы, чем раздел begin. Если говорить об ООП, то это прежде всего иерархия классов, а отдельные реализации свойств и методов м.б. простыми и не особо интересными для понимания программы в целом. В многопоточном программировании прежде всего интересуют общие блоки памяти, мьютексы и семафоры.
warlock66613 в сообщении #928283 писал(а):
Объявление переменной в C++ не занимает отдельной строки.
Используется синтаксис C
int n; // число вершин исходного графа
int nn; // число вершин преобразованного графа
int m; // число ребер исходного графа
int mm;  // число ребер преобразованного графа
int w;  // индекс Винера исходного графа
int ww;  // индекс Винера преобразованного графа - используется только для отладки
int h; // индекс Хосойя исходного графа
int hh; // индекс Хосойя преобразованного графа - используется только для отладки
8 строчек на 8 переменных ;-)
Интересно, почему же Вы не используете мудрость Вирта о структурах данных и не делаете, например, так:
Используется синтаксис C
struct GraphInfo
{
  int numVertices;
  int numEdges;
  int wienerIndex;
  int hosoyaIndex;
};

struct GraphInfo source, transformed;
 


-- Сб ноя 08, 2014 19:12:36 --

Pavia в сообщении #928337 писал(а):
getnextchar в случае конца строки возвращает (short int)(-1), а не "\0" как думаю многие.
Результат getnextchar (short int) , а не char. Именно для этого. Что семантически вопиющее нарушение, но именно так можно отличить ANSI символ с кодом "\0" от конца строки.
Это вы про стандартную getchar, а не про какую-то гипотетическую функцию nextgetchar из примера

-- Сб ноя 08, 2014 19:14:18 --

Pavia в сообщении #928337 писал(а):
Аргумент то, что в Си это безопаснее думаю не является плюсом.
Кто не знает, что после цикла использовать переменную нельзя тот и в Си ошибется и в паскале. Кто знает уже не должен
Это как раз самый распространенный вид ошибок - по невнимательности. В С++ если переменная объявлена в цикле, то вне цикла она просто не видна, так что использовать ее запретит компилятор.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 19:33 
Заслуженный участник


02/08/11
7003
bin в сообщении #928332 писал(а):
8 строчек на 8 переменных
Да, это хороший пример того, как не надо делать.

-- 08.11.2014, 20:34 --

bin в сообщении #928332 писал(а):
Разделы type и var не менее важны для понимания нетривиальной программы, чем раздел begin.
Вот type - это и есть структуры данных, но никак не var.

-- 08.11.2014, 20:36 --

bin в сообщении #928332 писал(а):
В многопоточном программировании прежде всего интересуют общие блоки памяти, мьютексы и семафоры.
Общие блоки памяти, мьютексы и семафоры в локальных переменных? Да, если кодер неопытен в ООП и многопоточном программировании, то такое бывает.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 19:47 
Заслуженный участник


15/05/05
3445
USA
warlock66613 в сообщении #928358 писал(а):
bin в сообщении #928332 писал(а):
8 строчек на 8 переменных
Да, это хороший пример того, как не надо делать.
Точнее, как не надо выбирать имена переменных.
А комментарии - вполне нормальные. Через полгода и сам автор может забыть назначение переменных.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 19:50 
Заслуженный участник


02/08/11
7003
Yuri Gendelman в сообщении #928366 писал(а):
Через полгода и сам автор может забыть назначение переменных.
Не забудет, если сделает так, как продемонстрировал Xaositect.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 21:03 
Аватара пользователя


22/09/09

1907
Xaositect в сообщении #928344 писал(а):
Интересно, почему же Вы не используете мудрость Вирта о структурах данных
На практике я бы так м.б. и сделал, но получилось бы еще больше строчек, поэтому для примера написал так, как написал ;-) Пришлось бы, нпр., давать отдельный коммент, что "индекс Винера преобразованного графа - используется только для отладки". Когда однотипных переменных раз-два- и обчелся, то структуры (на Паскале - записи) не очень помогают. Вот, нпр., в случае бинарного дерева без них не обойтись.
Yuri Gendelman в сообщении #928366 писал(а):
Точнее, как не надо выбирать имена переменных.
А комментарии - вполне нормальные. Через полгода и сам автор может забыть назначение переменных.
Про имена вопрос особый. Если разрабатываешь новый алгоритм и собираешься публиковать его в научном журнале, то в мат. формулах $\sum\limits _{i=1}^n... выглядит привычнее, чем $\sum\limits _{i=1}^{numVertices}... . Поэтому для нужных в формулах публикации переменных по возможности выбираю однобуквенные имена.

-- Сб ноя 08, 2014 21:09:49 --

warlock66613 в сообщении #928358 писал(а):
Вот type - это и есть структуры данных, но никак не var.
Могу записать и так:
Используется синтаксис Pascal
var A : array [1..maxN,1..maxN] of Boolean;
warlock66613 в сообщении #928358 писал(а):
Общие блоки памяти, мьютексы и семафоры в локальных переменных
А где я сказал, что в локальных?

-- Сб ноя 08, 2014 21:38:32 --

Pavia в сообщении #928337 писал(а):
Кто не знает, что после цикла использовать переменную нельзя тот и в Си ошибется и в паскале.
Интересно, почему "Си", но "паскале" с маленькой буквы? В паскале не надо разбираться, надо разбираться в ПАСКАЛЕ ;-) По сути: ее можно понимать по-разному. Нпр:

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
const
 maxN = 12012; // буду работать с небольшими графами
var
  A,B: array [1..maxN,1..maxN] of Boolean; // матрицы смежности
  D : array [1..maxN] of integer;
  i,j : integer;
begin
// тут пропущен код заполнения матрицы А размера nxn
  for i:=1 to n do
    D[i] := 0; // обнуляю вектор
  writeln (i); // этой строчки писать не надо!
  for i:=1 to n do // повторно использую i? Не буду я десять разных переменных заказывать для всех
                          // невложенных циклов
    for j:=1 to n do
     if A[i,j] then inc (D[i]); // вычисляю степени вершин графа
   for i:=1 to n do
    for j:=1 to n do
     B[i,j]:= not A[i,j]; // вычисляю дополнительный граф
 // делаю что-то еще    
end;  //  вот и финиш! Ура !!!

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 22:41 
Заслуженный участник
Аватара пользователя


06/10/08
6422
bin в сообщении #928414 писал(а):
Когда однотипных переменных раз-два- и обчелся, то структуры (на Паскале - записи) не очень помогают.
Это, на мой взгляд, заблуждение. Структуры данных - это не только какие-нибудь списки и деревья. Типы-произведения (ака структуры в си, ака записи в паскале) - это простейшие структуры данных, которые служат для того, чтобы объединить в программе данные, логически связанные в предметной области, и использовать их надо сразу, как только появляются две пары переменных, связанных с однотипными объектами. Или пара-тройка переменных, связанных с каким-то объектом, и передающихся во все функции вместе.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 23:39 
Заслуженный участник


27/04/09
28128
bin в сообщении #928332 писал(а):
Еще Вирт показал, что они очень удобны, нпр., для написания компиляторов. Благодаря им очень удобно прослеживать сложную рекурсию. А вот генерированный яками парсер без излишеств обычно является лишь вспомогательным и до релиза не доходит.
В текущие времена парсеру вполне позволительно состоять из отдельно таблиц разбора и прочих данных и отдельно engine, который их использует и не пишется разработчиком компилятора. Так менять грамматику языка проще. И никакие вложенные функции к этому совершенно не относятся.

bin в сообщении #928332 писал(а):
Отлично. С циклами в С/С++ все в порядке - они могут быть вложенными, почему же процедурные блоки обидели? ;-)
Очевидно, семантика разная. Цикл — это исполняемый оператор, а процедура — это объявление. И даже код анонимной функции, где он есть, — это выражение.

bin в сообщении #928414 писал(а):
Про имена вопрос особый. Если разрабатываешь новый алгоритм и собираешься публиковать его в научном журнале, то в мат. формулах $\sum\limits _{i=1}^n...$ выглядит привычнее, чем $\sum\limits _{i=1}^{numVertices}...$ . Поэтому для нужных в формулах публикации переменных по возможности выбираю однобуквенные имена.
Во-первых, кто вас заставляет использовать в формулах и коде одинаковые имена?

Во-вторых, действительно, $\sum\limits_{i=1}^{\mathrm{numVertices}}$ будет выглядеть лучше. А ещё лучше будет выглядеть $\sum\limits_{v\in V}$. Индексы должны быть обоснованны.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение09.11.2014, 00:03 
Аватара пользователя


22/09/09

1907
Xaositect в сообщении #928476 писал(а):
Это, на мой взгляд, заблуждение.
Если я правильно понял, Вы говорите не только про ООП, но и про обычные записи Паскаля. В теории я с Вами согласен. На практике в процессе работы наведение красот может быть преждевременным. Так, с примером, который я привел выше, дело может обстоять следующим образом:

- имеются отдельные программки для вычисления индексов Хосойя и Винера с процедурами и функциями:
Используется синтаксис Delphi
procedure readGraph (adjList : string; var adjMat : TAdjMatrix; var n : integer);
// по списку смежности  adjList строит nxn матрицу смежности adjMat

function hos (graph : TAdjMatrix; vNum : integer) : integer;
// возвращает индекс Хосойя

function win (A : TAdjMatrix; vn : integer) : integer;
// возвращает индекс Винера
 

- нужно их объединить, чтобы проверить некую теорию. Конечно же, если теория окажется верной, в релизе должно быть:

Используется синтаксис Delphi
type

TGraph = record
                adjMatrix :     TAdjMatrix;
                vertexNum,
                hosIndex,
                winIndex  : integer;
          end;

procedure readGraph (adjList : string; var graph : TGraph);
function hos (graph : TGraph) : integer;
function win (graph : TGraph) : integer;


Поменять имена - рутина, но если идея окажется неверной, это будут лишние трудозатраты. А рабочее время надо беречь! ;-)

arseniiv в сообщении #928513 писал(а):
В текущие времена парсеру вполне позволительно состоять из отдельно таблиц разбора и прочих данных и отдельно engine, который их использует и не пишется разработчиком компилятора. Так менять грамматику языка проще.
Приведите, пожалуйста, пример неигрушечного компилятора, сделанного невручную.
arseniiv в сообщении #928513 писал(а):
Очевидно, семантика разная. Цикл — это исполняемый оператор, а процедура — это объявление.
Не вижу разницы в контексте данного обсуждения.
arseniiv в сообщении #928513 писал(а):
Во-первых, кто вас заставляет использовать в формулах и коде одинаковые имена?
Редакторы журналов, которые неохотно тратят лишнее место на таблицы соответствий обозначений статьи и имен программы. А как читатель сам вижу, что они правы, когда в статье и в программе разные имена, читать труднее. А уж использовать в формулах длинные обозначения, вроде numVertices, это запредельно. Если даже в формуле всего десять имен. Много ли подобных примеров можно найти?

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение09.11.2014, 00:13 
Заслуженный участник
Аватара пользователя


06/10/08
6422
bin в сообщении #928533 писал(а):
Если я правильно понял, Вы говорите не только про ООП, но и про обычные записи Паскаля. В теории я с Вами согласен. На практике в процессе работы наведение красот может быть преждевременным.
Не знаю, я как раз на практике сначала пишу типы и интерфейсы, а потом уже сами функции. Потому что если мы работаем с графами, то ясно, что у нас будет тип "граф". И если вдруг в процессе экспериментов нам надо будет предвычислить, например, список степеней вершин, то я при своем подходе просто добавлю поле в тип "граф", а Вам придется менять интерфейс всех функций, в которых этот список надо будет использовать.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение09.11.2014, 00:21 
Заслуженный участник


27/04/09
28128
bin в сообщении #928533 писал(а):
Приведите, пожалуйста, пример неигрушечного компилятора, сделанного невручную.
А что такое «неигрушечный компилятор»?

bin в сообщении #928533 писал(а):
Не вижу разницы в контексте данного обсуждения.
В данном случае контекст обсуждения никак не влияет на разницу. Цикл выполняется ясно как, а «выполнению» определения функции (которое в языке типа C++ всё равно не нужно) можно придать только смысл присваивания имени функции замыкания, образованного из тела функции. Тело функции всё равно не будет выполняться так же как цикл. Вложенные функции à la Pascal потому не аналогичны вложенным циклам, и выразимы через не вложенные. А уровень доступа можно отрегулировать пространствами имён или структурами/классами.

bin в сообщении #928533 писал(а):
Редакторы журналов, которые неохотно тратят лишнее место на таблицы соответствий обозначений статьи и имен программы.
Сами понимаете качество этого аргумента.

bin в сообщении #928533 писал(а):
Если даже в формуле всего десять имен.
Если в формуле «всего десять» имён, и имена не общераспространённые, а определялись выше в статье, то совершенно неочевидно, будут понятнее в такой формуле читателю более длинные или короткие имена.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение09.11.2014, 01:59 
Аватара пользователя


22/09/09

1907
Xaositect в сообщении #928543 писал(а):
Не знаю, я как раз на практике сначала пишу типы и интерфейсы, а потом уже сами функции.
А если эти функции от Ваших сослуживцев, из сети, из литературы, из тех, что десять лет назад Вы сами написали - везде разные имена, и стоит ли сразу их причесывать под одну гребенку, может ведь и не оправдаться? ;-)
arseniiv в сообщении #928546 писал(а):
А что такое «неигрушечный компилятор»?
Коммерческий, успешный, широко используемый для коммерческих и успешных задач, пользующихся широким спросом. (Пример: упомянутый CUDA C)
arseniiv в сообщении #928546 писал(а):
Цикл выполняется ясно как
И функция выполняется ясно как.
arseniiv в сообщении #928546 писал(а):
Сами понимаете качество этого аргумента.
Да, это реальность, а не абстрактные рассуждения, как бы могло быть, если бы все журналы работали, как нам хочется. (Если бы такое произошло, то мы бы первые стали катить все бочки на такие журналы ;-)
arseniiv в сообщении #928546 писал(а):
Если в формуле «всего десять» имён, и имена не общераспространённые, а определялись выше в статье, то совершенно неочевидно, будут понятнее в такой формуле читателю более длинные или короткие имена.
Станет очевидно, когда попробуете записать подобную формулу в TeX ;-)

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение09.11.2014, 09:48 
Аватара пользователя


31/10/08
1244
По поводу длинной переменной "vertexNum".
Если читали Макконела то vertexNum - не есть правильное имя. Должно быть просто Count, но для более красивого оформления потребуется ООП, так что нет ничего страшного. В данном имени, тем более:
Есть понятие внешнее представление и внутреннее. Так вот внутреннее должно быть удобным.А в данном случае это внешнее представление.
Поэтому изменение имени переменной это нормально.
Просто в коде пишется
Используется синтаксис Pascal
N:=vertexNum;

Или
Используется синтаксис Pascal
procedure F(N:Integer);
...
begin
F(vertexNum);
end;
 



По поводу того что на Yacc не пишется профессиональные компиляторы. Пишутся
но сейчас это не в моде. Вот пример пожалуйста Brooсk+ написан на Flex(Yacc).
Написана специалистами из ATI при участие специалистов NVidia.
http://sourceforge.net/projects/brookplus/
и его предшедствинник.
http://sourceforge.net/projects/brook/

PS. Интернет тормозит - поэтому до конца проверить факты не получается. Пишу по памяти.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение09.11.2014, 11:48 
Аватара пользователя


22/09/09

1907
Pavia в сообщении #928620 писал(а):
Вот пример пожалуйста Brooсk+ написан на Flex(Yacc).

В TIOBE programming community index я Brooсk+ не нашел ;-) М.б. со временем он станет популярным...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 101 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group