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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
ika11ika
0 / 0 / 0
Регистрация: 16.11.2013
Сообщений: 12
#1

Подсчет частоты алфавита - C++

14.12.2013, 16:29. Просмотров 1193. Ответов 23
Метки нет (Все метки)

Доброго времени суток. Как посчитать в тексте из файла частоту алфавита(сколько раз каждый символ встречается в приведенном тексте)? Я понимаю, что мы открываем 2 файла: в 1 изначальный текст, в другой записывается частота алфавита. Вот только не посимвольно же этот текст читать и суммировать. А как сделать это на массивах представляю очень образно и на практике не выходит. Помогите хотя бы с теоретической части, а практической может сама дойду. Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2013, 16:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подсчет частоты алфавита (C++):

Подсчет частоты встречаемости слов - C++
Разработайте программу, выполняющую подсчет частоты встречаемости слов, поступающих со стандартного потока вывода и выводящую слова их...

Сделать подсчет частоты встречаемости последовательности символов АБВ в текстовом файле - C++
Народ помогите пожалуйста решить задачу: подсчет частоты встречаемости последовательности символов АБВ в текстовом файле?

Подсчет количества символов русского алфавита в текстовом файле - C++
Здравствуйте, нужна ваша помощь) Допустим у нас имеется текстовой файл Test.txt( в нем находятся русские буквы и другие... символы и...

Работа со звуком (частоты) - C++
Привет. Меня интересует как работать со звуком на С-подобных языках. Какие существуют для этого библиотеки и подходы. Очень хочется...

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

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

23
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
14.12.2013, 16:35 #2
Цитата Сообщение от ika11ika Посмотреть сообщение
Вот только не посимвольно же этот текст читать и суммировать.
а почему бы и не посимвольно?
Цитата Сообщение от ika11ika Посмотреть сообщение
А как сделать это на массивах представляю очень образно и на практике не выходит.
C++
1
2
3
4
5
6
int symbols[256]={0};
char c;
while(!f.eof()){
  f>>c;
  symbols[c]++;//тут ещё нужно, наверн. подумать, что делать со знаковыми char
}
0
ika11ika
0 / 0 / 0
Регистрация: 16.11.2013
Сообщений: 12
14.12.2013, 16:38  [ТС] #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а почему бы и не посимвольно?
C++
1
2
3
4
5
6
int symbols[256]={0};
char c;
while(!f.eof()){
  f>>c;
  symbols[c]++;//тут ещё нужно, наверн. подумать, что делать со знаковыми char
}
не посимвольно, наверное потому, что если загрузить в файл приличного объема текст(ну не "Войну и мир" конечно, но тоже большое произведение), то скорее всего долга эта программа будем все эти символы считать
0
Xfaider
11 / 11 / 1
Регистрация: 27.10.2012
Сообщений: 26
14.12.2013, 16:52 #4
Я вижу это так:
создаем массив размере 25(для английского алфавита)
считываем строку
проходим по строке передавая каждый символ в функцию, которая в свою очередь проверяет какой это символ, и в зависимости от того какой, увеличивает значение в массиве
Пример функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
char 
    c1='a',
    c2='A';
for (int i=0; i<25; i++)
    {
        if (c1==c)
            array[i]++;
        if (c2==c)
            array[i]++;
        c1++;
        c2++;
    }
0
ya_noob
_
201 / 145 / 9
Регистрация: 08.10.2011
Сообщений: 432
14.12.2013, 17:06 #5
ika11ika, можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdio>
#include <cctype>
using namespace std;
 
int main()
{
    int freq[ 256 ] = { 0 };
 
    const int M = 10000;
    char buf[ M ];
    int m;
 
    while ( ( m = fread( buf, 1, M, stdin ) ) ) // читаем кусками по M байт за раз
        for ( int i = 0; i < m; ++i )
            ++freq[ tolower( buf[ i ] ) ];
 
    for ( char i = 'a'; i <= 'z'; ++i )
        printf( "%c: %d\n", i, freq[ i ] );
 
    return 0;
}
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
14.12.2013, 17:49 #6
Цитата Сообщение от ika11ika Посмотреть сообщение
не посимвольно, наверное потому, что если загрузить в файл приличного объема текст(ну не "Войну и мир" конечно, но тоже большое произведение), то скорее всего долга эта программа будем все эти символы считать
а ничего, что те, кто реализовывал файловые потоки в С++, наверное лучше знают как там чё буферизовать?
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
14.12.2013, 17:56 #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
symbols[c]++;//тут ещё нужно, наверн. подумать, что делать со знаковыми char
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
char c;
объявить его беззнаковым
C++
1
unsigned char c;
Цитата Сообщение от ika11ika Посмотреть сообщение
наверное потому, что если загрузить в файл приличного объема текст
одна страница текста A4 занимает примерно 1.5 кБайт
что ты подразумеваешь под файлом большого размера?
сколько страниц ?
1
gazlan
3132 / 1908 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
14.12.2013, 18:08 #8
Цитата Сообщение от ya_noob Посмотреть сообщение
// читаем кусками по M байт за раз
И для чего только страничная организация памяти придумана?
0
ya_noob
_
201 / 145 / 9
Регистрация: 08.10.2011
Сообщений: 432
14.12.2013, 18:24 #9
Цитата Сообщение от gazlan Посмотреть сообщение
И для чего только страничная организация памяти придумана?
не понял, поясните
0
gazlan
3132 / 1908 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
14.12.2013, 18:55 #10
Обмен памяти с диском происходит страницами. И ваш выбор const int M = 10000; лишен всякого смысла.
0
ika11ika
0 / 0 / 0
Регистрация: 16.11.2013
Сообщений: 12
14.12.2013, 19:28  [ТС] #11
Цитата Сообщение от ValeryS Посмотреть сообщение
одна страница текста A4 занимает примерно 1.5 кБайт
что ты подразумеваешь под файлом большого размера?
сколько страниц ?
Ну, в том плане, что в файле может оказаться текст большего размера, чем 1 страница и если будет, например, 10 страниц, то пока она сосчитает все символы...это в моем понимании(женская логика).

Цитата Сообщение от Xfaider Посмотреть сообщение
Я вижу это так:
создаем массив размере 25(для английского алфавита)
считываем строку
проходим по строке передавая каждый символ в функцию, которая в свою очередь проверяет какой это символ, и в зависимости от того какой, увеличивает значение в массиве
Пример функции:
Не вариант, потому что мне нужны все числа и все буквы в том числе заглавные от английского и русского алфавитов. Но не это проблема, ведь, при работе с файлами все равно какой язык используется (для записи, не для вывода).
0
ya_noob
_
201 / 145 / 9
Регистрация: 08.10.2011
Сообщений: 432
14.12.2013, 19:41 #12
Цитата Сообщение от gazlan Посмотреть сообщение
И ваш выбор const int M = 10000; лишен всякого смысла.
M=10000 было написано "от балды", конечно оптимально будет цифра около 512 (+-). функция read1() читает текстовый файл размером 60 МБ за 1,2 сек, а функция read2() за 5 сек (посимвольное чтение предлагалось до моего первого поста)
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
#include <cstdio>
#include <ctime>
#include <cctype>
using namespace std;
 
void read1( int *freq )
{
    const int M = 512;
    char buf[ M ];
 
    for ( int m; ( m = fread( buf, 1, M, stdin ) ); ) // читаем кусками по M байт за раз
        for ( int i = 0; i < m; ++i )
            ++freq[ tolower( buf[ i ] ) ];
}
 
void read2( int *freq )
{
    for ( char c; EOF != ( c = getchar() ); ++freq[ tolower( c ) ] );
}
 
int main()
{
    int freq[ 256 ] = { 0 };
    int timer;
 
    timer = clock();
    read1( freq );
    timer = clock() - timer;
    printf( "%d\n", timer );
 
    return 0;
}
0
gazlan
3132 / 1908 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
14.12.2013, 19:47 #13
Цитата Сообщение от ya_noob Посмотреть сообщение
конечно оптимально будет цифра около 512 (+-)
Прочитайте, наконец, про страничную организацию памяти. И не пишите больше про "+-".
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
14.12.2013, 20:15 #14
Цитата Сообщение от ika11ika Посмотреть сообщение
Ну, в том плане, что в файле может оказаться текст большего размера, чем 1 страница и если будет, например, 10 страниц, то пока она сосчитает все символы...
и что
даже 1000 страниц считает на глаз незаметно
попробуй прочитать файл побайтно и блоком и если заметишь разницу то то тогда и будем говорить
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
symbols[c]++;
а это вообще времени мизер займет
но можешь создать в памяти буфер размером с файл считать туда разом, и потом работать с этим буфером

Добавлено через 3 минуты
Цитата Сообщение от ya_noob Посмотреть сообщение
читает текстовый файл размером 60 МБ за 1,2 сек, а функция read2() за 5 сек
во первых 5 секунд это не такое большое время
а во вторых 60 МБ это примерно 50 000 страниц
где в реальности такие файлы? это БСЭ что ли считывать?
0
ya_noob
_
201 / 145 / 9
Регистрация: 08.10.2011
Сообщений: 432
14.12.2013, 20:29 #15
Цитата Сообщение от gazlan Посмотреть сообщение
Прочитайте, наконец, про страничную организацию памяти.
а оно мне надо? я примерно представляю, как этот процесс происходит, мне этого пока достаточно.
да и вообще, я привел пример с помощью чего можно читать файлы быстрее и не претендовал на идеальное решение. вы могли бы еще в первом ответе уточнить значение M, не тыкая в википедию (про нее я и сам знаю, но нет желания в этом подробно разбираться) и не писать эти бессмысленные фразы типа
Цитата Сообщение от gazlan Посмотреть сообщение
И для чего только страничная организация памяти придумана?
если о чем-то лучше знаете почему бы просто не рассказать об этом???

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
где в реальности такие файлы? это БСЭ что ли считывать?
набрал строчку, нажал ctrl+C, зажал ctrl+V на несколько секунд и вуаля. Что вы до мелочей докапываетесь то?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 20:29
Привет! Вот еще темы с ответами:

Необходима реализация изменения частоты дискретизации на С++ - C++
Мне очень нужна помощь в области изменения частоты дискретизации с помощью различных способов аппроксимации. Необходимо реализовать на С++...

Программа для подсчета частоты вхождения слов - C++
Доброго времени суток. Недавно помогли &quot;сворганить&quot; програмку для подсчета частоты вхождения слов из текстового файла: #include...

Программа для подсчета частоты вхождения слов - C++
Программа считает частоту вхождений слов, но есть небольшой нюанс. Слова типа (&quot;как-то&quot;) выводит как два отдельных слова, как и то, Тире не...

цикл алфавита - C++
1. Вывести в одну строчку zyyxxx и тогдалее до 26 штук а 2. Создайте программу, которая вводит с клавиатуры текст. Слова могут...


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

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

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