Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Надейкина_ПРОГРАММИРОВАНИЕ_лабы5678.doc
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
795.14 Кб
Скачать

3.3 Задание на выполнение лабораторной работы

- Даны сведения о некоторых объектах, обладающих несколькими разнотипными характеристиками;

- Создать текстовой файл, в который поместить исходные данные.

- Определить структурный тип для представления данных в программе;

- Разработать структуру программы, схемы алгоритмов и программу обработки структурных данных конкретного варианта.

3.4 Порядок выполнения работы

1) Сформировать файл с исходными данными в соответствии с вариантом задания. В каждой строке файла должны располагаться записи характеристик одного из объектов данных.

2) Определить в соответствии с данными структурный тип.

3) Определить внешний массив структур данного типа.

4) Разработать алгоритмы и определить функции:

- подсчета количества записей (строк) в файле данных;

- удаления пробелов в начале и в конце символьных строк;

- ввода данных файла в массив структур;

- вывода строк шапки таблицы;

- вывода данных массива структур в файл результатов в виде таблицы;

- поиска и вывода элементов массива структур, поиск производить по одному признаку.

5) В главной функции произвести вызов функций.

6) Файл результатов должен содержать таблицу структурных данных, а также результаты поиска структур в массиве структур.

7) Провести отладку и тестирование программы.

8) Оформить и защитить отчет по лабораторной работе.

3.5 Пример выполнения лабораторной работы

Даны сведения об автомобилях: марка, цвет, цена, страна изготовитель, максимальная скорость. Исходные данные для создания массива структур поместить в файл данных (auto.txt) в виде, представленном на рис. 7.

Исходные данные для поиска по марке автомобиля показаны на рис.8 (файл poisk.txt).

Рисунок 7. Файл с исходными данными auto.txt

Рисунок 8. Файл с исходными данными poisk.txt

Текст программы

#include <iostream>

#include <windows.h>

#include <fstream>

#include <iomanip>

using namespace std;

ofstream fout; // определяется выходной файловый поток

ifstream fin; // определяется входной файловый поток

struct avto {

char mark [15]; //марка автомобиля;

char color [50]; //цвет;

double price; //цена;

char place [100]; //страна изготовитель;

unsigned int spid; //максимальная скорость;

};

avto B [10]; //объявляется массив из 10 структур типа avto

char sh [][256] = {" Автомобили ",

"|==============|=============|==========|=======================|======================|",

"|Марка |Цвет |Цена | Страна изготовитель | Максимальная скорость|",

"|==============|=============|==========|=======================|======================|",

"|------------------------|----------------------|-----------------|---------------------------------------|--------------------------------------|"

};

double s; //переменная для суммарной стоимости автомобилей

//------------Удаление пробелов вначале и в конце строки - параметра--------

void filtr (char* str) {

int x;

int xl = 0, // номер первого символа строки

xr = strlen(str)-1; //номер последнего символа строка

while (str[xl] == ' ') xl++;

while (str[xr] == ' ') xr--;

for (x = xl; x <= xr; x++)

str [x - xl] = str[x];

str [x - xl] = '\0';}

//---------------------Вывод строк шапки таблицы-------------------------

void psh () {

for (int i = 0; i<4; i++)

fout << sh [i] << endl;

}

//------------Определение количества записей в файле данных--------------

int number (char*filename) {

int n = 0; // счетчик записей;

char T [255]; // массив буфер;

fin.open (filename); //открытие файла данных;

if (!fin) {cout << "Ошибка при открытии файла данных";

system ("pause");

exit (0);

}

while (!fin.eof()) { //пока не достигли конца файла данных

fin.getline (T, 255); n++; //считываем строку файла, увеличиваем n

}

fin.close (); // закрываем файл данных;

return n; //возвращаем количество строк файла;

}

//---------------Ввод данных из файла и заполнение массива структур-----------

void vvod (avto B [10], int n, double & s, char*filename) {

//параметры: 1) массив структур, 2) количество записей в файле данных,

//3) ссылка для передачи суммарной стоимости, 4) строка - имя файла данных

int i; s = 0;

char T [80]; //массив буфер;

fin.open (filename); //открытие файла данных;

if (!fin) {cout << "Ошибка при открытии файла данных";

system ("pause"); exit (0);}

for (i = 0; i <n; i++) { //цикл считывания данных из файла в массив

fin.get (B[i]. mark, 15); filtr(B[i]. mark); //считывается марка автомобиля;

fin>>B[i].color>>B[i].price>>B[i].spid; //считывается цвет, цена, скорость;

fin.getline (B[i]. place, 99); filtr(B[i]. place); // страна изготовитель;

s += B[i]. price; // подсчитывается суммарная цена всех автомобилей;

} //из потока извлекается символ перехода на новую строку

fin.close ();

}

//-------------------------------Вывод массива структур--------------------------------

void vivod (avto B [10], int n) {

int i;

for (i = 0; i<n; i++)

fout << '|' << setw (14) << B[i]. mark << '|' << setw (13) << B[i]. color << '|'

<< setw (10) << B[i]. price << '|' << setw (23) << B[i]. place << '|' << setw (22)

<< B[i]. spid << '|' << endl;

fout <<sh [1] <<endl << "Суммарная стоимость автомобилей: " <<s;

}

//-----------------------Поиск по марке автомобиля----------------------------------

void poisk (avto *p, int n) {

//параметры: адрес первого элемента массива структур и кол-во

//заполненных структур в массиве

char name [20]; // строка для поискового признака;

fin.open ("poisk.txt"); //открытие файла данных для поиска;

if (!fin) {cout << "Ошибка открытия файла данных для поиска";

system("pause"); exit (0);}

fout << "\n\n Поиск по марке автомобиля \n";

while (!fin.eof()){ // пока не конец файла;

fin.getline (name, 20); //считываем из файла поисковый признак;

filtr (name);

if (!strcmp (name, "")){ //если это пустая строка

fout << "\nНет данных";

continue; //к следующей итерации цикла while;

}

//в противном случае

for (int i = 0; i <n; i++) //перебираем структуры из массива структур

if (strcmp (p[i]. mark, name) = = 0) { //если есть совпадение

fout << "\n|" << setw (10) << p[i]. mark << '|' << setw (8) << p[i]. color

<<'|'<< setw (9) << p[i]. price << '|' << setw (14) << p[i]. place

<<'|' << setw (13) << p[i]. spid << '|';

goto m;

}

//если перебрали все структуры массива, и совпадения не было

fout << "\n Марка " <<name << " не найдена";

m:;

} //тело цикла while

fin.close ();

}

int main () {

SetConsoleCP (1251);

SetConsoleOutputCP (1251);

fout.open ("r.cpp"); // создание и открытие файла результатов;

if (!fout) {cout << "Ошибка открытия файла результатов"; exit (0);}

//вызовы функций:

int n = number ("avto.txt"); //количество записей в файле;

vvod (B, n, s, "avto.txt");

psh ();

vivod (B, n);

poisk (B, n);

fout.close ();

return 0;

}

На рис. 9 представлен файл результатов программы (r.cpp)

Рисунок 9. Файл результатов r.cpp