Задание 1. Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию и, применяя режим прямого доступа, выполнить задание по своему варианту.
Вариант задания № 1
1. Структура имеет вид: фамилия, пол, год рождения и рост. Вывести данные о самом высоком спортсмене.
cpp
struct Sportsman {
std::string surname;
std::string gender;
int birthYear;
float height;
};
Затем мы создадим функцию, которая будет запрашивать данные о каждом спортсмене и записывать их в файл:
cpp
void createFile() {
// Открываем файл для записи
std::ofstream file("sportsmen.txt");
if (!file) {
std::cerr << "Не удалось открыть файл для записи" << std::endl;
return;
}
// Запрашиваем данные о каждом спортсмене и записываем их в файл
for (int i = 0; i < 10; ++i) {
Sportsman sportsman;
std::cout << "Введите фамилию спортсмена " << i+1 << ": ";
std::cin >> sportsman.surname;
std::cout << "Введите пол спортсмена " << i+1 << ": ";
std::cin >> sportsman.gender;
std::cout << "Введите год рождения спортсмена " << i+1 << ": ";
std::cin >> sportsman.birthYear;
std::cout << "Введите рост спортсмена " << i+1 << ": ";
std::cin >> sportsman.height;
// Записываем данные в файл
file << sportsman.surname << " " << sportsman.gender << " " << sportsman.birthYear << " " << sportsman.height << std::endl;
}
// Закрываем файл
file.close();
std::cout << "Файл успешно создан" << std::endl;
}
Шаг 2: Просмотр файла и поиск самого высокого спортсмена.
Теперь нам нужно просмотреть созданный файл, считать данные о спортсменах и найти самого высокого спортсмена. Мы откроем файл для чтения и прочитаем данные в массив структур Sportsman. Затем мы пройдемся по массиву, и если найдется спортсмен с ростом, большим текущего максимального, мы обновим максимальный рост и запомним индекс спортсмена с самым большим ростом.
cpp
void findTallestSportsman() {
// Открываем файл для чтения
std::ifstream file("sportsmen.txt");
if (!file) {
std::cerr << "Не удалось открыть файл для чтения" << std::endl;
return;
}
// Создаем массив структур для хранения данных о спортсменах
Sportsman sportsmen[10];
int index = 0;
float maxHeight = 0.0;
// Считываем данные из файла в массив структур
while (file >> sportsmen[index].surname >> sportsmen[index].gender >> sportsmen[index].birthYear >> sportsmen[index].height) {
// Проверяем, является ли текущий спортсмен самым высоким
if (sportsmen[index].height > maxHeight) {
maxHeight = sportsmen[index].height;
}
++index;
}
// Ищем спортсменов с самым большим ростом
for (int i = 0; i < index; ++i) {
if (sportsmen[i].height == maxHeight) {
std::cout << "Самый высокий спортсмен: " << std::endl;
std::cout << "Фамилия: " << sportsmen[i].surname << std::endl;
std::cout << "Пол: " << sportsmen[i].gender << std::endl;
std::cout << "Год рождения: " << sportsmen[i].birthYear << std::endl;
std::cout << "Рост: " << sportsmen[i].height << std::endl;
break;
}
}
// Закрываем файл
file.close();
}
Шаг 3: Добавление новой информации в файл.
Теперь мы добавим возможность добавлять новую информацию о спортсмене в файл. Для этого мы создадим функцию, которая будет запрашивать данные и записывать их в конец файла.
cpp
void addNewSportsman() {
// Открываем файл для добавления данных
std::ofstream file("sportsmen.txt", std::ios::app);
if (!file) {
std::cerr << "Не удалось открыть файл для добавления данных" << std::endl;
return;
}
Sportsman sportsman;
std::cout << "Введите фамилию нового спортсмена: ";
std::cin >> sportsman.surname;
std::cout << "Введите пол нового спортсмена: ";
std::cin >> sportsman.gender;
std::cout << "Введите год рождения нового спортсмена: ";
std::cin >> sportsman.birthYear;
std::cout << "Введите рост нового спортсмена: ";
std::cin >> sportsman.height;
// Записываем данные о новом спортсмене в конец файла
file << sportsman.surname << " " << sportsman.gender << " " << sportsman.birthYear << " " << sportsman.height << std::endl;
// Закрываем файл
file.close();
std::cout << "Новый спортсмен успешно добавлен" << std::endl;
}
Шаг 4: Использование режима прямого доступа для выполнения задания по варианту.
Структура файла позволяет нам использовать режим прямого доступа для выполнения задания по варианту. Мы можем использовать позиции записей в файле для чтения данных о спортсменах по их индексам.
Мы создадим функцию, которая будет принимать в качестве аргумента индекс спортсмена и возвращать данные о нем.
cpp
Sportsman getSportsman(int index) {
// Открываем файл для чтения
std::ifstream file("sportsmen.txt");
if (!file) {
std::cerr << "Не удалось открыть файл для чтения" << std::endl;
return Sportsman();
}
// Переходим к нужному индексу спортсмена
file.seekg(index * sizeof(Sportsman));
Sportsman sportsman;
// Читаем данные о спортсмене
file >> sportsman.surname >> sportsman.gender >> sportsman.birthYear >> sportsman.height;
// Закрываем файл
file.close();
// Возвращаем данные о спортсмене
return sportsman;
}
Теперь мы можем использовать функцию `getSportsman()` для выполнения задания по варианту. Нам нужно найти самого высокого спортсмена, сравнить его рост с ростом других спортсменов и вывести данные о нем.
cpp
void findTallestSportsmanUsingDirectAccess() {
int tallestSportsmanIndex = 0;
float maxHeight = 0.0;
// Ищем самого высокого спортсмена
for (int i = 0; i < 10; ++i) {
Sportsman sportsman = getSportsman(i);
// Проверяем, является ли текущий спортсмен самым высоким
if (sportsman.height > maxHeight) {
maxHeight = sportsman.height;
tallestSportsmanIndex = i;
}
}
// Выводим данные о самом высоком спортсмене
Sportsman tallestSportsman = getSportsman(tallestSportsmanIndex);
std::cout << "Самый высокий спортсмен: " << std::endl;
std::cout << "Фамилия: " << tallestSportsman.surname << std::endl;
std::cout << "Пол: " << tallestSportsman.gender << std::endl;
std::cout << "Год рождения: " << tallestSportsman.birthYear << std::endl;
std::cout << "Рост: " << tallestSportsman.height << std::endl;
}
Теперь мы можем вызвать функции в определенном порядке для выполнения задачи:
cpp
int main() {
createFile();
findTallestSportsman();
addNewSportsman();
findTallestSportsmanUsingDirectAccess();
return 0;
}
Таким образом, мы создадим файл с данными о 10 спортсменах, найдем самого высокого спортсмена, добавим нового спортсмена в файл и снова найдем самого высокого спортсмена, используя режим прямого доступа.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет