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

Б. Страуструп - Язык программирования С++ (1119446), страница 69

Файл №1119446 Б. Страуструп - Язык программирования С++ (Б. Страуструп - Язык программирования С++) 69 страницаБ. Страуструп - Язык программирования С++ (1119446) страница 692019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

При таких обращениях в структуре системывозникают циклические зависимости, в результате чего ее труднее понять, и возможно возникновениебесконечных циклов в процессе обработки и восстановления после ошибки.Чтобы часть программы, предназначенная для обработки ошибок была более упорядоченной, стоитприменять такие упрощающие дело приемы, как "запрос ресурсов путем инициализации", и исходить изтаких упрощающих дело допущений, что "особые ситуации являются ошибками".9.9 Упражнения1.(*2) Обобщите класс STC до шаблона типа, который позволяет хранить и устанавливать функцииразных типов.2.(*3) Дополните класс CheckedPtrToT из $$7.10 до шаблона типа, в котором особые ситуациисигнализируют о динамических ошибках.3.(*3) Напишите функцию find для поиска в бинарном дереве узлов по значению поля типа char*.

Еслинайден узел с полем, имеющим значение "hello", она должна возвращать указатель на него. Дляобозначения неудачного поиска используйте особую ситуацию.4.(*1) Определите класс Int, совпадающий во всем со встроенным типом int за исключением того, чтовместо переполнения или потери значимости в этом классе запускаются особые ситуации.Подсказка: см. $$9.3.2.5.(*2) Перенесите из стандартного интерфейса С в вашу операционную систему основные операции сфайлами: открытие, закрытие, чтение и запись. Реализуйте их как функции на С++ с тем женазначением, что и функций на С, но в случае ошибок запускайте особые ситуации.6.(*1) Напишите полное определение шаблона типа Vector с особыми ситуациями Range и Size.Подсказка: см. $$9.3.7.(*1) Напишите цикл для вычисления суммы элементов вектора, определенного в упражнении 6,причем не проверяйте размер вектора.

Почему это плохое решение?8.(*2.5) Допустим класс Exception используется как базовый для всех классов, задающих особыеситуации. Каков должен быть его вид? Какая от него могла быть польза? Какие неудобства можетвызвать требование обязательного использования этого класса?9.(*2) Напишите класс или шаблон типа, который поможет реализовать обратный вызов.10. (*2) Напишите класс Lock (замок) для какой-нибудь системы, допускающей параллельноевыполнение.11. (*1) Пусть определена функцияint main() { /* ...

*/ }Измените ее так, чтобы в ней перехватывались все особые ситуации, преобразовывались всообщения об ошибке и вызов abort(). Подсказка: в функции fromC() из $$9.8 учтены не все случаи.256Бьерн Страуструп.Язык программирования С++ГЛАВА 10. ПОТОКИ"Доступно только то, что видимо"Б. КерниганВ языке С++ нет средств для ввода-вывода. Их и не нужно, поскольку такие средства можно просто иэлегантно создать на самом языке. Описанная здесь библиотека потокового ввода-вывода реализуетстрогий типовой и вместе с тем гибкий и эффективный способ символьного ввода и вывода целых,вещественных чисел и символьных строк, а также является базой для расширения, рассчитанного наработу с пользовательскими типами данных.

Пользовательский интерфейс библиотеки находится вфайле <iostream.h>. Эта глава посвящена самой потоковой библиотеке, некоторым способам работы сней и определенным приемам реализации библиотеки.10.1 ВВЕДЕНИЕШироко известна трудность задачи проектирования и реализации стандартных средств ввода-выводадля языков программирования.

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

Таким образом,кажется разумным потребовать, чтобы средства ввода-вывода для С++ программировались сиспользованием возможностей С++, доступных каждому. Представленные здесь потоковые средстваввода-вывода появились в результате попытки удовлетворить этим требованиям.Основная задача потоковых средств ввода-вывода - это процесс преобразования объектовопределенного типа в последовательность символов и наоборот. Существуют и другие схемы вводавывода, но указанная является основной, и если считать символ просто набором битов, игнорируя егоестественную связь с алфавитом, то многие схемы двоичного ввода-вывода можно свести к ней.Поэтому программистская суть задачи сводится к описанию связи между объектом определенного типаи бестиповой (что существенно) строкой.Последующие разделы описывают основные части потоковой библиотеки С++:10.2Вывод: То, что для прикладной программы представляется выводом, на самом деле являетсяпреобразованием такихобъектовкакint, char *, complex или Employee_record впоследовательность символов.

Описываются средства для записи объектов встроенных ипользовательских типов данных.10.3Ввод: Описаны функции дляпользовательских типов данных.10.4Форматирование: Часто существуют определенные требования к виду вывода, например, intдолжно печататься десятичными цифрами, указатели в шестнадцатеричной записи, авещественные числа должны быть с явно заданной точностью фиксированного размера.Обсуждаются функции форматирования и определенные программистские приемы ихсоздания, в частности, манипуляторы.10.5Файлы и потоки: Каждая программа на С++ может использовать по умолчанию три потока стандартный вывод (cout), стандартный ввод (cin) и стандартный поток ошибок (cerr).

Чтобыработать с какими-либо устройствами или файлами надо создать потоки и привязать их к этимустройствам или файлам. Описывается механизм открытия и закрытия файлов и связыванияфайлов с потоками.10.6Ввод-вывод для С: обсуждается функция printf из файла <stdio.h> для С а также связь междувводасимволов,257строкизначенийвстроенныхиБьерн Страуструп.Язык программирования С++библиотекой для С и <iostream.h> для С++.Укажем, что существует много независимых реализаций потоковой библиотеки ввода-вывода и наборсредств, описанных здесь, будет только подмножеством средств, имеющихся в вашей библиотеке.Говорят, что внутри любой большой программы есть маленькая программа, которая стремитсявырваться наружу.

В этой главе предпринята попытка описать как раз маленькую потоковую библиотекуввода-вывода, которая позволит оценить основные концепции потокового ввода-вывода и познакомитьс наиболее полезными средствами. Используя только средства, описанные здесь, можно написатьмного программ; если возникнетнеобходимость в более сложных средствах, обратитесь за деталями к вашему руководству по С++.Заголовочный файл <iostream.h> определяет интерфейс потоковой библиотеки. В ранних версияхпотоковой библиотеки использовался файл <stream.h>. Если существуют оба файла, <iostream.h>определяет полныйнабор средств, а <stream.h> определяет подмножество, которое совместимо с ранними, менеебогатыми потоковыми библиотеками.Естественно, для пользования потоковой библиотекой вовсе не нужно знание техники ее реализации,тем более, что техника может быть различной для различных реализаций.

Однако, реализация вводавыводаявляется задачей, диктующей определенные условия, значит приемы, найденные в процессе еерешения, можно применить и для других задач, а само это решение достойно изучения.10.2 ВЫВОДСтрогую типовую и единообразную работу как со встроенными, так и с пользовательскими типамиможно обеспечить, если использовать единственное перегруженное имя функции для различныхопераций вывода. Например:put(cerr,"x = "); // cerr - выходной поток ошибокput(cerr,x);put(cerr,'\n');Тип аргумента определяет какую функцию надо вызывать в каждом случае. Такой подход применяетсяв нескольких языках, однако, это слишком длинная запись. За счет перегрузки операции << , чтобы онаозначала "вывести" ("put to"), можно получить более простую запись и разрешить программистувыводить в одном операторе последовательность объектов, например так:cerr << "x = " << x << '\n';Здесь cerr обозначает стандартный поток ошибок.

Так, если х типа int со значением 123, топриведенный оператор выдастx = 123и еще символ конца строки в стандартный поток ошибок. Аналогично, если х имеет пользовательскийтип complex со значением (1,2.4), то указанный оператор выдастx = (1,2.4)в поток cerr. Такой подход легко использовать пока x такого типа, для которого определена операция<<, а пользователь может просто доопределить << для новых типов.Мы использовали операцию вывода, чтобы избежать многословности, неизбежной, если применятьфункцию вывода. Но почему именно символ << ? Невозможно изобрести новую лексему (см. 7.2).Кандидатом для ввода и вывода была операция присваивания, но большинство людей предпочитает,чтобы операции ввода и вывода были различны.

Более того, порядок выполнения операции =неподходящий, так cout=a=b означает cout=(a=b). Пробовали использовать операции < и >, но к ним таккрепко привязано понятие "меньше чем" и "больше чем", что операции ввода-вывода с ними во всехпрактически случаях не поддавались прочтению.Операции << и >> похоже не создают таких проблем. Они асиметричны, что позволяет приписывать имсмысл "в" и "из". Они не относятся к числу наиболее часто используемых операций над встроенными258Бьерн Страуструп.Язык программирования С++типами, а приоритет << достаточно низкий, чтобы писать арифметические выражения в качествеоперанда без скобок:cout << "a*b+c=" << a*b+c << '\n';Скобки нужны, если выражение содержит операции с более низким приоритетом:cout << "a^b|c=" << (a^b|c) << '\n';Операцию сдвига влево можно использовать в операции вывода, но, конечно, она должна быть вскобках:cout << "a<<b=" << (a<<b) << '\n';10.2.1 Вывод встроенных типовДля управления выводом встроенных типов определяется класс ostream с операцией << (вывести):class ostream : public virtual ios {// ...public:ostream& operator<<(const char*);ostream& operator<<(char);ostream& operator<<(short i){ return *this << int(i); }ostream& operator<<(int);ostream& operator<<(long);ostream& operator<<(double);ostream& operator<<(const void*);// ...};//строки// указателиЕстественно, в классе ostream должен быть набор функций operator<<() для работы с беззнаковымитипами.Функция operator<< возвращает ссылку на класс ostream, из которого она вызывалась, чтобы к нейможно было применить еще раз operator<<.

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

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

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