18.11.2015, 01:32. Показов 856. Ответов 2
А точнее, компилятор возвращает такую ошибку:
ОС: Mac OS X 10.9.5
IDE: Xcode 6.2
Изначально просто пытался подключить необходимые файлы программы в .cpp через #include в главный файл.
Возвращалась вот эта самая ошибка. После попытки поиска решения в гугле я решил использовать вдобавок заголовочные файлы для подключаемых файлов .cpp. Я перенес весь код из файлов .cpp в их заголовочные файлы .h, оставив в них только инклюды с подключением этих самых заголовочных файлов. В итоге сейчас мой каталог файлов выглядит вот так:
Но все-равно у меня выпадает та же ошибка.
Что делать? Правильно ли я прописал всё в заголовочных файлах и файлах самой программы? Нужно ли вообще использовать заголовочные файлы или проблема в другом?
Других ошибок по программе у меня вроде бы нет, компилятор выдает только эту одну ошибку.
Под спойлерами код для самой программы:
Кликните здесь для просмотра всего текста
classes.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
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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
| #ifndef lab4_5_classes_h
#define lab4_5_classes_h
#include "classes.cpp"
#include <iostream>
#include <string.h>
#include <fstream>
#include <cstdlib>
using namespace std;
class child{
public:
string surname;
string address;
char gender;
int days;
void input();
void print();
child();
};
void child::input(){
cout<<"введите фамилию:"<<endl;
getline(cin, surname);
cout<<"введите адрес проживания:"<<endl;
getline(cin, address);
cout<<"введите пол, m - male (мужской), f - female (женский):"<<endl;
cin>>gender;
cout<<"введите количество дней посещения (не болел):"<<endl;
cin>>days;
}
void child::print(){
cout<<"фамилия ребенка: "<<surname<<endl;
cout<<"его адрес проживания: "<<address<<endl;
cout<<"пол: "<<gender<<endl;
cout<<"количество дней посещения (не болел): "<<days<<endl;
}
child::child(){
surname="noname";
address="none";
gender='e';
days=0;
}
class group{
public:
child chl;
void input_to_file(); //запись в файл
void input_to_file_end(); //запись в конец файла
void print_file();
void most_ill_child(); //самый болеющий ребенок
void boys_or_girls(); //кто больше болеет: мальчики или девочки
void on_this_street(); //список детей, проживающих на данной улице (введенной пользователем)
void sort(); //сортировка базы данных по алфавиту (по фамилии)
};
void group::input_to_file(){
int n=0;
cout<<"введите кол-во детей в группе:"<<endl;
cin>>n;
ofstream out_str;
cout<<"введите имя путь к файлу и его имя для записи новой базы:"<<endl;
string path;
getline(cin, path);
out_str.open(path);
if(!out_str.is_open()) {cout<<"ошибка открытия файла (input_to_file) "<<endl; exit(1);}
for(int i=0; i<n*4; i++){
chl.input();
out_str<<chl.surname;
out_str<<chl.address;
out_str<<chl.gender;
out_str<<chl.days;
}
out_str.close();
}
void group::input_to_file_end(){
int n=0;
cout<<"введите кол-во детей для дозаписи:"<<endl;
cin>>n;
ofstream out_str;
cout<<"введите имя путь к файлу и его имя для дозаписи в базу:"<<endl;
string path;
getline(cin, path);
out_str.open(path, ios_base::app);
if(!out_str.is_open()) {cout<<"ошибка открытия файла (input_to_file_end) "<<endl; exit(1);}
for(int i=0; i<n*4; i++){
chl.input();
out_str<<chl.surname;
out_str<<chl.address;
out_str<<chl.gender;
out_str<<chl.days;
}
out_str.close();
}
void group::print_file(){
ifstream in_str;
cout<<"введите имя путь к файлу и его имя для просмотра базы:"<<endl;
string path;
getline(cin, path);
in_str.open(path);
if(!in_str.is_open()) {cout<<"ошибка открытия файла (print_file) "<<endl; exit(1);}
while(!in_str.eof()){
in_str>>chl.surname;
in_str>>chl.address;
in_str>>chl.gender;
in_str>>chl.days;
chl.print();
}
in_str.close();
}
void group::most_ill_child(){
int days_min;
int count=0;
int count_for_min_days=0;
ifstream in_str;
cout<<"введите имя путь к файлу для работы с базой:"<<endl;
string path;
getline(cin, path);
in_str.open(path);
if(!in_str.is_open()) {cout<<"ошибка открытия файла (most_ill_child) "<<endl; exit(1);}
in_str>>chl.surname;
in_str>>chl.address;
in_str>>chl.gender;
in_str>>chl.days;
days_min = chl.days;
in_str.seekg(0);
while(!in_str.eof()){
in_str>>chl.surname;
in_str>>chl.address;
in_str>>chl.gender;
in_str>>chl.days;
count=count+4;;
if(chl.days<days_min) {days_min=chl.days; count_for_min_days=count;}
}
in_str.seekg(0);
for(int i=0; i<count_for_min_days; i++){
in_str>>chl.surname;
in_str>>chl.address;
in_str>>chl.gender;
in_str>>chl.days;
}
in_str.close();
cout<<"самый болеющий ребенок: "<<endl;
chl.print();
}
void group::boys_or_girls(){
int count_for_boys=0;
int count_for_girls=0;
ifstream in_str;
cout<<"введите имя путь к файлу для работы с базой:"<<endl;
string path;
getline(cin, path);
in_str.open(path);
if(!in_str.is_open()) {cout<<"ошибка открытия файла (boys_or_girls) "<<endl; exit(1);}
while(!in_str.eof()){
in_str>>chl.surname;
in_str>>chl.address;
in_str>>chl.gender;
in_str>>chl.days;
if(chl.gender=='m') count_for_boys=count_for_boys+chl.days;
if(chl.gender=='f') count_for_girls=count_for_girls+chl.days;
}
in_str.close();
if(count_for_girls<count_for_boys){cout<<"девочки болели больше, чем мальчики"<<endl;}
else if(count_for_girls>count_for_boys){cout<<"мальчики болели больше, чем девочки"<<endl;}
else cout<<"девочки и мальчики болели одинаковое количество дней"<<endl;
}
void group::on_this_street(){
string find_address;
bool check=false;
cout<<"введите искомый адрес проживания:"<<endl;
getline(cin, find_address);
ifstream in_str;
cout<<"введите имя путь к файлу для работы с базой:"<<endl;
string path;
getline(cin, path);
in_str.open(path);
if(!in_str.is_open()) {cout<<"ошибка открытия файла (on_this_street) "<<endl; exit(1);}
while(!in_str.eof()){
in_str>>chl.surname;
in_str>>chl.address;
in_str>>chl.gender;
in_str>>chl.days;
if(chl.address==find_address) {check=true; chl.input(); cout<<endl;}
}
if(check==false) cout<<"детей, проживающих на этой улице, не найдено"<<endl;
in_str.close();
}
void group::sort(){
int count = 0;
string *surname = new string[count];
string *address = new string[count];
char *gender = new char[count];
int *days = new int[count];
string *temp_surname = new string;
string *temp_address = new string;
char *temp_gender = new char;
int *temp_days = new int;
ifstream in_str;
cout<<"введите имя путь к файлу для работы с базой:"<<endl;
string path;
getline(cin, path);
in_str.open(path);
if(!in_str.is_open()) {cout<<"ошибка открытия файла (sort, read) "<<endl; exit(1);}
while(!in_str.eof()){
count++;
in_str>>surname[count-1];
in_str>>address[count-1];
in_str>>gender[count-1];
in_str>>days[count-1];
}
in_str.close();
for(int i=0; i<count-1; i++){
for(int j=0; j<count-1; j++){
if(surname[j]>surname[j+1]){
temp_surname=&surname[j];
temp_address=&address[j];
temp_gender=&gender[j];
temp_days=&days[j];
surname[j]=surname[j+1];
address[j]=address[j+1];
gender[j]=gender[j+1];
days[j]=days[j+1];
surname[j+1]=*temp_surname;
address[j+1]=*temp_address;
gender[j+1]=*temp_gender;
days[j+1]=*temp_days;
}
}
}
ofstream out_str;
out_str.open(path, ios_base::trunc);
if(!in_str.is_open()) {cout<<"ошибка открытия файла (sort, write) "<<endl; exit(1);}
for(int i=0; i<count; i++){
out_str<<surname[i];
out_str<<address[i];
out_str<<gender[i];
out_str<<days[i];
}
out_str.close();
delete surname;
delete temp_surname;
delete address;
delete temp_address;
delete gender;
delete temp_gender;
delete days;
delete temp_days;
}
#endif |
|
classes.cpp:
menu.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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| #ifndef lab4_5_menu_h
#define lab4_5_menu_h
#include <iostream>
using namespace std;
void main_menu_admin(){
cout<<"выберите пункт меню (введите его номер):"<<endl;
cout<<"1) ввод исходных данных"<<endl;
cout<<"2) вывод всей базы данных"<<endl;
cout<<"3) добавление данных в конец файла"<<endl;
cout<<"4) здоровье"<<endl;
cout<<"5) сортировка базы данных по алфавиту (по фамилии)"<<endl;
cout<<"6) вывести список детей проживающих на данной улице"<<endl;
cout<<"0) выход из программы"<<endl;
cout<<"ваш выбор:"<<endl;
}
void main_menu_user(){
cout<<"выберите пункт меню (введите его номер):"<<endl;
cout<<"1) вывод всей базы данных"<<endl;
cout<<"2) здоровье"<<endl;
cout<<"3) сортировка базы данных по алфавиту (по фамилии)"<<endl;
cout<<"4) вывести список детей проживающих на данной улице"<<endl;
cout<<"0) выход из программы"<<endl;
cout<<"ваш выбор:"<<endl;
}
void hidden_menu(){
cout<<"здоровье:"<<endl;
cout<<"выберите пункт меню (введите его номер):"<<endl;
cout<<"1) определить самого болеющего ребенка"<<endl;
cout<<"2) кто больше болеет - мальчики или девочки"<<endl;
cout<<"0) выход в главное меню"<<endl;
cout<<"ваш выбор"<<endl;
}
#endif |
|
menu.cpp:
mainfile.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
| #include <stdio.h>
#include <cstdlib>
#include "classes.h"
#include "menu.h"
using namespace std;
int input_control(bool check, int select){ //функция преобразует ввод команд для пользователя
int num = select;
if(check==false){
if(select==1) num = 2;
if(select>=2) num = select+2;
if(select==0) num = 0;
return num;
}
else return select;
}
int main(void){
group data;
int select;
int select_hidden;
int login;
bool admin_check = false;
int pass;
cout<<"выберите уровень доступа:"<<endl;
cout<<"1 - пользователь, 2 - администратор"<<endl;
cin>>login;
if(login=='2'){
cout<<"введите пароль:"<<endl;
cin>>pass; //стандартный пароль: 1337
if(pass==1337) {admin_check=true; cout<<"вы вошли как администратор"<<endl;} else
cout<<"неверный пароль, вы вошли как пользователь"<<endl;
} else cout<<"вы вошли как пользователь";
do{
if(admin_check==true) main_menu_admin(); else main_menu_user();
cin>>select;
switch(input_control(admin_check, select)){
case 1: data.input_to_file(); break;
case 2: data.print_file(); break;
case 3: data.input_to_file_end(); break;
case 4: {
cout<<endl<<endl;
do{
hidden_menu();
cin>>select_hidden;
switch(select_hidden){
case 1: data.most_ill_child(); break;
case 2: data.boys_or_girls(); break;
case 0: cout<<"выход"<<endl; break;
default: cout<<"ошибка (switch, hidden_menu)"<<endl;
}
}
while(select_hidden!=0);
} break;
case 5: data.sort(); break;
case 0: cout<<"работа программы завершена"<<endl; exit(1);
default: cout<<"ошибка (switch, main_menu)"<<endl;
}
}
while(input_control(admin_check, select)!=0);
} |
|
Сама задача:
Кликните здесь для просмотра всего текста
*в исходном тексте задачи есть неточности, я знаю про них
Сформировать класс ребенок= фамилия:string; адрес:string; пол  муж,жен); количество дней посещения (не болел): integer; и обобщающий класс – группа с методами сортировки, ввода-вывода и др.. ; Вывести на экран сначала сообщение (меню) для выбора уровня доступа к данным: 1- пользователь или 2- администратор. При выборе №2 (администратор) запросить пароль. После совпадения пароля вывести на экран сообщение (меню) пользователю вида:
Выберете номер действия:
1--ввод исходных данных;
2--вывод всей базы данных;
3 – добавление данных в конец файла
4— здоровье (далее вывод вложенного подменю)
1 -- определить : самого болеющего ребенка;
2 -- определить: кто больше болеет мальчики или девочки
0 – выход в главное меню
5 -- сортировка базы данных по алфавиту (по фамилии);
6 -- вывести список детей проживающих на данной улице (введенной пользователем)
0--выход из программы;
Ваш выбор___
При выборе пунктов №1 и №2 (ввод данных) Запросить у «Администратора» имя и путь к файлу для сохранения (записи) базы.
При выборе пункта №3 (вывод данных) Запросить имя и путь к файлу для отображения (чтения) базы и осуществить проверку возможности открытия данного файла.
Если выполняется вход без пароля в качестве «Пользователя», то выводить меню с меньшим количеством пунктов. То есть без возможности вводить (пункт №1) и добавлять (пункт №2) данные в базу,
Каждый пункт меню (действие) оформить в виде метода класса . Описание класса разместить в отдельном модуле. Основную программу организовать в виде цикла «пока не выбран пункт 0—выход». Для вариантов выбора использовать оператор switch.
|