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

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 34

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 34 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 342018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Областью видимости переменной, определенной в условии, является тело условной конструкции, а значение этой переменной совпадает с величиной условного выражения (56.3.2.1). Поэтому выражение !ей l = (1 вычисляется тогда и только тогда, когда Н не равно нулю. Функция рг1уи(), обрабатывающая первичные элементы, похожа на ехрг() и геле(), но поскольку тут мы забрались ниже по иерархии вызовов некоторая реальная работа уже выполняется (и цикл не нужен): Глава 6 Выражения и операторы 160 сазе ЕР: ( «оиЫе е = ехрг (<гие); <Т(сип <оа ) = ВР) ге<ига еггог(" ' ) ' ехрес<е<<ч) 8е« о<ген () < ~У пропустить 7' ге<ига е; ) «е!пи<<: ге<игп еп ог ( "рг<тагу ехрес<еат ); Когда встречается 1<1!)МВЕВ (то есть целый литерал или литерал с плавающей запятой), возвращается его значение.

Вводимое функцией 8е« ойеи () значение помещается в глобальную переменную иитЬег га1ие. Обычно глобальная переменная в программе сигнализирует о недостаточно четкой ее структуре — например, проведена некоторая оптимизация. Таков и наш случай. В идеале лексема состоит из двух частей: значения, определяющего тип лексемы (тайен га1ие в данной программе), и величины самой лексемы (где это требуется). У нас же имеется единственная переменная сиге <ой, из-за чего и потребовалась глобальная переменная иитЬег гаи!е для хранения последнего прочитанного Х!3МВЕИ. Задача исключить эту глобальную переменную предложена ниже в качестве самостоятельного упражнения (56.6[21]). В действительности, нет жесткой необходимости сохранять значение июиЬег за!ив в локальной переменной г перед вызовом 8е« ойеи().

Для каждого допустимого ввода наш калькулятор всегда выполняет вычисления с единственным числом, после чего читает новое. Но в случае ошибки сохраненное число и его вывод помогут пользователю. Аналогично тому, как последнее значение 3(1!)МЕЕВ хранится в переменной иитЬег га!ие, строковое представление последнего А<АМЕ хранится в зи!и8 га!ие.

Прежде, чем обработать имя, калькулятору нужно заглянуть вперед и узнать, как это имя используется — читается или оно участвует в операции присваивания. В любом случае происходит обращение к таблице символов, имеющей тип тар Я3.7.4, В 1 7.4.1): таркз<г<п8, <<оиЫе> <аЫе ," Когда таблица символов <аЫе индексируется строкой, возвращается значение типа <!оиЫе, ассоциированное с указанной строкой. Например, если пользователь вводит гаслизГ 8378. 388; то калькулятор выполняет следующее: <<оиЫез г = <аЫе("га«<из" ]; 7... ехрг() вычисляет значение, которое будет присвоено., г = о378.388; Ссылка г настраивается на числовое значение типа ((оцЫе, ассоциированное с именем га<!1из, и сохраняет к нему доступ, пока функция ехрг() не выделит число 6378.

388 из входного потока символов. 161 б ) Калькулятор 6.1.2. функция ввода Очень часто считывание ввода является самой запутанной частью программы. Это обаясняется тем, что программе приходится взаимодействовать с человеком— учитывать его причуды, пристрастия и просто случайные ошибки. Попытка заставить человека действовать как машина часто воспринимается им (вполне справедливо) как оскорбление. Задача процедуры низкоуровневого ввода состоит в чтении потока символов и выделения из него более высокоуровневых лексем.

Эти лексемы затем подаются на вход еше более высокоуровневым процедурам. В нашей программе низкоуровневый ввод обрабатывается функцией аег го)сея() . По счастью, написание процедур низкоуровневого ввода не является каждодневной задачей, ибо во многих системах для этого имеются готовые стандартные процедуры. Я выбрал двухэтапную тактику построения функции яег го)геп () . Сначала я напишу обманчиво простую версию, которая все сложности перекладывает на пользователя программы. Затем я модифицирую ее в окончательный вариант, который выглядит менее элегантно, зато прост в использовании.

Обший план состоит в считывании символа, определении по этому символу типа лексемы и возврате соответствуюшего зо)сеп гайзе. Начальные операторы функции считывают первый непробельный символ в переменную сй и проверяют успешность ввода: тайен га!ие еез Го)теп ( ) ( сваг сй = О; с)н»сй | зн йод (сй) ( сазе О: ге!иго сигг гоИ=ЕМР; У присваивание и возврат По умолчанию, операция» пропускоегп пробельные символы (то есть собственно пробел, табуляцию, переход на новую строку и т.д.) и не изменяет значение переменной сй в случае неудачи ввода. Отсюда следует, что сй == О означает конец ввода. Операция присваивания вырабатывает значение, совпадающее с новой величиной переменной, стоящей в левой части операции присваивания.

Поэтому я присваиваю ЕМР переменной сигг той и возвращаю это же значение в рамках единственного оператора. Это улучшает надежность сопровождения программы, так как в случае двух операторов программист может изменить лишь один из них, забыв про другой. Теперь взглянем на отдельные ветви оператора зннгс)) до того, как будет представлен весь текст функции. Для символа окончания выражений, то есть символа '; ', круглых скобок и символов операций, выполняемых калькулятором, возвращаются их числовые коды: сазе '; ': сазе ' * ': сазе ' у ': сазе ' ь ': сазе ' - ': 162 Глава 6. Выражения и операторы сазе ' ( ': сазе ') ': сазе '=': ге(игп сигг гоЬ=Тоаеп га!ие (сЬ) Для чисел поступаем следующим образом: сазе ' 0 ': сазе ' 1 ': сазе ' 2 ': сазе ' 5 ': сазе ' 4 ': сазе ' 5 ': сазе ' б ': сазе ' 7': сазе ' 0 ': сазе ' 9 ': сазе ' .

': с!п.ригбаса(сЬ) ! ст»питЬег га!ие; гетгп сигг год=)уЮМЕЕК; Может быть и не слишком хорошо с точки зрения восприятия располагать саяе-ветви оператора зн1ясЬ горизонтально, но уж больно утомительно писать однообразные строки одну под другой. Суть же кода очень проста, так как операция» читать константы с плавающей запятой в переменные типа боиЫе умеет изначально. Выявив характерный для чисел начальный символ (цифра или точка), возвращают его в поток с!и, после чего вся константа читается в переменную пюпЬег га1ие. Аналогично работаем с именами: г!е)а ай: (1(!за1раа (сЬ) ) ( ст.рисбас!г (сЬ); с!п»згг!пе га1ие! ге(игп сиге !об=)ЧАМЕ! еггог ( "Ьад соаеп" ); гегигп сигг гоЬ=РЕЕч Т! ЕСМЕ, !чАМЕ =, илн ошибка Тоаеп га!ие ее! !олен ( ) ( слог сЬ=О; сгп»сЬ ! зпйсЬ (сЬ) ( сазе 0: ге(игп сиге яоЬ=ЕГ41)г сазе '; ': саяе ' * ': сазе ' l ': Чтобы избежать перечисления всех алфавитных символов в саяе-ветвях, используем стандартную библиотечную функцию 1яа1рйа() ($20.4.2).

Операция» читает символы в строку (в нашем случае, в переменную з(т)ия оа1ие) до тех пор, пока не встретится пробельный символ. Это значит, что во входном тексте пользователь программы должен после имени (и до знака операции) располагать пробельные символы. Это крайне неудобно и мы еще вернемся к этому вопросу в Вб.)дс И вот, наконец, полный текст функции ввода: 1бз 6.).

Калькулятор сазе '+': сазе ' — ': сазе ' ( ': сазе ') ': саяе '=': ге<игл сиге <оЬ=Тоаеп га<ие (са) < сазе ' 0' < сазе ' 1 ': саяе ' 2 ': сазе ' 3 ': сазе ' 4 ': сазе ' 5 ': сазе ' б ': сазе ' 7': сазе ' 8 ': сазе ' 9 ': сазе ' . ': ст.ри<Ьаса (сЬ) < с<п»питЬе( оа<ие; ге<игл сигг МЬ=11БМВЕВ < (<ели<(: 1У(йа1раа (сЬ) ) ( с!п.ри<Ьаса (сЬ); с!п»з(г!по го<не; ге(игп сиге (оа=!()АМЕ; ) егго( ( "Ьа4 (о!<еп" ); ге(игп сигг <оЬ=РВНЧТ; д ХАМЕ, МАМЕ =, или ошибка Преобразование операций к типу То!(еп оа1ие имеет тривиальный смысл, так как элементы этого перечисления, соответствующие операциям, имеют значения, совпадающие с кодировками символов операций (см. также 54.8).

6.1.3. Низкоуровневый ввод Тоаеп оа1ие ае« оаеп () ( сьаг сЬ) У пропустить все пробельные символы кроме ')и' «о ( ф'(! с!п.яе((сЬ) ) ге(игп сигг <оа = Е!<Т(( !шЫ!е(сЬ! ='',и' аа и(расе(сЬ) ) < завсЬ (сЬ) Работа с текущей версией калькулятора имеет ряд неудобств. Например, нужно не забывать про точку с запятой, иначе калькулятор не выведет вычисленного значения. Необходимость же в обязательном порядке проставлять пробелы после имен, вообще просто нонсенс. Действительно, в данной версии калькулятора х=7 трактуется как идентификатор, а вовсе не набор из идентификатора х, операции = и числа 7. Все перечисленные неудобства устраняются путем замены в теле функции «е< (о1(еп() простых стандартных операций типоориентированного ввода на операции посимвольного ввода.

Начнем с того, что предложим наряду с точкой с запятой использовать и перевод строки для индикации конца выражений: 164 Глава б. Выражения и операторы саяе '; ': сазе 'тп ': гешгп сиге зоЬ=Р!(11ч'Т; Здесь использован оператор цикла я(о, который эквивалентен циклическому оператору тч))))е, за исключением того, что его тело всегда исполняется хотя бы один раз. Вызов с!п.яег(сЬ) читает один символ из стандартного потока ввода в переменную сЬ. По умолчанию, «е1() не выполняет автоматически пропуск пробельных символов так, как это делает операция».

Проверка (у(, с!п.аег(сЬ) ) выявляет невозможность чтения символа из с)п; в этом случае возвращается Е(ПУ и работа с калькулятором завершается. Операцию . (логическое отрицание) приходится использовать из-за того, что яет О возвращает Ггие в случае успешного чтения. Стандартная библиотечная функция !ззрасеО проверяет, является ли символ пробельным (520.4.2); 1ззрасе(с) возвращает ненулевое значение для пробельных символов и нуль в противном случае. Функция Ырасе() выполняется быстрее, чем наш альтернативный перебор всех пробельных символов.

Имеются также стандартные функции для выявления цифр — шйя11 () — букв — !за1РЬа (), а также цифр или букв — 1зайяит () . После пропуска пробельных символов следующий за ними символ используется для выявления типа лексемы. Проблема, вызванная чтением строки операцией» вплоть до пробельных символов, преодолевается последовательным посимвольным чтением до тех пор, пока не встретится символ, отличный от буквы или цифры: о' ХАМЕ ХАМЕ= или ошибка де~аи11: в (аа!ряа (сЬ) ) ( з!ппя га1ие=сЬ; шЫ1е(сгн.аег(сЬ) зь !за!пот (сЬ) ) ззггпя га1ие.ризЬ Ьася(ся) с(п.ри!бася (сЬ); ге!игл сип !оЬ=)чАМЕ; ) еггог ( "Ьад !ояеп" ); ге!иго сип гоЬ=РК!ХТ; Оба рассмотренных улучшения достигаются модификацией четко ограниченных небольших участков кода. Конструирование программ таким образом, что их последующие модификации могут ограничиваться локальными изменениями кода, является важной целью проектирования.

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

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

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

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