Нужна помощь с текстовыми данными с++
Входной файл сохраняет следующую информацию о студентах:
- Фамилия
- Имя
- Отчество
- Год рождения
- Курс
Фамилия, имя и отчество имеют не более 12 символов, пол - указывается символами М и Ж, год рождения - целое из 4 цифр, курс - целое от 1 до 5.
Данные по студентам отделяются знаком «;».
Необходимо написать программу, которая выводит на консоль и в файл следующую информацию:
Суть задания заключается в том , чтобы программа считала и вывела в компилятор , самой популярное женское имя.
Вот что указано в текстовом файле:
keruev,nikita,vasilevich,2003,2,M;kremova,irina,dmitrivna,2001,3,F;morozova,anna,genadevna,2002,F;
gortiv,egor,vasilevich,2002,2,M;morty,irina,igrevna,2003,1,F;gorb,irina,petrova,2000,4,F;
#include<iostream>
#include<string>
#include<fstream>
#include<Windows.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Ru");
char student[256];
char surname;
char firstname;
char middlename;
char year;
char course;
char gender;
const char* mark = ",";
ifstream phile("informtion.txt");
phile.is_open();
if (!phile.is_open())
{
cout << "Произошла ошибка!" << endl;
}
while (phile.getline(student, 500, ';'))
{
char* names{0}; //имена студенток
int k = 0;
if (gender == 'F')//если это студентка
{
names[k++] = firstname;
}
int count{};
for (int i = 0; i < k; ++i)
for (int j = i + 1; j < k; ++j)
if (names[i] && names[i] == names[j]) {
++count[i];
}
int max = 0;
for (int i = 0; i < k; ++i)
if (max < count[i])
max = i;
cout << "наиболее часто встречается имя: " << names[max];
}
phile.close();
}
Ответы (2 шт):
Про ошибку с инициализацией: Когда вы объявляете локальную переменную, то в ней хранится мусор. И потом вы пытаетесь этот мусор сравнить и присвоить. Нужно просто присвоить этим переменным любое подходящее вам значение.
gender = 'A'
firstname = 'A'
Честно у вас очень много непонятного в вашем коде, так что приведу пример с комментариями:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
#define MAX_STUDENTS 20
int main()
{
setlocale(LC_ALL, "Ru");
ifstream phile("information.txt");
if (!phile.is_open())
{
cout << "Произошла ошибка!" << endl;
return EXIT_FAILURE;
}
//Буффер для считывания информации о студенте
char student[49];
//Статический массив, в котором максимум могут хранитьмя 20 имен
//Да можно использовать всякие динамические структуры, но я решил по простому
//если они вам нужны можете спокойно добавить.
char names[MAX_STUDENTS][12];
//Массив в котором, будет хранится кол-во каждого имени
//в counts[i] хранится кол-во имен names[i]
int counts[MAX_STUDENTS]{ 0 };
//Счетчик, сколько на данный момент уникальных имен
int count = 0;
//Максимальный индекс имени в массиве names
int maxI = 0;
//Максимальное кол-во появлений имени names[maxI]
int maxCount = -1;
//Считываем информацию о студенте по разделителю ';'
while (phile.getline(student, 49, ';')) {
//Сразу пропускаем студента мужского пола
if (student[strlen(student) - 1] == 'M')
continue;
//Функция strtok возвращает подстроку строки student разделенную по ,
//В нашем случае в token будет находится фамилия
char* token = strtok(student, ",");
//Передавая NULL мы говорим функции, что работает с той же строчкой student
//В итоге в token будет уже имя
token = strtok(NULL, ",");
int i = 0;
//Проходимся по всем уникальным женским именам
//и если находим там имя рассматриваемой на данный момент студентны
//то увеличиваем кол-во появлений этого имени, сразу проверяем на максимальное кол-во
//и выходим из цикла
for (; i < count; ++i)
if (strcmp(names[i], token) == 0) {
++counts[i];
if (counts[i] > maxCount) {
maxCount = counts[i];
maxI = i;
}
break;
}
//Если же мы не нашли совпадений, то
//скопируем в names[count] найденное уникальное имя
//присвоем кол-во появлений 1 и увеличим счетчик уникальных имен
if (i == count) {
strcpy(names[count], token);
counts[count] = 1;
++count;
//Решил сделать проверку
if (count >= MAX_STUDENTS) {
cout << "Достигнуто максимальное кол-во имен студентов!" << endl;
return EXIT_FAILURE;
}
}
}
//Ну и выводим имя и количество появлений этого имени
cout << "Наиболее часто встречающее имя: " << names[maxI] << endl;
cout << "Кол-во таких имен: " << maxCount << endl;
phile.close();
}
Насчет функций strcmp, strcpy и strtok
Если вам не подходит использования сторонних функций, тогда советую отдельно создать функции и реализовать их, а не нагромождать все в main, с этим я думаю проблем не должно возникнуть.