计算字母串的C程序

cyej8jka  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(107)

任务:
创建一个函数maxRepeatingLetter,该函数接收一个字符串,并作为结果返回给定字符串中重复次数最多的字母(如果有多个字母满足给定条件,则返回英语字母表中的第一个字母),假设字符串中至少有一个字母。
代码:

#include <stdio.h>

char maxRepeatingLetter(const char *s)
{
int i, max = 0, maxIndex = 0;
int letter[26] = {0}; 
const char *pom = s;
while (*pom != '\0') 
{
  if ((*pom >= 'a' && *pom <= 'z'))
  {
     letter[*pom - 97]++;
  }
  if (*pom >= 'A' && *pom <= 'Z')
  {
     letter[*pom - 65]++;
  }
 pom++; 
}
 
for (i = 0; i < 26; i++)
{
   if (letter[i] > max) 
   { 
    max =letter[i]; maxIndex = I;
   }
 return maxIndex + 65;
}

int main () 
{
 printf("Most repeating letter is: %c", 
 maxRepeatingLetter("input for letter to repeat"));
 return 0;
}

我目前的任务是能够解释上面的代码和它是如何工作的。我需要输入一个小的变化到它,例如,添加一些东西到代码,或使它更简单。但不失去代码的主要功能。
有人愿意用2-3行来解释上面的代码吗?如果可以的话,请帮助我或提示我,甚至告诉我,我可以对代码进行哪些修改。

oug3syen

oug3syen1#

我可以看到,你必须区分小写和大写,你可以只有字母,而不是符号,如?|^!ecc......所以我试着给予你一些建议:
1.尽量缩进代码,它将更可读的外部眼睛。
1.使用变量letter是一个好主意,但我不明白使用pom的意义。
1.如果您可以使用string.h库中的strlen()函数,否则自己实现它可能是一个很好的练习。

  1. letter[*pom - 97]++letter[*pom - 65]++maxIndex + 65依赖于ASCII表,请尝试letter[*pom - 'a']++letter[*pom - 'A']++maxIndex + 'A'
  2. for循环不起作用,您遗漏了一个括号,因此if不在for中。
    代码的解释很简单,首先你使用26个元素的数组letter,因为在字母表中我们有26个字母,所以第i个元素对应于字母表中的第i个字母。
    对字符串循环一次,并将第i个字母出现的次数保存在第i个元素letter中。
    使用if in for循环,您只需在该数组中查找max,一旦找到它,您将返回max的索引,索引是出现频率更高的字母。
    对不起,我的英语不好,如果你需要更多的帮助,请告诉我。
q3qa4bjr

q3qa4bjr2#

如果你正在寻找上面代码的解释,这是非常直接的。我建议使用多个打印来理解事情是如何发生的。这里是我的几个提示。
1.函数maxRepeatingLetter()在每次字符出现时更新计数器表letter[]
1.此后,代码尝试在计数器表letter[]中查找最大数。

相关问题