Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.59/32: Рейтинг темы: голосов - 32, средняя оценка - 4.59
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
1

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

31.07.2011, 16:02. Просмотров 6380. Ответов 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. Программа с латинскими символами работает вроде бы правильно, и считает тоже.
Но с русскими: выводит так:
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2011, 16:02
Ответы с готовыми решениями:

как сделать чтобы читало русские буквы с массива и выводило русский шрифт при функции рекурсии
Добрый день #include &lt;iostream&gt; using namespace std; void reverse(char *s); int main()

Сделать, чтобы в консоли отображались русские буквы, а не кракозябры
Собственно вместо русских букв выдает кракозябры. Шрифт Lucida. Как пофиксить? #include...

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

Как сделать так чтобы простейшая программа запускалась сначало
Предположим есть самая простая программа: #include &lt;iostream&gt; using namespace std; #include...

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

Добавлено через 1 минуту
Цитата Сообщение от Visary_Master Посмотреть сообщение
Дак sizeof(mass) возвращает получается весь размер массива?
И strlen(mass)-1... делает то же самое... хотя может и нет... но программа работает одинаково
т.е. const int SIZE = 255; // но это же бред...
0
387 / 279 / 53
Регистрация: 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;   
}
а что вообще должна делать программа? Могу написать полностью
0
1184 / 540 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
31.07.2011, 16:35 6
В коде не разбирался, но ввод и вывод русских символов можно установить так
C++
1
2
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
Для использования нужно подключить windows.h.
0
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
31.07.2011, 16:39  [ТС] 7
Цитата Сообщение от Mayonez Посмотреть сообщение

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

Добавлено через 4 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
В коде не разбирался, но ввод и вывод русских символов можно установить так
C++
1
2
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
Для использования нужно подключить windows.h.
Ужас что твориться, когда я с этим запускаю... у меня семерка х32
0
387 / 279 / 53
Регистрация: 26.12.2009
Сообщений: 875
31.07.2011, 17:25 8
Цитата Сообщение от Visary_Master Посмотреть сообщение
можно ли мой вариант как-нибудь сделать так, чтобы он с русскими работал символами...
можно, но мне так лень читать чужой код...
иногда проще такие небольшие програмки самому написать, так сказать "по своей логике".
но сейчас посмотрю что там не так
0
387 / 279 / 53
Регистрация: 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; 
}
немного посмотрел, дописал там в коментах
Как сделать так, чтобы программа понимала русские буквы?
0
30 / 30 / 0
Регистрация: 30.06.2011
Сообщений: 467
31.07.2011, 18:46 10
Цитата Сообщение от Mayonez Посмотреть сообщение
kol=kol+1;
можно сократить так - kol+=1
0
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
31.07.2011, 21:41  [ТС] 11
Цитата Сообщение от Mayonez Посмотреть сообщение
немного посмотрел, дописал там в коментах
Вложение 90037
А каким компилятором пользуетесь? У меня MS visual studio 2010.
0
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
31.07.2011, 21:57  [ТС] 12
Цитата Сообщение от Visary_Master Посмотреть сообщение
А каким компилятором пользуетесь? У меня MS visual studio 2010.
вообще копипастом ничего не работает....
0
Миниатюры
Как сделать так, чтобы программа понимала русские буквы?  
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.08.2011, 16:58  [ТС] 13
Еще при вводе сразу иероглифы
0
Миниатюры
Как сделать так, чтобы программа понимала русские буквы?  
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10842 / 6685 / 1614
Регистрация: 25.07.2009
Сообщений: 12,447
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;
}
Как сделать так, чтобы программа понимала русские буквы?
1
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.08.2011, 19:00  [ТС] 15
нет, не работает.
0
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
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() не возвращает то что положено???....
0
Android Programmer
139 / 140 / 10
Регистрация: 08.12.2010
Сообщений: 421
05.08.2011, 15:38 17
ибо почитайте про sizeof более подробно.
C++
1
sizeof(mass)/sizeof(mass[0])
поможет.
да и вопрос, зачем вам sizeof, если у вас размер статичен?
1
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
05.08.2011, 16:46  [ТС] 18
Цитата Сообщение от silentnuke Посмотреть сообщение
ибо почитайте про sizeof более подробно.
C++
1
sizeof(mass)/sizeof(mass[0])
поможет.
да и вопрос, зачем вам sizeof, если у вас размер статичен?
Почитаю...
точно... но.... размер массива константа... видимо он берет размер константы, а не строки...

Добавлено через 35 минут
выдает размер типа данных(
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10842 / 6685 / 1614
Регистрация: 25.07.2009
Сообщений: 12,447
05.08.2011, 16:53 19
Visary_Master, вот, почему в программах на С++ лучше всё-таки wstring использовать - у неё .size() есть Чтобы узнать длину строки wchar_t *, в wchar.h есть функция wcslen()
1
847 / 189 / 18
Регистрация: 01.08.2011
Сообщений: 505
05.08.2011, 17:05 20
Есть у меня несколько замечаний по поводу подсчета количества слов и подсчета букв, но лучше посоветую книжку, в которой нашла подобные быстрые алгоритмы. См. ссылку в конце предлагаемого поста (да и в самом посте алгоритм из той книги):

https://www.cyberforum.ru/showthread.php?p=1880997
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2011, 17:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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