0

我是 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 ... 等等。此外,如果可以以更短的方式声明许多类似的变量?一般来说,我如何保持简短,我做错了什么?

谢谢你。

4

4 回答 4

2

是的,你做错了很多事情。

这部分代码

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数组中。

于 2013-03-13T16:59:06.240 回答
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');
    
于 2013-03-13T17:22:45.660 回答
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您可以从答案中添加最佳索引查找代码

于 2013-03-13T16:39:45.530 回答
-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'));
于 2013-03-13T16:33:23.120 回答