Форум программистов, компьютерный форум CyberForum.ru

Калькулятор в книге Страуструпа - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
28.07.2013, 14:48     Калькулятор в книге Страуструпа #1
Я знал, что это довольно тяжелая книга, поэтому начал читать ее после другой о С++, но пример "элементарного" калькулятора поставил меня в тупик с первых же строк. В этой теме я буду задавать вопросы относительно него по частям. Вот с самого начала: это всё вообще что? Даже не псевдокод, почему END в начале? Что за выражения? Что за термы? Первичное? Выражения? Прочитал весь пример, и так вопросов куча.
(стр. 70)
Грамматика языка калькулятора определяется следующими правилами:
программа:
END // END - это конец ввода
список-выраженийEND
список-выражений:
выражение PRINT // PRINT - это'\n' или';'
выражение PRINT список-выражений
выражение:
выражение+ терм
выражение - терм
терм
терм:
терм/ первичное
терм* первичное
первичное
первичное:
NUMBER // число с плавающей запятой в С++
NAME // имя в языке С++ за исключением'_'
NAME = выражение
- первичное
( выражение)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.07.2013, 14:51     Калькулятор в книге Страуструпа #2
http://ru.wikipedia.org/wiki/%D0%A4%...83%D1%80%D0%B0
а так же Ахо, Ульман - компиляторы...
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
28.07.2013, 15:02     Калькулятор в книге Страуструпа #3
term - условие (англ.)
У тебя такое издание? У меня книга эта лежит, ща открою посмотрю.

Добавлено через 2 минуты
У тебя должно начинаться с
C++
1
2
program: 
                    END              // END - это конец ввода
Так?
аа так у тебя все на русском))) короче не заморачивайся, а начинай учить с более легких книжек раз это не понимаешь с Праты 6-ого издания, например.

Добавлено через 6 минут
грубо говоря программа начинается со слова программа
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
28.07.2013, 15:04  [ТС]     Калькулятор в книге Страуструпа #4
Цитата Сообщение от metagalaxy Посмотреть сообщение
term - условие (англ.)
аа так у тебя все на русском))) короче не заморачивайся, а начинай учить с более легких книжек раз это не понимаешь с Праты 6-ого издания, например.

Добавлено через 6 минут
грубо говоря программа начинается со слова программа
Вот после Праты я и начал учить, и процентов на 95 её переварил без проблем. Я просто не пойму логику этого примера и дальнейших листингов. У меня Второе дополненное издание.
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
28.07.2013, 15:06     Калькулятор в книге Страуструпа #5
Т.е. автор всем "этим" хотел тебе сказать, что (цитата из книги, сразу после этого листинга): "Иными словами, программа есть последовательность выражений, разделенных точкой с запятой" (PRINT это ";")
)))
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
28.07.2013, 15:08     Калькулятор в книге Страуструпа #6
Это некий план калькулятора. Просто читай дальше. Там будет по каждой функции объяснения. К концу главы поймешь общую суть калькулятора и реализацию. На самом деле, действительно, мне тоже показался сложным пример...
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
28.07.2013, 15:10     Калькулятор в книге Страуструпа #7
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
Вот после Праты я и начал учить, и процентов на 95 её переварил без проблем. Я просто не пойму логику этого примера и дальнейших листингов. У меня Второе дополненное издание.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
program:
 
      END                    // END - это конец ввода
 
      expr_list END
 
 
 
  expr_list:
 
      expression PRINT      // PRINT - это или '\n' или ';'
 
      expression PRINT expr_list
 
 
 
  expression:
 
      expression + term
 
      expression - term
 
      term
 
 
 
  term:
 
      term / primary
 
      term * primary
 
      primary
 
 
 
  primary:
 
      NUMBER                // число с плавающей точкой в C++
 
      NAME                  // имя C++ за исключением '_'
 
      NAME = expression
 
      - primary
 
      ( expression )
Вот так понятней? Это грамматика языка, которую допускает калькулятор. Вот почитай.
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
29.07.2013, 10:23  [ТС]     Калькулятор в книге Страуструпа #8
metagalaxy, gore-lykovoe,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
double expr()  // складывает и вычитает
{ 
double left = term(); 
for(;;) // ``вечно'' 
switch(curr_tok) { 
case PLUS: 
get_token(); // случай'+' 
left += term(); 
break; 
case MINUS: 
get_token(); // случай'-' 
left -= term(); 
break; 
default: 
return left; 
} 
}
что за переменная left? почему ей присваивается значение функции, вычисляющей умножение и деление?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
29.07.2013, 11:16     Калькулятор в книге Страуструпа #9
Потому что сложение или вычитание представляется в виде a1 + a2 + a3... (и a1-a2-a3...). А последовательность операций сложения и вычитания - слева направо. Поэтому в выражении a1+a2+a3 сначала посчитаем a1+a2 и потом к этой сумме добавим a3.
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
29.07.2013, 11:21  [ТС]     Калькулятор в книге Страуструпа #10
Цитата Сообщение от Dani Посмотреть сообщение
Потому что сложение или вычитание представляется в виде
Так при чём здесь функция умножения и деления?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
29.07.2013, 11:22     Калькулятор в книге Страуструпа #11
А при том, что выражение 2*3 + 4*5 + 5*6, это тоже, что и a1+a2+a3. Только a1, a2, a3 уже посчитаны: a1 = 2*3, a2 = 4*5, a3 = 5*6.
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
29.07.2013, 11:28  [ТС]     Калькулятор в книге Страуструпа #12
Цитата Сообщение от Dani Посмотреть сообщение
А при том, что выражение 2*3 + 4*5 + 5*6, это тоже, что и a1+a2+a3. Только a1, a2, a3 уже посчитаны: a1 = 2*3, a2 = 4*5, a3 = 5*6.
Я правильно понимаю, что что бы не вводилось в программу, это в конечном счете будет посчитано просто как сумма слагаемых? Поэтому листинг функции суммы приведен первым?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
29.07.2013, 11:42     Калькулятор в книге Страуструпа #13
Смотри. Первыми в математике выполняются умножение и деление, а потом - сложение и вычитание. Что мы складываем в математике? Слагаемые. Что может быть слагаемым? Может быть просто число, произведение чего-либо, частное чего-либо, выражение в скобках. В функции expression мы только знаем, что слагаемое - это Терм (просто название, можно назвать Выражение, Терм, Первичное веражение - хоть A, B, C, но это будет не информативно). Почему? Т.к. терм обрабатывает случаи умножения и деления, а функция primary (которая вызывается из функции term) обрабатывает случай выражения в скобках и числа - это все возможные варианты слагаемого. Функция терм возвратит нам значение слагаемого, затем мы его просто просуммируем к остальному результату.
Точно также и с функцией term: мы только знаем, что 1 множитель (в математике: 1 множитель * 2 множитель = произведение) это первичное выражение. Это первичное выражение обрабатывает функция primary (т.к. множитель может быть либо числом, либо выражением в скобках).
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
29.07.2013, 12:14  [ТС]     Калькулятор в книге Страуструпа #14
Dani, Огромное спасибо, теперь осталось разобраться в принципе работы функции get_token() и вообще в куче ещё всего, но многое уже прояснилось. Если мне ещё понадобится ваша помощь, могу ли я к вам обратиться?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
29.07.2013, 12:18     Калькулятор в книге Страуструпа #15
tramp_1-3, да, обращаться можете. Знаете, сколько я с этим калькулятором мучился? И как раздражает, когда он еще главы 3-4 трындит про этот калькулятор (раздражает, когда не понял как работает калькулятор). Главное - выполнить упражнения, там сразу гораздо понятнее станет. get_token - не беда, поясню как время будет.
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
29.07.2013, 12:23  [ТС]     Калькулятор в книге Страуструпа #16
Цитата Сообщение от Dani Посмотреть сообщение
Знаете, сколько я с этим калькулятором мучился? И как раздражает, когда он еще главы 3-4 трындит про этот калькулятор (раздражает, когда не понял как работает калькулятор). Главное - выполнить упражнения, там сразу гораздо понятнее станет. get_token - не беда, поясню как время будет.
Вы прочли его книгу? Она стоит потраченных на неё усилий? После Праты подобные листниги это АдЪ...
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
29.07.2013, 12:26     Калькулятор в книге Страуструпа #17
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
Вы прочли его книгу? Она стоит потраченных на неё усилий? После Праты подобные листниги это АдЪ...
Лично мне - стоило. Это была моя первая книга. И сейчас почитываю временами. Это не АдЪ, просто он пытается все объяснить на реальных примерах и ход мыслей реального программиста, показать, как от быдлоидеи придти к нормальной и работающей идее, на всех этапах.
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
29.07.2013, 13:11  [ТС]     Калькулятор в книге Страуструпа #18
Dani, функция expr () вызывается в программе первой? Ей передается все введенное выражение? Как происходит приращение (и чего?), чтобы программа достигла блока default: return left;? Чем больше спрашиваю, тем больше вопросов..
double expr() // складывает и вычитает
C++
1
2
3
4
5
6
{ 
double left = term(); 
for(;;) // ``вечно'' 
//
} 
}
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
29.07.2013, 13:27     Калькулятор в книге Страуструпа #19
Да, функция expression вызывается в программе первой, т.к. нам надо посчитать выражение целиком (а не Терм например).
Ей ничего не передается - она берет только нужные токены из ввода. Приращение происходит так: вычисляем первое слагаемое, вызовом ф-ции term (вот эта строчка: double left = term(); ). Затем смотрим: есть ли после этого слагаемого знак "+" или "-"? Если есть, то это значит, что выражение посчитано не до конца, и мы идем дальше (это и есть бесконечный цикл, где мы проверяем полученный токен: если не + и не - , тогда выражение завершено).

Это, кстати, точно написано в книге.

Добавлено через 52 секунды
tramp_1-3, возможно, стоит перечитать главу помедленнее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2013, 13:30     Калькулятор в книге Страуструпа
Еще ссылки по теме:

Калькулятор страуструпа C++
C++ Задание из Страуструпа
C++ Обучение по книге Страуструпа "принципы и практика C++". Не выводится "Hello, World"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
29.07.2013, 13:30  [ТС]     Калькулятор в книге Страуструпа #20
Цитата Сообщение от Dani Посмотреть сообщение
возможно, стоит перечитать главу помедленнее.
Да раза 3-4 перечитывал, но в голове всё смешивается из-за этой сложной цепочки вызовов..
Yandex
Объявления
29.07.2013, 13:30     Калькулятор в книге Страуструпа
Ответ Создать тему
Опции темы

Текущее время: 05:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru