1 Востаннє редагувалося taras150995 (03.11.2013 21:02:59)

Тема: Сортування слів (стрічок) за алфавітом з урахуванням літер і, є, ї, ґ

Доброго вечора.
Завдання:    Розробити функцію для порівняння двох українських слів за абетковим порядком. З клавіатури по одному ввести набір українських слів і занести їх у масив рядків. Використовуючи розроблену функцію, відсортувати введені слова за абетковим порядком.
Проблема полягає в тому, що в кодовій таблиці (наприклад windows-1251) коди вище згаданих літер йдуть не за порядком. Підкажіть будь ласка, як можна це реалізувати. Дякую.
P.S. програмую на чистому С
фрагмент коду:

#include <stdio.h>
#include <string.h>
#include <windows.h>
#define N 25
#define K 10

int EntArr(char (*)[]);

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char arr[K][N];
    puts("-----Сортування слів в абетковому порядку-----");
    int kst=EntArr(arr);
    int j=1, i=0;
    char repl[N];


    if (stricmp(arr[i], arr[j])==1)
    {
    strcpy(repl, arr[i]);
    strcpy(arr[i], arr[j]);
    strcpy(arr[j], repl);
    }
    while (i<kst)
    {
        puts(arr[i]);
        i++;
    }

    return 0;
}

int EntArr (char mas[][N])
{
    int i=0;
    printf("\nВведення слів (max %d), для закінчення натисніть ENTER\n", K);
    for (; i!=K; )
    {
        printf("Введіть %d слово: ", i+1);
        gets(mas[i]);
        if (*mas[i]==0)
            return i;
        i++;
    }
    return i;
}

2 Востаннє редагувалося koala (04.11.2013 07:15:54)

Re: Сортування слів (стрічок) за алфавітом з урахуванням літер і, є, ї, ґ

Проблема в stricmp, так? Шукаємо, бачимо, що функція застаріла. Дивимося _stricmp, бачимо, що вона порівнює без урахування локалі, а _stricoll її враховує. Накидаємо приклад:

#include <string.h>
#include <stdio.h>
#include <locale.h>

int main() {
   printf("\n%d",_stricoll ("і", "є"));
   setlocale(LC_ALL,"Ukrainian");   
   printf("\n%d",_stricoll ("і", "є")); 
   return 0;
}

Перевіряємо - і дійсно, є різниця. Вперед!

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

3 Востаннє редагувалося taras150995 (04.11.2013 22:59:33)

Re: Сортування слів (стрічок) за алфавітом з урахуванням літер і, є, ї, ґ

Дуже дякую. Виникло ще одне питання: чому при підключенні локалі в консолі не відображаються літери і та І?
Також, це не буде працювати, при звичайному порівнянні кодів символів, наприклад

 if ('і'>'а')
        puts("yes");
    else puts("no");
    printf("\n%d",_stricoll ("і", "а"));

на екран виведе no та 1

Post's attachments

Screenshot_1.png 5.56 kb, 255 downloads since 2013-11-04 

4 Востаннє редагувалося koala (04.11.2013 23:02:08)

Re: Сортування слів (стрічок) за алфавітом з урахуванням літер і, є, ї, ґ

Це питання непокоїть вже не перше покоління користувачів цієї дурнуватої ОС. Іншої відповіді, крім дурнуватості ОС, доки не придумано.
Ну і звичайне порівняння іде по кодовій таблиці, а вона ламана. strcoll - по абетці.

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

5

Re: Сортування слів (стрічок) за алфавітом з урахуванням літер і, є, ї, ґ

а чи є альтернативний спосіб без використання сторонніх функцій (на випадок, якщо викладачу не сподобається, адже завдання: розробити функцію для порівняння двох українських слів за абетковим порядком, а не використати вже існуючу) ?

6

Re: Сортування слів (стрічок) за алфавітом з урахуванням літер і, є, ї, ґ

Звісно що можна. Записуєте абетку в масив, шукаєте в ній індекси порівнюваних символів (це можна досить сильно оптимізувати, але й так згодиться) і видаєте результат порівняння індексів.

7

Re: Сортування слів (стрічок) за алфавітом з урахуванням літер і, є, ї, ґ

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Вирішення проблеми з буквою і та І.

8

Re: Сортування слів (стрічок) за алфавітом з урахуванням літер і, є, ї, ґ

cryoffiar написав:
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Вирішення проблеми з буквою і та І.

Гм, не пройшло і 5 років, а ні, таки пройшло..

9

Re: Сортування слів (стрічок) за алфавітом з урахуванням літер і, є, ї, ґ

я забув дописати, в vs code міняєш кодіровку  на 1251, і тоді все норм буде виводити і.