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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.76
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
#1

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

31.07.2011, 16:02. Просмотров 4493. Ответов 20
Метки нет (Все метки)

И если знаете как убрать этот огромный массив символов "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++
Добрый день #include &lt;iostream&gt; using namespace std; void reverse(char *s); int main()

Сделать, чтобы в консоли отображались русские буквы, а не кракозябры - C++
Собственно вместо русских букв выдает кракозябры. Шрифт Lucida. Как пофиксить? #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...

Как сделать так чтобы программа открывала txt файл? - C++
Допустим,я создал тхт файл и нужно его открыть с помощью запуска программы,как так сделать?

Как сделать так чтобы простейшая программа запускалась сначало - C++
Предположим есть самая простая программа: #include &lt;iostream&gt; using namespace std; #include &lt;cmath&gt; int main() { double c; ...

Как сделать, так чтобы программа выводила наименование цвета, как здесь? - C++
http://colors.aeio.ru/color/fffffe Я создал базу из 1002 цветов но это вообще не то. Я подгрузил изображение в 2тыс пикселей. И программа...

Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? - C++
Друзья! Дело в следующем, вот у меня есть функции X и Y. И вот мне не хотелось бы вызывать X прежде, чем будет вызвана Y. Но это всё в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Mayonez
380 / 272 / 21
Регистрация: 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
-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
380 / 272 / 21
Регистрация: 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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
31.07.2011, 16:35 #6
В коде не разбирался, но ввод и вывод русских символов можно установить так
C++
1
2
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
Для использования нужно подключить windows.h.
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
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
31.07.2011, 17:25 #8
Цитата Сообщение от Visary_Master Посмотреть сообщение
можно ли мой вариант как-нибудь сделать так, чтобы он с русскими работал символами...
можно, но мне так лень читать чужой код...
иногда проще такие небольшие програмки самому написать, так сказать "по своей логике".
но сейчас посмотрю что там не так
Mayonez
380 / 272 / 21
Регистрация: 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
30 / 30 / 1
Регистрация: 30.06.2011
Сообщений: 467
31.07.2011, 18:46 #10
Цитата Сообщение от Mayonez Посмотреть сообщение
kol=kol+1;
можно сократить так - kol+=1
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.07.2011, 21:41  [ТС] #11
Цитата Сообщение от Mayonez Посмотреть сообщение
немного посмотрел, дописал там в коментах
Вложение 90037
А каким компилятором пользуетесь? У меня MS visual studio 2010.
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.07.2011, 21:57  [ТС] #12
Цитата Сообщение от Visary_Master Посмотреть сообщение
А каким компилятором пользуетесь? У меня MS visual studio 2010.
вообще копипастом ничего не работает....
Миниатюры
Как сделать так, чтобы программа понимала русские буквы?  
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.08.2011, 16:58  [ТС] #13
Еще при вводе сразу иероглифы
Миниатюры
Как сделать так, чтобы программа понимала русские буквы?  
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,607
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
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.08.2011, 19:00  [ТС] #15
нет, не работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 19:00
Привет! Вот еще темы с ответами:

Как сделать так, чтобы программа открывалась там, где я её закрыл в прошлый раз? - C++
Как переделать эту функцию: main_hWnd = CreateWindowEx( WS_EX_TOPMOST, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW &amp;...

Как сделать так чтобы в матрице присутствовали еще и нулевые элементы и программа считала их количество? - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; int main() { setlocale(LC_ALL,...

Сделать так, чтобы функция возвращала как целые, так и дробные значения - C++
Задача: нужно найти среднее арифметическое чисел в одномерном массиве разных типов. В main() у пользователя спрашивается размер...

Сделать так, чтобы при вводе отрицательного значения программа выводила errror - C++
Цикл WHILE. В этом коде нужно сделать так чтобы при вводе отрицательного значения программа выводила errror. Как это сделать ? Вот код. ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2011, 19:00
Ответ Создать тему
Опции темы

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