Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2023, 23:36   #1
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию программа на С++ с бинарными файлами. Подсчитайте средний балл каждой группы по номеру курса и средний балл курса

Помогите исправить программу на С++, используя бинарные файлы, если у меня есть такое условие:
Создайте файл Студент. Подсчитайте средний балл каждой группы по заданному номеру курса и средний балл курса.
Дана структура записи Студент: ФИО (40 знаков); Номер курса (1 знак); Номер группы (1 знак); Успеваемость - 5 экзаменов в каждой из 10 сессий; Форма обучения (целевая, договорная) (1 знак); Наименование предмета (10 знаков); Оценка (1 знак).
Записи упорядочены по номеру курса, внутри курса - по номеру группы, в группе - по ФИО.



Написала программу, с помощью команд, которые знаю (мне нужно использовать эти команды, то есть как можно проще и не использовать указатели). У меня куча ошибок. Файл не могу не один просмотреть. Как в него записать и потом просмотреть из него не могу. Пожалуйста, помогите исправить программу, чтобы она заработала, уже несколько дней с ней мучаюсь и не получается.
Код:
#include <iostream>
#include <fstream>
#include <Windows.h> 
 
struct Tpredmet
{
    char form;
    char name[10];
    char ocenka;
};
 
struct Tstudent
{
    char name[40];
    char kurs;
    char grup;
    char nsessia[10];
    char npredmet[5];
    Tpredmet sessia[nsessia][npredmet];
};
 
struct Tgrup
{
    Tgrup* Next; // ссылка структуры на себя
    char    name;
    int     ocenka;
    double  sredni_bal;
};
 
bool CountMarks(Tgrup* g, Tstudent& s) 
{
    for (int i = 0; i < nsessia; i++)
        for (int j = 0; j < npredmet; j++)
            sredni_bal = sredni_bal + s.sessia[i][j].ocenka - '0';
    ocenka = ocenka + nsessia * nsessia;
    return false;
}
 
int main() 
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int argc, i;
    char* argv[];
    ifstream file("file1.bin");  // чтение файла
    if (!file)
    {
        cout << "Ошибка открытия файла!";
        return 1;
    }
 
    file.read(buffer, size);
    for (int i = 0; i < size; i++)
    {
        file.read(buffer, size);
    }
    file.close();
    
    ofstream file("file2.bin"); // запись в файл
    if (!file)
    {
        cout << "Файл file не открывается\n";
        return 1;
    }
    file.write(buffer, size);
    for (int i = 0; i < size; i++)
    {
        file.write(buffer, size);
    }
    file.close();
 
    fclose(file);
    char nkurs;
    int ngrups;
    float sredni_bal = 0;
    Tgrup* agrups = 0;
    Tstudent astudent;
    cout << "Введите номер курса";
    cin >> nkurs;
    ifstream file("fili1.bin");
    if (file.is_open()) 
    {
        while (!file.eof()) 
        {
            file.read((char*)&astudent, sizeof(astudent));
            if (astudent.kurs == nkurs)
            {
                int k = 0;
                for (Tgrup = agrup; i != 0)
                    if (astudent.group == name)
                        k = CountMarks(i, astudent);
                if (k=0) 
                {
                    TGroup;
                    t = agrup;
                    agrup = t;
                    name = astudent.grup;
                    CountMarks(t, astudent);
                }
            }
        }
        file.close();
        if (agrup == 0) 
        {
            cout << "Заданного курса нет в файле!";
            return 0;
        }
        for (Tgrup = agrup, i != 0; i = t)
        {
            double avg = sredni_bal / ocenka;
            cout << "Средний балл группы: " << name << " = " << avg << endl;
            sredni_bal += avg;
            ngrup++;
            t = Next;
            delete i;
        }
        cout << "Средний балл курса: " << nkurs << " = " << sredni_bal / ngrup << endl;
    }
    return 0;
}
может не нужно отдельный файл заводить для внесения данных, а сделать вот так
Код:
    char name{ "Vova","Sasha","Semen","Vadim","Polya" };
    char nkurs{ "1","2","3","4","5" };
    char grup{ "1","2","3","4","5","6","7","8","9","10" };
    char uspevaemost{ " "," "," "," " };
    char sredni_ball_studenta{ " "," "," "," " };
    char sredni_ball_gruppa{ " "," "," "," " };
    char forma_obuchenia{ "целевая", "договорная" };
    char predmet_number{ "история","русский","алгебра","информатика","литература" };
    char ocenka{ "неудовл","удовл","хор","отл" };
или это не пойдет так.
lenaiv вне форума Ответить с цитированием
Старый 17.04.2023, 00:03   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

https://www.programmersforum.ru/showthread.php?t=345579
macomics вне форума Ответить с цитированием
Старый 17.04.2023, 00:13   #3
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

macomics, там с указателями, а мне нужно без них, вот я переделала, взяла еще куски из различных учебников и у меня программа выдает ошибки, я не занаю как их поправить, уже использовала различные варианты
lenaiv вне форума Ответить с цитированием
Старый 17.04.2023, 00:20   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Но тогда начните с исправления структуры. У вас в задании написано про 10 сессий по 5 предметов (итого 50). Это будет двухмерный массив побочных структур, а у вас два одномерных массива. Я не понял зачем вас два лишних массива на 10 и 5 элементов типа char

Да и от указателей вы не избавились...
Код:
struct Tgrup
{
    Tgrup* Next; // ссылка структуры на себя  <<< это же указатель...
    char    name;
    int     ocenka;
    double  sredni_bal;
};
Дальше. В задании сказано про бинарные файла, а вы не указываете режим открытия файла (ios::binary)

Последний раз редактировалось macomics; 17.04.2023 в 00:24.
macomics вне форума Ответить с цитированием
Старый 17.04.2023, 00:26   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Дальше. Что-то я так и не нашёл, где объявлен этот buffer
Код:
file.read(buffer, size);
Но он похоже какой-то многоразмерный, раз в него считывается и количество записей и сами записи (структуры)...

Код:
for (Tgrup = agrup; i != 0)
Что за апокалипсис произошёл с этим циклом. Т.е. вы считаете, что будет работать без инкремента? А где переменная i?

Последний раз редактировалось macomics; 17.04.2023 в 00:29.
macomics вне форума Ответить с цитированием
Старый 17.04.2023, 13:06   #6
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Дальше. Что-то я так и не нашёл, где объявлен этот buffer
Код:
file.read(buffer, size);
Но он похоже какой-то многоразмерный, раз в него считывается и количество записей и сами записи (структуры)...

Код:
for (Tgrup = agrup; i != 0)
Что за апокалипсис произошёл с этим циклом. Т.е. вы считаете, что будет работать без инкремента? А где переменная i?
теперь исправила, но не идет

Код:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <Windows.h> 

using namespace std;

struct TSubject 
{
    char forma_obuchenia;
    char fio[10];
    char ocenka;
};

const int n_sessia = 10, n_predmet = 5;
struct TStudent
{
    char     fio[40];
    char     kurs;
    char     grup;
    TSubject session[n_sessia][n_predmet];
};

struct TGroup 
{
    TGroup* Next;
    char    fio;
    int     ocenka;
    double  Average;
};

bool CountMarks(TGroup, TStudent)
{
    for (int i = 0; i < n_sessia; i++)
        for (int j = 0; j < n_predmet; j++)
            sredni_bal_grup = sredni_bal_grup + s.sessia[i][j].ocenka - '0';
    ocenka = ocenka + n_sessia * n_sessia;
    return false;
}

int main() 
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char n_kurs;
    int n_grup = 0;
    float Average = 0;
    TGroup* a_grup = 0;
    TStudent a_student;
    const int n_sessia = 10, n_predmet = 5;
    int n=10, argc, i;
    char* argv[];

    struct student
    {
        char fio[40];
        char n_kurs;
        char n_grup;
        char sessia[n_sessia][n_predmet];
        char forma_obuchenia;
        char name_predmet[10];
        char ocenka;
    };

    struct student_fio a =
    {
    {"Андреев А.П."}, {"Гусев П.А"}, {"Колтаков А.Н."}, {"Костянский М.А."}, {"Кузина Д.Р."}, 
    {"Паринов А.Н."}, {"Полухин А.С."}, {"Сафонова А.В."}, {"Слинькова Н.М."}, {"Трушин К.Г."}
    };

    struct student_n_kurs b =
    {
    {"1"}, {"2"}, {"3"}, {"4"}, {"5"}
    };

    struct student_n_grup c =
    {
    {"1"}, {"2"}, {"3"}, {"4"}, {"5"}, {"6"}, {"7"}, {"8"}, {"9"}, {"10"}
    };

    struct student_sessia d[] =
    {
    {"1", "1"}, {"1", "2"}, {"1", "3"}, {"1", "4"}, {"1", "5"}, 
    {"2", "1"}, {"2", "2"}, {"2", "3"}, {"2", "4"}, {"2", "5"},
    {"3", "1"}, {"3", "2"}, {"3", "3"}, {"3", "4"}, {"3", "5"},
    {"4", "1"}, {"4", "2"}, {"4", "3"}, {"4", "4"}, {"4", "5"},
    {"5", "1"}, {"5", "2"}, {"5", "3"}, {"5", "4"}, {"5", "5"},
    {"6", "1"}, {"6", "2"}, {"6", "3"}, {"6", "4"}, {"6", "5"},
    {"7", "1"}, {"7", "2"}, {"7", "3"}, {"7", "4"}, {"7", "5"},
    {"8", "1"}, {"8", "2"}, {"8", "3"}, {"8", "4"}, {"8", "5"},
    {"9", "1"}, {"9", "2"}, {"9", "3"}, {"9", "4"}, {"9", "5"},
    {"10", "1"}, {"10", "2"}, {"10", "3"}, {"10", "4"}, {"10", "5"}
    };

    struct student_forma_obuchenia f =
    {
    {"целевая"}, {"договорная"}
    };

    struct student_name_predmet p =
    {
    {"алгебра"}, {"геометрия"}, {"русский"}, {"история"}, {"философия"},
    {"иностранный"}, {"биология"}, {"физика"}, {"химия"}, {"право"}
    };

    struct student_ocenka t =
    {
    {"1"}, {"2"}, {"3"}, {"4"}, {"5"}
    };

    srand(time(NULL));

    for (int i = 0; i < n; i++)
    {
        student_unit new_student_unit;

        srand(rand());
        new_student_unit.fio = fio[rand() % fio.size()];
        srand(rand());
        new_student_unit.n_kurs = n_kurs[rand() % n_kurs.size()];
        srand(rand());
        new_student_unit.n_grup = n_grup[rand() % n_grup.size()];
        srand(rand());
        new_student_unit.sessia = sessia[rand() % sessia.size()];
        srand(rand());
        new_student_unit.forma_obuchenia = forma_obuchenia[rand() % forma_obuchenia.size()];
        srand(rand());
        new_student_unit.name_predmet = name_predmet[rand() % name_predmet.size()];
        srand(rand());
        new_student_unit.ocenka = ocenka[rand() % ocenka.size()];

        users_input.push_back(new_student_unit);
    }

    return users_input;

}

    double sredni_bal_grup = 0, sredni_bal_kursa = 0;
    cout << "Введите номер курса";
    cin >> n_kurs;

    ifstream s_student.open("C:\\Users\\Я\\source\\repos\\s_student.txt");
    if (!s_student)
    {
        cout << "Файл s_student не открывается\n";
        return 1;
    }

    ifstream fin("C:\\Users\\Я\\source\\repos\\s_student.txt", ios::binary);
    if (fin.is_open())
    {
        while (!fin.eof())
        {
            fin.write((char*)&student, sizeof(student) 1, s_student);
        }
    }
    
    ifstream fin("C:\\Users\\Я\\source\\repos\\s_student.txt", ios::binary);
    if (fin.is_open()) 
    {
        while (!fin.eof())
        {
            fin.read((char*)&student, sizeof(student) 1, s_student);
            ifstream fin("s_student.txt", ios::binary);
            if (fin.is_open()) 
            {
                while (!fin.eof()) 
                {
                    fin.read((char*)&a_student, sizeof(a_student));
                    if (a_student.n_kurs == n_kurs)
                    {
                        bool k = true;
                        for (TGroup* i = a_grup; i != 0; i = i->Next)
                            if (a_student.grup == i->Name)
                                k = CountMarks(i, a_student);
                        if (k) 
                        {
                            TGroup* t = new TGroup;
                            t->Next = a_grup;
                            aGroups = t;
                            t->fio = a_student.grup;
                            CountMarks(t, a_student);
                        }
                    }
                }
                fin.close();
                if (n_grup == 0)
                {
                    cout << "Заданного курса нет в файле!";
                    return 0;
                }
                for (TGroup* i = a_grup_grup, *t; i != 0; i = t)
                {
                    double avg = i->sredni_bal_grup / i->ocenka;
                    cout << "Средний балл группы: " << i->fio << " = " << avg << endl;
                    sredni_bal_grup += avg;
                    n_grup++;
                    t = i->Next;
                    delete i;
                }
                cout << "Средний балл курса: " << n_kurs << " = " << sredni_bal_grup / n_grup << endl;
            }
            return 0;
}
lenaiv вне форума Ответить с цитированием
Старый 17.04.2023, 13:36   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Это проще переписать, а не исправлять. Тут столько перепутано...

Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
bool CountMarks(TGroup, TStudent)
Куда пропали имена аргументов


Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
sredni_bal_grup = sredni_bal_grup + s.sessia[i][j].ocenka - '0';
Здесь должно быть обращение к структуре TGroup и суммирование оценок за все сессии для всех предметов. А что тут у вас? sredni_bal_grup - даже не объявлена!

Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
ocenka = ocenka + n_sessia * n_sessia;
А в этой строке должно быть просуммировано количество сложений (количество посчитанных оценок). Т.к. циклы константные, то нет смысла в куче ++, можно просто перемножить эти константы. А у вас тут что? Опять ocenka даже не объявлена (в исходном варианте это также было одним из полей структуры). Так вы ещё и количество оценок не правильно посчитали...

Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
const int n_sessia = 10, n_predmet = 5;

    struct student
    {
        char fio[40];
        char n_kurs;
        char n_grup;
        char sessia[n_sessia][n_predmet];
        char forma_obuchenia;
        char name_predmet[10];
        char ocenka;
    };
Зачем дублировать глобальные константы? И почему структура объявлена снова? Да еще и не правильно по заданию.

Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
int n=10, argc, i;
    char* argv[];
Каким образом аргументы функции main переехали в локальные переменные? Зачем?

Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
struct student_fio a =
    {
    {"Андреев А.П."}, {"Гусев П.А"}, {"Колтаков А.Н."}, {"Костянский М.А."}, {"Кузина Д.Р."}, 
    {"Паринов А.Н."}, {"Полухин А.С."}, {"Сафонова А.В."}, {"Слинькова Н.М."}, {"Трушин К.Г."}
    };

    struct student_n_kurs b =
    {
    {"1"}, {"2"}, {"3"}, {"4"}, {"5"}
    };

    struct student_n_grup c =
    {
    {"1"}, {"2"}, {"3"}, {"4"}, {"5"}, {"6"}, {"7"}, {"8"}, {"9"}, {"10"}
    };

    struct student_sessia d[] =
    {
    {"1", "1"}, {"1", "2"}, {"1", "3"}, {"1", "4"}, {"1", "5"}, 
    {"2", "1"}, {"2", "2"}, {"2", "3"}, {"2", "4"}, {"2", "5"},
    {"3", "1"}, {"3", "2"}, {"3", "3"}, {"3", "4"}, {"3", "5"},
    {"4", "1"}, {"4", "2"}, {"4", "3"}, {"4", "4"}, {"4", "5"},
    {"5", "1"}, {"5", "2"}, {"5", "3"}, {"5", "4"}, {"5", "5"},
    {"6", "1"}, {"6", "2"}, {"6", "3"}, {"6", "4"}, {"6", "5"},
    {"7", "1"}, {"7", "2"}, {"7", "3"}, {"7", "4"}, {"7", "5"},
    {"8", "1"}, {"8", "2"}, {"8", "3"}, {"8", "4"}, {"8", "5"},
    {"9", "1"}, {"9", "2"}, {"9", "3"}, {"9", "4"}, {"9", "5"},
    {"10", "1"}, {"10", "2"}, {"10", "3"}, {"10", "4"}, {"10", "5"}
    };

    struct student_forma_obuchenia f =
    {
    {"целевая"}, {"договорная"}
    };

    struct student_name_predmet p =
    {
    {"алгебра"}, {"геометрия"}, {"русский"}, {"история"}, {"философия"},
    {"иностранный"}, {"биология"}, {"физика"}, {"химия"}, {"право"}
    };

    struct student_ocenka t =
    {
    {"1"}, {"2"}, {"3"}, {"4"}, {"5"}
    };
А это тут зачем и что оно должно делать?

Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
srand(time(NULL));
for (int i = 0; i < n; i++)
    {
        student_unit new_student_unit;

        srand(rand());
        new_student_unit.fio = fio[rand() % fio.size()];
        srand(rand());
        new_student_unit.n_kurs = n_kurs[rand() % n_kurs.size()];
        srand(rand());
        new_student_unit.n_grup = n_grup[rand() % n_grup.size()];
        srand(rand());
        new_student_unit.sessia = sessia[rand() % sessia.size()];
        srand(rand());
        new_student_unit.forma_obuchenia = forma_obuchenia[rand() % forma_obuchenia.size()];
        srand(rand());
        new_student_unit.name_predmet = name_predmet[rand() % name_predmet.size()];
        srand(rand());
        new_student_unit.ocenka = ocenka[rand() % ocenka.size()];

        users_input.push_back(new_student_unit);
    }

    return users_input;

}
Зачем тут нужен генератор случайных чисел? А остальной код просто так будет висеть. Вы тут main вообще-то закрываете и при этом кусок кода выпадает за её пределы!

Дальше превышен лимит ошибок за один раз...
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Средний балл. Паскаль. Brain1ess Помощь студентам 2 11.06.2015 10:25
Парни на вас надежда Pascal.Распечатать самый высокий средний балл группы и фамилии студентов, их имеющих Аня_Аня Помощь студентам 1 23.05.2012 17:49
Необходимо выяснить сколько студентов группы имеют средний балл, наименее всего отклоняющийся по абсолютному значению от среднего natik3 Помощь студентам 2 05.04.2012 23:24
Структуры. Опр. средний балл toy Общие вопросы C/C++ 1 19.05.2010 08:49
Средний балл KORT Общие вопросы C/C++ 3 27.02.2008 17:04