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

Сортировка структур с++ - C++

Восстановить пароль Регистрация
 
man9ik
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 4
10.01.2013, 01:12     Сортировка структур с++ #1
Здравствуйте. Помогите пожалуйста. Делаю уже месяц, задача простоя а наверно я дурочек не чего не понимаю.
задача. Написать программу, в которой необходимо создать структуру, элементами которой являются: имя, фамилия, год рождения студента и оценки по пяти экзаменам. Объявить массив данных о студентах группы типа структуры и ввести значения его элементов. Определить сумму баллов за сессию каждого студента и отсортировать список студентов по баллам в порядке возрастания. Сортировку реализовать в отдельной функции. Предусмотреть меню. Результаты работы программы записать в файл.

вот последнее что с чем работаю. много переделывал и все таки запутался и она перестала вообще работать. раньше не работала не получалась найти общий бал для сортировки. начал его делать и изменять код. читать статьи и в итого не чего хорошего не получилась.

код
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
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define n 20
FILE* files;
struct gurnal
{
char im;
char fam;
int god;
int mat;
int fiz;
int ist;
int oop;
int prog;
float sred;
 
};
int z=0;
void menu()
{
printf("1.Zapis studenta\n");
printf("2.Spisok\n");
printf("3.Sortirovka\n");
printf("4.Save and exit\n");
}
void zapis()
{
gurnal stud[n];
printf("Imja studenta:");
scanf("%s",&stud[n].im);
printf("Familija:");
scanf("%s",&stud[n].fam);
printf("Gog rogdenija:");
scanf("%d",&stud[n].god);
printf("Ozenka po matem:");
scanf("%d",&stud[n].mat);
printf("Ozenka po fizika:");
scanf("%d",&stud[n].fiz);
printf("Ozenka po istorii:");
scanf("%d",&stud[n].ist);
printf("Ozenka po oop:");
scanf("%d",&stud[n].oop);
printf("Ozenka po programmirovanijo:");
scanf("%d",&stud[n].prog);
 
if (z>=n)
{
printf("Spisok poln");
}
else
{
stud[z]=stud;
z++;
}
}
void spisok()
{
int i;
for(i=0;i<z;i++)
{
printf("%d. %s %s god %d mat%d fiz%d ist%d oop%d prog%d\n",i+1,stud[i].im,stud[i].fam,stud[i].mat,stud[i].fiz,stud[i].ist,stud[i].oop,stud[i].prog);
}
printf("\n");
}
 
void sortirovka()
{
 
}
 
 
 
 
int main()
{
int h;
for(;;)
{
menu();
printf("\nVvedite nomer:");
scanf("%d",&h);
switch(h)
{
case(1): zapis();
break;
case(2): spisok();
break;
case(3): sortirovka();
break;
case(4):
//files=fopen("gurnal save.txt", "w");
//fputs("gurnal:\n",files);
//for (int i=0; i<z; i++)
//{
//fputs(stud[i].im,files);
//fputs("\t",files);
 
//fputs("\n",files);
//}
//fclose(files);
 
return 0;
}
}
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 01:12     Сортировка структур с++
Посмотрите здесь:

C++ Сортировка структур
Сортировка структур C++
C++ Сортировка структур
C++ Сортировка структур
Сортировка структур C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
10.01.2013, 13:08     Сортировка структур с++ #2
вам проще будет сделать массивы структур то есть отдельно структура с предметами , структура с данными о студентах и т.д
а далее просто передовать аргументы от одной структуры к другой
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
10.01.2013, 14:01     Сортировка структур с++ #3
man9ik Ваш код, написан на СИ.Если надо написать на С++, то сортировку структур можно реализовать с помощью swap http://www.cplusplus.com/reference/algorithm/swap/
FlaYnoSt
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
10.01.2013, 15:36     Сортировка структур с++ #4
Не по теме:
http://stump-workshop.blogspot.ru/2008/09/blog-post.html

По теме:

list.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
#ifndef LIST_H
#define LIST_H
 
class List{
private:
    static const int n = 5; //Кол-во оценок
    struct student{
        char name[100];
        char secondName[100];
        int birth;
        short scores[n];
        float averageScore;
 
        student* Next;
        student* Prev;
    };
    student* First;
    student* Last;
    int count;
public:
    void addNewStudent();
    void outputList();
    void sort();
    void calcAverageScores();
private: 
    void swap(student*, student*);
 
    List();
    ~List();
};
 
#endif // LIST_H
list.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
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
#include <list.h>
#include <iostream>
 
using namespace std;
 
void List::addNewStudent(){
    student* _new = new student();
 
    cout << "Введите имя: ";
    cin >> _new->name;
 
    cout << "Введите фамилию: ";
    cin >> _new->secondName;
 
    cout << "Введите год рождения: ";
    cin >> _new->birth;
 
    cout << "Введите оценки по дисциплинам: ";
    for (int i = 0; i < n; i++){
        cin >> _new->scores[i];
    }
 
    if (First == 0){
        _new->Next = 0;
        _new->Prev = 0;
        First = _new;
        Last = _new;
    }
    else{
        _new->Next = 0;
        _new->Prev = Last;
        Last->Next = _new;
        Last = _new;
    }
 
    count++;
}
 
void List::calcAverageScores(){
    for (student* tmp = First; tmp != 0; tmp = tmp->Next){
        for (int i = 0; i < n; i++)
            tmp->averageScore += tmp->scores[i];
 
        tmp->averageScore /= n;
    }
}
 
void List::swap(student* a, student* b){
    if (a->Next == b){
        if (a->Prev != 0)
            a->Prev->Next = b;
        if (b->Next != 0)
            b->Next->Prev = a;
        a->Next = b->Next;
        b->Prev = a->Prev;
        a->Prev = b;
        b->Next = a;
    }
    else{
        if (a->Prev != 0)
            a->Prev->Next = b;
        if (a->Next != 0)
            a->Next->Prev = b;
        if (b->Next != 0)
            b->Next->Prev = a;
        if (b->Prev != 0)
            b->Prev->Next = a;
 
 
        student* tmpNext = a->Next;
        student* tmpPrev = a->Prev;
 
        a->Next = b->Next;
        a->Prev = b->Prev;
 
        b->Next = tmpNext;
        b->Prev = tmpPrev;
    }
 
    if (a == First)
        First = b;
    if (b == Last)
        Last = a;
 
}
 
void List::sort(){
    //сортировка пузырьком
    for (int i = 0; i < count - 1; i++){
        student* tmp = First;
        for (int j = 0; j < count - i - 1; j++){
            if (tmp->averageScore < tmp->Next->averageScore)
                swap(tmp, tmp->Next);
        }
    }
}
 
void List::outputList(){
    for (student* tmp = First; tmp != 0; tmp = tmp->Next){
        cout << tmp->secondName << " " << tmp->name << " " << tmp->birth << endl;
        cout << "Оценки: ";
        for (int i = 0; i < n; i++){
            cout << tmp->scores[i] << " ";
        }
        cout << "Среднее: " << tmp->averageScore << endl << endl << endl;
    }
}
 
List::List(){
    Last = 0;
    First = 0;
    count = 0;
}
 
List::~List(){
    for (student* tmp = First->Next; tmp != 0; tmp = tmp->Next)
        delete tmp->Prev;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <list.h>
 
using namespace std;
 
int main()
{
    List mylist;
    mylist.addNewStudent();
    mylist.addNewStudent();
    mylist.addNewStudent();
    mylist.calcAverageScores();
    mylist.outputList();
    mylist.sort();
    mylist.outputList();
    return 0;
}
Вроде даже работает. Меню уж сам допишешь, ну и под массив при желании переделаешь.
FreeMinder
 Аватар для FreeMinder
36 / 36 / 2
Регистрация: 29.08.2012
Сообщений: 59
10.01.2013, 15:54     Сортировка структур с++ #5
Если учитывать, что автор хранит в одном символе имя студента, то с классами врядли справится.
Более простой вариант
Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<fstream>
 
using namespace std;
 
const int _size_ = 16;
 
struct Student
{
    char Name    [_size_];
    char LastName[_size_];
    int  Year;
    int  Marks[5];
    float AverageMark;
};
 
Student AddStudent();
void PrintList(const Student* list, const int& count);
void Sort(Student* list, const int& count);
void Menu();
void WriteToFile(const Student* list,const int& count);
 
 
int main()
{
    Menu(); 
}
 
Student AddStudent()
{
    system("cls");
    Student student;
    cout<<"Name: ";
    cin>>student.Name;
    cout<<"Last Name: ";
    cin>>student.LastName;
    cout<<"Year: ";
    cin>>student.Year;
    cout<<"Math mark: ";
    cin>>student.Marks[0];
    cout<<"Physics mark: ";
    cin>>student.Marks[1];
    cout<<"History mark: ";
    cin>>student.Marks[2];
    cout<<"OOP mark: ";
    cin>>student.Marks[3];
    cout<<"Programming mark: ";
    cin>>student.Marks[4];
    student.AverageMark = static_cast<float>((student.Marks[0]+student.Marks[1]+student.Marks[2]+student.Marks[3]+student.Marks[4]) / 5);
    cout<<"\nStudent add success\n";
    system("pause >> void");
    return student;
}
void PrintList(const Student* list, const int& count)
{   
    system("cls");
    if(count == 0)
    {
        system("cls");
        cout<<"\n\tList is empty\n";
    }
    else
    {
        for(int i=0; i < count; i++)
        {           
            cout<<"\n\tNo:"     <<i+1<<endl;
            cout<<"Name: "      <<list[i].Name<<endl;
            cout<<"LastName: "  <<list[i].LastName<<endl;
            cout<<"Year: "      <<list[i].Year<<endl;
            cout<<"Marks: ";
            for (int j = 0; j < 5; j++)
                cout<<list[i].Marks[j]<<" ";
            cout<<"\nAverage mark: "<<list[i].AverageMark;
        }
        cout<<endl;
    }
    system("pause >> void");
} 
void Sort(Student* list, const int& count)
{
    if(count == 0)
    {
        cout<<"List is empty\n";
    }
    else
    {
        for (int i = 0; i < count; i++)
            for (int j = i+1; j < count; j++)
            {           
                if (list[i].AverageMark > list[j].AverageMark)
                {
                    Student temp = list[i];
                    list[i] = list[j];
                    list[j] = temp;
                }
            }
        cout<<"\nSort finished\n";      
    }
    system("pause >> void");
}
void WriteToFile(const Student* list,const int& count)
{
    if(count == 0 )
    {
        cout<<"\nList is empty!\n";
        system("pause >> void");
        return;
    }
    ofstream out("save.txt",ios::out);
    if(!out)
    {
        cout<<"Error of writing to file";
        system("pause >> void");
        return;
    }
    for(int i=0; i < count; i++)
    {           
        out<<"\n\tNo:"      <<i+1<<endl;
        out<<"Name: "       <<list[i].Name<<endl;
        out<<"LastName: "   <<list[i].LastName<<endl;
        out<<"Year: "       <<list[i].Year<<endl;
        out<<"Marks: ";
        for (int j = 0; j < 5; j++)
            out<<list[i].Marks[j]<<" ";
        out<<"\nAverage mark: "<<list[i].AverageMark;
    }
    cout<<"Writing to file OK!\n";
    system("pause >> void");
}
void Menu()
{
    int StudentCount = 0;
    int choice = 1;
    Student* List = NULL;
 
    while(true)
    {       
        system("cls");
        cout<<"1.Add student\n";
        cout<<"2.Print list\n";
        cout<<"3.Sort\n";
        cout<<"4.Save and exit\n";
        cout<<"\n\tInput choice:";
        cin>>choice;
        switch(choice)
        {
            case 1: 
            {
                StudentCount++;
                Student* newList = new Student[StudentCount];
                for (int i = 0; i < StudentCount-1; i++)
                {
                    newList[i] = List[i];
                }
                if(List) 
                    delete[]List;
                List = newList;
                List[StudentCount-1] = AddStudent();
                break;
            }
            case 2: 
                PrintList(List, StudentCount);
                break;
 
            case 3: 
                Sort(List,StudentCount);
                break;
 
            case 4:
                WriteToFile(List,StudentCount);
                if(List)
                    delete[]List;
                return;
 
            default:                
                cout<<"\nWrong choice\n";
                system("pause >> void");
                break;
        }
    }   
}
man9ik
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 4
10.01.2013, 18:15  [ТС]     Сортировка структур с++ #6
Спасибо большое! Сейчас буду разбираться. на первый взгляд все понятно. доделаю по мелочам сам.
Yandex
Объявления
10.01.2013, 18:15     Сортировка структур с++
Ответ Создать тему
Опции темы

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