Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Headmaster
1 / 1 / 1
Регистрация: 08.05.2013
Сообщений: 95
#1

Дружественная функция для сравнения строк - C++

17.05.2013, 12:42. Просмотров 618. Ответов 11
Метки нет (Все метки)

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

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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include <iostream>
#include <string>
#include <math.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
 
class Student
{
    char *firstname;
    char *lastname;
    char *faculty;
    int kurs;
    double *otcenka;
    int kolvo;
    double sredniibal;
public:
    Student(char * =" ", char * =" ", char * =" ", int =0, int =0, double* =0);
    ~Student();
    Student &operator=(const Student &);
    void setFirstname(char *);
    void setLastname(char *);
    void setFaculty(char *);
    void setKurs(int);
    void setKolvo(int);
    void show()const;
    double getsredniibal();
    friend void ShowFaculty(Student *, char ,char );
};
void ShowFaculty(Student *mass, char *fac,char *l) //та самая дружественная функция
{
    char *facvibr;
    facvibr=new char[strlen(fac)+1];
    cout<<"Vvedite facultet:";
    cin>>facvibr;
    if (strcmp(fac,  facvibr) ==0)
        cout<<facvibr<<l<<endl;
}
double Student::getsredniibal()
{
    double sum=0;
    for (int i=0; i<kolvo; i++)
        sum+=otcenka[i];
    sredniibal=sum/kolvo;
    cout<<lastname;
    return this->sredniibal;
}
Student::Student(char *f,char *l, char *fac, int k, int kol, double* o)
{
    this->firstname=new char[strlen(f)+1];
    strcpy(this->firstname,f);
    this->lastname=new char[strlen(l)+1];
    strcpy(this->lastname,l);
    this->faculty=new char[strlen(fac)+1];
    strcpy(this->faculty,fac);
    this->kurs=k;
    this->kolvo=kol;
    this->otcenka=new double [this->kolvo];
    for(int i=0;i<kolvo;i++)
        this->otcenka[i] = o[i];
}
 
Student &Student::operator=(const Student &obj)
{
    if(this->firstname)
        delete[]this->firstname;
    if(this->lastname)
        delete[]this->lastname;
    if(this->faculty)
        delete[]this->faculty;
    this->firstname=new char[strlen(obj.firstname)+1];
    strcpy(this->firstname,obj.firstname);
    this->lastname=new char[strlen(obj.lastname)+1];
    strcpy(this->lastname,obj.lastname);
    this->faculty=new char[strlen(obj.faculty)+1];
    strcpy(this->faculty,obj.faculty);
    this->kurs=obj.kurs;
    this->kolvo=obj.kolvo;
    if(this->otcenka) delete [] this->otcenka;
        this->otcenka=new double [this->kolvo];
    for(int i=0;i<kolvo;i++)
        this->otcenka[i] = obj.otcenka[i];
    return *this;
}
Student::~Student()
{
    if(this->firstname)
        delete[]this->firstname;
    if(this-> lastname)
        delete[]this->lastname;
    if(this->faculty)
        delete[]this->faculty;
}
void Student::setFirstname(char *f)
{
    if(this->firstname)
        delete[]this->firstname;
    this->firstname=new char[strlen(f)+1];
    strcpy(this->firstname,f);
}
void Student::setLastname(char *l)
{
    if(this->lastname)
        delete[]this->lastname;
    this->lastname=new char[strlen(l)+1];
    strcpy(this->lastname,l);
}
void Student::setFaculty(char *fac)
{
    if(this->faculty)
        delete[]this->faculty;
    this->faculty=new char[strlen(fac)+1];
    strcpy(this->faculty,fac);
}
void Student::setKurs(int k)
{
    this->kurs=k;
}
void Student::setKolvo(int kol)
{
    this->kolvo=kol;
}
void Student::show()const
{
    cout<<this->firstname<<endl;
    cout<<this->lastname<<endl;
    cout<<this->faculty<<endl;
    cout<<this->kurs<<endl;
    for(int i=0;i<kolvo;i++)
        cout<<this->otcenka[i]<<" ";
    cout<<endl;
}
int menu()
{
    cout<<"Vvedite:"<<endl;
    cout<<"1-sozdat zapis"<<endl;
    cout<<"2-posmotret vseh"<<endl;
    cout<<"3-vivesti srednii bal"<<endl;
    cout<<"4-vivesti spisok studentov faculteta"<<endl;
    cout<<"0-exit"<<endl;
    int z;
    cin>>z;
    return z;
}
void main()
{
    Student *mass=0;
    int n=0;
    while(int z=menu())
    {
        switch (z)
        {
        case 1:                                            //здесь я заполняю массив
            {
                char f[80],l[80],fac[80];
                int k,kol;
                double *o;
                cout<<"firstname:";
                cin>>f;
                cout<<"lastname:";
                cin>>l;
                cout<<"faculty:";
                cin>>fac;
                cout<<"kurs:";
                cin>>k;
                cout<<"vvedite kol-vo eksamenov:";
                cin>>kol;
                o = new double[kol];
                cout<<"vvedite otcenki za eksameni:";
                for(int i=0;i<kol;i++)
                    cin>>o[i];
                Student buf (f,l,fac,k,kol,o);
                Student *buf_mass=mass;
                mass=new Student[n+1];
                for(int i=0;i<n;i++)
                    mass[i]=buf_mass[i];
                mass[n]=buf;
                if(buf_mass)
                    delete[]buf_mass;
                n++;
                break;
            }
        case 2:
            {
                for(int i=0;i<n;i++)
                    mass[i].show();
                break;
            }
        case 3:
            {
                for(int i=0;i<n;i++)
                    cout<<" "<<mass[i].getsredniibal()<<endl;
                break;
            }
        case 4:                                                                             //вызываю
            {
                char l[80],fac[80];
                ShowFaculty(mass,fac, l);
                break;
            }
            default:
            {
                cout<<"unknown"<<endl;
                break;
            }
        }
    }
    if(mass) delete[]mass;
}



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
    friend void ShowFaculty(Student *, char ,char );
};
void ShowFaculty(Student *mass, char *fac,char *l) //та самая дружественная функция
{
    char *facvibr;
    facvibr=new char[strlen(fac)+1];
    cout<<"Vvedite facultet:";
    cin>>facvibr;
    if (strcmp(fac,  facvibr) ==0)
        cout<<facvibr<<l<<endl;
}
 
        case 1:                                            //здесь я заполняю массив
            {
                char f[80],l[80],fac[80];
                int k,kol;
                double *o;
                cout<<"firstname:";
                cin>>f;
                cout<<"lastname:";
                cin>>l;
                cout<<"faculty:";
                cin>>fac;
                cout<<"kurs:";
                cin>>k;
                cout<<"vvedite kol-vo eksamenov:";
                cin>>kol;
                o = new double[kol];
                cout<<"vvedite otcenki za eksameni:";
                for(int i=0;i<kol;i++)
                    cin>>o[i];
                Student buf (f,l,fac,k,kol,o);
                Student *buf_mass=mass;
                mass=new Student[n+1];
                for(int i=0;i<n;i++)
                    mass[i]=buf_mass[i];
                mass[n]=buf;
                if(buf_mass)
                    delete[]buf_mass;
                n++;
                break;
            }
 
        case 4:                                                                             //вызываю
            {
                char l[80],fac[80];
                ShowFaculty(mass,fac, l);
                break;
            }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2013, 12:42     Дружественная функция для сравнения строк
Посмотрите здесь:

Класс "Человек" + дружественная функция сравнения по возрасту - C++
Создать класс человек и к нему дружественную функцию сравнения по возрасту (сравнение 2-х человек) class Human { private: ...

Дружественная функция для двух классов - C++
Фукция setdesign() не понимает типов данных, созданных с помощью классов. При обявлении функции дружественной классам generator и peltier...

не работает функция сравнения строк - C++
В функции, отвечающей за удаление страны из списка не хочет работать часть поиска нужной страны из общего списка. Подскажите в чем ошибка ...

Функция сравнения двух строк - C++
Написать функцию сравнения двух строк, используя указатели на них. Прошу помочь написать код программа для заданного условия

Функция сравнения строк с разной длиной - C++
Создайте свою версию библиотечной функции strcmp(sl, s2), которая сравнивает две строки и возвращает -1, если s1 идет первой по алфавиту,...

Функция для сравнения файлов - C++
Даны два текстовый файла, состоящие из некоторого количества строк. Написать функцию для сравнения этих файлов. Помогите пожалуйста

Дружественная функция - C++
Хочу сделать вычисление площади как дружественную функцию, начал описывать, дальше догнать не могу как кодить. Подскажите? #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2013, 12:58     Дружественная функция для сравнения строк #2
А зачем такая функция вообще нужна? В любом нормальном стрококлассе для этой цели есть операторы-члены.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.05.2013, 13:07     Дружественная функция для сравнения строк #3
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем такая функция вообще нужна?
Цитата Сообщение от taras atavin Посмотреть сообщение
для этой цели есть операторы-члены.
а зачем нужны такие операторы-члены которые не модифицируют this
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.05.2013, 15:10     Дружественная функция для сравнения строк #4
Цитата Сообщение от Jupiter Посмотреть сообщение
а зачем нужны такие операторы-члены которые не модифицируют this
ну есть же const и static функции
Headmaster
1 / 1 / 1
Регистрация: 08.05.2013
Сообщений: 95
17.05.2013, 16:23  [ТС]     Дружественная функция для сравнения строк #5
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем такая функция вообще нужна? В любом нормальном стрококлассе для этой цели есть операторы-члены.
Цитата Сообщение от Jupiter Посмотреть сообщение
а зачем нужны такие операторы-члены которые не модифицируют this
Цитата Сообщение от Tulosba Посмотреть сообщение
ну есть же const и static функции
Я понимаю что это форум, но может по делу у вас что-то есть?
gray_fox
What a waste!
1449 / 1178 / 61
Регистрация: 21.04.2012
Сообщений: 2,466
Завершенные тесты: 3
17.05.2013, 17:10     Дружественная функция для сравнения строк #6
Цитата Сообщение от Headmaster Посмотреть сообщение
friend void ShowFaculty(Student *, char ,char );
Цитата Сообщение от Headmaster Посмотреть сообщение
void ShowFaculty(Student *mass, char *fac,char *l)
Сигнатуры в объявлении другом и самой функции не совпадают (2 последних типов аргументов).
Headmaster
1 / 1 / 1
Регистрация: 08.05.2013
Сообщений: 95
17.05.2013, 17:27  [ТС]     Дружественная функция для сравнения строк #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Сигнатуры в объявлении другом и самой функции не совпадают (2 последних типов аргументов).
Спасибо. Но дело не только в этом
gray_fox
17.05.2013, 17:29
  #8

Не по теме:

Headmaster, советую копировать изменённый код и ошибки компиляции\линковки в тему (в тегах).

Headmaster
1 / 1 / 1
Регистрация: 08.05.2013
Сообщений: 95
17.05.2013, 21:46  [ТС]     Дружественная функция для сравнения строк #9
Цитата Сообщение от gray_fox Посмотреть сообщение
Headmaster, советую копировать изменённый код и ошибки компиляции\линковки в тему (в тегах).
Ошибок компиляции нет. Я не могу разобраться с friend-функциями, не понимаю что туда надо передать и как сделать
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.05.2013, 22:11     Дружественная функция для сравнения строк #10
Цитата Сообщение от Headmaster Посмотреть сообщение
Я не могу разобраться с friend-функциями
Дружественная функция - функция, которая не является членом класса, при этом имеет доступ к скрытым полям класса. По Вашему коду, функция, определенная в 30 строке не является дружественной классу Student, т.к. в 28 строке сигнатура функции другая.
Цитата Сообщение от Headmaster Посмотреть сообщение
не понимаю что туда надо передать и как сделать
Передаете экземпляр класса, которым хотите оперировать, и выполняете нужные действия.
Headmaster
1 / 1 / 1
Регистрация: 08.05.2013
Сообщений: 95
18.05.2013, 11:53  [ТС]     Дружественная функция для сравнения строк #11
Спасибо конечно за советы, но в итоге более менее самому пришлось переделать + прочитать 213 страниц книги

Если кому интересно, то надо было некоторые локальные переменные сделать более глобальными. Когда доведу до ума, скину конечный код. Надеюсь кому-нибудь поможет/будет интересно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2013, 11:49     Дружественная функция для сравнения строк
Еще ссылки по теме:

Дружественная функция - C++
У меня есть класс, подсчитывающий количество равносторонних треугольников в заданном множестве точек на плоскости. Подскажите,...

Дружественная функция - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class massiv { int len,*p_mas; public : massiv() {} massiv...

Дружественная функция - C++
описать классы автомобиль и маршрут. Использовать дружественную функцию определить количество потраченного топлива и время на преодоление...

Функция для сравнения двух массивов - C++
Функция нужна для ответа на вопрос задачи &quot;Верно ли, что все элементы 1-ой последовательности входят во 2-ю последовательность.&quot;...

Дружественная функция. Графы - C++
Здравствуйте! Задача такая: Пересечением двух графов называется граф, все вершины и все ребра которого принадлежат как одному, так и...


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

Или воспользуйтесь поиском по форуму:
Headmaster
1 / 1 / 1
Регистрация: 08.05.2013
Сообщений: 95
23.05.2013, 11:49  [ТС]     Дружественная функция для сравнения строк #12
Извиняюсь что поднимаю слегка старую тему, но я вот доделал код и хочу поделиться

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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#include <iostream>
#include <string>
#include <math.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
 
class Student
{
    char *firstname;
    char *lastname;
    char *faculty;
    int kurs;
    double *otcenka;
    int kolvo;
    double sredniibal;
public:
    Student(char * =" ", char * =" ", char * =" ", int =0, int =0, double* =0);
    ~Student();
    Student & operator = (const Student &);
    void setFirstname (char *);
    void setLastname (char *);
    void setFaculty (char *);
    void setKurs (int);
    void setKolvo (int);
    void show()const;
    double getsredniibal();
    friend void ShowFaculty (Student *, int ,char *);
    friend void ShowKursFaculty (Student *, int, char *, int);
};
void ShowKursFaculty (Student *mass, int n, char *fac, int k)
{
    cout << "Na vibrannom kurse faculteta est studenti" << endl;
    for (int i = 0; i < n; i++)
        if (!strcmp(mass[i].faculty ,fac) && mass[i].kurs == k)
            cout  << mass[i].lastname << endl;
}
void ShowFaculty (Student *mass, int n, char *fac)
{
    cout << "Na vibrannom facultete est studenti" << endl;
    for (int i = 0; i < n; i++)
        if(!strcmp(mass[i].faculty ,fac))
            cout  << mass[i].lastname << endl;
}
double Student::getsredniibal()
{
    double sum = 0;
    for (int i = 0; i < kolvo; i++)
        sum += otcenka[i];
    sredniibal = sum / kolvo;
    cout << lastname;
    return this-> sredniibal;
}
Student::Student(char *f,char *l, char *fac, int k, int kol, double* o)
{
    this-> firstname = new char [strlen(f) + 1];
    strcpy (this-> firstname, f);
    this-> lastname = new char [strlen(l) + 1];
    strcpy (this-> lastname,l);
    this-> faculty = new char [strlen(fac) + 1];
    strcpy(this-> faculty,fac);
    this-> kurs = k;
    this-> kolvo = kol;
    this-> otcenka = new double [this-> kolvo];
    for(int i = 0; i < kolvo; i++)
        this-> otcenka[i] = o[i];
}
 
Student &Student::operator = (const Student &obj)
{
    if (this-> firstname)
        delete [] this-> firstname;
    if (this-> lastname)
        delete [] this-> lastname;
    if (this-> faculty)
        delete [] this-> faculty;
    this-> firstname = new char [strlen (obj.firstname) + 1];
    strcpy (this-> firstname, obj.firstname);
    this-> lastname = new char [strlen (obj.lastname) + 1];
    strcpy (this-> lastname, obj.lastname);
    this-> faculty = new char [strlen (obj.faculty) + 1];
    strcpy (this-> faculty, obj.faculty);
    this-> kurs = obj.kurs;
    this-> kolvo = obj.kolvo;
    if (this-> otcenka) delete [] this-> otcenka;
        this-> otcenka = new double [this-> kolvo];
    for (int i = 0; i < kolvo; i++)
        this-> otcenka[i] = obj.otcenka[i];
    return *this;
}
Student::~Student()
{
    if (this-> firstname)
        delete [] this-> firstname;
    if(this-> lastname)
        delete [] this-> lastname;
    if(this-> faculty)
        delete [] this-> faculty;
}
void Student::setFirstname(char *f)
{
    if (this-> firstname)
        delete [] this-> firstname;
    this-> firstname = new char [strlen(f) + 1];
    strcpy (this-> firstname, f);
}
void Student::setLastname(char *l)
{
    if (this-> lastname)
        delete [] this-> lastname;
    this-> lastname = new char [strlen(l) + 1];
    strcpy (this-> lastname, l);
}
void Student::setFaculty(char *fac)
{
    if (this-> faculty)
        delete [] this-> faculty;
    this-> faculty = new char [strlen(fac) + 1];
    strcpy (this-> faculty, fac);
}
void Student::setKurs(int k)
{
    this-> kurs = k;
}
void Student::setKolvo(int kol)
{
    this-> kolvo = kol;
}
void Student::show()const
{
    cout << this-> firstname << endl;
    cout << this-> lastname << endl;
    cout << this-> faculty << endl;
    cout << this-> kurs << endl;
    for (int i = 0; i < kolvo; i++)
        cout << this-> otcenka[i] <<" ";
    cout << endl;
}
int menu()
{
    cout << "Vvedite:" << endl;
    cout << "1-sozdat zapis" << endl;
    cout << "2-posmotret vseh" << endl;
    cout << "3-vivesti srednii bal" << endl;
    cout << "4-vivesti spisok studentov faculteta" << endl;
    cout << "5-vivesti spisok studentov kursa faculteta" << endl;
    cout << "0-exit" << endl;
    int z;
    cin >> z;
    return z;
}
void main()
{
    Student *mass = 0;
    int n = 0;
    char f[80], l[80], fac[80];
    int k, kol;
    double *o;
    while(int z = menu())
    {
        switch (z)
        {
        case 1:
            {
                cout << "firstname:";
                cin >> f;
                cout << "lastname:";
                cin >> l;
                cout << "faculty:";
                cin >> fac;
                cout << "kurs:";
                cin >> k;
                cout << "vvedite kol-vo eksamenov:";
                cin >> kol;
                o = new double [kol];
                cout << "vvedite otcenki za eksameni:";
                for (int i = 0; i < kol; i++)
                    cin >> o[i];
                Student buf (f, l, fac, k, kol, o);
                Student *buf_mass = mass;
                mass = new Student [n+1];
                for (int i = 0; i < n; i++)
                    mass[i] = buf_mass[i];
                mass [n] = buf;
                if (buf_mass)
                    delete [] buf_mass;
                n++;
                break;
            }
        case 2:
            {
                for (int i = 0; i < n; i++)
                    mass[i].show();
                break;
            }
        case 3:
            {
                for(int i = 0; i < n; i++)
                    cout << " " << mass[i].getsredniibal() << endl;
                break;
            }
        case 4:
            {
                cout << "Vvedite facultet:";
                cin >> fac;
                ShowFaculty(mass, n, fac);
                break;
            }
        case 5:
            {
                cout << "Vvedite facultet:";
                cin >> fac;
                cout << "Vvedite kurs:";
                cin >> k;
                ShowKursFaculty(mass, n, fac, k);
                break;
            }
            default:
            {
                cout << "unknown" << endl;
                break;
            }
        }
    }
    if (mass) delete [] mass;
}
Пояснения к коду быди в предыдущих постах, но если возникнут у кого вопросы - обращаетесь. Надеюсь кому-нибудь поможет
Yandex
Объявления
23.05.2013, 11:49     Дружественная функция для сравнения строк
Ответ Создать тему
Опции темы

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