С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
196 / 41 / 24
Регистрация: 24.02.2013
Сообщений: 231

Как перегрузить оператор?

25.04.2013, 16:20. Показов 3375. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот написал функцию поиска студента по номеру группы. STL list
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
void find()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else
    {
int number;
cout<<"Введите искомую группу"<<endl;
cin>>number;
list <CStudent>::iterator location = find(students.begin(),students.end(),number);
if (location==students.end())
    cout<<"Ничего не найдено"<<endl;
else
{
    cout<<"Результат:"<<endl;
    if (location==students.begin())
        cout<<"Студент с заданной группой найден:"<<number<<endl;
    location->output();
}
    }
 
 
 
}
Дальше не фига не могу перегрузить оператор. Обьясните кто нибудь
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2013, 16:20
Ответы с готовыми решениями:

Как перегрузить оператор<< и оператор>> ?
Доброго времени суток. Застрял на двух вопросах и не как не могу найти инфу которвя мне помогла бы их решить. вопрос первый. В общем...

Как перегрузить оператор >?
В задании нужно создать шаблон класса, который будет принимать массив целых, вещественных и дробей, а также минимум в массиве. Для целых и...

Как перегрузить оператор =
ну там чтоб он например сложение делал или чтото другое

26
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 16:27
alexSo94, какой оператор вы пытаетесь перегрузить? Я что не заметил.
0
196 / 41 / 24
Регистрация: 24.02.2013
Сообщений: 231
25.04.2013, 16:31  [ТС]
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, какой оператор вы пытаетесь перегрузить? Я что не заметил.
==
C++
1
2
3
bool operator ==(const CStudent &);
bool CStudent::operator ==(const CStudent &a)
{return number==a.number;}
0
Обитатель форума
201 / 184 / 54
Регистрация: 28.10.2012
Сообщений: 543
25.04.2013, 16:36
C++
1
2
3
4
bool operator==(const CStudent& left, const CStudent& right)
{
    return left.number == right.number;
}
0
196 / 41 / 24
Регистрация: 24.02.2013
Сообщений: 231
25.04.2013, 16:58  [ТС]
Цитата Сообщение от Afflicted Посмотреть сообщение
C++
1
2
3
4
bool operator==(const CStudent& left, const CStudent& right)
{
    return left.number == right.number;
}
C++
1
2
3
4
5
6
c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.cpp(46): error C2248: CStudent::number: невозможно обратиться к private член, объявленному в классе "CStudent"
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.h(11): см. объявление "CStudent::number"
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.h(8): см. объявление "CStudent"
1>c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.cpp(46): error C2248: CStudent::number: невозможно обратиться к private член, объявленному в классе "CStudent"
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.h(11): см. объявление "CStudent::number"
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.h(8): см. объявление "CStudent"
класс студент
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
#ifndef CStudent_H
#define CStudent_H
#include <string>
 using namespace std;
 enum number_type{G1, G2, unknown};
 
 class CStudent
{
    
string  name;
    number_type number;
    int  year;
        
public:
    CStudent();//конструктор «пустого» студента
    CStudent(string, number_type ,  int);//конструктор создания студента на основе заданных фамилии, специальности, пола и года
    string get_name() {return name;}
    number_type number_gender(){return number;}
    int get_year(){return year;}
    void input();// метод ввода данных о студенте с клавиатуры
    void output();// метод вывода данных о студенте на экран
    bool operator==(const CStudent&);
 
 
};
 #endif
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:02
alexSo94, я знаете чего не пойму? В ищете группу,


Цитата Сообщение от alexSo94 Посмотреть сообщение
list <CStudent>::iterator location = find(students.begin(),students.end(),num ber);
так, если такой не найдено, find вернет end, иначе вернет итератор на нужный элемент, проверка

Цитата Сообщение от alexSo94 Посмотреть сообщение
if (location==students.begin())
не нужна, поскольку в location и будет нужный результат, поэтому необходимости в перегруженном операторе == нет.
0
Обитатель форума
201 / 184 / 54
Регистрация: 28.10.2012
Сообщений: 543
25.04.2013, 17:03
C++
1
2
3
4
5
6
7
8
9
10
11
12
class CStudent
{
 
    public:
        friend bool operator==(const CStudent& left, const CStudent& right);
 
};
 
bool operator==(const CStudent& left, const CStudent& right)
{
    return left.number== right.number;
}
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:08
alexSo94, я бы вот так сделал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int number;
 
cout<<"Введите искомую группу"<<endl;
    cin>>number;
 
list <CStudent>::iterator location = find(students.begin(),students.end(),number);
 
    if(location == students.end())
        cout<<"Ничего не найдено"<<endl;
    else
    {
        cout<<"Результат:"<<endl;
            cout<<"Студент с заданной группой найден:"<<number<<endl;
        location->output();
    }
0
196 / 41 / 24
Регистрация: 24.02.2013
Сообщений: 231
25.04.2013, 17:30  [ТС]
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, я знаете чего не пойму? В ищете группу,




так, если такой не найдено, find вернет end, иначе вернет итератор на нужный элемент, проверка



не нужна, поскольку в location и будет нужный результат, поэтому необходимости в перегруженном операторе == нет.
Когда я убираю
C++
1
bool operator==(const CStudent& left, const CStudent& right);
Вываливаеться куча ошибок(
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
25.04.2013, 17:34
Читайте про предикаты.
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:35
alexSo94, а что за ошибки? Просто я реально не пойму зачем сравнивать уже найденное число с самим собой, это не логично, давайте посмотрим что выскакивает покажите сейчас как выглядит функция и покажите ошибки какие выдает компилятор
0
196 / 41 / 24
Регистрация: 24.02.2013
Сообщений: 231
25.04.2013, 17:39  [ТС]
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, а что за ошибки? Просто я реально не пойму зачем сравнивать уже найденное число с самим собой, это не логично, давайте посмотрим что выскакивает покажите сейчас как выглядит функция и покажите ошибки какие выдает компилятор
И так попорядку:
Вот значит класс CStudent.h
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
#ifndef CStudent_H
#define CStudent_H
#include <string>
 using namespace std;
 enum number_type{G1, G2, unknown};
 
 class CStudent
{
    
string  name;
    number_type number;
    int  year;
        
public:
    CStudent();//конструктор «пустого» студента
    CStudent(string, number_type ,  int);//конструктор создания студента на основе заданных фамилии, специальности, пола и года
    string get_name() {return name;}
    number_type number_gender(){return number;}
    int get_year(){return year;}
    void input();// метод ввода данных о студенте с клавиатуры
    void output();// метод вывода данных о студенте на экран
     
 
 
};
 #endif
CStudent.cpp
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
#include "StdAfx.h"
#include "CStudent.h"
# include <iostream>
# include <string>
# include <iomanip>
 
using namespace std;
 
 CStudent::CStudent(): name(""),    number(unknown),    year(0) {}
 
CStudent::CStudent(string n, number_type g, int y)
{
    name=n;
    number=g;
    year=y;
    
}
 
void CStudent::output()
{
    cout.setf(ios::left);
    cout<<"\n"<<setw(30)<<name;
    if (number==G1) cout<<setw(8)<<"Первая"; 
    else if (number==G2) cout<<setw(8)<<"Вторая";
        else cout<<setw(8)<<"unknown";
    cout<<setw(4)<<year;
    
}
 
void CStudent::input()
{
    cout<<"\n Введите имя: ";
    getline(cin,name);
    getline(cin,name);
    cout<<"\n Введите группу (0-Первая, 1-Вторая) : ";
    bool f;
    cin>>f;
    if (f==0) number=G1; else number=G2;
    cout<<"\n Введите возраст: ";
    cin>>year;
    cout << "\n";
}
main.cpp
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
//9.    Описать класс СТУДЕНТ (поля: ФИО, ГОД РОЖДЕНИЯ, КОД ГРУППЫ). Написать программу для работы со списком событий, используя контейнерный класс list. Программа должна обеспечивать выбор с помощью меню и выполнение одной из следующих функций:
//a)    начальное формирование списка студентов (ввод с клавиатуры или из заданного массива);
//b)    добавления студента  в конец списка;
//c)    вывод списка студентов на экран;
//d)    удаление из массива студента с определенной ФИО; 
//e)    поиск в списке всех студентов с заданным номером группы.
 
//
 
#include "stdafx.h"
#include "CStudent.h"
#include <iostream>
#include <conio.h> 
#include <list>
#include <algorithm>
list <CStudent> students;
 
 
 
 
 
 
void add()
{
    CStudent tmp; //cоздаём объект
    tmp.input(); //вводим данные
    students.push_back(tmp); //добавляем в конец списка
}
 
void output()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else 
        for (list<CStudent>::iterator i = students.begin(); i!=students.end(); ++i)
        i->output();
    
 
}
 
 
 
void del ()
{
    setlocale( LC_ALL,"Russian" );
    
    if (students.empty()) cout<<"Нет студентов в списке";
    else 
    {
        string name;
        cout<<"\nВведите фамилию студента, данные о котом Вы хотите удалить "<<endl;
        getline(cin,name);
        getline(cin,name);
        CStudent stud(name, G1, 0);
        list <CStudent>::iterator location=find(students.begin(), students.end(),stud); 
        if (location!=students.end()) 
        { 
            students.erase(location);
            cout<<"\nСтудент с заданной фамилией "<<name<<" удален";
        }
        else    cout<<"\nВ списке нет студента с  фамилией "<<name;
    }
}
 
void new_list()
{
    setlocale( LC_ALL,"Russian" );
    
    cout<<"Будуте вводить данные с клавиатуры(y/n)? ";
        char s;
        cin>>s;
        if (s=='y' || s=='Y') 
        {       
            cout<<"Введите количество студентов ";
            int n;
            cin>>n;
            for (int i=1; i<=n; i++ ) 
                add();
        }                   
        else 
        {
            CStudent ar[]={
                CStudent ("Petrova", G1, 1995),
                CStudent ("Sidorov", G1, 1995),
                CStudent ("Utkin", G2, 1995),
                CStudent("Ivanova", G1, 1993),
                CStudent ("Antonov", G2, 1991)
            };
            int size=sizeof(ar)/sizeof(CStudent);
            list <CStudent> s(ar, ar+size);
            students=s;
            cout<<"\nСписок сфорирован из заданного массива";
        }
        cout<<"\nФормирование списка завершено";
        
}
 
 
void find()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else
    {
int number;
cout<<"Введите искомую группу"<<endl;
cin>>number;
list <CStudent>::iterator location = find(students.begin(),students.end(),number);
if (location==students.end())
    cout<<"Ничего не найдено"<<endl;
else
{
    cout<<"Результат:"<<endl;
    if (location==students.begin())
        cout<<"Студент с заданной группой найден:"<<number<<endl;
    location->output();
}
    }
 
 
 
}
int main ()
{
    setlocale (0,"Rus");
    bool q=0;
    
 
    while (q!=1)
    {
        cout<<"\nВыберите действие:\n";
        cout<<"1 - Начальное формирование списка студентов (ввод с клавиатуры или из заданного массива);\n";
        cout<<"2 - Добавления студента  в конец списка\n";
        cout<<"3 - Вывод списка студентов на экране\n";
        cout<<"4 - Удаление из массива студента с определенной ФИО\n";
        cout<<"5 - Поиск в списке всех студентов с заданным номером группы";
        cout<<"0 - Выход\n";
        
        char n;
 
        cin>>n;
        switch(n)
        {
        case '1':   
            {
                if (students.empty())
                    new_list(); 
                else cout<<"Список уже сформирован, Вы можете только добавить студента"; 
                break;
            }
        case '2':   {
                   add();
                   break;
                    }
        case '3':
            {
                   output();
                    break;
            }
        case '4':   {
                   del ();
                    break;
                    }
        case '5':   {
                    /*find();*/
 
                    break;
                    }
        case '0':   {q=1; break;}
        default:    cout<<"Ошибка ввода\n";
        }
        
        cout<<"\nДля продолжения нажмите Enter"; 
        _getch();
    }
        
}
ошибки
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
d:\visual studio 2010\vc\include\algorithm(41): error C2678: бинарный "==": не найден оператор, принимающий левый операнд типа "CStudent" (или приемлемое преобразование отсутствует)
1>          d:\visual studio 2010\vc\include\exception(470): может быть "bool std::operator ==(const std::_Exception_ptr &,const std::_Exception_ptr &)"
1>          d:\visual studio 2010\vc\include\exception(475): или       "bool std::operator ==(std::_Null_type,const std::_Exception_ptr &)"
1>          d:\visual studio 2010\vc\include\exception(481): или       "bool std::operator ==(const std::_Exception_ptr &,std::_Null_type)"
1>          d:\visual studio 2010\vc\include\system_error(408): или       "bool std::operator ==(const std::error_code &,const std::error_condition &)"
1>          d:\visual studio 2010\vc\include\system_error(416): или       "bool std::operator ==(const std::error_condition &,const std::error_code &)"
1>          при попытке сопоставить список аргументов "(CStudent, const CStudent)"
1>          d:\visual studio 2010\vc\include\algorithm(74): см. ссылку на создание экземпляров функции шаблон при компиляции "_InIt std::_Find<std::_List_unchecked_iterator<_Mylist>,_Ty>(_InIt,_InIt,const _Ty &)"
1>          with
1>          [
1>              _InIt=std::_List_unchecked_iterator<std::_List_val<CStudent,std::allocator<CStudent>>>,
1>              _Mylist=std::_List_val<CStudent,std::allocator<CStudent>>,
1>              _Ty=CStudent
1>          ]
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\newstudent.cpp(55): см. ссылку на создание экземпляров функции шаблон при компиляции "_InIt std::find<std::_List_iterator<_Mylist>,CStudent>(_InIt,_InIt,const _Ty &)"
1>          with
1>          [
1>              _InIt=std::_List_iterator<std::_List_val<CStudent,std::allocator<CStudent>>>,
1>              _Mylist=std::_List_val<CStudent,std::allocator<CStudent>>,
1>              _Ty=CStudent
1>          ]
1>d:\visual studio 2010\vc\include\algorithm(41): error C2678: бинарный "==": не найден оператор, принимающий левый операнд типа "CStudent" (или приемлемое преобразование отсутствует)
1>          d:\visual studio 2010\vc\include\exception(470): может быть "bool std::operator ==(const std::_Exception_ptr &,const std::_Exception_ptr &)"
1>          d:\visual studio 2010\vc\include\exception(475): или       "bool std::operator ==(std::_Null_type,const std::_Exception_ptr &)"
1>          d:\visual studio 2010\vc\include\exception(481): или       "bool std::operator ==(const std::_Exception_ptr &,std::_Null_type)"
1>          d:\visual studio 2010\vc\include\system_error(408): или       "bool std::operator ==(const std::error_code &,const std::error_condition &)"
1>          d:\visual studio 2010\vc\include\system_error(416): или       "bool std::operator ==(const std::error_condition &,const std::error_code &)"
1>          при попытке сопоставить список аргументов "(CStudent, const int)"
1>          d:\visual studio 2010\vc\include\algorithm(74): см. ссылку на создание экземпляров функции шаблон при компиляции "_InIt std::_Find<std::_List_unchecked_iterator<_Mylist>,_Ty>(_InIt,_InIt,const _Ty &)"
1>          with
1>          [
1>              _InIt=std::_List_unchecked_iterator<std::_List_val<CStudent,std::allocator<CStudent>>>,
1>              _Mylist=std::_List_val<CStudent,std::allocator<CStudent>>,
1>              _Ty=int
1>          ]
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\newstudent.cpp(108): см. ссылку на создание экземпляров функции шаблон при компиляции "_InIt std::find<std::_List_iterator<_Mylist>,int>(_InIt,_InIt,const _Ty &)"
1>          with
1>          [
1>              _InIt=std::_List_iterator<std::_List_val<CStudent,std::allocator<CStudent>>>,
1>              _Mylist=std::_List_val<CStudent,std::allocator<CStudent>>,
1>              _Ty=int
1>          ]
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:00.87
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:53
alexSo94, ну что могу сказать, вся твоя проблема не в перегрузке оператора ==, тебе нужно написать предикат для сравнения к алгоритму find, так как ты пытаешься сравнивать объект класса студент с целым числом, сейчас покажу как примерно надо
0
196 / 41 / 24
Регистрация: 24.02.2013
Сообщений: 231
25.04.2013, 17:57  [ТС]
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, а зачем ты номер группы сделал перечислением, да еще его реализовал отдельно от класса? Ты же не сможешь искать...
Ну там задание было, что нужно ввести номер группы с фиксированного списка.
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 18:11
alexSo94, хорошо, сейчас пересмотрю

Добавлено через 9 минут
alexSo94, твой .h

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
#ifndef CStudent_H
#define CStudent_H
#include <string>
using namespace std;
 
enum number_type{G1, G2, unknown};
 
class CStudent
{
    string name;
    number_type number;
    int year;
        
    public:
        friend bool operator==(const CStudent& left, const CStudent& right);
        CStudent();//конструктор «пустого» студента
        CStudent(string, number_type,  int);//конструктор создания студента на основе заданных фамилии, специальности, пола и года
        string get_name() {return name;}
        number_type number_gender(){return number;}
        int get_year(){return year;}
        void input();// метод ввода данных о студенте с клавиатуры
        void output();// метод вывода данных о студенте на экран
};
#endif
твой .cpp

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
#include "StdAfx.h"
#include "CStudent.h"
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
 
CStudent::CStudent(): name(""), number(unknown), year(0) {}
 
CStudent::CStudent(string n, number_type g, int y)
{
    name=n;
    number=g;
    year=y;
    
}
 
bool operator==(const CStudent& left, const CStudent& right)
{
    return (left.number== right.number && left.name== right.name
        && left.year== right.year);
}
 
void CStudent::output()
{
    cout.setf(ios::left);
    cout<<"\n"<<setw(30)<<name;
    if (number==G1) cout<<setw(8)<<"Первая"; 
    else if (number==G2) cout<<setw(8)<<"Вторая";
        else cout<<setw(8)<<"unknown";
    cout<<setw(4)<<year;
    
}
 
void CStudent::input()
{
    cout<<"\n Введите имя: ";
    getline(cin,name);
    getline(cin,name);
    cout<<"\n Введите группу (0-Первая, 1-Вторая) : ";
    bool f;
    cin>>f;
    if (f==0) number=G1; else number=G2;
    cout<<"\n Введите возраст: ";
    cin>>year;
    cout << "\n";
}
и main

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
//9.    Описать класс СТУДЕНТ (поля: ФИО, ГОД РОЖДЕНИЯ, КОД ГРУППЫ). Написать программу для работы со списком событий, используя контейнерный класс list. Программа должна обеспечивать выбор с помощью меню и выполнение одной из следующих функций:
//a)    начальное формирование списка студентов (ввод с клавиатуры или из заданного массива);
//b)    добавления студента  в конец списка;
//c)    вывод списка студентов на экран;
//d)    удаление из массива студента с определенной ФИО; 
//e)    поиск в списке всех студентов с заданным номером группы.
 
//
 
#include "stdafx.h"
#include "CStudent.h"
#include <iostream>
#include <conio.h> 
#include <list>
#include <algorithm>
list <CStudent> students;
 
void add()
{
    CStudent tmp; //cоздаём объект
    tmp.input(); //вводим данные
    students.push_back(tmp); //добавляем в конец списка
}
 
void output()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else 
        for (list<CStudent>::iterator i = students.begin(); i!=students.end(); ++i)
        i->output();
    
 
}
 
 
 
void del ()
{
    setlocale( LC_ALL,"Russian" );
    
    if (students.empty()) cout<<"Нет студентов в списке";
    else 
    {
        string name;
        cout<<"\nВведите фамилию студента, данные о котом Вы хотите удалить "<<endl;
        getline(cin,name);
        getline(cin,name);
        CStudent stud(name, G1, 0);
        list <CStudent>::iterator location;
 
        location=find_if(students.begin(), students.end(),[stud](CStudent &op)
        {
            return op == stud;  
        }); 
 
        if (location!=students.end()) 
        { 
            students.erase(location);
            cout<<"\nСтудент с заданной фамилией "<<name<<" удален";
        }
        else    cout<<"\nВ списке нет студента с  фамилией "<<name;
    }
}
 
void new_list()
{
    setlocale( LC_ALL,"Russian" );
    
    cout<<"Будуте вводить данные с клавиатуры(y/n)? ";
        char s;
        cin>>s;
        if (s=='y' || s=='Y') 
        {       
            cout<<"Введите количество студентов ";
            int n;
            cin>>n;
            for (int i=1; i<=n; i++ ) 
                add();
        }                   
        else 
        {
            CStudent ar[]={
                CStudent ("Petrova", G1, 1995),
                CStudent ("Sidorov", G1, 1995),
                CStudent ("Utkin", G2, 1995),
                CStudent("Ivanova", G1, 1993),
                CStudent ("Antonov", G2, 1991)
            };
            int size=sizeof(ar)/sizeof(CStudent);
            list <CStudent> s(ar, ar+size);
            students=s;
            cout<<"\nСписок сфорирован из заданного массива";
        }
        cout<<"\nФормирование списка завершено";
        
}
 
void find()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else
    {
number_type number = G1;
cout<<"Введите искомую группу"<<endl;
 
list <CStudent>::iterator location;
location = find_if(students.begin(),students.end(),[&number](CStudent &op)
    {
        return op.number_gender() == number;    
    });
 
if (location==students.end())
    cout<<"Ничего не найдено"<<endl;
else
{
    cout<<"Результат:"<<endl;
        cout<<"Студент с заданной группой найден:"<<number<<endl;
    location->output();
}
    }
}
 
int main ()
{
    setlocale (0,"Rus");
    bool q=0;
    
 
    while (q!=1)
    {
        cout<<"\nВыберите действие:\n";
        cout<<"1 - Начальное формирование списка студентов (ввод с клавиатуры или из заданного массива);\n";
        cout<<"2 - Добавления студента  в конец списка\n";
        cout<<"3 - Вывод списка студентов на экране\n";
        cout<<"4 - Удаление из массива студента с определенной ФИО\n";
        cout<<"5 - Поиск в списке всех студентов с заданным номером группы";
        cout<<"0 - Выход\n";
        
        char n;
 
        cin>>n;
        switch(n)
        {
        case '1':   
            {
                if (students.empty())
                    new_list(); 
                else cout<<"Список уже сформирован, Вы можете только добавить студента"; 
                break;
            }
        case '2':   {
                   add();
                   break;
                    }
        case '3':
            {
                   output();
                    break;
            }
        case '4':   {
                   del ();
                    break;
                    }
        case '5':   {
                    /*find();*/
 
                    break;
                    }
        case '0':   {q=1; break;}
        default:    cout<<"Ошибка ввода\n";
        }
        
        cout<<"\nДля продолжения нажмите Enter"; 
        _getch();
    }
        
}
1
196 / 41 / 24
Регистрация: 24.02.2013
Сообщений: 231
25.04.2013, 18:39  [ТС]
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, хорошо, сейчас пересмотрю

Добавлено через 9 минут
alexSo94, твой .h

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
#ifndef CStudent_H
#define CStudent_H
#include <string>
using namespace std;
 
enum number_type{G1, G2, unknown};
 
class CStudent
{
    string name;
    number_type number;
    int year;
        
    public:
        friend bool operator==(const CStudent& left, const CStudent& right);
        CStudent();//конструктор «пустого» студента
        CStudent(string, number_type,  int);//конструктор создания студента на основе заданных фамилии, специальности, пола и года
        string get_name() {return name;}
        number_type number_gender(){return number;}
        int get_year(){return year;}
        void input();// метод ввода данных о студенте с клавиатуры
        void output();// метод вывода данных о студенте на экран
};
#endif
твой .cpp

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
#include "StdAfx.h"
#include "CStudent.h"
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
 
CStudent::CStudent(): name(""), number(unknown), year(0) {}
 
CStudent::CStudent(string n, number_type g, int y)
{
    name=n;
    number=g;
    year=y;
    
}
 
bool operator==(const CStudent& left, const CStudent& right)
{
    return (left.number== right.number && left.name== right.name
        && left.year== right.year);
}
 
void CStudent::output()
{
    cout.setf(ios::left);
    cout<<"\n"<<setw(30)<<name;
    if (number==G1) cout<<setw(8)<<"Первая"; 
    else if (number==G2) cout<<setw(8)<<"Вторая";
        else cout<<setw(8)<<"unknown";
    cout<<setw(4)<<year;
    
}
 
void CStudent::input()
{
    cout<<"\n Введите имя: ";
    getline(cin,name);
    getline(cin,name);
    cout<<"\n Введите группу (0-Первая, 1-Вторая) : ";
    bool f;
    cin>>f;
    if (f==0) number=G1; else number=G2;
    cout<<"\n Введите возраст: ";
    cin>>year;
    cout << "\n";
}
и main

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
//9.    Описать класс СТУДЕНТ (поля: ФИО, ГОД РОЖДЕНИЯ, КОД ГРУППЫ). Написать программу для работы со списком событий, используя контейнерный класс list. Программа должна обеспечивать выбор с помощью меню и выполнение одной из следующих функций:
//a)    начальное формирование списка студентов (ввод с клавиатуры или из заданного массива);
//b)    добавления студента  в конец списка;
//c)    вывод списка студентов на экран;
//d)    удаление из массива студента с определенной ФИО; 
//e)    поиск в списке всех студентов с заданным номером группы.
 
//
 
#include "stdafx.h"
#include "CStudent.h"
#include <iostream>
#include <conio.h> 
#include <list>
#include <algorithm>
list <CStudent> students;
 
void add()
{
    CStudent tmp; //cоздаём объект
    tmp.input(); //вводим данные
    students.push_back(tmp); //добавляем в конец списка
}
 
void output()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else 
        for (list<CStudent>::iterator i = students.begin(); i!=students.end(); ++i)
        i->output();
    
 
}
 
 
 
void del ()
{
    setlocale( LC_ALL,"Russian" );
    
    if (students.empty()) cout<<"Нет студентов в списке";
    else 
    {
        string name;
        cout<<"\nВведите фамилию студента, данные о котом Вы хотите удалить "<<endl;
        getline(cin,name);
        getline(cin,name);
        CStudent stud(name, G1, 0);
        list <CStudent>::iterator location;
 
        location=find_if(students.begin(), students.end(),[stud](CStudent &op)
        {
            return op == stud;  
        }); 
 
        if (location!=students.end()) 
        { 
            students.erase(location);
            cout<<"\nСтудент с заданной фамилией "<<name<<" удален";
        }
        else    cout<<"\nВ списке нет студента с  фамилией "<<name;
    }
}
 
void new_list()
{
    setlocale( LC_ALL,"Russian" );
    
    cout<<"Будуте вводить данные с клавиатуры(y/n)? ";
        char s;
        cin>>s;
        if (s=='y' || s=='Y') 
        {       
            cout<<"Введите количество студентов ";
            int n;
            cin>>n;
            for (int i=1; i<=n; i++ ) 
                add();
        }                   
        else 
        {
            CStudent ar[]={
                CStudent ("Petrova", G1, 1995),
                CStudent ("Sidorov", G1, 1995),
                CStudent ("Utkin", G2, 1995),
                CStudent("Ivanova", G1, 1993),
                CStudent ("Antonov", G2, 1991)
            };
            int size=sizeof(ar)/sizeof(CStudent);
            list <CStudent> s(ar, ar+size);
            students=s;
            cout<<"\nСписок сфорирован из заданного массива";
        }
        cout<<"\nФормирование списка завершено";
        
}
 
void find()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else
    {
number_type number = G1;
cout<<"Введите искомую группу"<<endl;
 
list <CStudent>::iterator location;
location = find_if(students.begin(),students.end(),[&number](CStudent &op)
    {
        return op.number_gender() == number;    
    });
 
if (location==students.end())
    cout<<"Ничего не найдено"<<endl;
else
{
    cout<<"Результат:"<<endl;
        cout<<"Студент с заданной группой найден:"<<number<<endl;
    location->output();
}
    }
}
 
int main ()
{
    setlocale (0,"Rus");
    bool q=0;
    
 
    while (q!=1)
    {
        cout<<"\nВыберите действие:\n";
        cout<<"1 - Начальное формирование списка студентов (ввод с клавиатуры или из заданного массива);\n";
        cout<<"2 - Добавления студента  в конец списка\n";
        cout<<"3 - Вывод списка студентов на экране\n";
        cout<<"4 - Удаление из массива студента с определенной ФИО\n";
        cout<<"5 - Поиск в списке всех студентов с заданным номером группы";
        cout<<"0 - Выход\n";
        
        char n;
 
        cin>>n;
        switch(n)
        {
        case '1':   
            {
                if (students.empty())
                    new_list(); 
                else cout<<"Список уже сформирован, Вы можете только добавить студента"; 
                break;
            }
        case '2':   {
                   add();
                   break;
                    }
        case '3':
            {
                   output();
                    break;
            }
        case '4':   {
                   del ();
                    break;
                    }
        case '5':   {
                    /*find();*/
 
                    break;
                    }
        case '0':   {q=1; break;}
        default:    cout<<"Ошибка ввода\n";
        }
        
        cout<<"\nДля продолжения нажмите Enter"; 
        _getch();
    }
        
}
СПасибо огромное. Хотелось бы узнать подробнее о строке 52 main . Да и еще функция ищет только одного студента с заданной группой.
Миниатюры
Как перегрузить оператор?  
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 18:42
alexSo94, это лямбда функция, да, программа ищет первого студента, если надо всех, то уже нужен не алгоритм, нужно в цикле по итераторам идти
0
196 / 41 / 24
Регистрация: 24.02.2013
Сообщений: 231
25.04.2013, 18:45  [ТС]
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, это лямбда функция, да, программа ищет первого студента, если надо всех, то уже нужен не алгоритм, нужно в цикле по итераторам идти
ппц. Ну спасибо и на этом.
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 18:46
alexSo94, ну в цикле не сложно, сейчас покажу
1
196 / 41 / 24
Регистрация: 24.02.2013
Сообщений: 231
25.04.2013, 18:47  [ТС]
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, ну в цикле не сложно, сейчас покажу
Ок спасибо огромное.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2013, 18:47
Помогаю со студенческими работами здесь

Как перегрузить оператор []?
вообщем есть класс class Point{ private: int color_id, state; public: //constructors Point(); //destructors ...

Как перегрузить оператор разыменования *
Как перегрузить оператор разыменования?

Как перегрузить оператор << в классе?
Всем привет, есть данный код: #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include &quot;ccolor.h&quot; #include...

Как перегрузить оператор ввода?
Как перегрузить оператор ввода? rational.h #define _Rational_h_ #include &lt;iostream&gt; using namespace std; int nod(int p,...

Как правильно перегрузить оператор [] =
вот например в классе хранится массив, и допустим я хочу елементу массива в этом классе присвоить другое значение, тоесть так, class...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru