- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Дружественный класс
- •Использование указателя this
- •Композиция классов
- •Дружественные функции класса
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Специальные функции ввода-вывода строк
#include <stdio.h>
char str1[]=”Введите фамилию:”;
void main()
{char name[80];
puts(str1);
gets(name);
}
В последний элемент массива str1 нуль-символ’\0’ будет записан автоматически во время компиляции при инициализации массива. Для функции puts() наличие ’\0’ является обязательным. Функция gets() начинает работу только после нажатия <Enter> и завершает свою работу при вводе ‘\n’, который автоматически передается от клавиатуры при нажатии <Enter>. При этом сам символ ‘\n’ во вводимую строку не записывается. Вместо него помещается ’\0’.
Прототипы функций:
char* gets(char* s);
int puts(char* s);
Параметр функций одинаков – указатель на символ. Если строка прочитана удачно, gets() возвращает адрес массива s, в который производился ввод строки. В случае ошибки функция возвращает NULL. Функция puts() в случае успеха возвращает последний выведенный символ (‘\n’), - вместо ’\0’ добавляет ‘\n’. При ошибке – возвращает значение константы EOF (end of file). Константа EOF определена в stdio.h и имеет значение 0 или 1 (в зависимости от операционной системы).
Ввод-вывод символов в языке C++
1.С помощью операций ввода-вывода:
#include <iostream.h>
void main()
{char z;
cout<<”Напишите предложение с точкой в конце:”<<endl;
cin.unsetf(ios::skipws); //для ввода пробелов
for(z=’ ‘; z!=’.’;)
{cin>>z; //ввод символа с клавиатуры
cout>>z; //вывод символа на экран
}
}
По умолчанию операция >> пропускает символы-разделители. Чтобы изменить это, сбрасывают флаг skipws.
2.С помощью функций-элементов eof(), get(), put() класса потоков ввода-вывода:
#include <iostream.h>
void main()
{ int c;
cout<<”До ввода cin.eof() равно:”<<cin.eof()<<endl
<<”Введите предложение, завершающееся признаком конца файла:”
<<endl;
while((c=cin.get())!=EOF) cout.put(c);
cout<<endl<<”EOF равно:”<<c<<endl;
cout<<”После ввода cin.eof() равно:”<<cin.eof()<<endl;
}
Результат:
До ввода cin.eof() равно:0
Введите предложение, завершающееся признаком конца файла:
Проверка функций-элементов get и put ^Z
Проверка функций-элементов get и put
EOF равно:-1
После ввода cin.eof() равно:1
Примечание. Функции-элементы eof(), get(), put() используются с объектами cin и cout класса iostream потоков ввода-вывода.
Ввод-вывод строк в языке C++
1.С помощью операций ввода-вывода:
#include <iostream.h>
…………………
char word[20];
……………….
cin>>word;
…………….
cout<<word;
Оператор ввода считывает символы до тех пор, пока не встретится символ-разделитель: пробел, символ табуляции, символ новой строки или символ конца файла. Вводимая строка должна быть не длиннее 19 символов, чтобы оставить место для завершающего ’\0’. Для гарантии добавляют:
#include <iomanip.h>
………………..
cin>>setw(19)>>word;
Этот оператор указывает, что cin может считать не более 19 символов в массив word и оставить 20-й символ в массиве для ’\0’.
2.С помощью функции-элемента getline() класса потоков ввода-вывода:
char s[80];
………….
cin.getline(s, 80, ‘\n’);
Функция считывает строку текста с клавиатуры в массив s. Прекращает считывание символов, если встретится ‘\n’, или символ конца файла, или количество считанных символов окажется 79 (последний символ резервируется для ’\0’). Если встретится символ-ограничитель (‘\n’, конец файла), он считывается и отбрасывается, вместо него - ’\0’. Третий аргумент (‘\n’) можно опустить, так как функция getline имеет его по умолчанию: cin.getline(s, 80);
Примечание. В среде Builder используются строки типа AnsiString.
char* str1=”привет!”;
AnsiString str2=”привет!”;
Общее свойство строк типа char* и типа AnsiString – завершаются символом’\0’. Отличие: первый символ ‘п’ находится в str1[0] и в str2[1].
Преобразование строки типа char* в строку типа AnsiString:
(AnsiString)(строка типа char*);(вторые скобки необязательны).
Преобразование строки типа AnsiString в строку типа char*:
(строка типа AnsiString).c_str(); (скобки необязательны).
