Б. Страуструп - Язык программирования С++ (1119446), страница 75
Текст из файла (страница 75)
Так, ниже приведенизвестный способ получения неожиданного результата - печати мусорного значения или чего похуже:char x;// ...printf("bad input char: %s",x);Однако, эти функции обеспечивают большую гибкость и знакомы программирующим на С.Как обычно, getchar() позволяет знакомым способом читать символы из входного потока:int i;:while ((i=getchar())!=EOF) { // символьный ввод C// используем i}Обратите внимание: чтобы было законным сравнение с величиной EOF типа int при проверке на конецфайла, результат getchar() надо помещать в переменную типа int, а не char.За подробностями о вводе-выводе на С отсылаем к вашему руководству по С или книге Кернигана иРитчи "Язык программирования С".10.7 Упражнения1.(*1.5) Читая файл вещественных чисел, составлять из пар прочитанных чисел комплексные числа,записать комплексные числа.2.(*1.5) Определить тип name_and_address (тип_и_адрес).
Определить для него << и >>. Написатьпрограмму копирования объектов потока name_and_address.3.(*2) Разработать несколько функций для запроса и чтения данных разных типов. Предложения:целое, вещественное число, имя файла, почтовый адрес, дата, личная информация, и т.п.Попытайтесь сделать их устойчивыми к ошибкам.281Бьерн Страуструп.Язык программирования С++4.(*1.5) Напишите программу, которая печатает: (1) строчные буквы, (2) все буквы, (3) все буквы ицифры, (4) все символы, входящие в идентификатор в вашей версии С++, (5) все знаки пунктуации,(6) целые значения всех управляющих символов, (7) все обобщенные пробелы, (8) целые значениявсех обобщенных пробелов, и, наконец, (9) все изображаемые символы.5.(*4) Реализуйте стандартную библиотеку ввода-вывода С (<stdio.h>) с помощью стандартнойбиблиотеки ввода-вывода С++ (<iostream.h>).6.(*4) Реализуйте стандартную библиотеку ввода-вывода С++ (<iostream.h>) с помощью стандартнойбиблиотеки ввода-вывода С (<stdio.h>).7.(*4) Реализуйте библиотеки С и С++ так, чтобы их можно было использовать одновременно.8.(*2) Реализуйте класс, для которого операция [] перегружена так, чтобы обеспечить произвольноечтение символов из файла.9.(*3) Повторите упражнение 8, но добейтесь, чтобы операция [] была применима для чтения и длязаписи.
Подсказка: пусть [] возвращает объект "дескриптор типа", для которого присваиваниеозначает: присвоить через дескриптор файлу, а неявное приведение к типу char означает чтениефайла по дескриптору.10. (*2) Повторите упражнение 9, позволяя операции [] индексировать объекты произвольных типов, ане только символы.11. (*3.5) Продумайте и реализуйте операцию форматного ввода. Используйте для задания форматастроку спецификаций как в printf(). Должна быть возможность попыток применения несколькихспецификаций для одного ввода, чтобы найти требуемый формат.
Класс форматного ввода долженбыть производным класса istream.12. (*4) Придумайте (и реализуйте) лучшие форматы ввода.13. (**2) Определите для вывода манипулятор based с двумя параметрами: система счисления и целоезначение, и печатайте целое в представлении, определяемом системой счисления. Например,based(2,9) напечатает 1001.14. (**2) Напишите "миниатюрную" систему ввода-вывода, которая реализует классы istream, ostream,ifstream, ofstream и предоставляет функции, такие как operator<<() и operator>>() для целых, иоперации, такие как open() и close() для файлов.
Используйте исключительные ситуации, а непеременные состояния, для сообщения об ошибках.15. (**2) Напишите манипулятор, который включает и отключает эхо символа.282Бьерн Страуструп.Язык программирования С++ГЛАВА 11. ПРОЕКТИРОВАНИЕ И РАЗВИТИЕ"Серебряной пули не существует."- Ф. БруксВ этой главе обсуждаются подходы к разработке программного обеспечения. Обсуждение затрагиваеткак технические, так и социологические аспекты процесса развития программного обеспечения.Программа рассматривается как модель реальности, в которой каждый класс представляетопределенное понятие. Ключевая задача проектирования состоит в определении доступной изащищенной частей интерфейса класса, исходя из которых определяются различные части программы.Определение этих интерфейсов есть итеративный процесс, обычно требующий экспериментирования.Упор делается на важной роли проектирования и организационных факторов в процессе развитияпрограммного обеспечения.11.1 ВведениеСоздание любой нетривиальной программной системы - сложная и часто выматывающая задача.
Дажедля отдельного программиста собственно запись операторов программы есть только часть всейработы. Обычно анализ всей задачи, проектирование программы в целом, документация, тестирование,сопровождение и управление всем этим затмевает задачу написания и отладки отдельных частейпрограммы. Конечно, можно все эти виды деятельности обозначить как "программирование" и затемвполне обоснованно утверждать: "Я не проектирую, я только программирую".
Но как бы не называлисьотдельные виды деятельности, бывает иногда важно сосредоточиться на них по отдельности, так же какиногда бывает важно рассмотреть весь процесс в целом. Стремясь поскорее довести систему допоставки, нельзя упускать из вида ни детали, ни картину в целом, хотя довольно часто происходитименно это. Эта глава сосредоточена на тех частях процесса развития программы, которые не связаныс написанием и отладкой отдельных программных фрагментов. Обсуждение здесь менее точное идетальное, чем во всех остальных частях книги, где рассматриваются конкретные черты языка илиопределенные приемы программирования.
Это неизбежно, поскольку нет готовых рецептов созданияхороших программ. Детальные рецепты "как" могут существовать только для определенных, хорошоразработанных областей применения, но не для достаточно широких областей приложения. Впрограммировании не существует заменителей разума, опыта и вкуса. Следовательно, в этой главе вынайдете только общие рекомендации, альтернативные подходы и осторожные выводы.Сложность данной тематики связана с абстрактной природой программ и тем фактом, что приемы,применимые для небольших проектов (скажем, программа в 10000 строк, созданная одним или двумялюдьми), не распространяются на средние или большие проекты. По этой причине иногда мы приводимпримеры из менее абстрактных инженерных дисциплин, а не только из программирования.
Непреминем напомнить, что "доказательство по аналогии" является мошенничеством, и аналогии служатздесь только в качестве примера. Понятия проектирования, формулируемые с помощью определенныхконструкций С++, и поясняемые примерами, мы будем обсуждать в главах 12 и 13. Предложенные вэтой главе рекомендации, отражаются как в самом языке С++, так и в решении конкретныхпрограммных задач по всей книге.Снова напомним, что в силу чрезвычайного разнообразия областей применения, программистов исреды, в которой развивается программная система, нельзя ожидать, что каждый вывод, сделанныйздесь, будет прямо применим для вашей задачи.
Эти выводы применимы во многих самых разныхслучаях, но их нельзя считать универсальными законами. Смотрите на них со здоровой долейскептицизма.Язык С++ можно просто использовать как лучший вариант С. Однако, поступая так, мы не используемнаиболее мощные возможности С++ и определенные приемы программирования на нем, так чтореализуем лишь малую долю потенциальных достоинств С++. В этой главе излагается такой подход кпроектированию, который позволяет полностью использовать возможности абстрактных данных исредства объектного программирования С++.
Такой подход обычно называют объектноориентированным проектированием. В главе 12 обсуждаются основные приемы программирования наС++, там же содержится предостережение от сомнительных идей, что есть только один "правильный"способ использования С++, и что для получения максимального выигрыша следует всякое средство283Бьерн Страуструп.Язык программирования С++С++ применять в любой программе ($$12.1).Укажем некоторые основные принципы, рассматриваемые в этой главе:-из всех вопросов, связанных с процессом развития программного обеспечения, самый важный четко сознавать, что собственно вы пытаетесь создать.-Успешный процесс развития программного обеспечения - это длительный процесс.-Системы, которые мы создаем, стремятся к пределу сложности по отношению как к самимсоздателям, так и используемым средствам.-Эксперимент является необходимой частью проекта для разработки всех нетривиальныхпрограммных систем.-Проектирование и программирование - это итеративные процессы.-Различные стадии проекта программного обеспечения, такиепрограммирование и тестирование - невозможно строго разделить.-Проектирование и программирование нельзя рассматривать в отрыве от вопросов управленияэтими видами деятельности.как:проектирование,Недооценить любой из этих принципов очень легко, но обычно накладно.
В то же время трудновоплотить эти абстрактные идеи на практике. Здесь необходим определенный опыт. Подобнопостроению лодки, езде на велосипеде или программированию проектирование - это искусство,которым нельзя овладеть только с помощью теоретических занятий.Может быть все эти емкие принципы можно сжать в один: проектирование и программирование - видычеловеческой деятельности; забудь про это - и все пропало. Слишком часто мы забываем про это ирассматриваем процесс развития программного обеспечения просто как "последовательность хорошоопределенных шагов, на каждом из которых по заданным правилам производятся некоторые действиянад входными данными, чтобы получить требуемый результат". Сам стиль предыдущего предложениявыдает присутствие человеческой природы! Эта глава относится к проектам, которые можно считатьчестолюбивыми, если учитывать ресурсы и опыт людей, создающих систему.