我是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 ...等。如果可以用更短的方式声明许多类似的变量?一般来说,我如何做空,我做错了什么?
谢谢。
答案 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]
将是您的a
,letter[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'));