【问题标题】:Program that detects which letter is the most common检测哪个字母最常见的程序
【发布时间】:2013-03-01 17:21:27
【问题描述】:

我是 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。 这是我需要帮助的地方,我该如何优化?我怎样才能创建一个循环而不是拥有所有 a>b && a>c ... 等等。另外,如果可以以更短的方式声明许多类似的变量?一般来说,我如何保持简短,我做错了什么?

谢谢。

【问题讨论】:

标签: c variables loops optimization


【解决方案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】:

    您当然可以按照自己的方式进行操作,并将每个字母相互比较。但通常你会分两个阶段来做这件事

    • 计算这些字母出现的频率

      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');
      

    【讨论】:

      【解决方案3】:

      令人印象深刻的工作:)

      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 答案中添加最佳索引查找代码

      【讨论】:

        【解决方案4】:

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

        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'));
        

        【讨论】:

        • 老实说,这是 OP 实际寻找的最接近的答案,甚至它落在 EBCDIC 平台上(之前最多有 9 个 个连续字符序列中的一个中断。即'j' - 'a' 不是 9;它是 16)。
        • @WhozCraig 哈哈,好一个 :) 出于某种原因,我认为 OP 并不关心这种事情。否则,他可能像60岁了=D
        • 应该关心。它是正确的和 JGE 之间的区别(足够好)。 “正确”持续,JGE 是未来令人头疼的源头。
        • 如果你不想关心这类事情,就不要写C代码。
        • 请解释反对意见。 OP 没有说任何关于他的系统的事情。我敢打赌,这不是那种代码不起作用的系统。
        猜你喜欢
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-13
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        相关资源
        最近更新 更多