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

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

09.04.2019, 21:37. Показов 4185. Ответов 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
Сообщений: 397
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
Сообщений: 397
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
Сообщений: 397
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
Сообщений: 397
15.04.2019, 20:04  [ТС]
Кажется, я смогу сделать добавление сам. Сделаю переменную типа char, которую программа предложит ввести. Если она будет равна плюсу, то программа запросит кол-во студентов, которые надо ввести, а потом то же самое, что и ввод из файла, а если минусу, то удалит.

Добавлено через 8 минут
Ну, добавление сделал, проверил, работает правильно.
nd2, как теперь сделать удаление? Нужно, чтобы программа нашла студента с введённой фамилией, предварительно выдав весь их список, это я сделаю. Но как удалить именно этот элемент вектора?
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 20:09
ChioraYaz, std::vector::erase()
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 397
15.04.2019, 20:10  [ТС]
И сотрётся не только фамилия, но и остальные данные о студенте?
0
 Аватар для zayats80888
6353 / 3524 / 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
Сообщений: 397
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
6353 / 3524 / 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
Сообщений: 397
15.04.2019, 20:49  [ТС]
Я не знаю, как его адаптировать к тому что уже есть.
0
 Аватар для zayats80888
6353 / 3524 / 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
Сообщений: 397
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
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 21:03
Цитата Сообщение от ChioraYaz Посмотреть сообщение
она сравнивается с фамилией
Цитата Сообщение от zayats80888 Посмотреть сообщение
famdel[a]
а это что?
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 397
15.04.2019, 21:08  [ТС]
famdel[a] - массив фамилий типа string, вводится с клавиатуры.
0
 Аватар для zayats80888
6353 / 3524 / 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
Сообщений: 397
15.04.2019, 21:29  [ТС]
Выдаётся ошибка:
no matching function for call to 'std::vector<Student>::erase(int&, int)'
Может, нужно что-то объявить в include?
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 21:36
ChioraYaz, извиняюсь, я совсем того, из вектора можно удалять только по итератору
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 397
15.04.2019, 21:37  [ТС]
Слышал что-то о нём, но ещё не читал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2019, 21:37

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru