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

Связка структур, разработка функций - C++

Восстановить пароль Регистрация
 
MonoRec
1 / 1 / 0
Регистрация: 24.11.2013
Сообщений: 84
17.05.2014, 21:15     Связка структур, разработка функций #1
Есть проблема. Есть 3 бинарных файла Subjects.txt Student.txt Mark.txt
Есть 3 структуры:

Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Student
{
    char Student_Name[20];
    char Student_Surname[20];
    char Student_Code[10];
    char Student_Groupe[10];
    int age;
};
 
struct Subject
{
    char Subject_Name[20];
    char Subject_Code[10]; 
    char Subject_Groupe[10];  
};
 
struct Mark
{
    char Stu_code[10];
    char Sub_code[10];
    float mark;
};
Например вожу:
Студента:
Student_Name:Maks
Student_Surname:Maksim
Student_Code:1001
Student_Groupe:1002
age:20

Предмет:
Subject_Name:Rus
Subject_Code:2001

Оценку:
Stu_code[10]:1001
Sub_code[10]:2001
mark:10

После работы функции void see_marks()

Ответ:
Student_Name:Maks
Student_Surname:Maksim
Student_Code:1001
Student_Groupe:1002
age:20
Subject_Name:Rus
mark:10

Все работает как надо.
Но есть проблема. Если у удалю предмет или студента.
Например:
Удаляю

Subject_Name:Rus
Subject_Code:2001

После работы функции получаю.

Student_Name:Maks
Student_Surname:Maksim
Student_Code:1001
Student_Groupe:1002
age:20
Subject_Name:<<<$@#<<<@#@>
mark:10
Как это исправить?
Также, если отсортирую (студентов или предметы) то функция не работает!
Еще один вопрос правильно ли я открыл 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
39
40
41
42
43
44
45
void see_marks()
{ifstream fi("Subjects.txt", ios::binary);
if(!fi) cout<<"Error with file\n"<<endl;
else {fi. seekg(0,ios::end);
int size=fi.tellg();
size=size/sizeof(Subject);
Subject * Subjects=new Subject[size];
fi.seekg(0, ios::beg);
fi.read ((char*)Subjects,sizeof(Subject)*size);
ifstream fi("Students.txt", ios::binary);
 
if(!fi) cout<<"Error with file\n";
else {fi. seekg(0,ios::end);
int size=fi.tellg();
size=size/sizeof(Student);
Student * Student_1= new Student[size];
fi.seekg(0, ios::beg);
fi.read ((char*)Student_1,sizeof(Student)*size);
 
ifstream fi("Marks.txt", ios::binary);
if(!fi) cout<<"Error with file\n"<<endl;
else {fi. seekg(0,ios::end);
int size=fi.tellg();
size=size/sizeof(Mark);
Mark * Marks=new Mark[size];
fi.seekg(0, ios::beg);
fi.read ((char*)Marks,sizeof(Mark)*size);
 
 
 
for( int i=0; i < size; i++)
 
if(!strncmp(Student_1[i].Student_Code, Marks[i].Stu_code,sizeof(Marks[i].Stu_code)/sizeof(char)))
 
{   
cout<<" Student Name: "<<Student_1[i].Student_Name<<"\n Student Surname: "<<Student_1[i].Student_Surname<<"\n Student Code: "<<Student_1[i].Student_Code;
    cout<<"\n Student Groupe: "<<Student_1[i].Student_Groupe<<"\n Student Age: "<<Student_1[i].age;
        cout<<"\n Student mark: "<<Marks[i].mark;
            cout<<"\n Subject Name: "<<Subjects[i].Subject_Name<<endl;;
 
 
}
system("pause");
}
}}}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2014, 21:15     Связка структур, разработка функций
Посмотрите здесь:

C++ Разработка и отладка алгоритмов и программ с использованием структур данных.
Использование функций и структур C++
Разработка динамических структур данных и функций их обработки C++
C++ Лаба. Тема: Разработка и отладка алгоритмов и программ с использованием динамических структур.
C++ разработка нерекурсивных функций.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kupnu4
26 / 26 / 9
Регистрация: 03.05.2013
Сообщений: 71
17.05.2014, 23:34     Связка структур, разработка функций #2
при удалении какого либо предмета/ученика, проходи предварительно по Marks и удаляй оттуда все записи с этим предметом/учеником.

Добавлено через 6 минут
а по поводу правильного открытия - немного смущает одинаковое название переменной (везде fi) для всех трех файлов. ну и по хорошему вроде файлики то после использования нужно закрывать (вроде fi.close()). В main это не критично (хотя можно привести случаи когда и для main это будет неприятно), так как по завершении программы они все равно закроются. но вообще лучше взять в привычку закрывать файлы.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
18.05.2014, 00:56     Связка структур, разработка функций #3
MonoRec, мне больше с итераторами нравится, типа такого: Считать слова из файла в разные переменные
MonoRec
1 / 1 / 0
Регистрация: 24.11.2013
Сообщений: 84
18.05.2014, 10:38  [ТС]     Связка структур, разработка функций #4
Решил переделать для двух структур. Для двух стуктура работает все как надо!
Но есть пробелма. Если 2 студента с одинаковым Student_Code:1001 и Оценку:Stu_code[10]:1001
То в ответ поподает один студент. Как сделать что бы оба отображались?
kupnu4
26 / 26 / 9
Регистрация: 03.05.2013
Сообщений: 71
18.05.2014, 11:30     Связка структур, разработка функций #5
а для чего вообще нужен student_code в структуре?

Добавлено через 8 минут
просто я сначала почему-то решил, что это вроде уникального идентификатора, и если я прав, то не может быть двух студентов с одинаковым student_code
MonoRec
1 / 1 / 0
Регистрация: 24.11.2013
Сообщений: 84
18.05.2014, 15:24  [ТС]     Связка структур, разработка функций #6
Появился вопрос.

Как сделать что бы

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
{
system("cls");
ifstream fi("Clients.txt", ios::binary);
if(!fi) cout<<"Error with file\n"<<endl;
else {fi. seekg(0,ios::end);
int size=fi.tellg();
size=size/sizeof(Client);
Client * Clients=new Client[size];
fi.seekg(0, ios::beg);
fi.read ((char*)Clients,sizeof(Client)*size);
 
ifstream fi("Services.txt", ios::binary);
if(!fi) cout<<"Error with file\n"<<endl;
else {fi. seekg(0,ios::end);
int size=fi.tellg();
size=size/sizeof(Service);
Service * Services=new Service[size];
fi.seekg(0, ios::beg);
fi.read ((char*)Services,sizeof(Service)*size);
Service findService;
 
cout<<"\t1.Enter Service Name: ";
cin>>findService.S_Name;
 
for( int i=0; i < size; i++)
 
if(!strncmp(Services[i].S_Name, findService.S_Name,sizeof(findService.S_Name)/sizeof(char)))
    for( int i=0; i < size; i++)
    if(!strncmp(Services[i].S_Code, Clients[i].Code,sizeof(Clients[i].Code)/sizeof(char)))
}
system("Pause");
}
}
Services[0].S_Code, сравнивался со всеми Clients[i].Code[0-......];
Services[1].S_Code, сравнивался со всеми Clients[i].Code[0-......];

Потому что если я отсортирую свою структуру.

Например: Вожу
Clients:2 Services:4
Clients:1 Services:3
Clients:3 Services:1

Сортирую:
Clients:1 Services:1
Clients:2 Services:3
Clients:3 Services:4

Потмоу в цикле:
C++
1
if(!strncmp(Services[i].S_Code, Clients[i].Code,sizeof(Clients[i].Code)/sizeof(char)))
Совпадения не будет.
Yandex
Объявления
18.05.2014, 15:24     Связка структур, разработка функций
Ответ Создать тему
Опции темы

Текущее время: 03:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru