Работа с динамическими массивами структур. Отчёт. Лаб. № 1. Лабораторная работа 1. Работа с динамическими массивами структур. Руководитель подпись, дата инициалы, фамилия
Скачать 321.6 Kb.
|
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «» Институт Кафедра ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ Языки программирования
Руководитель .. подпись, дата инициалы, фамилия Обучающийся -, .. номер группы, зачетной книжки подпись, дата инициалы, фамилия 2020 г. ЦЕЛЬ РАБОТЫЦель работы: Получение практических навыков разработки и отладки программ с использованием динамических массивов структур. Необходимо разработать программу, формирующую и обрабатывающую массив структур (согласно варианту задания). Для каждого действия, выполняемого над массивом структур, необходимо разработать отдельную функцию. В main продемонстрировать работу функций. В зависимости от оценки, на которую вы претендуете, необходимо выполнить следующие задания (для каждой следующей оценки нужно выполнить ВСЕ предыдущие задания) ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУПорядок выполнения работы: 1.Ознакомиться с общей постановкой задачи. 2.Ознакомится с вариантом задания – соответствует вашему номеру в списке группы (при нехватке заданий вариант задания вычисляется как нoмер_в_списке_группы -количество_заданий). 3.Разработать блок-схему алгоритма решения поставленной задачи. 4.Написать и отладить программу на подготовленных наборах тестовых данных. 5.Подготовить отчет по лабораторной работе. Отчет должен включать в себя: титульный лист; цель лабораторной работы; постановку задачи; блок-схему алгоритма решения поставленной задачи; текст программы с комментариями; наборы тестовых исходных данных с соответствующими результатами работы программы (5 и более тестовых наборов); краткие ответы на контрольные вопросы; выводы по лабораторной работе. 6.Защитить лабораторную работу перед преподавателем.
Вариант 18. Создайте структуру Расписание с элементами Номер электрички, Направление, Длина состава (1). Заполните массив элементов Расписание (2, 6). Написать функцию по нахождению всех электричек, двигающихся в определенном направлении (направление задаёт пользователь) (4). Провести сортировку массива по длине состава (8). ХОД РАБОТЫСодержимое файла с данными для массива структуры: Содержимое программы: #include #include #include #include #include #include #include using namespace std; struct Schedule //1. Объявление структуры { char path[20]; int number; int lenght; }; int In(Schedule*& sch) //2. Функция заполнения массива структуры данными с клавиатуры { int n; cout << "Enter the number of trains: "; cin >> n; cout << "\n"; sch = new Schedule[n]; for (int i = 0; i < n; i++) { cout << "Train" << i + 1 << ": \n"; cout << "Enter path: "; cin >> sch[i].path; cout << "Enter number: "; cin >> sch[i].number; cout << "Enter lenght: "; cin >> sch[i].lenght; cout << endl; } return n; } void Out(int n, Schedule* sch) //3. Функция вывода данных из массива структуры в консоль { cout << "List of all Paths: \n"; for (int i = 0; i < n; i++) { cout << "Path: " << sch[i].path << ";"; cout << setw(15) << "Number: " << sch[i].number << ";"; cout << setw(15) << "Lenght: " << sch[i].lenght << ";"; cout << endl; } cout << endl; } void Sort(int n, Schedule* sch) //8. Функция сортировки данных массива структуры(по убыванию) { for (int i = 0; i < n; i++) { for (int j = 0; j < n - 1; j++) { if (sch[j].lenght < sch[j + 1].lenght) { swap(sch[j], sch[j + 1]); } } } } int Choice(int n, Schedule* sch, Schedule* ss, const char* s) //4. Функция обработки данных массива структуры(Выбор электричек с заданным путем) { int j = 0; for (int i = 0; i < n; i++) { if (strcmp(sch[i].path, s) == 0) { strcpy_s(ss[j].path, 20, sch[i].path); ss[j].number = sch[i].number; ss[j].lenght = sch[i].lenght; j++; } } return j; } void SortOut(int j, Schedule* ss, const char* s) //5. Функция вывода обработанных данных массива структуры { cout << "List (sorting by decending of lenght) of all train going on your (" << s << ") path: \n"; for (int i = 0; i < j; i++) { cout << "Path: " << ss[i].path << ";"; cout << setw(15) << "Number: " << ss[i].number << ";"; cout << setw(15) << "Lenhgt: " << ss[i].lenght << ";"; cout << endl; } cout << endl; } int TxtIn(Schedule*& sch, char name[10]) //6. Функция заполнения массива структуры данными из файла { int n; ifstream inf(name); if (!inf) { cerr << "Error" << endl; exit(1); } inf >> n; sch = new Schedule[n]; for (int i = 0; i < n; i++) { inf >> sch[i].path; inf >> sch[i].number; inf >> sch[i].lenght; } inf.close(); return n; } void TxtOut(int n, Schedule* sch) // Функция вывода данных массива структуры в файл { ofstream outf("Out.txt"); if (!outf) { cerr << "ERROR" << endl; exit(1); } outf << "List of all Paths: \n"; for (int i = 0; i < n; i++) { outf << "Path: " << sch[i].path << ";"; outf << setw(15) << "Number: " << sch[i].number << ";"; outf << setw(15) << "Lenght: " << sch[i].lenght << ";"; outf << endl; } cout << endl; } void TxtSortOut(int j, Schedule* ss, const char* s) //7.9. Функция вывода в файл отсортированного массива структур { ofstream outf("Search.txt"); if (!outf) { cerr << "ERROR" << endl; exit(1); } outf << "List (sorting by decending of lenght) of all train going on your (" << s << ") path: \n"; for (int i = 0; i < j; i++) { outf << "Path: " << ss[i].path << ";"; outf << setw(15) << "Number: " << ss[i].number << ";"; //10. форматированный вывод данных с помощью манипуляторов форматирования outf << setw(15) << "Lenhgt: " << ss[i].lenght << ";"; outf << endl; } outf << endl; } int main() { int n, j; char path[20], name[10] = "In.txt"; char o[4]; cout << "Enter your path: "; gets_s(path); Schedule* sch = 0; cout << "How do you want enter data? Enter 'txt' or 'key': "; cin >> o; if (strcmp(o, "txt") == 0) { cout << "Enter file name: "; cin >> name; n = TxtIn(sch, name); Schedule* ss = new Schedule[n]; TxtOut(n, sch); Sort(n, sch); j = Choice(n, sch, ss, path); TxtSortOut(j, ss, path); delete[] sch; } else if (strcmp(o, "key") == 0) { n = In(sch); Schedule* ss = new Schedule[n]; Out(n, sch); Sort(n, sch); j = Choice(n, sch, ss, path); SortOut(j, ss, path); delete[] sch; system("pause"); } else cout << "Wrong answer"; return 0; } Содержимое файла для вывода информации после обработки: Объявление структуры: Функция заполнения массива структуры данными с клавиатуры: Пример работы: Функция вывода данных из массива структуры: Пример работы: Функция обработки данных массива структуры: Функция вывода обработанных данных массива структуры: Пример работы: Функция заполнения массива структуры данными из файла: Функция вывода данных массива структуры в файл: 9. функция вывода в файл отсортированного массива структур: 10. форматированный вывод данных с помощью манипуляторов форматирования: Пример работы: ОТВЕТЫ НА КОНТРОЛЬНЫЕ ВОПРОСЫ1.Как производится определение пользовательских функций в языке С++? Определение функции имеет следующий синтаксис: ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов) { ТелоФункции; ... return(ВозвращаемоеЗначение); } 2. Каков синтаксис вызова функции? Переменная = ИмяФункции(СписокФактическихАргументов); 3. Как происходит передача параметров в функцию по значению? При передаче аргументов по значению внешний объект, который передается в качестве аргумента в функцию, не может быть изменен в этой функции. В функцию передается само значение этого объекта. Например: ТипВозвращаемогоЗначения ИмяФункции(тип Аргумент) { Аргумент = Значение; } 4. Как происходит передача параметров в функцию по ссылке? ТипВозвращаемогоЗначения ИмяФункции(тип &Аргумент) { Аргумент = Значение; } int main() { ИмяФункции(переменная); } 5. Как происходит передача параметров в функцию по указателю? ТипВозвращаемогоЗначения ИмяФункции(тип *Аргумент) { *Аргумент = Значение; } int main() { ИмяФункции(&ИмяПеременной); } 6.Какого типа значения может возвращать функция? Как вернуть из функции несколько значений? Все функции, кроме функций типа void, возвращают значения. Либо ссылки, либо указатели, либо описать структуру, представляющую весь набор желаемых значений и возвращать её экземпляр 7.Как описываются структуры? struct имя_структуры { тип имя_элемента_1; ... Тип имя_элемента_N; }список_переменных; //! список_переменных необязателен 8. Способы объявления структурных переменных. Динамическое выделение памяти для массива структур. Объявление cтруктурной переменной аналогично объявлению обычной переменной встроенного типа, но в качестве названия типа служит имя структуры. имя_структуры имя_переменной; В случае, когда нужно прочитать массив структур, например, из файла, то можно написать отдельную функцию 9.Как обратиться к элементам структуры по указателю? Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Для доступа к элементам структуры используются конструкции: Имя_переменной.имя_поля указ_на_структуру->имя_поля 10.Передача структуры в функцию. Непосредственный доступ к компонентам структуры – плохой стиль программирования. Все операции, которые разрешены применительно к структуре, должны быть при этом реализованы в виде отдельных функций. 11.Как организуется доступ к файлам? Какие виды доступа вы знаете? В программах на C++ при работе с текстовыми файлами необходимо подключать библиотеки iostream и fstream. для того чтобы начать работать с текстовым файлом, необходимо описать переменную типа ofstream. 12.Каким образом можно считать/записать данные из текстового файла? описать переменную типа ofstream. открыть файл с помощью функции open. вывести информацию в файл. обязательно закрыть файл. Для считывания данных из текстового файла, необходимо: описать переменную типа ifstream. открыть файл с помощью функции open. считать информацию из файла, при считывании каждой порции данных необходимо проверять, достигнут ли конец файла. закрыть файл. ВЫВОДЫВ результате выполнения лабораторной работы мою были изучены динамические массивы структур, разработана программа, формирующая и обрабатывающая массив структур. |