2 / 2 / 1
Регистрация: 18.04.2017
Сообщений: 48
1

Переписать класс с Public в Private. Обеспечить доступ к данным (дописать программу)

02.03.2019, 17:46. Показов 420. Ответов 3
Метки нет (Все метки)

Всем привет. Написал код "база данных студентов". Нужно переделать: всё что находится в public, закинуть в private, а в public дописать методы которые будут работать с этими данными. Из-за недостатка знаний не могу грамотно дописать. Также приветствуется критика по коду, возможно я все усложняю и можно было сделать куда легче
Буду очень благодарен за вашу помощь
Код:
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
#include <iostream>
 
using namespace std;
 
class student
{
    public:
    char *name;
    int kurs;
    float rating;
};
 
student *create_student(student *students, int &n)
{
    if (n == 0)
    {
        students = new student[100];
        cout << "Введите количество студентов: ";
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            cout << "\n";
            cout << "Имя: ";
            students[i].name = new char[100];
            cin >> students[i].name;
            cout << "Курс: ";
            cin >> students[i].kurs;
            cout << "Рейтинг: ";
            cin >> students[i].rating;
            cout << "------------------------------" << "\n";
        }
    }
    else
        cout << "База данных заполнена." << endl;
    return students;
}
 
void print_student(student *students, int n, int M)
{
    if (M == 0)
    {
        for (int i = 0; i < n; i++)
        {
            cout << endl;
            cout << "Имя: " << students[i].name << " Курс: " << students[i].kurs << " Рейтинг: " << students[i].rating;
            cout << endl;
        }
    }
    else
    {
        for (int i = 0; i < M; i++)
        {
            cout << endl;
            cout << "Имя: " << students[i].name << " Курс: " << students[i].kurs << " Рейтинг: " << students[i].rating;
            cout << endl;
        }
    }
    return;
}
 
void find(student *students, int n)
{
    student *find = new student[100];
    int count = 0;
    for (int i = 0; i < n; i++)
    {
        if ((students[i].kurs <= 2) && (students[i].rating <= 3))
        {
            find[count].name = students[i].name;
            find[count].kurs = students[i].kurs;
            find[count].rating = students[i].rating;
            count++;
        }
    }
    if (count != 0)
    {
        for (int i = 0; i < count; i++)
        {
            cout << endl;
            cout << "Имя: " << find[i].name << " Курс: " << find[i].kurs << " Рейтинг: " << find[i].rating;
            cout << endl;
        }
    }
    else
    {
        cout << endl;
        cout << "Таких студентов нет в базе данных." << endl;
        cout << endl;
    }
    delete[] find;
    return;
}
 
void insert_student(student *students, int n, int &M)
{
    if (n != 0)
    {
        int K = 0, N = 0;
        cout << "Введите K строк для удаления" << endl;
        cin >> K;
        cout << "Начиная со строки с номером N" << endl;
        cin >> N;
        M = n - K;
        for (int i = N; i < M; i++)
        {
            students[i].name = students[i + K].name;
            students[i].kurs = students[i + K].kurs;
            students[i].rating = students[i + K].rating;
        }
    }
    else
    {
        cout << endl;
        cout << "Сначала создайте базу данных." << endl;
        cout << endl;
    }
    return;
}
 
void delete_student(student *students, int n)
{
    if (n != 0)
    {
        delete[] students;
        students = nullptr;
    }
    else
    {
        cout << endl;
        cout << "База данных пуста." << endl;
        cout << endl;
    }
}
 
 
int main()
{
    setlocale(LC_ALL, "russian");
    int n = 0, k = 0, M = 0;
    student *students = nullptr;
    do
    {
        cout << "1. Создать базу данных студентов\n";
        cout << "2. Показать базу данных студентов\n";
        cout << "3. Найти студентов 1 и 2 курса, у которых рейтинг меньше 3\n";
        cout << "4. Удалить K сток начиная со строки с номером N\n";
        cout << "5. Очистить базу данных \n";
        cout << "6. Выход\n";
        cin >> k;
        switch (k)
        {
        case 1:
            students = create_student(students, n);
            cout << endl;
            break;
        case 2:
            print_student(students, n, M);
            cout << endl;
            break;
        case 3:
            find(students, n);
            cout << endl;
            break;
        case 4:
            insert_student(students, n, M);
            break;
        case 5:
            delete_student(students, n);
            n = 0, M = 0;
            break;
        }
    } while (k != 6);
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2019, 17:46
Ответы с готовыми решениями:

Доступ к private-данным одного класса из другого
Как получить доступ к private данных одного класса в другом? В принципе нельзя. Но можешь всеже...

Не могу получить доступ к private данным через дружественную функцию
Заголовочный файл: class Vector { private: int * vect; int size; public: Vector();...

Один и тот же метод объявлен в базовом private, а в производном public; и по ссылке на производный класс он не вызывается!
Прежде всего, вот код который компилится и работает, он описан у Эккеля (глава 8 &quot;Полиморфизм&quot;): ...

Доступ к полям private final из класса в класс
Здравствуйте! Подскажите пожалуйста, можно ли осуществить доступ к закрытому полю объекта класса...

3
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 467
02.03.2019, 18:40 2
Цитата Сообщение от Edudin97 Посмотреть сообщение
char *name;
Используй string
Цитата Сообщение от Edudin97 Посмотреть сообщение
student *create_student(student *students, int &n)
Почитай про конструкторы, да и вообще, все функции закинь в сам класс
Для доступа к элементам используй get/set, например
C++
1
2
3
4
private:
std::string name;
public:
std::string getName() {return name;}
0
2 / 2 / 1
Регистрация: 18.04.2017
Сообщений: 48
02.03.2019, 19:26  [ТС] 3
Спасибо за совет, но это не поможет. Я пока пытаюсь добиться полной работоспособности программы, а потом изменю тип переменной. Также не могу закинуть все в класс, потому что в программе есть меню где вызываю функции, а если они буду в классе - то только там и доступны.
Пытаюсь что-то реализовать, но это все равно не то
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
class student
{
private:
    char *name;
    int *kurs;
    float *rating;
public:
    void set_name(char *set_name)
    {
        name = new char[50];
        for (int i = 0; i < 3; ++i)
        name[i] = set_name[i];
    }
    char *get_name()
    {
        return name;
    }
    void set_kurs(int *set_kurs)
    {
        kurs = new int[3];
        for (int i = 0; i < 3; ++i)
            kurs[i] = set_kurs[i];
    }
    int *get_kurs()
    {
        return kurs;
    }
    void set_rating(float *set_rating)
    {
        rating = new float[3];
        for (int i = 0; i < 3; ++i)
            rating[i] = set_rating[i];
    }
    float *get_rating()
    {
        return rating;
    }
};
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
02.03.2019, 19:32 4
Цитата Сообщение от Edudin97 Посмотреть сообщение
Я пока пытаюсь добиться полной работоспособности программы, а потом изменю тип переменной.
Вам это не поможет пока Вы не поймете как работают указатели, массивы (в том числе динамические) и вероятно ООП.
Только я хотел указать на ошибки, но посмотрев на это:
Цитата Сообщение от Edudin97 Посмотреть сообщение
C++
1
2
3
char *name;
int *kurs;
float *rating;
, понял что в этом нету смысла. Почитайте подробнее раздел об указателях и строках, для начала.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2019, 19:32
Помогаю со студенческими работами здесь

Почему я могу легально получить доступ к private полю у ссылочного типа на класс?
Здравствуйте, я недавно решила написать длинную арифметику по памяти (годовой давности) и как можно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru