检测哪个字母最常见的程序

时间:2013-03-13 16:28:09

标签: c variables loops optimization

我是C的初学者,我正在尝试制作一个程序来检测哪个字母是最常见的10个字母。 这是我到目前为止所得到的:

char one = 'a'; //0110 0001
char check[10];

scanf("%s", &check);
char *ptr;
int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;int f = 0;int g = 0;int h = 0;int i = 0;int j = 0;int k = 0;int l = 0;int m = 0;int n = 0;int o = 0;int p = 0;int q = 0;int r = 0;int s = 0;int t = 0;int u = 0;int v = 0;int w = 0;int x = 0;int y = 0;int z = 0;


if (check[0]=='a'){
    a += 1;
    if (a> b && a> c && a> d && a> e && a> f && a> g && a> h && a> i && a> j && a> k && a> l && a> m && a> n && a> o && a> p && a> q && a> r && a> s && a> t && a> u && a> v && a> x && a> y ){
        printf("A is the most common letter);
    }
}

'if'语句仅适用于输入的第一个字母,它仅检查字母a。 这是我需要帮助的地方,我该如何优化?如何制作循环而不是拥有> b&& a> c ...等。如果可以用更短的方式声明许多类似的变量?一般来说,我如何做空,我做错了什么?

谢谢。

4 个答案:

答案 0 :(得分:2)

你当然可以按自己的方式去做,并将每个字母与其他字母进行比较。但通常你分两个阶段完成这个任务

  • 计算字母出现的频率

    int letters[26];
    int i, n = strlen(check), max;
    memset(letters, 0, sizeof(letters));
    for (i = 0; i < n; ++i) {
        char c = tolower(check[i]);
        letters[c - 'a']++;
    }
    
  • 选择最高的

    max = 0;
    for (i = 1; i < 26; ++i)
        if (letters[i] > letters[max])
            max = i;
    
    printf("%c is the most common letter\n", max + 'a');
    

答案 1 :(得分:1)

是的,你做错了很多。

此部分代码

int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;int f = 0;int g = 0;int h = 0;int i = 0;int j = 0;int k = 0;int l = 0;int m = 0;int n = 0;int o = 0;int p = 0;int q = 0;int r = 0;int s = 0;int t = 0;int u = 0;int v = 0;int w = 0;int x = 0;int y = 0;int z = 0;

是可怕的。

使用数组,如: int letter[25];

letter[0]将是您的aletter[1]将是您的b ... letter[49]将是您的z

此部分代码

if (check[0]=='a'){
    a += 1;

是做你想做的事情的坏方法。

你应该这样做:

int i;

for(i = 0; i < 10; ++i)
{
    if(check[i] >= 'A' && check[i] <= 'Z') // Check if letter is uppercase.
        ++letter[check[i] - 'A']; // 'A' == 65, But our array is from 0 to 49.

    if(check[i] >= 'a' && check[i] <= 'z') // Check if letter is lowercase.
        ++letter[check[i] - 'a']; // 'a' == 97. Note that 'A' is not 'a'.
}

这将检查哪个字符最常见,并将其存储在letter数组中。

答案 2 :(得分:0)

令人印象深刻的工作:)

int counts[26]; // We are expecting 26 letters
char check[10];
char *ptr;
scanf("%s", check);

memset(counts, 0, sizeof(counts)); // zero all array values
for (ptr = check; *ptr; ptr++)
{
   char ch = *ptr;
   if (isalpha(ch)) // ignore non-alphas
   {
      ch = tolower(ch);
      counts[ch - 'a']++;
   }
}

您可以从dreamzor回答

添加最佳索引查找代码

答案 3 :(得分:-1)

您需要使用循环和数组。只需存储您在数组中的字母数量,然后将当前字母数量与最佳数量进行比较:

char check[10];
scanf("%s", &check);
const int checkSize = strlen(check);

int numberOfLetters[26]; 
for(int i = 0; i < 26; ++i) 
    numberOfLetters[i] = 0;

int bestLetterIndex = -1;

for(int i = 0; i < checkSize; ++i) {
    int letterIndex = check[i] - 'a'; // getting index from ASCII code
    numberOfLetters[letterIndex]++;

    if(i == 0 || // first letter, index not found yet 
       numberOfLetters[letterIndex] > numberOfLetters[bestLetterIndex]) {
        bestLetterIndex = letterIndex;
    }
}

printf("Most common letter is %c", (char)(bestLetterIndex + 'a'));