
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Массивы структур
Массивы могут содержать в себе не только данные основных типов, но структуры. Структурный массив – довольно удобная конструкция для применнения на практике, поскольку позволяет объединить данные различных типов. Синтаксис структурных массивов ничем не отличается от синтаксиса массивов на основе встроенных основных типов данных. Массивы структур могут быть как константными, так и динамическими, например:
Tovar t[200];
Tovar *tm = new Tovar [N];
Рассмотрим пример программы, позволяющей создавать базу данных склада товаров и хранить её в текстовом файле. Каждая строка файла содержит: наименование товара, идентификационный номер товара, стоимость товара.
…
const int N=30;
struct Tovar {
char name[N]; //наименование товара
int number; //номер товара
float cena;
};
int main() {
int K=0, i;
cout << "Skolko zapisei vy hotite dobavit? "; cin >> K;
Tovar *t = new Tovar [K]; //динамический массив структуры
for(i=0; i<K; i++) {
cout << "\n Zapis N " << i << endl;
cout << "Vvedite naimenovanie tovara: "; cin >> t[i].name;
cout << "Vvedite nomer tovara: "; cin >> t[i].number;
cout << "Vvedite stoimost tovara: "; cin >> t[i].cena;
}
ofstream fout("c:\\tovar\\tovarbd.txt", ios::app);
if(!fout) { cout << "\nOshibka otkrytiya faila!"; getch(); return 1; }
for(i=0; i<K; i++) {
fout << t[i].name << ' ' << t[i].number << ' ' << t[i].cena;
fout << endl;
}
cout << "\nDannye zapisany v fail.";
getch(); return 0;
}
Рассмотрим следующий пример программы, позволяющей считывать текстовый файл базы товаров и выводить все записи в упорядоченном по цене виде (сортировка по цене).
const int N=30;
struct Tovar {
char name[N]; //наименование товара
int number; //номер товара
float cena;
};
void sortmp_po_cene(Tovar tmas[], int R);
int main() {
int K=0, i=0;
char sim;
ifstream fin("c:\\tovar\\tovarbd.txt");
if(!fin) { cout << "\nOshibka otkrytiya faila!"; getch(); return 1; }
while(!fin.eof()) { //определяем кол-во строк базы
fin.get(sim);
if(sim=='\n') K++;
}
K=K-1; //т.к. последняя строка пустая
Tovar *t = new Tovar [K];
fin.close();
ifstream fin2("c:\\os\\tovar\\tovarbd.txt");
if(!fin2) { cout << "\nOshibka otkrytiya faila!"; getch(); return 1; }
while(i<K) {
fin2 >> t[i].name >> t[i].number >> t[i].cena;
i++;
}
fin2.close();
sortmp_po_cene(t, K); //отсортируем структурный массив по цене (по возрастанию)
for(i=0; i<K; i++) {
cout << "\n Zapis N " << i << endl;
cout << t[i].name << " " << t[i].number << " " << t[i].cena;
cout << endl;
}
getch(); return 0;
}
//---------------------------------------------------------------------------
void sortmp_po_cene(Tovar tmas[], int R) {
for(int i=0; i<R-1; i++) {
for(int j=i+1; j<R; j++) {
if(tmas[j].cena < tmas[i].cena) {
Tovar a = tmas[i]; tmas[i] = tmas[j]; tmas[j] = a;
}
}
}
}
Здесь мы применили алгоритм сортировки методом пузырька. Сначала первый элемент массива сравнивается по очереди с остальными элементами (начиная со второго). Если он больше, чем какой либо из элементов массива, то эти элементы меняются местами. Следовательно, нам станет известен первый элемент последовательности, самый маленький. Затем сравниваем второй элемент по очереди со всеми остальными, начиная с третьего, и вновь меняем местами элементы, если найдётся элемент меньший, чем второй. В результате будет известен уже второй элемент последовательности. Этот процесс продолжается далее для всех остальных элементов до предпоследнего.
Приведённые примеры программ показали, что массив структуры очень удобная для применения конструкция.
Д/З |
Измените рассмотренную программу таким образом, чтобы она позволяла сортировать считанную из файла информацию по наименованию товара и перезаписывать данный файл. Напишите также функцию для вычисления стоимости всех товаров, указанных в базе. |
Ответ |
void sortmp_po_name(Tovar tmas[], int R) { int i, j; for(i=0; i<R-1; i++) { for(j=i+1; j<R; j++) { if(tmas[j].name[0] < tmas[i].name[0]) { Tovar a = tmas[i]; tmas[i] = tmas[j]; tmas[j] = a; } } } ofstream fout("c:\\os\\tovar\\tovarbd_sort.txt"); if(!fout) { cout << "\nOshibka zapisi faila!"; getch(); return ; } for(i=0; i<R; i++) { fout << tmas[i].name << ' ' << tmas[i].number << ' ' << tmas[i].cena; fout << endl; } fout.close(); cout << "\n Fail otsortitovan i perezapisan!"; } //--------------------------------------------------------------------------- float sum_cena(Tovar tm[], int R) { float sumc=0; for(int i=0; i<R; i++) { sumc=sumc+tm[i].cena; } return sumc; } |