Как создать функцию для подсчета вхождений каждой буквы? - PullRequest
0 голосов
/ 08 ноября 2010

В C мне нужно создать функцию, которая для ввода будет подсчитывать и отображать количество раз, которое встречается каждая буква.

Для ввода «Lorem ipsum dolor sit amet» функция должна возвращать что-то похожее на:

a: 0
b: 0
c: 0
d: 1
e: 2
f: 0
...

Ответы [ 4 ]

5 голосов
/ 08 ноября 2010

Так что вам, в основном, нужно будет прочитать весь файл char-by-char. Предполагая, что вы знаете, как работает чтение файлов, вам нужно будет сделать что-то вроде (извините, я давно не делал C):

if (isalpha(ch)) {
  count[ch-'a']++;
}
/* rest of code where char pointer is moved on etc. */

Для этого вам нужно будет импортировать библиотеку ctype:

#include <ctype.h>

** забыл упомянуть, предположил, что вы вывели бы следующее: ch - ваш указатель на текущий читаемый символ, а count [] - это int [], инициализированный для всех нулей с размером (26 * 2) = 52 для обслуживания как в верхнем, так и в нижнем регистре. Если прописные и строчные буквы должны обрабатываться одинаково, вы можете использовать функцию tolower (int c), также включенную в библиотеку ctype. В этом случае вам нужен только массив размером 26

.
if (isalpha(ch)) {
  count[tolower(ch)-'a']++;
}

Тогда счет [] должен содержать счетчики для каждого символа.

/ * ***** * /

Если вы хотите сделать это только с библиотекой stdio.h, вы можете реализовать две функции, используемые из библиотеки ctype.h.

Простая реализация функции isalpha (int c) может выглядеть примерно так:

if (((int)c >= 'a' && (int)c <= 'z') || ((int)c >= 'A' && (int)c <= 'Z') {
  return TRUE;
} else {
  return FALSE;
}

(где TRUE и FALSE имеют тип вашего возвращаемого типа и что-то, что вы определили).

И действительно простая версия tolower может выглядеть примерно так:

if ((int)c >= 'A' && (int)c <= 'Z') {
  return (int)c - 'a';
} else {
  return (int)c;
}

Возможно, вы могли бы обойтись без всех приведений ...

2 голосов
/ 08 ноября 2010

Рекомендации:

char c[26] = { 0 }; // init
// read each input chars
    ++c[input-'a'];
1 голос
/ 08 ноября 2010

Я бы имел массив (размером, равный домену char) и увеличил бы число в соответствующей позиции.

 count[ch]++;
0 голосов
/ 08 ноября 2010

На всякий случай, если вас интересует скорость:

unsigned int chars [255], * p = text;

while (* p) chars [* p] ++;

для (int i = 0; i <255; i ++) if (i> ('A' - 1) && i <('Z' + 1)) printf ("% c)% u / n", i, chars [i]; </p>

Извините за" / n ", но мой mac pro не имеет правильного символа на клавиатуре ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...