Главная » Просмотр файлов » Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004

Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 35

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 35 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 352019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 35)

Обе проблемы решаютгя заменой операции ввода в ие1 1ойел (), ориентированных на типы, на код, который осупсествляет посимвольный ввод. Во-первых, пусть перевод строки, так же как и точка с запятой, означает конец выражения: 7ойеп иа!иере! !ойеп() сйагсЬ, с(о ( 0 лронрсспито осе сиссвоси-ризделссспелсс кроле'сссс' с7 ( сссл де1(сь)) ге!игл сигг гоь = еь!!з; ) шййе (сЬ!= ''ул' оо спзрасе ~сЬ)), зшйсЬ (сЬ) ( сазе ': сазе ул'. ге!игл сигг !оЬ = Р!с!сЧ 7; Мьс воспользовалпсь с(о-инссссрукциеи.

Она эквивалентна шЬ!1е-инсслрукс(ии за тем исключением, что тело цикла выполняется по крайней мере один раз. Вызов ссп де1(сЬ) счсстьсвает один символ из стандартного по~ока ввода в сЬ. По умолчанию ссе1() не пропускает символы-разделители, как это делает оператор». Результатом проверки !!'(!с!п.ссег()) будет !а!зе, если не считан ни один символ из с1п, В этом случае возвращается ЕМР и работа калькулятора завершается. Используется оператор! (логическое отрицание), потому что ссе! () в случае успешного завершения возвращает 1гие.

Функция стандартной библиотеки 1злрасе () проверяет, является лп символ разделителем (й 20тй2); 1ззрасе (с) возвращает ненулевое значение, если с является символом-разделптелем н ноль — в противном случае. Проверка реализована в виде попска по таолпце, поэтому 1злрасе () работае~ значительно быстрее, чем сравнивание с конкретными символами-разделителямп (пробел, табуляция, перевод строки и т. д.).

Лналогссчные функции проверяют, является ли символ цифрой — 1зс(!сч1 (), буквой-- !ла!рйа (), буквой пли цифрой — !за!пит (). После того как пропусссены символы-разделители, следующий символ используется для определенсля типа лексемы. Проблема. вызванная тем, что» считывает в строку до тех пор, пока не встретится символ-разделитель, решается посимвольным чтением до тех пор, пока не встретится символ, отличный от буквы плп цифры: с(е~аи(г с сс МЛМЕ, А!4МЕ= илп осиибки с7 (!за1РЬа (сЬ)) ( з1г!лд оа1ие = сЬ; шЬ11е (с!п.де! (сЬ) Ы Ва1писп (сй)) всг!лд иа1ие.ризи Ьасй (сЬ); ссп рисйасЬ (сЬ); 156 Глава 5.

Выражения и инструкции геГигл сигг год =МАМЕ; ) еггог) неправильнал лексеяса ), гегигл сигг 1ой =РК!НТ; К счастью, оба этих улучшения достигаются модификацией одного локального фрагмента кода. Конструирование програмги такиля образом, что улучшения можно реализовать модификацией только локальных фрагментов, является важной целью проектирования. 6.1.4. Обработка ошибок Ввиду того, что программа достаточно проста, обработка ошибок не является сложной задачей. сРункцпя обработки ошибок просто подсчитывает количество ошибок п выволит сообщение об ошибке: глгло оУ' еггогв; !я 1 еггог ')сапог вггглиз, в) ( ло о1 еггогв++; сегг « "ошибка: ' «в « '~л'; геГигл 1; 11оток сегг - .

зто небуферпзованный поток вывода, который обычно используется для выдачи сообщений об ошибках Я 21.2.1). Возвращать значение из функции имеет смысл потому, что обычно ошибки возникают в процессе вычисления выражения, и надо либо полностью прервать процесс вычисления, либо возвратить значение, которое вряд ли вызовет последующие ошибки. Для нашего простого калькулятора вводится второй подход.

Гслн бы де1 1онел )) сохраняла информацию о номерах строк, еггог () могла бы сообщить пользователю, где примерно произошла ошибка, Это особенно полезно при использовании калькулятора в цеинтсрактивпом режиме Я 6.6) 19)). Часто необходимо заверши~ь выполнение программы после возникновения ошибки, потому что нет разумного способа ее продолжить.

Это можно сделать, вызвав функцию ех11 )), которая сначала освобождает ресурсы типа потоков вывода, а затем завершает про~рамму, возвращая значение, переданное ей в качестве аргумента Я 9.4.1.1). Можно применить более регулярный метод обработки ошибок, обратившись к механизму обработки исключений (см. 9 6.3, глава 14), но того, что мы имеем в нашем примере, вполне достаточно для программы калькулятора из 150 строк.

6.1.5. Драйвер Теперь, когда все части программы в на.чичии, нам нужна только управляющая про- грамма. Вот пример простой функции гла1л )): 1лГта1л )) 1 1аЫе)'рд) =,У.!415925585897982385; О ишгдиияизоаия предопределенных илвн гаЫе[" е") = 2 7182818284590452854; 157 6.1. Калькулятор тЬ!!е (с(п(( я'е! 1оЬеп ((, Ясигг 1оЬ==Ег(Р( Ь еаЬ, (Т (сиге 1оЬ==Р1!й>'Т(сопппие, сои1 «ехрг (Та!ве( « '(л'; ге1игп по оТ еггогв; Как правило, гпа(п (( возвращает ноль, если программа завершилась успешно н значение, отличное от нуля — в противном случае Я 3.2).

Возврат количества ошибок прекрасно реализует эту пдсю. В качестве инициализации потребовалось только записать предопределенные имена в таолицу символов. Главной задачей основного цикла является считывание выражений п вывод ответа. Это выполняется строкой: сои1 «ехрг Ца!ве( « '(и'; Лргумен г га(ве сообшает ехр(. ((, что она ие должна вызывать яе! 1оЬеп (( для выделения лексемы.

Проверка си! прп каждом проходе тела цикла гарантирует, что программа завершит выполнение, если что-нибудь произойдет с потоком ввода, а сравнение с ЕЛ(Р гарантирует, что цик.л корректно завершится, когда ае! 1оЬеп (( обнаружит конец файла. Инструкция ЬгеаЬ реализует выход из текущей инструкции вш!1сЬ пли цикла !Рог, юЬ1(е, с(о). Сравнение с Рй)НТ(то есть, с ' (л' или ' ) освобождает ехрг (( от ответственности за ооработку пустых выражений. Инструкция соп!!лие эквивалентна переходу в самый конец цикла, поэтому в данном случае тЬ!!е (с!л(( 0 Ц (сигг 1оЬ==РИМТ(сопппие; сои! -' ехрг ~а!ве( « "(и'; эквивалентно гиЬ1!е (с1л( ( д" (Т (сиге гоЬ(=РК1Х7) сои1 «ехрг (Га!ве( « '1п'; 6.1.б. Заголовочные файлы Калькулятор использует средства стандартной библиотеки.

Поэтому в завершенпу(о программу должны быть включены заголовочные файлы: №слс!идеств1геат> 7,( ввод(вывод №!лс!и(!есв!ггпу> О гарики №1пс!аде<тир> 1! вссоппитивпие пассива №1пс!иде сс(уре> Огва!рыл!) и пь д. Глава 5. Выражения и инструкции 158 Все этн заголовочные файлы предоставляют средства из области имен з!г(, поэтому мы должны либо пользоваться явным квалифнкатором е!г!с, либо перевестц все имена в глобальное пространство имен: ие!лд лат еьраее ел!, Для того чтобы не смешивать обсуждение выражений и обсуждение концепции модульности, я выбрал второй путь.

В главах 8 и 9 обсуждаются способы разбиения нашего калькулятора на модули с помощью пространств имен и разбиение его на файлы исходных текстов. Во многих системах наряду со стандартными заголовочными файлами имеются пх эквиваленты с расширением .й, в которых классы, функции и т. д. объявляются п помещаются в глобальное пространство имен Я 9.2 1, э 9 2А, 9 Ь.3.1). 6.1.7. Параметры командной строки После того как я написал и оттестировал программу, я обнаружил, что не очень удобно сначала запускать программу, затем вводить выражение и, наконец, выходить из нее. Наиболее часто я использовал калькулятор для вычисления единственного выражения. Если можно было бы ввести это выражение в качестве параметра в командной строке, удалось бы избежать нескольких нажатий клавиш.

Любая программа начинается с вызова функции тат (( (9 3 2, 9 9А). Прп этом та!п (( получает два аргумента. Первый опредеэшет количество параметров (обычно называется агпе), а второй — массив параметров (обычно называемый аг)!и). Аргументы передаются в та!и (( оболочкой, вызываюп!ей программу; если оболочка не может передать аргументы, то аеас устанавливается в О. Так как соблюдается соглашение С о вызове та!п ((, то прп передаче аргументов используются строки в стиле С (ейаг*(агде+1().

Имя программы (так, как оно записано в командной строке) передается в аг!!тз(О). Список аргументов ограничен нулем, то есть агдп(агре(==О. Например, если командная строка выглядит; Ыс 15011 1934 то аргументы будут иметь следующие значения; агОе: ( 2 ( '!БО/1.1984' Несложно получить доступ к параметрам командно и строки. Вопрос в том, как пх использовать с мпнимальнымп изменениями в программе.

Можно считывать нз строки точно таким же образом, как из потока ввода. Неудивительно, что поток для чтения из строки называется !е!г!пуз!геат. К сожалению, нет элегантного способа заставить с!п ссылаться на (е!г(пдз!геат, Поэтому пам нужно заставить функцшо ввода калькулятора обращаться к !з!г!паз! еат, Более того, нам нужно придумать, как заставить функцию ввода обращаться либо к !з!Ппдз!геат, либо к е!и в зависимости от того, как выглядгп командная строка. 159 6.1.

Калькулятор Простым решением будет об ьявлецпе глобального указателя шри1, который указывает на используемый поток; все функции ввода будут на него ориентироваться: 1в1геат* ьпри1, ((указатель на попюк ввода !п1 тшп (т1 аг8с, сдаг" агдо()) вшдс5 (а г8с) ( саве !. 71'гтандарагньы поток ввода три1 .= $с!и, Ьгеад, саве 2: 0 строка аргален тон иьри1= пеш!вгппив(геит(агав(П)); Ьгеай; г(е~аи!1. еггог ('слишком много параметров ); ге1игп 1, 1аЫе("р!") =.

3! 41 5926535897932385; !аЫе("е 1=-2.71828!8284590452354, шЫ!е (!при!) ( Ве! 1одеп (); (7' (сиге !од==Ел(79) Ьгеай; !7' (сигг 1од==рй7!47) соп!!пие; сои1 «ехр! (7а!ве) « ' 1пд ) !1 (!при!)=за!и) де1е!е иьри1! ге!игн по оу еггоге, Поток (в1г(пдв1геат являешься потоком ввода, который читает пз строки, переданной ему в качестве аргумента (5 21.53). При достижении конца строки !в(г!лав(геагл возврац!аетуа!ве, точно так же, как другие потоки при достижении конца ввода (9 3.6, 9 21.3.3). Для того чтобы воспользоваться !в(г!лав(геат, нужно включить заголовочньш файл <ев1геагл>.

Характеристики

Тип файла
DJVU-файл
Размер
10,02 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6451
Авторов
на СтудИзбе
305
Средний доход
с одного платного файла
Обучение Подробнее