Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
#1

Как перегрузить оператор - C++

25.04.2013, 16:20. Просмотров 794. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2013, 16:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как перегрузить оператор (C++):

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

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

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

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

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

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

26
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 16:27 #2
alexSo94, какой оператор вы пытаетесь перегрузить? Я что не заметил.
0
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 16:31  [ТС] #3
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, какой оператор вы пытаетесь перегрузить? Я что не заметил.
==
C++
1
2
3
bool operator ==(const CStudent &);
bool CStudent::operator ==(const CStudent &a)
{return number==a.number;}
0
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
25.04.2013, 16:36 #4
C++
1
2
3
4
bool operator==(const CStudent& left, const CStudent& right)
{
    return left.number == right.number;
}
0
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 16:58  [ТС] #5
Цитата Сообщение от 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
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:02 #6
alexSo94, я знаете чего не пойму? В ищете группу,


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

Цитата Сообщение от alexSo94 Посмотреть сообщение
if (location==students.begin())
не нужна, поскольку в location и будет нужный результат, поэтому необходимости в перегруженном операторе == нет.
0
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
25.04.2013, 17:03 #7
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
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:08 #8
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
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 17:30  [ТС] #9
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, я знаете чего не пойму? В ищете группу,




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



не нужна, поскольку в location и будет нужный результат, поэтому необходимости в перегруженном операторе == нет.
Когда я убираю
C++
1
bool operator==(const CStudent& left, const CStudent& right);
Вываливаеться куча ошибок(
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
25.04.2013, 17:34 #10
Читайте про предикаты.
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:35 #11
alexSo94, а что за ошибки? Просто я реально не пойму зачем сравнивать уже найденное число с самим собой, это не логично, давайте посмотрим что выскакивает покажите сейчас как выглядит функция и покажите ошибки какие выдает компилятор
0
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 17:39  [ТС] #12
Цитата Сообщение от 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
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:53 #13
alexSo94, ну что могу сказать, вся твоя проблема не в перегрузке оператора ==, тебе нужно написать предикат для сравнения к алгоритму find, так как ты пытаешься сравнивать объект класса студент с целым числом, сейчас покажу как примерно надо
0
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 17:57  [ТС] #14
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, а зачем ты номер группы сделал перечислением, да еще его реализовал отдельно от класса? Ты же не сможешь искать...
Ну там задание было, что нужно ввести номер группы с фиксированного списка.
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 18:11 #15
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
25.04.2013, 18:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2013, 18:11
Привет! Вот еще темы с ответами:

Как перегрузить оператор в виртуальном классе - C++
Помогите пожалста разобраться с перегрузкой операторов в абстрактных классах!!!! Есть чисто виртуальный класс физических величин ...

Как перегрузить оператор ввода из файла? - C++
Допустим у нас есть класс: class A {friend ifstream &amp;operator&gt;&gt;(ifstream &amp;, A &amp;); private: char a; char b; ...

Как в классе перегрузить оператор двойного индексирование? - C++
Вот мой класс.. class Matrix { int ** m; public: Matrix() { srand(time(NULL)); m=new int*;

Как перегрузить оператор [][] для разреженной матрицы? - C++
как перегрузить оператор для разреженной матрицы?знаю, что такого оператора нет, есть только , но все равно не понимаю как его перегрузить


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru