
- •Издано в рамках Инновационной образовательной программы ннгу: Образовательно-научный центр «Информационно-телекоммуникационные системы: физические основы и математическое обеспечение»
- •Глава 1. Основные понятия 13
- •Глава 3. Работа с числовыми данными 42
- •Глава 4. Операторы. Ключевые слова 52
- •Глава 5. Управление и циклы 64
- •Глава 6. Массивы 77
- •Глава 7. Функции 84
- •Глава 8. Символы и строки 102
- •Глава 9. Препроцессор 113
- •Глава 10. Указатели и ссылки 119
- •Глава 11. О файлах и командной строке 133
- •Глава 12. Работа с экраном дисплея 145
- •Глава 13. Внутреннее представление чисел 157
- •Глава 14. Структуры, перечисления, объединения 179
- •Глава 15. Классы 204
- •Глава 16. Программы из нескольких файлов 233
- •Глава 21. Шаблоны, исключения 321
- •Предисловие
- •Глава 1.Основные понятия
- •1.1.Элементы языка программирования
- •Алфавит
- •Лексемы
- •Выражения
- •Функции
- •Комментарии
- •1.2.Процесс создания программы
- •1.3.Первая программа Программа 1. Приветствие
- •1.4.Состав программы
- •Загрузка
- •Работа с окнами
- •Настройка среды
- •Указание каталогов библиотек
- •Подключение графической библиотеки
- •Назначение текущего каталога
- •Работа с блоками текста в редакторе
- •Выполнение программы
- •Отладка программ
- •Программа 2. Деление чисел
- •Синтаксические ошибки
- •Ошибки в процессе работы программы
- •Трассировка программ
- •Просмотр текущих значений выражений
- •Разработка консольных приложений
- •Программа 3. Hello
- •Выполнение и отладка программы
- •Файлы проекта
- •Автоматическая генерация кода
- •Особенности ввода и вывода
- •Глава 3.Работа с числовыми данными
- •3.1.Целые типы
- •Целые константы
- •Программа 4. Операции над целыми
- •3.2.Числа с плавающей точкой
- •Плавающие константы
- •3.3.Ввод и вывод чисел
- •Программа 5. Точность плавающих чисел
- •3.4.Логический тип и логические операции
- •3.5.Математические функции
- •Глава 4.Операторы. Ключевые слова
- •4.1.Операторы
- •Унарные операторы
- •Бинарные операторы
- •Оператор запятая
- •Условное выражение
- •Операторы присваивания
- •4.2.Приоритеты операторов
- •4.3.Ключевые слова
- •Продолжение таблицы 23. Ключевые слова стандарта языка Cи
- •4.4.Структура программы
- •Объявления переменных
- •Объявления и определения
- •Инструкции и блоки
- •4.5.Константы
- •Задачи 1-17 . Простейшие вычисления
- •Глава 5.Управление и циклы
- •5.1.Условный оператор
- •Программа 6. Максимальное из двух чисел
- •5.2.Операторы цикла
- •Цикл с предусловием while
- •Программа 7. Суммирование цифр целого
- •Цикл for
- •Программа 8. Поиск максимума и минимума
- •Цикл do-while
- •Программа 9. Вычисление квадратного корня
- •5.3.Переключатель
- •Программа 10. День недели
- •5.4.Операторы break и continue
- •Программа 11. Сумма положительных чисел
- •Задачи 18-52. Выбор и циклы
- •Глава 6.Массивы
- •6.1.Одномерные массивы
- •Программа 12. Проверка упорядоченности массива
- •6.2.Двумерные массивы
- •Программа 13. Подсчет выручки
- •Задачи 53-69. Одно- и двумерные массивы
- •Глава 7.Функции
- •7.1.Определение функции
- •7.2.Формальные параметры и фактические аргументы
- •Пpограмма.14. Степени целых чисел
- •7.3.Автоматические и статические переменные
- •Программа 15. Автоматические и статические переменные
- •7.4.Прототипы функций
- •7.5.Массивы как аргументы функций
- •7.6.Внешние переменные
- •Программа 16. Сортировка массива
- •7.7.Рекурсия
- •Программа 17. Рекурсивная печать целого
- •7.8.Перегруженные имена функций
- •Программа 18. Перегрузка функций
- •7.9.Аргументы функций по умолчанию
- •Программа 19. Аргументы по умолчанию
- •Задачи 70-96. Функции
- •Глава 8.Символы и строки
- •8.1.Символы
- •Символьные константы
- •Программа 20. Представления символов
- •Ввод и вывод символов
- •Программа 22. Печать текста по словам
- •8.2.Строки символов
- •Строковые константы
- •Ввод и вывод строк
- •Средства работы со строками
- •Программа 23. Реверсирование строк
- •Задачи 97-121. Символы и строки
- •Глава 9.Препроцессор
- •9.1.Директивы препроцессора
- •9.2.Макросы
- •Программа 24. Возможности препроцессора
- •Задачи 122-124. Макросы
- •Глава 10.Указатели и ссылки
- •10.1.Указатели и адреса
- •Программа 25. Расчет треугольника
- •10.2.Указатели и массивы
- •10.3.Адресная арифметика
- •10.4.Символьные указатели
- •10.5.Массивы указателей
- •Программа 26. Названия месяцев
- •10.6.Указатели на функции
- •Программа 27. Поиск максимума функции
- •10.7.Ссылки
- •Программа 28. Использование ссылок
- •10.8.Операторы new и delete
- •Программа 29. Выделение и освобождение памяти
- •Задачи 125-134. Указатели и ссылки
- •Глава 11.О файлах и командной строке
- •11.1.Знакомство с файлами
- •Программа 30. Копирование файлов
- •11.2.Командная строка
- •11.3.Перенаправление стандартного ввода и вывода на файл
- •11.4.Аргументы командной строки
- •Программа 31. Эхо аргументов командной строки
- •Программа 32. Печать строк, содержащих образец
- •Задачи 135-147. Файлы и командная строка
- •Глава 12.Работа с экраном дисплея
- •12.1.Текстовый режим
- •Программа 33. Российский флаг
- •12.2.Графический режим
- •Графические драйверы и режимы
- •Инициализация графики
- •Функции рисования
- •Программа 34. Звезда
- •Задачи 148-158. Работа с экраном
- •Глава 13.Внутреннее представление чисел
- •13.1.Двоичная система счисления
- •13.2.Беззнаковые целые
- •13.3.Двоичный дополнительный код
- •13.4.Двоичный код с избытком
- •13.5.Побитовые операторы
- •Программа 35. Побитовые операторы
- •13.6.Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8.Преобразование типов
- •Значения логических выражений
- •Арифметические преобразования
- •Преобразование при присваивании
- •Явное приведение типа
- •Задачи 159-166. Побитовые операторы
- •Глава 14.Структуры, перечисления, объединения
- •14.1.Объявление структур
- •14.2.Структуры и функции
- •14.3.Указатели на структуры
- •Программа 36. Точки и прямоугольники на экране
- •14.4.Массивы структур
- •Программа 37. Подсчет ключевых слов
- •14.5.Перечисления
- •Программа 38. Использование перечислений
- •14.6. Объединения
- •Программа 39. Внутреннее представление float
- •14.7.Битовые поля
- •14.8.О бинарных файлах
- •Программа 40. Анализ успеваемости
- •Задачи 167-174. Структуры
- •Глава 15.Классы
- •Программа 41. Время как структура
- •15.2.Встроенные функции
- •15.3.Классы. Скрытие данных
- •Программа 42. Класс дат
- •15.4.Конструкторы
- •Программа 43. Конструкторы в классе дат
- •15.5.Статические члены класса
- •Программа 44. Размер класса и объектов класса
- •15.6.Друзья класса
- •Программа 45. Статические члены и друзья класса
- •15.7.Копирование объектов класса
- •Программа 46. Копирование объектов
- •15.8.Управление доступом
- •Структуры и классы
- •Правила доступа
- •15.9.Ссылка на себя
- •Программа 47. Модификация дат
- •15.10.Деструкторы
- •Программа 48. Деструктор в классе дат
- •Программа 49. Многоугольники
- •Задачи 175-185. Работа с классами
- •Глава 16.Программы из нескольких файлов
- •16.1.Работа с проектами
- •16.2.Область действия имен
- •Программа 50. Глобальные и локальные имена
- •Статические имена
- •Программа 51. Сумматор чисел
- •16.3.Заголовочные файлы
- •Страж включения
- •Понятие стека
- •Программа 52. Реализация стека в виде массива
- •16.4.Пространства имен
- •Стандартные пространства имен
- •Задачи 186-189. Работа со стеком
- •Глава 17.Перегрузка операторов
- •Программа 53. Обыкновенные дроби
- •17.1.Правила перегрузки операторов
- •Программа 54. Комплексные числа
- •Задачи 190-196. Перегрузка операторов
- •Глава 18.Конструктор копирования и оператор присваивания
- •18.1.Проблемы при копировании
- •Программа 55. Вектора на плоскости
- •Задачи 197-198. Конструктор копирования
- •Глава 19.Ввод и вывод
- •19.1.Вывод
- •19.2.Ввод
- •19.3.Ввод и вывод определяемых пользователем типов
- •Программа 56. Перегрузка операторов ввода/вывода
- •19.4.Работа с файлами
- •Программа 57. Сравнение текстового и бинарного файлов
- •Задачи 199-202. Ввод и вывод
- •Глава 20.Взаимоотношения классов
- •20.1.Объекты как члены класса
- •20.2.Конструкторы встроенных типов
- •Программа 58. Личные данные
- •20.3.Наследование
- •Пример наследования
- •Программа 59. Наследование
- •Управление доступом при наследовании
- •Наследование и конструкторы
- •Программа 60. Производный класс личных данных
- •20.4. Виртуальные функции
- •Программа 61. Невиртуальные функции
- •Программа 62. Виртуальные функции
- •20.5.Абстрактные классы
- •Программа 63. Абстрактный класс фигур
- •Вызов виртуальных функций
- •20.6. Совместимость типов
- •20.7.Множественное наследование
- •Программа 64. Системы уравнений Класс алгебраических векторов Vector
- •Класс прямоугольных матриц
- •Объявление класса Matrix
- •Реализация класса Matrix
- •Класс систем линейных уравнений
- •Пример использования классов
- •Задачи 203-212. Наследование классов
- •Глава 21.Шаблоны, исключения
- •21.1.Шаблоны
- •21.2.Шаблоны функций
- •Программа 65. Объявление и определение шаблона функции
- •21.3.Классы и шаблоны
- •Программа 66. Шаблон классов векторов
- •Программа 67. Шаблон классов динамических массивов
- •21.4.Обработка исключений
- •Программа 68. Расчет нод
- •21.5.Стандартная библиотека шаблонов
- •Программа 69. Использование шаблона векторов
- •Литература
- •Предметный указатель
- •603950, Н. Новгород, пр. Гагарина, 23
- •603000, Н. Новгород, ул. Б. Покровская, 37.
19.4.Работа с файлами
Для работы с файлами в программу следует включить файл fstream.h или fstream, в котором объявлены три следующих потоковых класса, обеспечивающие работу с файлами:
ofstream – класс выходных файловых потоков;
ifstream – класс входных файловых потоков;
fstream – класс двунаправленных файловых потоков.
Чтение из файла и запись в файл производятся с помощью объектов файловых потоковых классов (потоков), которые должны быть связаны с конкретными файлами на диске. Связь потока с файлом можно установить с помощью функции-члена open, или с помощью конструктора, аргументами которых должно быть имя файла. Функция open и конструкторы потоковых классов могут иметь по два аргумента. Первым аргументом является имя открываемого файла, а второй аргумент задает режим работы с файлом. Для указания режима работы с файлом можно использовать константы, определенные в базовом классе ios:
ios::out – файл используется для вывода;
ios::in – файл используется для ввода;
ios::app – добавления в конец файла.
Программа 57. Сравнение текстового и бинарного файлов
В программе создаются два выходных файловых потока: текстовый и бинарный. Потоки связываются с файлами конструктором, которому в качестве аргумента передаются имена файлов. В файлы записываются случайные числа соответственно в текстовом и бинарном виде. Созданные файлы закрываются и открываются вновь как бинарные, для передачи функции FileSize, определяющей их размеры. Чтобы прочитать содержимое файла, хранящего текстовое представление чисел, он сначала закрывается как бинарный, а затем открывается на ввод как текстовый. Файл с бинарным представлением чисел подготавливается к чтению перемещением текущего указателя к началу файла. Содержимое файлов выводится на экран.
// Файл CmpTxtBn.cpp
#include <stdlib>
#include <fstream>
#include <iostream>
#include <windows>
#include <time.h>
#include <conio>
const int lenname = 13; // Длина имени файла
using namespace std; // Открываем стандартное пространство имен
char Buff[500]; // Буфер для преобразованной строки
char* Rus(char* in) // Функция для преобразования русских букв
{
CharToOem(in, Buff); // Функция CharToOem преобразует строку in
return Buff; // в строку Buff, используя кодировку DOS
}
long FileSize(istream& f) // Возвращает размер файла в байтах
{ // f – ссылка на поток
long k; // Счетчик
for (k = 0; !f.eof(); k++) // Пока не достигнут конец файла,
f.get(); // читаем из него символ
f.clear(); // Сброс флагов ошибок потока
return k - 1;
}
В функции FileSize производится посимвольное чтение из файла, пока не будет достигнут его конец. Состояние «конец файла» не возникает после прочтения последнего символа, оно возникает после первой неудачной попытки прочитать из файла символ, поэтому возвращается не общее число k вызовов функции get, а значение k - 1, равное числу прочитанных из файла символов.
void main()
{
char* tf = "TxtFile.txt"; // Имя текстового файла
char* bf = "BinFile.bin"; // Имя бинарного файла
const int N =20; // Количество чисел
ofstream tout(tf, ios::out); // Создаем выходной текстовый поток
if(!tout){ // Проверяем открытие файла
cout<<Rus("\nНе могу создать файл") << tf;
cin.get();
exit(1);
}
ofstream bout(bf, ios::out | ios::binary); // Выходной бинарный поток
if(!bout){ // Проверка
cout<<Rus("\nНе могу создать файл") << bf;
cin.get();
exit(1);
}
int i, n;
randomize(); // Инициализация датчика случайных чисел
for(i = 0; i < N; i++){
n = rand(); // Генерируем числа
tout << ' ' << n; // и заносим в текстовый
bout.write((char*)&n, sizeof(int)); // и бинарный файлы
}
tout.close(); // Закрываем
bout.close(); // потоки
ifstream tin(tf, ios::binary); // Открываем оба файла на чтение
ifstream bin(bf, ios::binary); // как бинарные
cout << Rus("\nРазмер текстового файла ") << tf
<< " = " << FileSize(tin);
cout << Rus("\nРазмер биарного файла ") << bf
<< " = " << FileSize(bin);
tin.close(); // Закрываем файл с текстовым представление чисел,
tin.open(tf); // окрываем снова как текстовый
if(!tin){
cout<<Rus("\nНе могу открыть файл ") << tf;
cin.get();
exit(1);
}
// Вывод чисел из обоих файлов
cout << Rus("\nЧисла из файла ") << tf << endl;
while(tin.good()){ // Пока в потоке нет ошибок,
tin >> n; // читаем число из файла
cout << n << ' '; // и выводим на экран
if(wherex() > 60) // Если использовали более 60 позиций экрана,
cout << endl; // переходим на новую строку
}
bin.seekg(0, ios::beg); // Перемещаем текущий указатель файла
// к его началу
cout << Rus("\nЧисла из файла ") << bf << endl;
while(bin.good()){
bin.read((char*)&n, sizeof(int)); // Читаем байты числа
if(!bin.eof()) // Если после чтения не достигнут конец файла
cout << n << ' '; // выводим число
if(wherex() > 60)
cout << endl;
}
tin.close(); // Закрываем
bin.close(); // потоки
cin.get();
}
Для проверки возможности чтения из потока использована функция
bool good() const;
которая возвращает истину, если из потока возможно чтение. Эта функция более надежна, чем eof.
Функция
int wherex();
возвращает текущую горизонтальную координату курсора. Курсор переводится на новую строку экрана, если текущая координата курсора больше 60.
Для записи в текстовый файл и чтения из него использованы обычные операторы вывода << и ввода >>. Для записи в бинарный файл использована функция write, для чтения – read. Подробнее о них см. §14.8.
Далее приводятся результаты, выводимые программой. В тестовом файле числа хранятся в виде последовательностей десятичных цифр, разделенных пробелами. Если открыть файл TxtFile.txt, то увидим в нем числа в виде одной длинной строки. Если открыть бинарный файл в текстовом редакторе, то увидим непрерывную последовательность непонятных значков.
Размер бинарного файла равен 80 байт, так как в него записано 20 целых чисел, каждое их которых занимает 4 байта. Размер тестового файла оказался больше, так как многие числа пятизначные, кроме того между числами ставятся пробелы.
Размер текстового файла TxtFile.txt = 117
Размер бинарного файла BinFile.bin = 81
Числа из файла TxtFile.txt
5100 5643 23190 21957 16631 26794 23086 2043 29278 17418 25104
17502 3733 13662 20114 25132 14391 11375 31451 27970
Числа из файла BinFile.bin
5100 5643 23190 21957 16631 26794 23086 2043 29278 17418 25104
17502 3733 13662 20114 25132 14391 11375 31451 27970