
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Очереди
Очередь – это частный случай однонаправленного списка, добавление элементов в который выполняется в один конец, а выборка – из другого конца. Таким образом, для очереди определены всего две операции: помещение в конец и выборка из начала. При выборке элемент удаляется из очереди (аналогично стеку и в противоположность списку). Очередь реализует принцип обслуживания FIFO (первым пришёл – первым ушёл). В программировании очереди применяются, например при диспетчеризации задач ОС, буферизованном вводе/выводе.
Рассмотрим программу, которая формирует очередь из пяти целых чисел и выводит её на экран. Указатель на начало очереди назовём pbeg, а указатель на конец – pend.
struct Node {
int d;
Node *p;
};
//---------------------------Начальное формирование очереди:
Node* first(int d)
{
Node *pv = new Node;
pv->d = d; pv->p = 0;
return pv;
}
//---------------------------Добавление в конец:
void add(Node **pend, int d)
{
Node *pv = new Node;
pv->d = d; pv->p = 0;
(*pend)->p = pv;
*pend = pv;
}
//---------------------------Выборка:
int del(Node **pbeg)
{
int temp = (*pbeg)->d;
Node *pv = *pbeg;
*pbeg = (*pbeg)->p;
delete pv;
return temp;
}
//---------------------------Главная функция:
int main(int argc, char* argv[])
{
Node *pbeg = first(1);
Node *pend = pbeg;
for(int i=2; i<6; i++) add(&pend, i);
while(pbeg) cout << del(&pbeg) << ' ';
return 0;
}
Результат работы программы: 1 2 3 4 5 .
Из кода этой программы видно, что у неё очень много общего с предыдущей. Функции начального формирования очереди и стека, а также функции выборки абсолютно идентичны. Функция first формирует первый элемент очереди и возвращает указатель на него. Функция add выполняет добавление в конец, поэтому ей передаётся указатель на конец очереди и элемент, который следует добавить. Выборка выполняется из начала очереди, при этом указатель на её начало изменяется.
Контрольная работа
Пусть существует программа, которая считывает записи из бинарного файла и формирует динамический массив структуры Tovar. Напишите часть главной функции, которая в зависимости от желания пользователя, позволяет вызывать функцию редактирования записей. Напишите эту функцию редактирования, которая позволяет редактировать данные указанного пользователем товара и по желанию пользователя сохранять изменения (перезаписывать файл).
…
int main() {
…
cout << "\n Budete redaktirovat?(y/n): "; cin >> ans;
if(ans=='y') redakt_po_name(ma, KZ);
cout << "\n Sohranit izmeneniya?(y/n): "; cin >> ans;
if(ans=='y') savefile(ma, KZ, dlz);
…
}
void redakt_po_name(Avia *tb, int& N) {
char namer[R];
cout << "\n Ukagite naimenovanie reisa: "; cin >> namer;
int l = strlen(namer);
int ks=0; //кол-во совпадений
for(int i=0; i<N; i++) {
if(strncmp(namer, tb[i].reis, l)==NULL) {
cout << "\nVvedite novoe imya reisa: "; cin >> tb[i].reis;
cout << "\nVvedite tip samoleta: "; cin >> tb[i].tips;
cout << "\nVvedite kol. prod. biletov: "; cin >> tb[i].kpb;
cout << "\nVvedite stoimost bileta: "; cin >> tb[i].cb;
ks++;
}
}
if(ks==0) { cout << "\n Takogo reisa net !"; }
}
//---------------------------------------------------------------------------
void savefile(Avia m[], int M, int dz) {
ofstream fout("c:\\os\\aviabase3_red.dat", ios::binary);
if(!fout) { cout << "\n Oshibka zapisi v fail!"; getch(); return ; }
fout.write(reinterpret_cast<char*>(m), M*dz);
fout.close();
}
Лекция 4 (14,5 стр.)