Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Кашина_СП_ЛБ8

.docx
Скачиваний:
0
Добавлен:
22.09.2026
Размер:
490 Кб
Скачать

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

«Владимирский государственный университет

имени Александра Григорьевича и Николая Григорьевича Столетовых» (ВлГУ)

Колледж инновационных технологий и предпринимательства

КАФЕДРА ФИЗИКИ И ПРИКЛАДНОЙ МАТЕМАТИКИ

Лабораторная работа № 8

по дисциплине «Системное программирование»

на тему: «Работа с функциями и файлами»

Выполнил

студент группы ИПсп-123

Кашина Д. А.

Принял

Красильщикова В. В.

Владимир, 2026

Цель работы: восстановление навыков описания функций и работы с файлами на языке C++, получение навыков хранения в файле сложных структур данных и описания заголовочных файлов.

1 задание

Заголовочный файл Person.h

// person.h

#ifndef PERSON_H

#define PERSON_H

#include <string>

struct Person {

std::string lastName; // фамилия

std::string firstName; // имя

int age; // возраст

char gender; // пол ('M' или 'F')

};

#endif // PERSON_H

Код программы:

// save_program.cpp

#include <iostream>

#include <fstream>

#include <string>

#include "person.h"

#include <Windows.h>

using namespace std;

// Функция сохранения массива структур в файл

void save(Person* people, int size, const string& filename) {

ofstream outFile(filename);

if (!outFile.is_open()) {

cerr << "Ошибка открытия файла для записи!" << endl;

return;

}

// Сохраняем размер массива в первой строке

outFile << size << endl;

// Сохраняем каждую структуру в файл в виде одной строки

// Формат: фамилия|имя|возраст|пол

for (int i = 0; i < size; i++) {

outFile << people[i].lastName << "|"

<< people[i].firstName << "|"

<< people[i].age << "|"

<< people[i].gender << endl;

}

outFile.close();

cout << "Данные успешно сохранены в файл: " << filename << endl;

}

int main() {

setlocale(LC_ALL, "Russian");

// Для корректного ввода/вывода русских строк в консоли Windows

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int size;

cout << "Выполнила Кашина Д. гр. ИПсп-123" << endl;

cout << "=== Программа ввода списка людей ===" << endl;

cout << "Введите количество людей: ";

cin >> size;

cin.ignore(); // Очищаем буфер после cin

// Создаем динамический массив структур

Person* people = new Person[size];

// Заполняем массив в диалоговом режиме

cout << "\n--- Ввод данных о людях ---" << endl;

for (int i = 0; i < size; i++) {

cout << "\nЧеловек #" << i + 1 << ":" << endl;

cout << "Фамилия: ";

getline(cin, people[i].lastName);

cout << "Имя: ";

getline(cin, people[i].firstName);

cout << "Возраст: ";

cin >> people[i].age;

cout << "Пол (M/F): ";

cin >> people[i].gender;

cin.ignore(); // Очищаем буфер после ввода пола

// Проверка корректности ввода пола

people[i].gender = toupper(people[i].gender);

while (people[i].gender != 'M' && people[i].gender != 'F') {

cout << "Неверный ввод! Введите M или F: ";

cin >> people[i].gender;

people[i].gender = toupper(people[i].gender);

cin.ignore();

}

}

// Вывод введенных данных для проверки

cout << "\n--- Введенные данные ---" << endl;

for (int i = 0; i < size; i++) {

cout << i + 1 << ". " << people[i].lastName << " " << people[i].firstName

<< ", возраст: " << people[i].age << ", пол: " << people[i].gender << endl;

}

// Ввод имени файла для сохранения

string filename;

cout << "\nВведите имя файла для сохранения: ";

cin >> filename;

// Сохраняем данные в файл

save(people, size, filename);

// Освобождаем память

delete[] people;

cout << "\nПрограмма завершена." << endl;

return 0;

}

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

Данные в файле Person.txt

Блок схема программы

2 задание.

Код программы

// load_program.cpp

#include <iostream>

#include <fstream>

#include <string>

#include <sstream>

#include <Windows.h>

#include "person.h"

using namespace std;

// Функция загрузки массива структур из файла

Person* load(const string& filename, int& size) {

ifstream inFile(filename);

if (!inFile.is_open()) {

cerr << "Ошибка открытия файла для чтения!" << endl;

return nullptr;

}

// Читаем размер массива из первой строки

inFile >> size;

inFile.ignore();

// Создаем динамический массив структур

Person* people = new Person[size];

// Загружаем данные из файла построчно

string line;

for (int i = 0; i < size; i++) {

if (getline(inFile, line)) {

stringstream ss(line);

string token;

// Читаем фамилию

getline(ss, token, '|');

people[i].lastName = token;

// Читаем имя

getline(ss, token, '|');

people[i].firstName = token;

// Читаем возраст

getline(ss, token, '|');

people[i].age = stoi(token);

// Читаем пол

getline(ss, token, '|');

people[i].gender = token[0];

}

}

inFile.close();

cout << "Данные успешно загружены из файла: " << filename << endl;

return people;

}

// Функция сортировки массива по фамилии + имени

void sort(Person* people, int size) {

for (int i = 0; i < size - 1; i++) {

for (int j = 0; j < size - i - 1; j++) {

if (people[j].lastName > people[j + 1].lastName) {

swap(people[j], people[j + 1]);

}

else if (people[j].lastName == people[j + 1].lastName) {

if (people[j].firstName > people[j + 1].firstName) {

swap(people[j], people[j + 1]);

}

}

}

}

}

// Функция вывода массива на экран

void printPeople(const Person* people, int size) {

cout << "\n--- Список людей ---" << endl;

cout << "-------------------------------------------------" << endl;

for (int i = 0; i < size; i++) {

cout << i + 1 << ". " << people[i].lastName << " " << people[i].firstName

<< " | Возраст: " << people[i].age

<< " | Пол: " << (people[i].gender == 'M' ? "Мужской" : "Женский") << endl;

}

cout << "-------------------------------------------------" << endl;

}

int main() {

setlocale(LC_ALL, "Russian");

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

string filename;

int size;

cout << "Выполнила Кашина Д. гр. ИПсп-123" << endl;

cout << "=== Программа чтения и сортировки списка людей ===" << endl;

cout << "Введите имя файла для чтения: ";

cin >> filename;

Person* people = load(filename, size);

if (people == nullptr) {

return 1;

}

cout << "\nИсходные данные:" << endl;

printPeople(people, size);

sort(people, size);

cout << "\nДанные после сортировки (по фамилии + имени):" << endl;

printPeople(people, size);

delete[] people;

cout << "\nПрограмма завершена." << endl;

return 0;

}

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

Блок-схема

Вывод: в ходе лабораторной работы были восстановлены навыки описания функций и работы с файлами на языке C++, получены навыки хранения в файле сложных структур данных и описания заголовочных файлов.

Соседние файлы в предмете Системное программирование