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

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

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

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

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

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

Помогите написать программу на С++, используя бинарные файлы и структуры, если у меня есть такое условие:

Создайте файл Студент. Подсчитайте средний балл каждой группы по заданному номеру курса и средний балл курса.

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

Записи упорядочены по номеру курса, внутри курса - по номеру группы, в группе - по ФИО.
lenaiv вне форума Ответить с цитированием
Старый 12.04.2023, 14:33   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,551
По умолчанию

Ув. lenaiv, вы - доцент и выдаёте это задание студентам для проверки их скудных знаний? Если нет, то во ФРИЛАНСе с нетерпением ждут вас с пачкой тугриков в руках.
digitalis вне форума Ответить с цитированием
Старый 12.04.2023, 20:35   #3
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Ув. lenaiv, вы - доцент и выдаёте это задание студентам для проверки их скудных знаний? Если нет, то во ФРИЛАНСе с нетерпением ждут вас с пачкой тугриков в руках.
Вы неправы, зачем же так. Я учу С++ и решаю различные задачи, а вот эта мне непонятна. Поэтому и задала вопрос.
lenaiv вне форума Ответить с цитированием
Старый 12.04.2023, 22:26   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,551
По умолчанию

Ну ладно, не сердись. Я не обратил внимания, что девчонка , помог бы сам, но на Сях писал лет 40 тому назад, а Сишников и без меня тут - рота.
Что непонятно то? Что такое структура? Так это уже обсосано в вопросе
https://programmersforum.ru/showthread.php?t=345574
И что надо делать с этим файлом - создавать заново, редактировать или только именно из готового файла
Цитата:
Подсчитайте средний балл каждой группы по заданному номеру курса и средний балл курса.
?
Не просматривается попытка начать решение.
Описать струкуру, массив структур, типизированный файл. Считать его в массив и простыми циклами посчитать искомое.
Я спросил у Яндекса: типизированные файлы в Си++

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

Можно как-то так
Код:
#include <iostream>
#include <fstream>

#define NAME_SIZE 40
#define SUBJ_SIZE 10
#define NSESSION 10
#define NSUBJECT 5

struct TSubject {
    char Form;
    char Name[SUBJ_SIZE];
    char Mark;
};

struct TStudent {
    char     Name[NAME_SIZE];
    char     Course;
    char     Group;
    TSubject Session[NSESSION][NSUBJECT];
};

struct TGroup {
    TGroup *Next;
    char    Name;
    int     Marks;
    double  Average;
};

bool CountMarks(TGroup *g, TStudent &s) {
    for (int i = 0; i < NSESSION; ++i)
        for (int j = 0; j < NSUBJECT; ++j)
            g->Average += s.Session[i][j].Mark - '0';
    g->Marks += NSESSION * NSUBJECT;
    return false;
}

int main(int argc, char *argv[]) {
    char nCourse = ' ';
    int nGroups = 0;
    float Average = 0;
    TGroup *aGroups = nullptr;
    TStudent aStudent;
    std::cout << "Введите номер курса";
    std::cin >> nCourse;
    std::ifstream fin("input.txt", std::ios::binary);
    if (fin.is_open()) {
        while (!fin.eof()) {
            fin.read((char *)&aStudent, sizeof(aStudent));
            if (aStudent.Course == nCourse) {
                bool flag = true;
                for (TGroup *i = aGroups; i != nullptr; i = i->Next)
                    if (aStudent.Group == i->Name)
                        flag = CountMarks(i, aStudent);
                if (flag) {
                    TGroup *t = new TGroup;
                    t->Next = aGroups;
                    aGroups = t;
                    t->Name = aStudent.Group;
                    CountMarks(t, aStudent);
                }
            }
        }
        fin.close();
        if (aGroups == nullptr) {
            std::cout << "Заданного курса нет в файле!";
            return 0;
        }
        for (TGroup *i = aGroups, *t; i != nullptr; i = t) {
            double avg = i->Average / i->Marks;
            std::cout << "Средний балл группы: " << i->Name << " = " << avg << std::endl;
            Average += avg;
            nGroups++;
            t = i->Next;
            delete i;
        }
        std::cout << "Средний балл курса: " << nCourse << " = " << Average / nGroups << std::endl;
    }
    return 0;
}
ADD: Это примерная программа, которая выполняет только указанное в задании: Вычислить средний балл по группам указанного курса и средний балл курса.
Ввод данных в файл сможете добавить сами в качестве тренировки.

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

Добавила запись и чтение в файл, но у меня не работает программа. уже все перепробовала
Код:
#include <iostream>
#include <fstream>

#define NAME_SIZE 40
#define SUBJ_SIZE 10
#define NSESSION 10
#define NSUBJECT 5

struct TSubject {
    char Form;
    char Name[SUBJ_SIZE];
    char Mark;
};

struct TStudent {
    char     Name[NAME_SIZE];
    char     Course;
    char     Group;
    TSubject Session[NSESSION][NSUBJECT];
};

struct TGroup {
    TGroup* Next;
    char    Name;
    int     Marks;
    double  Average;
};

bool CountMarks(TGroup* g, TStudent& s) {
    for (int i = 0; i < NSESSION; ++i)
        for (int j = 0; j < NSUBJECT; ++j)
            g->Average += s.Session[i][j].Mark - '0';
    g->Marks += NSESSION * NSUBJECT;
    return false;
}

int main(int argc, char* argv[]) {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    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();
    char nCourse = ' ';
    int nGroups = 0;
    float Average = 0;
    TGroup* aGroups = nullptr;
    TStudent aStudent;
    std::cout << "Введите номер курса";
    std::cin >> nCourse;
    std::ifstream fin("input.txt", std::ios::binary);
    if (fin.is_open()) {
        while (!fin.eof()) {
            fin.read((char*)&aStudent, sizeof(aStudent));
            if (aStudent.Course == nCourse) {
                bool flag = true;
                for (TGroup* i = aGroups; i != nullptr; i = i->Next)
                    if (aStudent.Group == i->Name)
                        flag = CountMarks(i, aStudent);
                if (flag) {
                    TGroup* t = new TGroup;
                    t->Next = aGroups;
                    aGroups = t;
                    t->Name = aStudent.Group;
                    CountMarks(t, aStudent);
                }
            }
        }
        fin.close();
        if (aGroups == nullptr) {
            std::cout << "Заданного курса нет в файле!";
            return 0;
        }
        for (TGroup* i = aGroups, *t; i != nullptr; i = t) {
            double avg = i->Average / i->Marks;
            std::cout << "Средний балл группы: " << i->Name << " = " << avg << std::endl;
            Average += avg;
            nGroups++;
            t = i->Next;
            delete i;
        }
        std::cout << "Средний балл курса: " << nCourse << " = " << Average / nGroups << std::endl;
    }
    return 0;
}
lenaiv вне форума Ответить с цитированием
Старый 17.04.2023, 13:07   #7
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

Еще исправила, не работает
Код:
#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, 14:32   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,551
По умолчанию

Как на мой взгляд - слишком много структур, где можно было бы обойтись просто массивами. "Одно сплошное телевидение" © Не разбирался, насколько это мешает работе программы, но как-то режет глаз. Как по мне - обошёлся бы одним-единственным массивом структур, откуда можно выщемить всё: по группам, по студентам, по предметам и пр.
Непонятно, как между собой взаимодействуют поля:
Цитата:
Успеваемость - 5 экзаменов в каждой из 10 сессий;
и
Цитата:
Наименование предмета (10 знаков);
Оценка (1 знак)
digitalis вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарные файлы с++ Lehhah Помощь студентам 1 15.05.2019 16:20
Написание программ (древовидные структуры, структуры неспециального вида и т.д.) Green Gin Фриланс 2 27.04.2012 15:26
Бинарные файлы с++ Killspamers Помощь студентам 0 01.03.2012 14:04
Бинарные файлы Kazik Помощь студентам 5 06.06.2010 21:51
Структуры,запись в бинарные файлы,массивы(С++) TOSHH Общие вопросы C/C++ 1 10.10.2009 02:01