- •Экзамен 374 Предварительные рассуждения Вступительное слово
- •Исторические факты
- •Начнем!
- •Проба пера
- •Открытие сохраненного проекта
- •Вывод данных
- •Типы данных
- •Хороший стиль программирования
- •Переменные и константы
- •Практический пример
- •Ввод данных
- •Например:
- •Пример:
- •Арифметические операции с числами
- •Литералы
- •Некоторые примеры
- •Домашнее задание
- •Напишите программу, которая вводит число из трех цифр, разделяет число на отдельные цифры и печатает их отдельно друг от друга с тремя пробелами между ними. Преобразование типов
- •Перечисляемые типы
- •Типичная ошибка
- •Хороший стиль программирования
- •Типичная ошибка
- •Выражения
- •Оператор if
- •Структура программы
- •Логические операции
- •Структура множественного выбора switch
- •Практический пример
- •Цикл for
- •Практический пример
- •Цикл do-while
- •Домашнее задание
- •Вызов функции
- •Прототипы функций
- •Разбор программы
- •Область видимости
- •Аргументы по умолчанию
- •Встраивание
- •Перегрузка функций
- •Учебный пример перегруженных функций. Иллюстрация перегрузки
- •Результат работы программы
- •Практические примеры
- •Домашнее задание
- •Примеры домашней работы урока 1 Пример №1
- •Как работает программа
- •Пример №2
- •Как работает программа
- •Примеры домашних работ на создание функций Пример №1
- •Как работает программа
- •Пример №2
- •Как работает программа
- •Массивы
- •Объявление массивов
- •Примеры использования массивов
- •Программа 1
- •Программа 2
- •Обратите внимание!
- •Типичная ошибка программирования
- •Типичная ошибка программирования
- •Программа 3
- •Типичная ошибка программирования
- •Замечание по технике программирования
- •Программа 4
- •Программа 5
- •Программа нахождения минимального и максимального элементов массива
- •Сортировка массивов
- •Домашнее задание
- •Что такое указатели?
- •За кулисами...
- •Как работать с указателями?..
- •Зачем нужны указатели?
- •Указатели и Массивы.
- •Примеры задач
- •Пример 1
- •Пример 2
- •Пример 3
- •Указатели - аргументы функций.
- •Ссылочные параметры
- •Примеры решения задач
- •Домашнее задание
- •Операторы свободной памяти new и delete
- •Функции работы со строками из библиотеки обработки строк
- •Пример 1.
- •Пример2
- •Пример 3
- •Пример задачи на новый материал
- •Домашнее задание
- •Двухмерные массивы, как частный случай многомерных массивов
- •Программа.
- •Результаты работы программы.
- •Многомерные динамические массивы
- •Пример на многомерные динамические массивы
- •Домашнее задание
- •Рекурсия
- •Рекурсии или итерации
- •Указатели на функции
- •Пример №1
- •Результат выполнения программы:
- •Пример №2
- •Результат выполнения программы
- •Пример №3
- •Результаты выполнения программы
- •Определения структур
- •Пример #1 на использование структур
- •Пример #2 на использование структур
- •Оператор указателя на структуру
- •Домашнее задание
- •Тест по c Группа ___________________ф. И. О. ______________________
- •Объектно-ориентированное программирование.
- •Наследование (Inheritance).
- •Инкапсуляция (Encapsulation).
- •Определение класса
- •Конструкторы и деструкторы Инициализация объектов класса: конструкторы
- •Основное назначение конструкторов - инициализация объектов.
- •Использование конструкторов с аргументами по умолчанию
- •Если параметры не передаются конструктору, в определении объекта не нужно включать пустые круглые скобки.
- •Использование деструкторов
- •Когда вызываются конструкторы и деструкторы.
- •Домашнее задание
- •Конструктор копирования
- •Синтаксис конструктора копирования
- •Памятка
- •Пример использования конструктора копирования.
- •Перегруженные конструкторы
- •Экскурс в историю
- •Послесловие к примеру
- •Маленькое замечание
- •Домашнее задание
- •Создание класса ''строка''
- •Перегрузка операций.
- •Общие принципы перегрузки операторов.
- •Преобразования, определяемые классом
- •Пример строкового класса с перегруженными операторами
- •Домашнее задание
- •Дружественные функции (Friend Functions)
- •Пример строкового класса с перегруженными операторами и дружественными функциями
- •Перегрузка операторов new и delete
- •Перегрузка оператора индексирования
- •Класс вектор. Часть1.
- •Класс вектор. Часть 2.
- •Класс вектор. Часть 3.
- •Домашнее задание
- •Наследование (Inheritance). Часть 1.
- •Наследование (Inheritance). Часть 2.
- •Множественное наследование (multiple inheritance)
- •Пример множественного наследования
- •Домашнее задание
- •Статические члены данных
- •Раннее и позднее связывание
- •Виртуальные функции
- •Пример.
- •Абстрактные классы
- •Виртуальный базовый класс
- •Практический пример
- •Домашнее задание
- •Потоки ввода-вывода.
- •Iostream.H: stream - поток, "I" - сокр. Input - ввод, "o" - сокр. Output - вывод.
- •Предопределенные потоки.
- •Операции помещения в поток и извлечения из потока.
- •Файловый ввод-вывод с применением потоков.
- •Конструкторы файловых потоков.
- •Функции для открытия и закрытия файлов.
- •Функции для обмена с потоками.
- •Часто применяемые функции потока.
- •Ввод/вывод массива в/из файл(-а).
- •Практический пример: перекодировка файла.
- •Домашнее задание
- •Немного о файлах...
- •И снова файлы...
- •Пример "Телефонная книга"
- •Файл abonent.H
- •Форматирование данных при обменах с потоками.
- •Состояние потока.
- •Использование аргументов командной строки.
- •Ввод/вывод в с.
- •Домашнее задание
- •Определение шаблонов функций
- •Переопределение шаблонов функций
- •Шаблоны классов
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Введение
- •Обработка исключительных ситуаций
- •Практический пример
- •Программа
- •Домашнее задание
- •Экзамен
Пример на многомерные динамические массивы
/*
Рассмотрим следующую задачу: необходимо создать массив, позволяющий создавать строки и работать с ними (аналог справочника). Для работы с этим массивом строк определен такой набор операций:
1) добавление строки в конец массива;
2) вставка строки в массив по заданному индексу;
3) удаление строки из массива по заданному индексу;
4) очистка массива (удаление всех строк);
5) вывод на экран содержимого массива.
*/
#include <iostream.h>
#include <string.h>
// Набор констант, представляющих различные пункты меню
enum {ChoiceAddEnd=1, ChoiceInsert, ChoiceDelete, ChoiceDeleteAll, ChoicePrint, ChoiceQuit};
int Menu(); // Вывод меню
char** AddLine(char**, int&); // Добавление строки в конец массива
char** InsLine(char**, int&); // Вставка строки в массив
char** DelLine(char**, int&); // Удаление указанной строки из массива
void DelAllLines(char**, int&); // Удаление всех строк массива
void Print(char**, int); // Распечатка строк массива
bool IsArrayEmpty(int&); // Проверка на наличие строк в массиве
void main()
{
char **c; // Массив строк
int m = 0; // Начальное количество строк массива
int choice = ChoiceAddEnd;
while (choice != ChoiceQuit) // Пока не выбран пункт ВЫХОД
{
choice = Menu(); // Вывод меню
cin.ignore(1); // Очистка потока ввода
switch (choice) // Выбор пункта меню
{
case ChoiceAddEnd:
c = AddLine(c, m); // Добавление строки в конец массива
break;
case ChoiceInsert:
c = InsLine(c, m); // Вставка строки в массив
break;
case ChoiceDelete:
if (!IsArrayEmpty(m)) // Если массив не пуст
c = DelLine(c, m); // Удаление строки
break;
case ChoiceDeleteAll:
if (!IsArrayEmpty(m)) // Если массив не пуст
DelAllLines(c, m); // Удаление всех строк массива
break;
case ChoicePrint:
if (!IsArrayEmpty(m)) // Если массив не пуст
Print(c, m); // Распечатка массива
break;
case ChoiceQuit:
break;
default: // В остальных случаях
cout << "Error in choice!\n";
break;
}
}
}
char** AddLine(char **c, int &m)
// Добавление строки в конец массива
{
char str[256]; // Массив для ввода новой строки
int n; // Длина введенной строки
int i;
cout << "Input string: ";
cin.getline(str, 256); // Ввод строки
n = strlen(str); // Вычисление длины новой строки
if (m == 0) // Если массив строк пуст
{
m++;
c = new char*[m];
c[0] = new char[n + 1]; // Создаем новую строку в массиве строк
strcpy(c[0], str);
}
else
{
char** t = new char*[m + 1];// Временный массив строк
for(i = 0; i < m; i++)
{
t[i] = new char[strlen(c[i]) + 1];
strcpy(t[i], c[i]); // Копирование строк
}
t[m] = new char[n + 1];
strcpy(t[m], str); // Копирование новой строки
for(i = 0; i < m; i++)
delete [] c[i];
delete [] c; // Удаление массива строк
m++;
c = new char*[m];
for(i = 0; i < m; i++)
{
c[i] = new char[strlen(t[i]) + 1];
strcpy(c[i], t[i]); // Создание нового массива строк
}
for(i = 0; i < m; i++)
delete [] t[i];
delete [] t; // Удаление временного массива строк
}
return c; // Возврат нового адреса массива строк
}
char** InsLine(char **c, int &m)
// Вставка строки в массив
{
char str[256]; // Массив для ввода новой строки
int n; // Длина введенной строки
int k; // Позиция новой строки в массиве
int i, j = 0;
cout << "Input string: ";
cin.getline(str, 256);
cout << "Input position # (0-" << m << "): ";
cin >> k;
while(k < 0 || k > m) // Проверка на ошибочный ввод
{
cout << "Error !!!\nInput position # (0-" << m << "): ";
cin >> k;
}
n = strlen(str); // Длина новой строки
if (m == 0) // Если массив строк пуст
{
m++;
c = new char*[m];
c[0] = new char[n + 1]; // Создаем новую строку в массиве строк
strcpy(c[0], str);
}
else
{
char** t = new char*[m + 1];// Временный массив строк
for(i = 0; i < m + 1; i++)
{
if (i == k)
{
t[i] = new char[strlen(str) + 1];
strcpy(t[i], str); // Вставка новой строки
j = 1;
}
else
{
t[i] = new char[strlen(c[i - j]) + 1];
strcpy(t[i], c[i - j]); // Копирование остальных строк
}
}
for(i = 0; i < m; i++)
delete [] c[i];
delete [] c; // Удаление массива строк
m++;
c = new char*[m];
for(i = 0; i < m; i++)
{
c[i] = new char[strlen(t[i]) + 1];
strcpy(c[i], t[i]); // Создание нового массива строк
}
for(i = 0; i < m; i++)
delete [] t[i];
delete [] t; // Удаление временного массива строк
}
return c; // Возврат нового адреса массива строк
}
char** DelLine(char **c, int &m)
// Удаление указанной строки из массива
{
int k; // Индекс удаляемой строки
int i, j = 0;
cout << "Input deleting position #: ";
cin >> k;
while(k < 0) // Проверка на ошибочный ввод
{
cout << "Error !!!\nInput deleting position #: ";
cin >> k;
}
char** t = new char*[m - 1];// Создание временного массива строк
for(i = 0; i < m - 1; i++)
{
if (i == k)
j = 1;
t[i] = new char[strlen(c[i + j]) + 1];
strcpy(t[i], c[i + j]); // Копирование оставшихся строк массива
}
for(i = 0; i < m; i++)
delete [] c[i];
delete [] c; // Удаление массива строк
m--;
c = new char*[m];
for(i = 0; i < m; i++)
{
c[i] = new char[strlen(t[i]) + 1];
strcpy(c[i], t[i]); // Создание нового массива строк
}
for(i = 0; i < m; i++)
delete [] t[i]; // Удаление временного массива строк
delete [] t;
return c; // Возврат нового адреса массива строк
}
void DelAllLines(char **c, int &m)
// Удаление всех строк массива
{
for(int i = 0; i < m; i++)
delete [] c[i];
delete [] c; // Удаление всех строк массива
m = 0;
}
bool IsArrayEmpty(int &m)
// Возвращает истину, если массив строк пуст; в обратном случае - ложь
{
if (m == 0)
{
cout << "Your line array is empty.\n";
return true;
}
else
return false;
}
int Menu()
// Вывод меню
{
int choice;
cout << "\n******* Menu *******\n";
cout << "1-Add 2-Insert 3-Delete 4-Delete All 5-Print 6-Quit\n";
cin >> choice; // Выбор пункта меню
if(choice < 0 || choice > 6) // Проверка выбора
choice = 0;
return choice; // Возвращение выбранного пункта
}
void Print(char **c, int m)
// Распечатка массива строк
{
for(int i = 0; i < m; i++)
cout << i << ": " << c[i] << endl;
}
/*
На экран выводится приглашение пользователю выбрать тот или иной пункт меню, после выбора которого выполняется соответствующее действие.
*/