1 Востаннє редагувалося blizzard (19.11.2017 19:58:03)

Тема: Як відсортувати строки за алфавітом?

Потрібно за першим стовпцем(Найменування товару) відсортувати її за алфавітом.

#include <iostream>
#include <string>
#include <Windows.h>
#include <iomanip>
#define SIZE 10

using namespace std;

struct Stationery {
    string name_type;
    char item_type;
    short int min_amount;
    double price;
}stationery[SIZE];

int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    int cntr, cout_cntr;

    cout << "Данні: " << endl;
    for (cntr = 0; cntr < SIZE; cntr++) {
        cout << cntr + 1 << ". Найменування товару: ";
        cin >> stationery[cntr].name_type;

        if (stationery[cntr].name_type == "Кінець") {
            break;
        }

        cout << "\t" << "Тип товарy: ";
        cin >> stationery[cntr].item_type;

       cout << "\t" << "Ціна за 1 шт.(грн.): ";
       cin >> stationery[cntr].price;

        cout << "\t" << "Мінімальна вартість товару: ";
        cin >> stationery[cntr].min_amount;
        cout << endl;
    }

    cout << endl << endl << endl << endl << endl;
    cout << "-------------------------------------------------------------------------------------------" << endl;
    cout << "|                                          Прайс-лист                                     |" << endl;
    cout << "-------------------------------------------------------------------------------------------" << endl;
    cout << "| Найменування товару | Тип товара | Ціна за 1 шт.(грн.) |   Мінімальна вартість товару   |" << endl;
    cout << "-------------------------------------------------------------------------------------------" << endl;
    for (cout_cntr = 0; cout_cntr < cntr; cout_cntr++) {
        cout << "|" << setw(14) << stationery[cout_cntr].name_type << setw(8) << "|" << setw(6) << stationery[cout_cntr].item_type << setw(7) << "|"
            << setw(13) << stationery[cout_cntr].price << setw(10) << "|" << setw(17) << stationery[cout_cntr].min_amount << setw(15) << "|"
            << endl;
        cout << "-------------------------------------------------------------------------------------------" << endl;
    }

    return 0;
}

Знаю алгоритми, але не знаю як відсортувати за структурою. Як змінити:

    for (int i = 0; i < cntr; i++) {
        for (int j = 0; j < cntr; j++) {
            int a = stationery.name_type;
            int b = cntr[j + 1];
            if (a > b) {
                string buf = cntr[j];
                cntr[j] = cntr[j + 1];
                cntr[j + 1] = buf;
            }
        }
        cout << str << endl;
    }

2

Re: Як відсортувати строки за алфавітом?

0. Існують стандартні функції для сортування, але я б вам радив все ж таки зробити сортування самостійно, щоб розібратися, як воно працює.
1. Те, що ви написали, як алгоритм сортування - щось дивне, хоча б тому, що ви порівнюєте рядок(?) cntr[j+1] із іменним елементом масиву(???) stationery.name_type, а до того порівнюєте число i із масивом рядків(???) cntr. Вкажіть, що у вас якого типу в другому коді.
2. Продумайте алгоритм сортування саме як алгоритм, а не як код: що із чим порівнюється, що куди переміщується. Спробуйте відсортувати за цим алгоритмом предмети на столі. Після цього запрограмуйте цей алгоритм для вашого масиву.
3. Порівняння за алфавітом - окрема цікава тема. Якщо код буде сортувати, але не так, як ви очікували, і ви будете певні, що код правильний - питайте тут з уточненням, що ви вводите, а що код виводить.

Подякували: 0xDADA11C7, LoganRoss, leofun013

3 Востаннє редагувалося laketych (21.11.2017 20:04:53)

Re: Як відсортувати строки за алфавітом?

Сортування можно винокати за допомогою функції strcmp, але ця функція працює тільки з цілим типом char. Може є алтернативна фукнція для string, але я не знаю(якщо є підскажіть будь ласка =)).
Отже, як би я зробив:

struct Stationery hold;

    for (int i = 0; i < cntr; i++) {
        for (int j = 0; j < cntr; j++) {
            if (int res = strcmp(stationery[i].name_type, stationery[j].name_type) < 0) {
                hold = stationery[i];
                stationery[i] = stationery[j];
                stationery[j] = hold;
            }
        }
    }

Якщо треба у зворотньому напрямку сортування - міняємо знак на протилежний.

Подякували: blizzard1

4

Re: Як відсортувати строки за алфавітом?

strcmp працює не з char, а з масивами char, що закінчуються нульовим символом.
А string порівнюються за допомогою - хто б міг подумати - операторів <,> і ==.

не для новачків

Оператор = для string дещо повільний, і варто було б замінити обмін на std::swap, а ще краще все сортування - на std::sort.

Ну і заради цікавості - нащо ви змінну res проголошуєте?

Подякували: blizzard1

5 Востаннє редагувалося laketych (21.11.2017 20:20:05)

Re: Як відсортувати строки за алфавітом?

strcmp працює не з char, а з масивами char, що закінчуються нульовим символом.
А string порівнюються за допомогою - хто б міг подумати - операторів <,> і ==.

Дякую за пораду!

Ну і заради цікавості - нащо ви змінну res проголошуєте?

А, це тому что я з самого початку:

int res=strcmp(stationery[i].name_type, stationery[j].name_type);
   if(res>0){
      ...
   }

Хотів цю всю "конструкцію" зменшити, але забув видалити "int res" =)

Подякували: koala1