Сортировка записи

cybernate

Дана задача: создать запись с полями и три оценки. Найти качественный показатель успеваемости. Отсортировать запись по убыванию среднего бала.как создать эту сортировку?
#include<iostream>
#include<string>
#include <iomanip>
 
using namespace std;
 
int main()
{
 
    struct journal
    {
        string surname;
        ****** mark1;
        ****** mark2;
        ****** mark3;
        ****** midle;       
    };
 
    int n;
    cout<<"Enter n: ";
    cin>>n;
    journal *people = new journal[n];               //journal people[n];
    cin.ignore();
    for(int i =0; i<n; i++)
        {
            cout<<"\nEnter surname the "<<i+1<<" student: ";
            getline(cin, people[i].surname);
            cout<<"\nEnter the first mark of third: "; cin>>people[i].mark1;
            cout<<"\nEnter the second mark of third: "; cin>>people[i].mark2;
            cout<<"\nEnter the third mark of third: "; cin>>people[i].mark3;
            people[i].midle = (people[i].mark1+people[i].mark2+people[i].mark3)/3;
            cin.ignore();
    }
    cout<<"\n______________________________________________\n";
    for(int i =0; i<n; i++)
    {   cout<<"\n"<<people[i].surname;
        cout<<"\n"<<people[i].mark1;
        cout<<"\n"<<people[i].mark2;
        cout<<"\n"<<people[i].mark3;
        cout<<"\nMidle mark is: "<<people[i].midle;
        cout<<"\n";
    }
    cout<<"\n______________________________________________\n";
 
 
    //////////////////////////////////////////////////////////  Показатель успеваемости
    int count1 = 0;
    int count2 = 0;
    for(int i=0; i<n; i++)
    {
        if (people[i].mark1 ==4)
            count1++;
        if (people[i].mark1 ==5)
            count2++;
        if (people[i].mark2 ==4)
            count1++;
        if (people[i].mark2 ==5)
            count2++;
        if (people[i].mark3 ==4)
            count1++;
        if (people[i].mark3 ==5)
            count2++;
    }
 
 
    cout<<"Vseh 4: "<< count1;
    cout<<"\nVseh 5: "<< count2;
    cout<<"\nPokazatel :"<< (((count1 + count2)*100)/n)/3<<"%\n\n"; 
 
 
 
 
 
    system("pause");
    return 0;
}
Моя сортировка, но она не правильно работает
int t=0;
    for(int i = 0; i<n; i++)
    {
        if(people[i].midle<people[i+1].midle)
            {people[i].midle = t;
        people[i].midle=people[i+1].midle;
            people[i+1].midle=t;
        }
    }
 
    for(int i = 0; i<n; i++)
    {
        cout<<people[i].midle<<" ";
    }
9 ответов

cybernate

Моя сортировка, но она не правильно работает
вы переставляете только middle-поле, а надо все поля переставлять это ошибка рази как вы уложили сортировку в 1 цикл? это ошибка 2


cybernate

abit, если не секрет, сколько циклов должно получится, столько сколько полей в структуре, то есть 5?


cybernate

Кликните здесь для просмотра всего текста
#include #include #include using namespace std; struct journal { string surname; ****** mark1; ****** mark2; ****** mark3; ****** midle; }; void Sort(journal *peole,int n); int main() {int n; cout<<"Enter n: "; cin>>n; journal *people = new journal[n]; //journal people[n]; cin.ignore(); for(int i =0; i>people[i].mark1; cout<<" \nEnter the second mark of third: "; cin>>people[i].mark2; cout<<" \nEnter the third mark of third: "; cin>>people[i].mark3; people[i].midle = (people[i].mark1+people[i].mark2+people[i].mark3)/3; cin.ignore(); } cout<<" \n______________________________________________\n"; for(int i=0; i people[i+1].midle) { temp = people[j]; people[j] = people[j+1]; people[j+1] = temp; } } } for(i=0;i
#include<iostream>
#include<string>
#include <iomanip>
 
using namespace std;
 struct journal
    {
        string surname;
        ****** mark1;
        ****** mark2;
        ****** mark3;
        ****** midle;       
    };
void Sort(journal *peole,int n);
int main()
{
 
    
 
    int n;
    cout<<"Enter n: ";
    cin>>n;
    journal *people = new journal[n];               //journal people[n];
    cin.ignore();
    for(int i =0; i<n; i++)
        {
            cout<<"\nEnter surname the "<<i+1<<" student: ";
            getline(cin, people[i].surname);
            cout<<"\nEnter the first mark of third: "; cin>>people[i].mark1;
            cout<<"\nEnter the second mark of third: "; cin>>people[i].mark2;
            cout<<"\nEnter the third mark of third: "; cin>>people[i].mark3;
            people[i].midle = (people[i].mark1+people[i].mark2+people[i].mark3)/3;
            cin.ignore();
    }
    cout<<"\n______________________________________________\n";
    for(int i =0; i<n; i++)
    {   cout<<"\n"<<people[i].surname;
        cout<<"\n"<<people[i].mark1;
        cout<<"\n"<<people[i].mark2;
        cout<<"\n"<<people[i].mark3;
        cout<<"\nMidle mark is: "<<people[i].midle;
        cout<<"\n";
    }
    cout<<"\n______________________________________________\n";
 
 
    //////////////////////////////////////////////////////////  Показатель успеваемости
    int count1 = 0;
    int count2 = 0;
    for(int i=0; i<n; i++)
    {
        if (people[i].mark1 ==4)
            count1++;
        if (people[i].mark1 ==5)
            count2++;
        if (people[i].mark2 ==4)
            count1++;
        if (people[i].mark2 ==5)
            count2++;
        if (people[i].mark3 ==4)
            count1++;
        if (people[i].mark3 ==5)
            count2++;
    }
 
 
    cout<<"Vseh 4: "<< count1;
    cout<<"\nVseh 5: "<< count2;
    cout<<"\nPokazatel :"<< (((count1 + count2)*100)/n)/3<<"%\n\n"; 
    cout<<"sortirovka:"<<endl;
    Sort(people,n);
    system("pause");
    return 0;
}
 
void Sort(journal *people, int n)
{
    journal temp;
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n-1;j++)
        {
            if(people[i].midle > people[i+1].midle)
            {
                temp = people[j];
                people[j] = people[j+1];
                people[j+1] = temp;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        cout<<people[i].midle<<endl;
    }
}


cybernate

abit, если не секрет, сколько циклов должно получится, столько сколько полей в структуре, то есть 5?
зависит от метода сортировки, но как минимум два, сложность самого быстрого алгоритма в пределе O(N*log(N)), O(N) возможен только в очень редких случаях, когда есть специфичные требования к входному массиву


cybernate

Эльшат, спасибов ответ выдаёт 2 5 3 вместо 5 3 2 . С чем может быть связано?


cybernate

в ответ выдаёт 2 5 3 вместо 5 3 2 . С чем может быть связано?
насколько я вижу он пытался изобразить пузырьковую сортировку... там инварианты цикла пишутся не так
 for(i=0;i<n;i++)
    {
        for(j=0;j<n-1;j++)
        {
там не может вложенного цикла снова по всей последовательностиприблизительно так должно выглядеть
for(j=0;j<n;++j)
          for(i=0;i<n-j;++i)
                if(people[i].midle > people[i+1].midle)
           {
                temp = people[i];
                people[i] = people[i+1];
                people[i+1] = temp;
            }


cybernate

да это была пузырьковая сортировка


cybernate

Да вот таким способом все корректно
  journal temp;
    int i,j;
   for(j=0;j<n;++j)
          for(i=0;i<n-j;++i)
                if(people[i].midle < people[i+1].midle)
           {
                temp = people[i];
                people[i] = people[i+1];
                people[i+1] = temp;
            }


cybernate

аа.. теперь все понятно