Сортировка массива структур работает неправильно

Планировалось, что это будет импровизированная база данных компьютерных программ. Сортировка по стоимости по возрастанию. Но из 4 элементов сортирует только первый элемент со вторым и только третий элемент с четвертым. Помогите найти ошибку.

 # include <iostream>
# include <conio.h>
# include <string.h>
# include <stdlib.h>
using namespace std;

struct cprogramme 
{   
    char name[30];
    char madeyear[4];
    int stoimost; 
};
int main()
{   
    const int n=4;
    int i;
    cprogramme s[n];
    cout.setf(ios::left);

    for (i=0;i<=n-1;i++)
    {   
        cout<< "             Vvedite name\n";
        cin>>s[i].name;
        cout<< "             Vvedite madeyear\n";
        cin>>s[i].madeyear;
        cout<< "             Vvedite stoimost\n";
        cin>>s[i].stoimost;
        cout<< "\n"; 
    }

    cout<< "\n Name         Madeyear                     Stoimost\n";
    cout<< "\n";

    for (i=0;i<=n-1;i++)
    {   
        cout.width(20);cout<<s[i].name;
        cout.width(20);cout<<s[i].madeyear;
        cout.width(20);cout<<s[i].stoimost<< "\n"; 
    }

        for (i=0;i<n-1;i++)
        if(s[i].stoimost>s[i+1].stoimost)
        {   
            int b;
            b=s[i].stoimost;
            s[i].stoimost=s[i+1].stoimost;
            s[i+1].stoimost=b; 
        }

        cout<< "\n Name     Madeyear              Stoimost\n ";
        cout<< "\n";
for (i=0;i<=n-1;i++)
{   
        cout.width(20);cout<<s[i].name;
        cout.width(20);cout<<s[i].madeyear;
        cout.width(20);cout<<s[i].stoimost<< "\n"; 
}

        getch(); 
}

То, что сортировка неправильно сортирует — это пол-беды ))) Если даже она будет сортировать правильно, то после сортировки цены на программы часто не будут соответствовать введённым. Поскольку ты пытаешься сортировать только стоимость, но не трогаешь другие два поля структуры.

Если действовать только в пределах голого С++, без применения контейнеров STL, то можно написать так:

# include <iostream>
# include <conio.h>
# include <string.h>
# include <stdlib.h>
using namespace std;

struct cprogramme 
{   
    char name[30];
    char madeyear[4];
    int stoimost; 
};

int qcompare(const void *a, const void *b) {
    cprogramme *aa = (cprogramme *)a;
    cprogramme *bb = (cprogramme *)b;
    return aa->stoimost - bb->stoimost;
}


int main()
{   
    const int n=4;
    int i;
    cprogramme s[n];
    cout.setf(ios::left);

    for (i=0;i<=n-1;i++)
    {   
        cout<< "             Vvedite name\n";
        cin>>s[i].name;
        cout<< "             Vvedite madeyear\n";
        cin>>s[i].madeyear;
        cout<< "             Vvedite stoimost\n";
        cin>>s[i].stoimost;
        cout<< "\n"; 
    }

    cout<< "\n Name         Madeyear                     Stoimost\n";
    cout<< "\n";

    for (i=0;i<=n-1;i++)
    {   
        cout.width(20);cout<<s[i].name;
        cout.width(20);cout<<s[i].madeyear;
        cout.width(20);cout<<s[i].stoimost<< "\n"; 
    }


    qsort(s, n, sizeof(cprogramme), qcompare);

    cout<< "\n Name     Madeyear              Stoimost\n ";
    cout<< "\n";

    for (i=0;i<=n-1;i++)
    {   
        cout.width(20);cout<<s[i].name;
        cout.width(20);cout<<s[i].madeyear;
        cout.width(20);cout<<s[i].stoimost<< "\n"; 
    }

    getch(); 
}

Подробности см. в доке на ф-цию qsort().

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.