Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Цвинтарный Иван 362-1 Лабораторная работа 9.docx
Скачиваний:
2
Добавлен:
21.06.2023
Размер:
52.84 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра промышленной электроники (ПрЭ)

ОТЧЁТ

по результатам лабораторной работы №9

по дисциплине «Информатика»

Структуры

Выполнил

Студент гр. 362-1

________ Цвинтарный И.В.

«___» __________

Проверил

Преподаватель

_____________ Савин Д.А.

«___»__________

Томск 2022

Оглавление

Введение 3

1. Ход работы 4

2. Индивидуальное задание 5

3. Программный код – текст программы 5

4. Результаты работы программы 11

Заключение 12

Введение

В девятой лабораторной работе нам необходимо освоить работу со структурами данных. Научиться создавать новый комбинированный тип данных – структуру. Научиться обращаться к статическим и динамическим переменным этого типа и к массиву структур. Закрепить навыки работы с файлами и символьными строками.

1. Ход работы

1. Задать структуру для хранения данных в соответствии с индивидуальным заданием (Таблица 18, столбец «Данные»), и написать подпрограммы, выполняющую заданные действия над структурой данных (Таблица 18, столбец «Операции»).

2. Создать массив для хранения переменных (объектов) заданной структуры. Заполнить массив структур, прочитав данные из текстового файла (не менее 10 объектов).

3. Задать в программе динамическую переменную типа заданной структуры. Заполнить ее, вводя значения полей с клавиатуры, и поместить (вставить) в массив структур. При вводе осуществлять проверку правильности (разумности) вводимых значений.

4. Результаты работы программы записать в текстовый файл результатов.

5. Реализовать в программе простейшее интерактивное меню для организации последовательного выполнения задания и вывода результатов.

6. По выполненной лабораторной работе подготовить отчет с результатами работы программы. В отчет вставить листинг программного кода, файл данных и файл результатов.

2. Индивидуальное задание

Вариант индивидуального задания – 23.

Рисунок 2.1 – Формулировка задания

3. Программный код – текст программы

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <fstream>

#include <conio.h>

using namespace std;

struct store

{

char material[100]; //материал

unsigned int price_rubles; //стоимость в рублях

char date[16]; //дата поставки

unsigned int total; //количество на складе

unsigned int velocity_day; //скорость расходования в день

};

ofstream fo;

void print(store b);

int load_lib(store lib[], const char* file); //загрузка данных

void print_lib(store lib[], int count); //вывод данных

void print_menu(); //интеррактивное меню

int new_material(store lib[], int count); //динамическая переменная

void sum(store lib[], int count); //расчеты стоимости всех материалов

void find_material(store lib[], int count); //заканчивающийся материал

void find_dates(store lib[], int count); //найти заканчивающийся материал к определенной дате

int main()

{

setlocale(LC_ALL, "RUS");

fo.open("result.txt");

store lib[80];

int count = 0;

while (true)

{

print_menu();

char ch = _getch();

switch (ch)

{

case '0': return 0;

break;

case '1':

if (count == 0)

count = load_lib(lib, "Store_in.txt");

if (count == -1)

{

cout << "Загрузка не удалась!" << endl;

fo << "Загрузка не удалась!" << endl;

count = 0;

}

break;

case '2':

if (count == 0)

{

cout << "Данные еще не загружены!" << endl;

fo << "Данные еще не загружены!" << endl;

}

else

print_lib(lib, count);

break;

case '3':

if (count == 0)

{

cout << "Данные еще не загружены!" << endl;

fo << "Данные еще не загружены!" << endl;

}

else

count = new_material(lib, count);

break;

case '4':

if (count == 0)

{

cout << "Данные еще не загружены!" << endl;

fo << "Данные еще не загружены!" << endl;

}

else

sum(lib, count);

break;

case '5':

if (count == 0)

{

cout << "Данные еще не загружены!" << endl;

fo << "Данные еще не загружены!" << endl;

}

else

find_material(lib, count);

break;

case '6':

if (count == 0)

{

cout << "Данные еще не загружены!" << endl;

fo << "Данные еще не загружены!" << endl;

}

else

find_dates(lib, count);

default:

cout << "Введена неизвестная команда!" << endl;

fo << "Введена неизвестная команда!" << endl;

break;

}

}

}

void print(store b)

{

cout << "Название материала: " << b.material << endl;

cout << "Стоимость в рублях: " << b.price_rubles << endl;

cout << "Дата поставки: " << b.date << endl;

cout << "Количество на складе: " << b.total << endl;

cout << "Скорость расходования: " << b.velocity_day << endl;

cout << endl;

}

int load_lib(store lib[], const char* file)

{

ifstream fi;

fi.open(file);

if (!fi.is_open())

{

cout << "Не удалось открыть файл " << file << endl;

fo << "Не удалось открыть файл " << file << endl;

return -1;

}

char buff[200];

fi.getline(buff, 200);

int count = atoi(buff);

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

{

if (fi.eof())

{

cout << "Не удалось прочитать данные из файла" << file << endl;

fo << "Не удалось прочитать данные из файла" << file << endl;

fi.close();

return -1;

}

fi.getline(lib[i].material, 100);

fi.getline(buff, 200);

lib[i].price_rubles = atoi(buff);

fi.getline(lib[i].date, 16);

fi.getline(buff, 200);

lib[i].total = atoi(buff);

fi.getline(buff, 200);

lib[i].velocity_day = atoi(buff);

}

fi.close();

return count;

}

void print_lib(store lib[], int count)

{

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

{

cout << "Материал " << i + 1 << endl;

print(lib[i]);

}

}

void print_menu()

{

cout << endl;

cout << "Выберите действие:" << endl;

cout << "0 - Выход из программы" << endl;

cout << "1 - Загрузить данные из файла" << endl;

cout << "2 - Вывести данные на экран" << endl;

cout << "3 - Добавить информацию о материале" << endl;

cout << "4 - Суммарная стоимость всех материалов на складе" << endl;

cout << "5 - Найти материал, который раньше кончится остальных" << endl;

cout << "6 - Найти материал, который кончится к определенной дате" << endl;

}

int new_material(store lib[], int count)

{

char buff[100];

store* p = new store;

cout << "Введите название материала: ";

cin.getline(p->material, 100);

cout << "Введите стоимость в рублях:";

cin.getline(buff, 100);

p->price_rubles = atoi(buff);

cout << "Введите дату поставки: ";

cin.getline(p->date, 16);

bool correct = false;

while (!correct)

{

cout << "Введите количество матерала на складе: ";

cin.getline(buff, 100);

p->total = atoi(buff);

if (p->total > 100000 || p->total < 0)

{

cout << "Введено некорректное число" << endl;

fo << "Введено некорректное число" << endl;

}

else

correct = true;

}

correct = false;

while (!correct)

{

cout << "Введите скорость расходывания: ";

cin.getline(buff, 100);

p->velocity_day = atoi(buff);

if (p->velocity_day > 1000 || p->velocity_day < 0)

{

cout << "Введено некорректное число" << endl;

fo << "Введено некорректное число" << endl;

}

else

correct = true;

}

strcpy(lib[count].material, p->material);

lib[count].price_rubles = p->price_rubles;

strcpy(lib[count].date, p->date);

lib[count].total = p->total;

lib[count].velocity_day = p->velocity_day;

delete p;

return count + 1;

}

void sum(store lib[], int count)

{

unsigned int total_cost = 0;

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

{

total_cost += lib[i].price_rubles * lib[i].total;

}

cout << "Общая стоимость всех материалов: " << total_cost << " руб." << endl;

fo << "Общая стоимость всех материалов: " << total_cost << " руб." << endl;

}

void find_material(store lib[], int count)

{

int min_time = INT_MAX; // присваиваем переменной "минимальное время" максимальное значение, чтобы сравнивать

int index = -1; //индекс материала, который кончится раньше остальных

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

{

int time_end = lib[i].total / lib[i].velocity_day;

if (time_end < min_time)

{

min_time = time_end;

index = i;

}

}

if (index != -1)

{

cout << "Материал, который кончится раньше остальных: " << lib[index].material << endl;

fo << "Материал, который кончится раньше остальных: " << lib[index].material << endl;

}

else

{

cout << "Нет данных о материалах!" << endl;

fo << "Нет данных о материалах!" << endl;

}

}

void find_dates(store lib[], int count)

{

int day1, month1, year1;

int day2, month2, year2;

cout << "Введите сегодняшнюю дату в формате [день].[месяц].[год]: "; // считываем первую дату

if (scanf("%d.%d.%d", &day1, &month1, &year1) != 3) //проверяем на корректность ввода

{

cout << "Неверный формат даты!" << endl;

fo << "Неверный формат даты!" << endl;

return;

}

cout << "Введите дату для поиска заканчивающегося материала в формате [день].[месяц].[год]: "; //считываем вторую дату

if (scanf("%d.%d.%d", &day2, &month2, &year2) != 3)

{

cout << "Неверный формат даты!" << endl;

fo << "Неверный формат даты!" << endl;

return;

}

int diff = (day2 + month2 * 30 + year2 * 365) - (day1 + month1 * 30 + year1 * 365); //вычисляем разницу между датами

bool found = false;

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

{

if ((lib[i].total / lib[i].velocity_day) < diff) //сравниваем

{

found = true;

cout << "Материал " << lib[i].material << " закончится раньше даты " << endl;

fo << "Материал " << lib[i].material << " закончится раньше даты " << endl;

}

}

if (!found)

{

cout << "Ни один материал не закончится раньше этой даты" << endl;

fo << "Ни один материал не закончится раньше этой даты" << endl;

}

}