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

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

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

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

17.05.2013, 12:42. Просмотров 642. Ответов 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;
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2013, 12:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дружественная функция для сравнения строк (C++):

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

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

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

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

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

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

11
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2013, 12:58 #2
А зачем такая функция вообще нужна? В любом нормальном стрококлассе для этой цели есть операторы-члены.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.05.2013, 13:07 #3
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем такая функция вообще нужна?
Цитата Сообщение от taras atavin Посмотреть сообщение
для этой цели есть операторы-члены.
а зачем нужны такие операторы-члены которые не модифицируют this
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.05.2013, 15:10 #4
Цитата Сообщение от Jupiter Посмотреть сообщение
а зачем нужны такие операторы-члены которые не модифицируют this
ну есть же const и static функции
0
Headmaster
1 / 1 / 1
Регистрация: 08.05.2013
Сообщений: 100
17.05.2013, 16:23  [ТС] #5
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем такая функция вообще нужна? В любом нормальном стрококлассе для этой цели есть операторы-члены.
Цитата Сообщение от Jupiter Посмотреть сообщение
а зачем нужны такие операторы-члены которые не модифицируют this
Цитата Сообщение от Tulosba Посмотреть сообщение
ну есть же const и static функции
Я понимаю что это форум, но может по делу у вас что-то есть?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
17.05.2013, 17:10 #6
Цитата Сообщение от Headmaster Посмотреть сообщение
friend void ShowFaculty(Student *, char ,char );
Цитата Сообщение от Headmaster Посмотреть сообщение
void ShowFaculty(Student *mass, char *fac,char *l)
Сигнатуры в объявлении другом и самой функции не совпадают (2 последних типов аргументов).
1
Headmaster
1 / 1 / 1
Регистрация: 08.05.2013
Сообщений: 100
17.05.2013, 17:27  [ТС] #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Сигнатуры в объявлении другом и самой функции не совпадают (2 последних типов аргументов).
Спасибо. Но дело не только в этом
0
gray_fox
17.05.2013, 17:29
  #8

Не по теме:

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

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

Если кому интересно, то надо было некоторые локальные переменные сделать более глобальными. Когда доведу до ума, скину конечный код. Надеюсь кому-нибудь поможет/будет интересно.
0
Headmaster
1 / 1 / 1
Регистрация: 08.05.2013
Сообщений: 100
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;
}
Пояснения к коду быди в предыдущих постах, но если возникнут у кого вопросы - обращаетесь. Надеюсь кому-нибудь поможет
0
23.05.2013, 11:49
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++
Хочу сделать вычисление площади как дружественную функцию, начал описывать, дальше догнать не могу как кодить. Подскажите? #include...

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


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

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

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