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

Как сделать так, чтобы программа понимала русские буквы? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.76
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.07.2011, 16:02     Как сделать так, чтобы программа понимала русские буквы? #1
И если знаете как убрать этот огромный массив символов "char mass2[]"

на chr виснет все...

Так вот код программы. Мне нужно чтобы она выводила статистику по русским символам правильно... а то выводит не то совсем. Подскажите пожалуйста.

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
67
68
69
70
71
72
#include <iostream> // подключаем библиотеку ввода, вывода
#include <conio.h> // для задержки экрана
#include <locale.h>
using namespace std; // чтобы не писать std::cout, std::cin подключаем пространство имен
 
const int SIZE = 255; // объявляем максимальный размер строки
 
int main() 
{
    setlocale( LC_ALL,"Russian" );
 
    char mass[SIZE]; // здесь будем хранить строку
    char mass2[] =  { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                      'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                      '1','2','2','4','5','6','7','8','9','0','!','@','#','$','%','^','&','*','(',')','-','+','=','"',';','?',
                      '~','`',' ', ',','.',
                      'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш',
                      'щ','ь','ы','ъ','э','ю','я','А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С',
                      'Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ь','Ы','Ъ','Э','Ю','Я'
                    };// массив для символов которые будем считать
    char mass3[] =  { '!',';','?',',','.'}; // для знаков препинания
 
    cout << "Введите строку: "; // просим ввести строку
    gets(mass); // вводим строку в массив mass
    cout << "======================================" << endl;
    int kol = 0; // счетчик для посчета слов в предложении
    // перебираем символы массива в котором находится та строка, которую мы ввели
    for (int i=0; i<sizeof(mass); i++)
        if ((mass[i] == ' ') && (mass[i+1] != ' ')) // если нашли пробел и следующий символ равен не пробелу
            kol=kol+1; // увеличиваем счетчик слов на 1
        if (mass[0] != ' ') // если первый символ не равен нулю
            kol=kol+1; // увеличиваем счетчик слов на 1
    // выводим кол-во слов
    cout << "В введеной строке слов: "<< kol << endl;
    cout << "======================================" << endl;
    cout << "Знаки препинания: " << endl;
    // перебираем символы массива mass3 и считаем знаки препинания 
    for (int j=0; j<sizeof(mass3); j++)
    {
        int count = 0; //  обявляем счетчик знаков перпинания
        // перебираем введеную строку
        for (int i=0; i<sizeof(mass); i++)
        {
            if (mass3[j] == mass[i]) // если символ совпал с текущим знаком препинания
            {
                count++; // увеличиваем счетчик знака
            }
        }
        if (mass3[j] && (count != 0)) // если такой символ найден и счетчик не равен 0
            cout << "'"<< mass3[j] << "' - "<< count << endl; // выводим кол-во его повторений
        count = 0; // обнуляем счетчик, для подсчета следующего знака препинания
    }
    cout << "======================================" << endl;
    cout << "Полная статистика по знакам: " << endl;
    // перебираем символы массива mass2 и все знаки
    for (int j=0; j<sizeof(mass2); j++)
    {
        int count = 0; //  обявляем счетчик знаков перпинания
        // перебираем введеную строку
        for (int i=0; i<sizeof(mass); i++)
        {
            if (mass2[j] == mass[i]) // если символ совпал с текущим знаком препинания
            {
                count++; // увеличиваем счетчик знака
            }
        }
        if (mass2[j] && (count != 0)) // если такой символ найден и счетчик не равен 0
            cout << "'"<< mass2[j] << "' - "<< count << endl; // выводим кол-во его повторений
        count = 0; // обнуляем счетчик, для подсчета следующего символа
    }
    return 0; 
}
P.S. Программа с латинскими символами работает вроде бы правильно, и считает тоже.
Но с русскими: выводит так:
http://s007.***********/i301/1107/ef/4c97f07375d2.jpg
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2011, 16:02     Как сделать так, чтобы программа понимала русские буквы?
Посмотрите здесь:

C++ как сделать так, чтоб при работе программы можно было вводить в качестве данных русские слова?
C++ при работе рекурсивной функции заканчивается стек и программа соответственно; как сделать так, чтобы она писала "стек закончился"?
C++ Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной?
Сделать так, чтобы при вводе отрицательного значения программа выводила errror C++
Нужно сделать так, чтобы программа запускалась только если ей передать заданный аргумент. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
31.07.2011, 16:10     Как сделать так, чтобы программа понимала русские буквы? #2
Цитата Сообщение от Visary_Master Посмотреть сообщение
И если знаете как убрать этот огромный массив символов "char mass2[]"
C++
1
char mas[] = "abcdefg............................";
инициализация строкой
Belphanior
8 / 8 / 0
Регистрация: 10.03.2011
Сообщений: 62
31.07.2011, 16:14     Как сделать так, чтобы программа понимала русские буквы? #3
Цикл у тебя проходит по всему массиву, даже там где строка кончилась и пошли пустые элементы. Во-вторых обрати внимание на кодировку консоли. Чтобы корректно сравнивать символы, кодировки должны совпадать.
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.07.2011, 16:24  [ТС]     Как сделать так, чтобы программа понимала русские буквы? #4
Цитата Сообщение от Belphanior Посмотреть сообщение
Цикл у тебя проходит по всему массиву, даже там где строка кончилась и пошли пустые элементы
Дак sizeof(mass) возвращает получается весь размер массива?
И strlen(mass)-1... делает то же самое... хотя может и нет... но программа работает одинаково

Добавлено через 1 минуту
Цитата Сообщение от Visary_Master Посмотреть сообщение
Дак sizeof(mass) возвращает получается весь размер массива?
И strlen(mass)-1... делает то же самое... хотя может и нет... но программа работает одинаково
т.е. const int SIZE = 255; // но это же бред...
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
31.07.2011, 16:27     Как сделать так, чтобы программа понимала русские буквы? #5
я бы зделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <iterator>
#include <string>
#include <map>
 
using namespace std;
 
int main(int argc, char **argv)
{
    map<char, int> counter;
    istream_iterator<char> begin(cin);
    istream_iterator<char> end;
    while(begin != end)
        counter[*begin++]++;
 
    for(map<char, int>::iterator iter = counter.begin();
        iter != counter.end(); iter++)
        cout << iter->second << " " << iter->first << endl;
    return 0;   
}
а что вообще должна делать программа? Могу написать полностью
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
31.07.2011, 16:35     Как сделать так, чтобы программа понимала русские буквы? #6
В коде не разбирался, но ввод и вывод русских символов можно установить так
C++
1
2
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
Для использования нужно подключить windows.h.
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.07.2011, 16:39  [ТС]     Как сделать так, чтобы программа понимала русские буквы? #7
Цитата Сообщение от Mayonez Посмотреть сообщение

а что вообще должна делать программа? Могу написать полностью
А можно ли мой вариант как-нибудь сделать так, чтобы он с русскими работал символами...
(...и лучше скажите где вы научились так программировать? Что читали, что писали?... но это в личку...)

Добавлено через 4 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
В коде не разбирался, но ввод и вывод русских символов можно установить так
C++
1
2
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
Для использования нужно подключить windows.h.
Ужас что твориться, когда я с этим запускаю... у меня семерка х32
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
31.07.2011, 17:25     Как сделать так, чтобы программа понимала русские буквы? #8
Цитата Сообщение от Visary_Master Посмотреть сообщение
можно ли мой вариант как-нибудь сделать так, чтобы он с русскими работал символами...
можно, но мне так лень читать чужой код...
иногда проще такие небольшие програмки самому написать, так сказать "по своей логике".
но сейчас посмотрю что там не так
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
31.07.2011, 18:22     Как сделать так, чтобы программа понимала русские буквы? #9
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
67
68
#include <iostream>
 
using namespace std; 
 
const int SIZE = 255; 
 
int main() 
{
        char mass[SIZE];
        
        //вместо этого массива воспользуемся проходом по таблице ASCII
        
        char mass3[] =  { '!',';','?',',','.'};
        
        cout << "Введите строку: "; 
        cin.getline(mass, SIZE);
        cout << "======================================" << endl;
        int kol = 0; 
 
        //sizeof() - вот где были все ошибки
        //sizeof(mass) возвращает 255
        //
        //пусть будет даже так
        for (int i = 0; i < strlen(mass); i++)
                if ((mass[i] == ' ') && (mass[i+1] != ' ')) 
                        kol=kol+1; 
                if (mass[0] != ' ') 
                        kol=kol+1; 
        // выводим кол-во слов
        cout << "В введеной строке слов: "<< kol << endl;
        cout << "======================================" << endl;
        cout << "Знаки препинания: " << endl;
 
        for (int j=0; j<strlen(mass3); j++)
        {
                int count = 0;
 
                for (int i=0; i< strlen(mass); i++)
                {
                        if (mass3[j] == mass[i]) 
                        {
                                count++; 
                        }
                }
                if (mass3[j] && (count != 0)) 
                        cout << "'"<< mass3[j] << "' - "<< count << endl; 
                count = 0;
        }
        cout << "======================================" << endl;
        cout << "Полная статистика по знакам: " << endl;
    //здесь изменил
        for (int j = 0; j < 255; j++)
        {
            int count = 0; 
            char c = j;
            if (ispunct(c))
                continue;
            for (int i = 0; i < strlen(mass); i++)
            {
                    if(mass[i] == c)
                            count++;
            }
            if (count)
                cout << "'" << c << "' - "<< count << endl;
        }
 
        return 0; 
}
немного посмотрел, дописал там в коментах
Как сделать так, чтобы программа понимала русские буквы?
leoned
 Аватар для leoned
29 / 29 / 1
Регистрация: 30.06.2011
Сообщений: 467
31.07.2011, 18:46     Как сделать так, чтобы программа понимала русские буквы? #10
Цитата Сообщение от Mayonez Посмотреть сообщение
kol=kol+1;
можно сократить так - kol+=1
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.07.2011, 21:41  [ТС]     Как сделать так, чтобы программа понимала русские буквы? #11
Цитата Сообщение от Mayonez Посмотреть сообщение
немного посмотрел, дописал там в коментах
Вложение 90037
А каким компилятором пользуетесь? У меня MS visual studio 2010.
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.07.2011, 21:57  [ТС]     Как сделать так, чтобы программа понимала русские буквы? #12
Цитата Сообщение от Visary_Master Посмотреть сообщение
А каким компилятором пользуетесь? У меня MS visual studio 2010.
вообще копипастом ничего не работает....
Миниатюры
Как сделать так, чтобы программа понимала русские буквы?  
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.08.2011, 16:58  [ТС]     Как сделать так, чтобы программа понимала русские буквы? #13
Еще при вводе сразу иероглифы
Миниатюры
Как сделать так, чтобы программа понимала русские буквы?  
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.08.2011, 18:42     Как сделать так, чтобы программа понимала русские буквы? #14
Без понятия, будет ли оно в винде работать, и проверить не на чем...
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
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <wctype.h>
#include <locale.h>
#include <string.h>
 
const wchar_t wsRuAlpha[] = L"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
const wchar_t wsEnAlpha[] = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 
const wchar_t wsPrompt[] = L"Строка";
const wchar_t wsCounters[] = L"Счётчики";
const wchar_t wsRuCount[] = L"Русские буквы";
const wchar_t wsEnCount[] = L"Английские буквы";
const wchar_t wsDigitCount[] = L"Цифры";
const wchar_t wsPunctCount[] = L"Знаки пунктуации";
const wchar_t wsSpaceCount[] = L"Пробельные символы включая перевод строки";
const wchar_t wsOtherCount[] = L"Прочие символы";
 
int main(void){
    wchar_t buf[BUFSIZ], * pBuf, * pCount;
    int ruCount[wcslen(wsRuAlpha)];
    int enCount[wcslen(wsEnAlpha)];
    int digitCount, punctCount, spaceCount, otherCount, i;
    
    setlocale(LC_ALL, "");
    
    while ( printf("%ls: ", wsPrompt) && fgetws(buf, BUFSIZ, stdin) && *buf != L'\n' ){
        memset(ruCount, 0, sizeof(ruCount));
        memset(enCount, 0, sizeof(enCount));
        digitCount = punctCount = spaceCount = otherCount = 0;
        
        for ( pBuf = buf; *pBuf != L'\0'; ++pBuf ){         
            if ( pCount = wcschr(wsRuAlpha, *pBuf) )
                ++ruCount[pCount - wsRuAlpha];
            else if ( pCount = wcschr(wsEnAlpha, *pBuf) )
                ++enCount[pCount - wsEnAlpha];
            else if ( iswdigit(*pBuf) )
                ++digitCount;
            else if ( iswpunct(*pBuf) )
                ++punctCount;
            else if ( iswspace(*pBuf) )
                ++spaceCount;
            else
                ++otherCount;
        }
        
        printf("\n%ls\n", wsCounters);
        printf("%ls:\n", wsRuCount);
        for ( i = 0; i < sizeof(ruCount) / sizeof(*ruCount); ++i )
            if ( ruCount[i] != 0 )
                printf("%lc\t%3d\n", *(wsRuAlpha + i), ruCount[i]);
        printf("%ls:\n", wsEnCount);
        for ( i = 0; i < sizeof(enCount) / sizeof(*enCount); ++i )
            if ( enCount[i] != 0 )
                printf("%lc\t%3d\n", *(wsEnAlpha + i), enCount[i]);
        printf("%ls: %d\n", wsDigitCount, digitCount);
        printf("%ls: %d\n", wsPunctCount, punctCount);
        printf("%ls: %d\n", wsSpaceCount, spaceCount);
        printf("%ls: %d\n", wsOtherCount, otherCount);
        printf("\n");
    }
    
    return 0;
}
Как сделать так, чтобы программа понимала русские буквы?
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.08.2011, 19:00  [ТС]     Как сделать так, чтобы программа понимала русские буквы? #15
нет, не работает.
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
05.08.2011, 15:26  [ТС]     Как сделать так, чтобы программа понимала русские буквы? #16
Получилось сравнивать, когда считаю слова. Остальное допишу.
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
#include <iostream>
#include <sstream>
#include <locale>
using namespace std;
int main()
{  
// установка русской локали для строкового потока и для вывода
   wcout.imbue(locale("rus_rus.866"));
   wcin.imbue(locale("rus_rus.866"));
 
   wchar_t mass[100]; 
    wcin.getline(mass,99);
    cout << endl;
 
    int kol = 0; 
    
    for (int i=0; i<sizeof(mass); i++)
    {
        if ((mass[i] == ' ') && (mass[i+1] != ' '))
            kol=kol+1;
        if (((mass[i]) && (mass[i+1] == ' ') && (mass[i-1] ==' ')) && ((mass[i] != L'а') || (mass[i] != L'я')))
            kol=kol-1; 
    }
    if (mass[0] != ' ') 
        kol=kol+1;
    
    wcout << L"В введеной строке слов: "<< kol << endl;
 
   return 0;
}
Но почему sizeof() не возвращает то что положено???....
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
05.08.2011, 15:38     Как сделать так, чтобы программа понимала русские буквы? #17
ибо почитайте про sizeof более подробно.
C++
1
sizeof(mass)/sizeof(mass[0])
поможет.
да и вопрос, зачем вам sizeof, если у вас размер статичен?
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
05.08.2011, 16:46  [ТС]     Как сделать так, чтобы программа понимала русские буквы? #18
Цитата Сообщение от silentnuke Посмотреть сообщение
ибо почитайте про sizeof более подробно.
C++
1
sizeof(mass)/sizeof(mass[0])
поможет.
да и вопрос, зачем вам sizeof, если у вас размер статичен?
Почитаю...
точно... но.... размер массива константа... видимо он берет размер константы, а не строки...

Добавлено через 35 минут
выдает размер типа данных(
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.08.2011, 16:53     Как сделать так, чтобы программа понимала русские буквы? #19
Visary_Master, вот, почему в программах на С++ лучше всё-таки wstring использовать - у неё .size() есть Чтобы узнать длину строки wchar_t *, в wchar.h есть функция wcslen()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2011, 17:05     Как сделать так, чтобы программа понимала русские буквы?
Еще ссылки по теме:

Как сделать, так чтобы i и j можно было вводить самому "i" И "j" в цикле, есть программа C++
C++ Не так выглядят русские буквы при выводе в файл.
Сделать так, чтобы функция возвращала как целые, так и дробные значения C++

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

Или воспользуйтесь поиском по форуму:
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
05.08.2011, 17:05     Как сделать так, чтобы программа понимала русские буквы? #20
Есть у меня несколько замечаний по поводу подсчета количества слов и подсчета букв, но лучше посоветую книжку, в которой нашла подобные быстрые алгоритмы. См. ссылку в конце предлагаемого поста (да и в самом посте алгоритм из той книги):

http://www.cyberforum.ru/showthread.php?p=1880997
Yandex
Объявления
05.08.2011, 17:05     Как сделать так, чтобы программа понимала русские буквы?
Ответ Создать тему
Опции темы

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