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

Сортировка русского алфавита с буквой ё - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
24.12.2012, 19:03     Сортировка русского алфавита с буквой ё #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
char arr[N_NSIZE][N_MSIZE];
    char* p[N_NSIZE];
    int i=0,count=0;
// fgets(arr[0],N,stdin);
// scanf("%s",str);
    while(1)
    {
 
        if (arr[i-1][1]=='\0') //Input words is over if double clicked "Enter" in the console line
        {
            break;
        }
        else
        {
            //i++;
            fgets(arr[i],N_NSIZE,stdin); // Write strings
            p[i]=arr[i];
            count++;    //Number of strings
            i++;
        }
    }
    qsort(p,count,sizeof(char*),Compare);
 return 0;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int Compare(const void *a, const void*b)
{
    int i=0;
    while ((*(char**)a)!="\0")
    {
        (*(char**)(a)+i);
        i++;
    }
 
    if (strcmp((*(char**)a),(*(char**)b))>0 && (strlen((*(char**)a))==strlen((*(char**)b)))) //Sort strings by ask (if "<0", then sort strings by desc)
    {
        return 1;
    }
    else if (strlen((*(char**)a))>strlen((*(char**)b))) //Sort strings by their lenght
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
Собственно проблема заключается в том, что у меня не получается выделить символ из слова (чтобы посимвольно сравнить 2 строки в Compare).
Помогите, пожалуйста. В чем может быть дело?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2012, 19:03     Сортировка русского алфавита с буквой ё
Посмотрите здесь:

C++ проверка символа на принадлежность к буквам русского алфавита
C++ Преобразовать буквы русского алфавита в латинские
C++ Определить номера букв русского алфавита
Написать функцию, которая возвращается True, если символ, полученный функцией в качестве аргумента, является гласной буквой русского алфавита C++
Корректный вывод русского алфавита C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,605
Записей в блоге: 17
24.12.2012, 19:48     Сортировка русского алфавита с буквой ё #2
А почему не используете STL ?
Или код на "чистом Си" ?
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
25.12.2012, 10:35  [ТС]     Сортировка русского алфавита с буквой ё #3
нет, код не на чистом си..
Помогите, пожалуйста..
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,605
Записей в блоге: 17
25.12.2012, 15:28     Сортировка русского алфавита с буквой ё #4
Если подойдет то

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
//--------------------------------------
using namespace std;
//--------------------------------------
int main()
{
    vector<string> vs= {"один","два","три","четыре","пять"};
    sort(vs.begin(),vs.end() );
 
    for(const string& s : vs ) cout<<s<<endl;
 
    cout<< endl;
    return 0;
}
//--------------------------------------
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 13:18  [ТС]     Сортировка русского алфавита с буквой ё #5
нет, дело именно в букве ё. она вышибает из колеи.. Т.е. если написать:
ёжик
мжик
ежик

То результатом обычной сортировки будет:
ежик
мжик
ёжик

А мне как раз нужно, чтобы ё заняла свое место)))
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
27.12.2012, 14:25     Сортировка русского алфавита с буквой ё #6
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
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cctype>
#include <functional>
 
#ifdef _MSC_VER
    #include <fcntl.h>
    #include <io.h>
#endif
 
struct wstring_comparer : public std::binary_function<std::wstring&, std::wstring&, bool>
{
    // <
    bool operator () (const std::wstring& s1, const std::wstring& s2)
    {
        for (std::wstring::size_type i = 0; i < std::min(s1.length(), s2.length()); i++)
        {
            wchar_t ch1 = tolower(s1[i]);
            wchar_t ch2 = tolower(s2[i]);
        
            if (ch1 == L'ё' && ch2 != L'е')
                ch1 = L'е';
            else if (ch1 == L'ё')
                ch1 = L'ж';
 
            if (ch2 == L'ё' && ch1 != L'е')
                ch2 = L'е';
            else if (ch2 == L'ё')
                ch2 = L'ж';
 
            if (ch1 < ch2)
                return true;
            else if (ch1 > ch2)
                return false;
        }
        return s1.length() < s2.length() ? false : true;
    }
};
 
 
int main()
{
    wchar_t *array[] = {
        L"ёжик",
        L"мжик",
        L"ежик"
    };
    std::vector<std::wstring> vector(std::begin(array), std::end(array));
    #ifdef _MSC_VER
    _setmode(_fileno(stdout), _O_U16TEXT);
    #endif
    std::sort(vector.begin(), vector.end(), wstring_comparer());
    for 
        (
            std::vector<std::wstring>::const_iterator it = vector.begin();
            it != vector.end();
            ++it
        )
        std::wcout << *it << std::endl;
    #ifdef _MSC_VER
        system("pause");
    #endif
    return 0;
}
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 14:46  [ТС]     Сортировка русского алфавита с буквой ё #7
не совсем понятен код..
я написал функцию сравнения строк для русского алфавита:
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
int strcmp_RUS(const char *s1, const char *s2)
{
    int i=0;
    while (s1[i]!='\0')
    {
        if ((s1[i]==-15)&&(s2[i]>=-91)&&(s2[i]<=-85))
        {
            return -1;
        }
        if ((s1[i]=='ё')&&(s2[i]>='ж')&&(s2[i]<='я'))
        {
            return 1;
        }
        if ((s2[i]=='ё')&&(s1[i]>='а')&&(s1[i]<='e'))
        {
            return 1;
        }
        if ((s2[i]=='ё')&&(s1[i]>='ж')&&(s1[i]<='я'))
        {
            return -1;
        }
        if (s1[i]>s2[i])
        {
            return 1;
        }
        if (s1[i]<s2[i])
        {
            return -1;
        }
        i++;
    }
    if (s2[i]!='\0')
    {
        return -1;
    }
    return 0;
}
Аналог strcmp, вызов которого представлен в начале темы.
Только дело в том, что в эти строки непосредственно передаются не символы русского алфавита, а какие-то ерундовые символы..(Локаль не помог решить данную проблему). Собственно, из-за этого первые 4 условия просто игнорируются при дебаже..
Посоветуйте, как сравнить значения символов в таком случае..?

Добавлено через 6 минут
первое условие будет таким:
C++
1
2
3
4
if ((s1[i]=='ё')&&(s2[i]>='а')&&(s2[i]<='е'))
        {
            return -1;
        }
Просто тестировал)
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,605
Записей в блоге: 17
27.12.2012, 14:51     Сортировка русского алфавита с буквой ё #8
Блин такие проблемы по идее должна решать локаль, или нет ?

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
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
//--------------------------------------
using namespace std;
 
struct lcmpch
{
 bool operator()(const char a,const char b)
  {
    if(a=='ё') return b>'е';
    if(b=='ё') return a<='е';
    if(a=='Ё') return b>'Е';
    if(b=='Ё') return a<='Е';
    return a<b;
  }
};
//--------------------------------------
struct lcmpstr
{
 bool operator()(const string & a,const string & b)
  {
   return lexicographical_compare(a.begin(),a.end(),b.begin(),b.end(),lcmpch() );
  }
};
//--------------------------------------
int main()
{
    system("chcp 1251");
 
    vector<string> vs= {"азбука","бяка","ёжик","мжик","ежик","ёп","четыре","пять"};
 
    sort(vs.begin(),vs.end(),lcmpstr() );
 
    for(const string& s : vs ) cout<<s<<endl;
 
    cout<< endl;
    return 0;
}
//--------------------------------------
Добавлено через 44 секунды
Вывод:
азбука
бяка
ежик
ёжик
ёп
мжик
пять
четыре
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 15:18  [ТС]     Сортировка русского алфавита с буквой ё #9
выдает ошибки:
в строках :
C++
1
vector<string> vs= {"азбука","бяка","ёжик","мжик","ежик","ёп","четыре","пять"};
C++
1
 for(const string& s : vs ) cout<<s<<endl;
Пишет, error C2552: vs: инициализация не агрегированных данных с помощью списка инициализации не допускается
error C2143: синтаксическая ошибка: отсутствие "," перед ":"
error C2530: s: ссылки должны быть инициализированы

Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,605
Записей в блоге: 17
27.12.2012, 15:20     Сортировка русского алфавита с буквой ё #10
Это с использованием нового стандарта
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 15:20  [ТС]     Сортировка русского алфавита с буквой ё #11
Локаль почему то не решает эту проблему, что у меня в коде.. system("chcp 1251") тоже не помог.
Хотя, вывод строк на экран получается нормальным.. какой-то парадокс прям таки
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 15:20  [ТС]     Сортировка русского алфавита с буквой ё #12
Цитата Сообщение от Avazart Посмотреть сообщение
Это с использованием нового стандарта
а как будет со старым?)
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
27.12.2012, 15:21     Сортировка русского алфавита с буквой ё #13
C++
1
2
3
4
vector<string> vs;
vs.push_back("азбука");
// TODO other words
vs.push_back("пять");
for-each C++11 замените обычным for
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,605
Записей в блоге: 17
27.12.2012, 15:24     Сортировка русского алфавита с буквой ё #14
Ну в коде все равно сортирует не так как хотелось - большие буквы ставит раньше малых...

Добавлено через 56 секунд
Где то у меня была сохранена ссылка на статью про локали...
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 15:25  [ТС]     Сортировка русского алфавита с буквой ё #15
Цитата Сообщение от Пaтрик Посмотреть сообщение
C++
1
2
3
4
vector<string> vs;
vs.push_back("азбука");
// TODO other words
vs.push_back("пять");
for-each C++11 замените обычным for
а вывод на консоль?
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,605
Записей в блоге: 17
27.12.2012, 15:27     Сортировка русского алфавита с буквой ё #16
C++
1
for(size_t i=0;i<vs.size();i++) cout<<vs[i]<<endl;
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 15:29  [ТС]     Сортировка русского алфавита с буквой ё #17
спасибо =)
правда, потыкаю еще в своем коде.. может, что и пройдет там..
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,605
Записей в блоге: 17
27.12.2012, 17:39     Сортировка русского алфавита с буквой ё #18
Добавил tolower_cp1251() для кириллицы чтоб сравнивать без учета региста
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
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
//--------------------------------------
using namespace std;
//--------------------------------------
char tolower_cp1251(const char ch)
{
   if(ch=='Ё') return 'ё';
 
   if(ch>='А' && ch<='я')
    {
     if(ch<='Я') return ch+('а'-'А');
     else return ch;
    }
  else return tolower(ch);
}
//-----------------------------
struct lcmpch
{
 bool operator()(const char a,const char b)
  {
    if(tolower_cp1251(a)=='ё') return tolower_cp1251(b)>'е';
    if(tolower_cp1251(b)=='ё') return tolower_cp1251(a)<='е';
    return tolower_cp1251(a)< tolower_cp1251(b);
  }
};
//--------------------------------------
struct lcmpstr
{
 bool operator()(const string & a,const string & b)
  {
   return lexicographical_compare(a.begin(),a.end(),b.begin(),b.end(),lcmpch() );
  }
};
//--------------------------------------
int main()
{
    system("chcp 1251");
 
    vector<string> vs= {"азбука","бяка","Ёжик","мжик","ежик","ёжик","четыре","пять"};
 
    sort(vs.begin(),vs.end(),lcmpstr() );
 
    for(const string& s : vs ) cout<<s<<endl;
 
    cout<< endl;
    return 0;
}
//--------------------------------------
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2012, 22:00     Сортировка русского алфавита с буквой ё
Еще ссылки по теме:

C++ Напишите подпрограмму, которая определяет, является ли введенный символ гласной буквой русского или латинского алфавита
Определить, является ли указанный символ гласной буквой русского алфавита C++
C++ Подсчет количества символов русского алфавита в текстовом файле

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zener
22 / 9 / 1
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 22:00  [ТС]     Сортировка русского алфавита с буквой ё #19
Спасибо за помощь..
Я подкорректировал свою программку, у меня тоже получилось)
Yandex
Объявления
27.12.2012, 22:00     Сортировка русского алфавита с буквой ё
Ответ Создать тему
Опции темы

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