Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
zener
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
1

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

24.12.2012, 19:03. Просмотров 1895. Ответов 18
Метки нет (Все метки)

Здравствуйте, помогите, пожалуйста, реализовать программу сортировки слов рус. алфавита с буквой ё.
вот то, что уже сделал:
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).
Помогите, пожалуйста. В чем может быть дело?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2012, 19:03
Ответы с готовыми решениями:

Определить, является ли указанный символ гласной буквой русского алфавита
Нужно написать функцию, которая возвращает True, если символ, полученный...

Напишите подпрограмму, которая определяет, является ли введенный символ гласной буквой русского или латинского алфавита
Напишите подпрограмму, которая определяет, является ли введенный символ гласной...

Написать функцию, которая возвращается True, если символ, полученный функцией в качестве аргумента, является гласной буквой русского алфавита
Люди добрые помогите исправить ошибки, а то в Си не оч) Написать функцию,...

Корректный вывод русского алфавита
Народ, подскажите, как решить проблему. Ввожу данные с клавиатуры, а при их...

Создать массив состоящий из русского алфавита
Доброго всем здравия, для программы дешифрования нужно создать массив из...

18
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
24.12.2012, 19:48 2
А почему не используете STL ?
Или код на "чистом Си" ?
0
zener
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
25.12.2012, 10:35  [ТС] 3
нет, код не на чистом си..
Помогите, пожалуйста..
0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 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;
}
//--------------------------------------
0
zener
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 13:18  [ТС] 5
нет, дело именно в букве ё. она вышибает из колеи.. Т.е. если написать:
ёжик
мжик
ежик

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

А мне как раз нужно, чтобы ё заняла свое место)))
0
Пaтрик
426 / 394 / 132
Регистрация: 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;
}
0
zener
22 / 9 / 2
Регистрация: 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;
        }
Просто тестировал)
0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 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 секунды
Вывод:
азбука
бяка
ежик
ёжик
ёп
мжик
пять
четыре
0
zener
22 / 9 / 2
Регистрация: 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: ссылки должны быть инициализированы

0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
27.12.2012, 15:20 10
Это с использованием нового стандарта
0
zener
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 15:20  [ТС] 11
Локаль почему то не решает эту проблему, что у меня в коде.. system("chcp 1251") тоже не помог.
Хотя, вывод строк на экран получается нормальным.. какой-то парадокс прям таки
0
zener
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 15:20  [ТС] 12
Цитата Сообщение от Avazart Посмотреть сообщение
Это с использованием нового стандарта
а как будет со старым?)
0
Пaтрик
426 / 394 / 132
Регистрация: 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
0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
27.12.2012, 15:24 14
Ну в коде все равно сортирует не так как хотелось - большие буквы ставит раньше малых...

Добавлено через 56 секунд
Где то у меня была сохранена ссылка на статью про локали...
0
zener
22 / 9 / 2
Регистрация: 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
а вывод на консоль?
0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
27.12.2012, 15:27 16
C++
1
for(size_t i=0;i<vs.size();i++) cout<<vs[i]<<endl;
0
zener
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 15:29  [ТС] 17
спасибо =)
правда, потыкаю еще в своем коде.. может, что и пройдет там..
0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 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;
}
//--------------------------------------
0
zener
22 / 9 / 2
Регистрация: 16.10.2010
Сообщений: 115
27.12.2012, 22:00  [ТС] 19
Спасибо за помощь..
Я подкорректировал свою программку, у меня тоже получилось)
0
27.12.2012, 22:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2012, 22:00

Определить номера букв русского алфавита
Добрый день. Суть вопроса: нужно для заданной строки определить номера букв...

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

Генератор паролей: 6 случайных букв русского алфавита
Реализовать на языке программирования С программу, реализующую генератор...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru