Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396

Большая задача на работу с классом и файлами

09.04.2019, 21:37. Показов 4091. Ответов 88
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По заданию нужно:
1)Занести из файлов индекс группы студента, его фамилию, четыре оценки за экзамены и участие (0/1).
2)Начислить студентам определённой группы стипендию: все "5" и участие +50% к стипендии, без участия +25%, с четвёрками обычная стипендия, с тройками её нет.
3)Предусмотреть возможность добавления информации, удаления отдельных записей, сортировки по заданному полю.


Я и с классами, и с файлами работал очень мало, поэтому у меня возникли вопросы: как из одного файла, содержащего одновременно фамилию и, допустим, оценки, считать одно отдельно от другого? Что за возможность добавления/удаления информации, сортировка и как это сделать?

Добавлено через 4 часа 41 минуту
Пожалуйста, ответьте быстрее, мне нужно сделать эту и остальные работы как можно скорее.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2019, 21:37
Ответы с готовыми решениями:

Задача на работу с файлами
Помогите решить проблему! ________________________________________ В файле находится текст программы на языке С. Создать выходной...

Задача на работу с файлами
Записать в С все положительные числа из А и В, указывая после каждого десятого элемента количество десятков. Последнее количество десятков...

Задача на работу с текстовыми файлами
В качестве входных данных поступает некоторое сообщение. Все сообщения имеют общее правило: Пользователь Команда Задача следующая. ...

88
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
14.04.2019, 11:50  [ТС]
Студворк — интернет-сервис помощи студентам
Да, есть такие, но на некоторые ещё не ответили, а с векторами нет вообще.
Для чего нужны эти два класса Department и Group? Нельзя обойтись одним? В тех задачах почти у всех был только класс Студент.
Я пытался как-то сделать цикл, но уже даже не знаю, как записать индекс группы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <vector>
#include <fstream>
#include <cstring>
 
using namespace std;
 
class Student
{
    int ind;
    string fam;
    int oc[4];
    int uch;
};
 
 
int main()
{
    int i, j, v=0, p, a;
    vector <Student> st[100];
 
    ifstream fi;
 
    fi.open("dannie.txt");
 
    for(i=0;i<a;i++)
    {
        if(v=3)
        {
            v=0;
            fi;
            j++;
        }
 
        if(v=0)
        {
            fi;
            v++;
            j++;
        }
 
        if(v=1)
        {
            fi;
            j++;
        }
 
        if(v=2)
        {
            fi;
            j++;
        }
    }
 
    return 0;
}
Причём в логе ошибок пишет, что в этом классе нет ничего, названного "ind", хотя есть.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
14.04.2019, 14:44
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Для чего нужны эти два класса Department и Group?
Это просто пример использования векторов объектов пользовательских классов. Тебе эти классы не нужны.
Цитата Сообщение от ChioraYaz Посмотреть сообщение
C++
1
vector <Student> st[100];
C++
1
vector <Student> st;
Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    ifstream fi("dannie.txt");
    if (!fi)
    {
        cout << "Error!" << endl;
        system("pause");
        return 0;
    }
   
   vector <Student> st;
   Student temp;
   while (fi >> temp.id)
   {
       fin >> temp.fam;
       for (int i = 0; i < 4; ++i)
              fin >> temp.oc[i];
       fin >> temp.uch;
       
       st.push_back(temp);
   }
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
14.04.2019, 19:24  [ТС]
Лог ругался на private, вместо fin был fi, всё исправил, сейчас попробую вывести на экран. Если всё в порядке, буду писать начисление стипендии.

Добавлено через 38 минут
Кажется, я не могу вывести вектор вот так:
C++
1
2
    for(int i = 0; i < st.size(); i++)
        cout << st[i] << " ";
Но везде написано, что так можно сделать. Просто у меня CodeBlocks, и я не знаю, может, в каких-то его версиях чего-то нет.

Добавлено через 3 часа 4 минуты
Я с .empty() проверил вектор, он не пустой, но как его вывести на экран?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
14.04.2019, 21:45
Цитата Сообщение от ChioraYaz Посмотреть сообщение
но как его вывести на экран?
C++
1
2
3
4
5
6
7
8
9
for(int i = 0; i < st.size(); i++)
{
        cout << st[i].ind << endl;
        cout << st[i].fam << endl;
        for (int j = 0; j < 4; ++j)
            cout << st[i].oc[j] << ' ';
        cout << endl;
        cout << st[i].uch << endl << endl;
}
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
14.04.2019, 22:46  [ТС]
Если честно, то я пробовал писать примерно так, но постоянно выводились ошибки, из-за чего я подумал, что для вывода вектора на экран используется какая-то другая функция.
С "начислением" я справился, получилось громоздко, но работает всё правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    for(i=0;i<st.size();i++)
    {
        if (st[i].oc[0]+st[i].oc[1]+st[i].oc[2]+st[i].oc[3]==20 && st[i].uch==1)
        {
            st[i].stip*=1.5;
        }
 
        if (st[i].oc[0]+st[i].oc[1]+st[i].oc[2]+st[i].oc[3]==20 && st[i].uch==0)
        {
            st[i].stip*=1.25;
        }
 
        if (st[i].oc[0]+st[i].oc[1]+st[i].oc[2]+st[i].oc[3]<20 && st[i].oc[0]!=3 && st[i].oc[1]!=3 &&
             st[i].oc[2]!=3 && st[i].oc[3]!=3 && st[i].oc[0]+st[i].oc[1]+st[i].oc[2]+st[i].oc[3]>15)
        {
            st[i].stip*=1;
        }
 
        if (st[i].oc[0]==3 || st[i].oc[1]==3 || st[i].oc[2]==3 || st[i].oc[3]==3)
        {
            st[i].stip=0;
        }
    }
 
    cout<<endl<<endl;
 
    for(int i = 0; i < st.size(); i++)
    {
        cout<<st[i].fam<<"  poluchil: "<<st[i].stip<<endl;
    }
Добавлено через 7 минут
Остался только третий пункт. Я так понял, в самом начале надо будет спросить, хочет ли пользователь добавить ещё одного студента или удалить кого-то, а сортировать с помощью другого вектора, да?
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
15.04.2019, 20:04  [ТС]
Кажется, я смогу сделать добавление сам. Сделаю переменную типа char, которую программа предложит ввести. Если она будет равна плюсу, то программа запросит кол-во студентов, которые надо ввести, а потом то же самое, что и ввод из файла, а если минусу, то удалит.

Добавлено через 8 минут
Ну, добавление сделал, проверил, работает правильно.
nd2, как теперь сделать удаление? Нужно, чтобы программа нашла студента с введённой фамилией, предварительно выдав весь их список, это я сделаю. Но как удалить именно этот элемент вектора?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 20:09
ChioraYaz, std::vector::erase()
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
15.04.2019, 20:10  [ТС]
И сотрётся не только фамилия, но и остальные данные о студенте?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 20:20
ChioraYaz,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string>
#include <vector>
#include <algorithm>
 
struct Student
{
    int ind;
    std::string fam;
    int oc[4];
    int uch;
};
 
int main()
{
    std::vector<Student> vs;
    std::string name{ "Ivan" };
    auto p = std::find_if(vs.begin(), vs.end(), [&](const auto& elem) { return elem.fam == name; });
    if (p != vs.end()) vs.erase(p);
}
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
15.04.2019, 20:38  [ТС]
C++
1
2
3
4
        for(j=0;j<kv;j++)
        {
            std::vector::erase(st[i]);
        }
Не работает.
C++
1
2
3
4
        for(j=0;j<kv;j++)
        {
            st.erase(st[i]);
        }
Тоже.

Добавлено через 8 минут
На данный момент у меня есть вот такой код, которые ищет определённые фамилии, но пока не может удалить данные о студентах с этими фамилиями.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    cout<<"Nazhmite -, chtobi udalit"<<endl;
    cin>>menu;
 
    if (menu == '-')
    {
        menu=' ';
 
        for(int i = 0; i < st.size(); i++)
        {
            cout << st[i].fam << endl;
        }
 
        cout<<endl<<"Kol-vo: ";cin>>kv;
 
        for(i=0;i<kv;i++)
        {
            cin>>famdel[i];
        };
 
        a=0;
 
        for(i=0;i<st.size();i++)
        {
            if(st[i].fam==famdel[a])
            {
                st.erase(st[i]);
 
                a++;
            }
        };
 
        kv=0;
 
        cout<<endl<<endl;
    }
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 20:48
Цитата Сообщение от ChioraYaz Посмотреть сообщение
std::vector::erase(st[i]);

ChioraYaz, изучите код чуть выше.
А еще лучше, книжку почитайте, с самого начала.
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
15.04.2019, 20:49  [ТС]
Я не знаю, как его адаптировать к тому что уже есть.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 20:51
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Я не знаю, как его адаптировать к тому что уже есть.
Цитата Сообщение от ChioraYaz Посмотреть сообщение
if(st[i].fam==famdel[a])
что здесь происходит?
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
15.04.2019, 20:57  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
class Student
{
 
public:
 
    int ind;
    string fam;
    int oc[4];
    int uch;
    int stip=1500;
};
st[i].fam - фамилия студента номер i в векторе, она сравнивается с фамилией, данные о владельце которой нужно удалить.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 21:03
Цитата Сообщение от ChioraYaz Посмотреть сообщение
она сравнивается с фамилией
Цитата Сообщение от zayats80888 Посмотреть сообщение
famdel[a]
а это что?
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
15.04.2019, 21:08  [ТС]
famdel[a] - массив фамилий типа string, вводится с клавиатуры.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 21:20
ChioraYaz, st.erase(i, 1)
так же for(i=0;i<st.size() && a < размер_famdel;i++)
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
15.04.2019, 21:29  [ТС]
Выдаётся ошибка:
no matching function for call to 'std::vector<Student>::erase(int&, int)'
Может, нужно что-то объявить в include?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 21:36
ChioraYaz, извиняюсь, я совсем того, из вектора можно удалять только по итератору
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 396
15.04.2019, 21:37  [ТС]
Слышал что-то о нём, но ещё не читал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2019, 21:37

Переделать работу с текстовыми файлами под работу с двоичными файлами
Здравствуйте. В этой программе идёт работа с текстовыми файлами, а нужно с двоичными. Можно ли как-то переделать? #include...

Написать программу, демонстрирующую работу с классом
Создать класс квадрат, члены класса - длина стороны. Предусмотреть в классе методы вычисления и вывода сведений о фигуре – диагоналей, ...

Задача на работу с файлами
Добрый день! Помогите, пожалуйста, решить следующую задачу: &quot;Дан текстовый файл со статистикой посещения сайта за неделю. Каждая строка...

задача на работу с файлами!
Если кому-то будет не сложно...я просто ничего в файлах практически не понимаю( известные данные: название предприятий, плановый объем...

Сложная задача на работу с файлами
Считать с клавиатуры строку, выделить слова в нее входящие. Построчно записать в файл уникальные буквы, частоту встречаемости данной буквы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru