С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 7
Текст из файла (страница 7)
Реализация* класса Screen представлена в главе 13.*/class Screen {/* Это называется телом класса */public:void home();/* переместить курсор в позицию 0,0 */void refresh ();/* перерисовать экран*/private:/* Классы поддерживают "сокрытие информации"*//* Сокрытие информации ограничивает доступ из*//* программы к внутреннему представлению класса *//* (его данным). Для этого используется метка*//* "private:"*/int height, width;вся последовательность между /* и */ считается комментарием.
Например:}Слишком большое число комментариев, перемежающихся с кодом программы, можетухудшить читаемость текста. Например, объявления переменных width и height вданном тексте окружены комментариями и почти не заметны. Рекомендуется писатьразвернутое объяснение перед блоком текста. Как и любая программная документация,комментарии должны обновляться в процессе модификации кода. Увы, нередкослучается, что они относятся к устаревшей версии.Комментарии в стиле С не могут быть вложенными. Попробуйте откомпилироватьнижеследующую программу в своей системе. Большинство компиляторов посчитают ее#include <iostream>/* комментарии /* */ не могут быть вложенными.* Строку "не вкладываются" компилятор рассматривает,* как часть программы. Это же относится к данной и следующей строкам*/int main() {cout << "Здравствуй, мир\n";ошибочной:}Один из способов решить проблему вложенных комментариев – поставить пробел междузвездочкой и косой чертой:25С++ для начинающих/* * /Последовательность символов */ считается концом комментария только в том случае,если между ними нет пробела.Второй тип комментариев – однострочный.
Он начинается последовательностьюсимволов // и ограничен концом строки. Часть строки вправо от двух косых чертигнорируется компилятором. Вот пример нашего класса Screen с использованием двух/** Первое знакомство с определением класса в C++.* Классы используются как в объектном, так и в* объектно-ориентированном программировании. Реализация* класса Screen представлена в главе 13.*/class Screen {// Это называется телом классаpublic:void home();// переместить курсор в позицию 0,0void refresh (); // перерисовать экранprivate:/* Классы поддерживают "сокрытие информации".*//* Сокрытие информации ограничивает доступ из*//* программы к внутреннему представлению класса *//* (его данным).
Для этого используется метка*//* "private:"*/int height, width;строчных комментариев:}Обычно в программе употребляют сразу оба типа комментариев. Строчные комментарииудобны для кратких пояснений – в одну или полстроки, а комментарии, ограниченные /*и */, лучше подходят для развернутых многострочных пояснений.1.5. Первый взгляд на ввод/выводЧастью стандартной библиотеки С++ является библиотека iostream, котораяреализована как иерархия классов и обеспечивает базовые возможности ввода/вывода.Ввод с терминала, называемый стандартным вводом, “привязан” к предопределенномуобъекту cin.
Вывод на терминал, или стандартный вывод, привязан к объекту cout.Третий предопределенный объект, cerr, представляет собой стандартный вывод дляошибок. Обычно он используется для вывода сообщений об ошибках и предупреждений.Для использования библиотеки ввода/вывода необходимо включить соответствующийзаголовочный файл:#include <iostream>Чтобы значение поступило в стандартный вывод или в стандартный вывод для ошибокиспользуется оператор <<:26С++ для начинающихint v1, v2;// ...cout << "сумма v1 и v2 = ";cout << v1 + v2;cout << "\n";Последовательность "\n" представляет собой символ перехода на новую строку.
Вместо"\n" мы можем использовать предопределенный манипулятор endl.cout << endl;Манипулятор endl не просто выводит данные (символ перехода на новую строку), но ипроизводит сброс буфера вывода. (Предопределенные манипуляторы рассматриваются вглаве 20.)Операторы вывода можно сцеплять. Так, три строки в предыдущем примере заменяютсяодной:cout << "сумма v1 и v2 = " << v1 + v2 << "\n";string file_name;// ...cout << "Введите имя файла: ";Для чтения значения из стандартного ввода применяется оператор ввода (>>):cin >> file_name;string ifile, ofile;Операторы ввода, как и операторы вывода, можно сцеплять:// ...cout << "Введите имя входного и выходного файлов: ";cin >> ifile >> ofile;Каким образом ввести заранее неизвестное число значений? Мы вернемся к этомуstring word;вопросу в конце раздела 2.2, а пока скажем, что последовательность инструкцийwhile ( cin >> word )// ...считывает по одному слову из стандартного ввода до тех пор, пока не считаны все слова.Выражение( cin >> word )27С++ для начинающих28возвращает false, когда достигнут конец файла.
(Подробнее об этом – в главе 20.) Вотпример простой законченной программы, считывающей по одному слову из cin и#include <iostream>#include <string>int main (){string word;while ( cin >> word )cout << "Прочитано слово: " << word << "\n";cout << "Все слова прочитаны!";выводящей их в cout:}Вот первое предложение из произведения Джеймса Джойса “Пробуждение Финнегана”:riverrun, past Eve and Adam'sЕсли запустить приведенную выше программу и набрать с клавиатуры данноепредложение, мы увидим на экране терминала следующее:ПрочитаноПрочитаноПрочитаноПрочитаноПрочитанослово:слово:слово:слово:слово:riverrun,pastEve,andAdam'sВсе слова прочитаны!(В главе 6 мы рассмотрим вопрос о том, как убрать знаки препинания из вводимых слов.)1.5.1.
Файловый ввод/выводБиблиотека iostream поддерживает и файловый ввод/вывод. Все операции, применимыев стандартному вводу и выводу, могут быть также применены к файлам. Чтобыиспользовать файл для ввода или вывода, мы должны включить еще один заголовочныйфайл:#include <fstream>Перед тем как открыть файл для вывода, необходимо объявить объект типа ofstream:ofstream outfile("name-of-file");Проверить, удалось ли нам открыть файл, можно следующим образом:С++ для начинающихif ( ! outfile ) // false, если файл не открытcerr << "Ошибка открытия файла.\n"ifstream infile("name-of-file");Так же открывается файл и для ввода, только он имеет тип ifstream:if ( ! infile ) // false, если файл не открытcerr << "Ошибка открытия файла.\n"Ниже приводится текст простой программы, которая читает файл с именем in_file ивыводит все прочитанные из этого файла слова, разделяя их пробелом, в другой файл,#include <iostream>#include <fstream>#include <string>int main(){ifstream infile("in_file");ofstream outfile("out_file");if ( ! infile ) {cerr << "Ошибка открытия входного файла.\n"return -1;}if ( ! outfile ) {cerr << "Ошибка открытия выходного файла.\n"return -2;}названный out_file.string word;while ( infile >> word )outfile << word << ' ';return 0;}В главе 20 библиотека ввода/вывода будет рассмотрена подробно.
А в следующихразделах мы увидим, как можно создавать новые типы данных, используя механизмклассов и шаблонов.29С++ для начинающих302. Краткий обзор С++Эту главу мы начнем с рассмотрения встроенного в язык С++ типа данных “массив”.Массив – это набор данных одного типа, например массив целых чисел или массивстрок. Мы рассмотрим недостатки, присущие встроенному массиву, и напишем для егопредставления свой класс Array, где попытаемся избавиться от этих недостатков. Затеммы построим целую иерархию подклассов, основываясь на нашем базовом классе Array.В конце концов мы сравним наш класс Array с классом vector из стандартнойбиблиотеки С++, реализующим аналогичную функциональность. В процессе созданияэтих классов мы коснемся таких свойств С++, как шаблоны, пространства имен иобработка ошибок.2.1.
Встроенный тип данных “массив”Как было показано в главе 1, С++ предоставляет встроенную поддержку для основных// объявление целого объекта ival// ival инициализируется значением 1024int ival = 1024;// объявление вещественного объекта двойной точности dval// dval инициализируется значением 3.14159double dval = 3.14159;// объявление вещественного объекта одинарной точности fval// fval инициализируется значением 3.14159типов данных – целых и вещественных чисел, логических значений и символов:float fval = 3.14159;К числовым типам данных могут применяться встроенные арифметические и логическиеint ival2 = ival1 + 4096;// сложениеоперации: объекты числового типа можно складывать, вычитать, умножать, делить и т.д.int ival3 = ival2 - ival;// вычитаниеdval = fval * ival;ival = ival3 / 2;// умножение// делениеbool result = ival2 == ival3;result = ival2 + ival != ival3;result = fval + ival2 < dval;result = ival > ival2;////////сравнениесравнениесравнениесравнениенанананаравенствонеравенствоменьшебольшеВ дополнение к встроенным типам стандартная библиотека С++ предоставляетподдержку для расширенного набора типов, таких, как строка и комплексное число.
(Мыотложим рассмотрение класса vector из стандартной библиотеки до раздела 2.7.)С++ для начинающих31Промежуточное положение между встроенными типами данных и типами данных изстандартной библиотеки занимают составные типы – массивы и указатели. (Указателирассмотрены в разделе 2.2.)Массив – это упорядоченныйпоследовательностьнаборэлементоводноготипа.Например,0 1 1 2 3 5 8 13 21представляет собой первые 9 элементов последовательности Фибоначчи. (Выбравначальные два числа, вычисляем каждый из следующих элементов как сумму двухпредыдущих.)Для того чтобы объявить массив и проинициализировать его данными элементами, мыдолжны написать следующую инструкцию С++:int fibon[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };Здесь fibon – это имя массива. Элементы массива имеют тип int, размер (длина)массива равна 9. Значение первого элемента – 0, последнего – 21. Для работы с массивоммы индексируем (нумеруем) его элементы, а доступ к ним осуществляется с помощьюоперации взятия индекса.
Казалось бы, для обращения к первому элементу массиваестественно написать:int first_elem = fibon[1];Однако это не совсем правильно: в С++ (как и в С) индексация массивов начинается с 0,поэтому элемент с индексом 1 на самом деле является вторым элементом массива, аиндекс первого равен 0.Таким образом, чтобы обратиться к последнему элементуfibon[0]; // первый элементfibon[1]; // второй элемент...fibon[8]; // последний элементмассива, мы должны вычесть единицу из размера массива:fibon[9]; // ...
ошибкаДевять элементов массива fibon имеют индексы от 0 до 8. Употребление вместо этогоиндексов 1-9 является одной из самых распространенных ошибок начинающихпрограммистов на С++.Для перебора элементов массива обычно употребляют инструкцию цикла. Вот примерпрограммы, которая инициализирует массив из десяти элементов числами от 0 до 9 иint main()затем печатает их в обратном порядке:{int ia[10];int index;С++ для начинающихfor (index=0; index<10; ++index)// ia[0] = 0, ia[1] = 1 и т.д.ia[index] = index;for (index=9; index>=0; --index)cout << ia[index] << " ";cout << endl;}Оба цикла выполняются по 10 раз.