Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

Массивы структур

Массивы могут содержать в себе не только данные основных типов, но структуры. Структурный массив – довольно удобная конструкция для применнения на практике, поскольку позволяет объединить данные различных типов. Синтаксис структурных массивов ничем не отличается от синтаксиса массивов на основе встроенных основных типов данных. Массивы структур могут быть как константными, так и динамическими, например:

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;

}