Кашина_СП_ЛБ8
.docxМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«Владимирский государственный университет
имени Александра Григорьевича и Николая Григорьевича Столетовых» (ВлГУ)
Колледж инновационных технологий и предпринимательства
КАФЕДРА ФИЗИКИ И ПРИКЛАДНОЙ МАТЕМАТИКИ
Лабораторная работа № 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++, получены навыки хранения в файле сложных структур данных и описания заголовочных файлов.
