编写程序统计从键盘输入的一行文本中各个字母的个数。 输入以回车键结束。 不区分大小写,大写字母与相应的小写字母按照同一个字母看待。 要求输出按照各个字母出现的个数从大到小进行排序,出现的个数相同的,按照字母在字母表中的先后顺序进行排序。 ***输入格式:调用getchar()函数依次输入每个字符 ***输出格式:"%c(%c):%d\n" 例如输入以下文本: hello world 程序将输出: l(l):3 o(o):2 d(d):1 e(e):1 h(h):1 r(r):1 w(w):1 a(a):0 b(b):0 c(c):0 f(f):0 g(g):0 i(i):0 j(j):0 k(k):0 m(m):0 n(n):0 p(p):0 q(q):0 s(s):0 t(t):0 u(u):0 v(v):0 x(x):0 y(y):0 z(z):0
时间: 2023-05-31 17:20:48 浏览: 125
### 回答1:
这道题目要求我们从键盘输入一个字符串,统计其中每个字母出现的次数,并按照字母表顺序进行排序,最后输出各个字母及其出现次数。输入格式为调用getchar()函数依次输入每个字符,注意大写字母和小写字母的区别。输出格式为"%c(%c):%d\n",其中%c代表字母,%c代表字母,%d代表出现次数。例如输入"hello world",则输出为l(l):3 o(o):2 d(d):1 e(e):1 h(h):1 r(r):1 w(w):1 a(a):0 b(b):0 c(c):0 f(f):0 g(g):0 i(i):0 j(j):0 k(k):0 m(m):0 n(n):0 p(p):0 q(q):0 s(s):0 t(t):0 u(u):0 v(v):0 x(x):0 y(y):0 z(z):0。注意要将字母按照字母表顺序进行排序输出。
### 回答2:
本题可以使用数组来统计各个字母的个数。首先需要定义一个大小为26的整型数组,用来表示26个字母。然后依次读入每个字符,如果该字符是字母,则将该字符转换成小写字母,然后将对应的数组元素加1。最后按照要求的顺序输出字母及其对应的个数。
具体的做法就是,先定义一个大小为26的整型数组count,表示每个字母的个数。然后用循环读入每个字符,如果该字符是字母,则将它转换成小写字母。这里可以利用C语言中的tolower()函数。然后根据转换后的小写字母计算出对应的数组下标,将该元素加1。最后,按照要求输出结果。具体代码如下:
```
#include <stdio.h>
#include <ctype.h>
int main()
{
int count[26] = {0}; // 数组初始化为0
char ch;
while ((ch = getchar()) != '\n') // 逐个读入字符,直到回车键
{
if (isalpha(ch)) // 如果是字母
{
ch = tolower(ch); // 转换成小写字母
count[ch - 'a']++; // 对应的计数器加1
}
}
// 对各个字母按照要求排序并输出
int i, j;
for (i = 25; i >= 0; i--) // 从后往前遍历
{
for (j = 0; j <= i; j++) // 冒泡排序
{
if (count[j] < count[j+1] || (count[j] == count[j+1] && j < i && j+1 < i && j+1 < 25 && count[j] > 0)) // 按照要求排序
{
int temp = count[j];
count[j] = count[j+1];
count[j+1] = temp;
}
}
if (count[i] > 0) // 如果该字母出现了,才输出
printf("%c(%c):%d\n", 'a'+i, 'A'+i, count[i]); // 输出字母及其个数
}
return 0;
}
```
在上面的代码中,我们对各个字母按照要求排序。具体来说,我们先从后往前遍历数组,设当前下标为i,然后再从前往后遍历数组,设当前下标为j,比较count[j]和count[j+1]的大小关系。如果count[j]大于count[j+1],则不需要交换;否则需要交换。如果count[j]等于count[j+1],则需要进一步比较字母在字母表中的先后顺序,即如果j小于i且j+1小于i,则按照字母表中的先后顺序排序。(注意这里需要保证j+1小于25,是因为只要有一个字母出现,那么它就需要输出,因此我们只能保证它小于25)
最后,我们可以按照题目要求输出结果。对于每个出现了的字母,我们输出对应的小写字母和大写字母及其个数。其中,小写字母可以直接计算,大写字母需要加上一个偏移量'A'-'a'。如果要进一步提高代码效率,可以尝试使用计数排序等线性时间复杂度算法对字母进行排序。
### 回答3:
这道题可以利用数组来进行存储和统计,定义一个大小为26的数组counts来存储各个字母出现的次数,计算字母对应的下标的方法是将字母转换成小写之后减去字符‘a’的ASCII码值,例如字符‘a’对应的下标是0,字符‘b’对应的下标是1……以此类推。
在循环中,每输入一个字符,就判断是否为字母,如果是则将其转化成小写字母,计算出对应的下标,并将counts数组的对应元素加1,最后输出所有非零元素,按照要求排序输出。
代码如下:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_SIZE 1000
int main()
{
int counts[26] = {0}; // 初始化数组counts
printf("请输入一行文本:\n");
char c;
while ((c = getchar()) != '\n')
{
if (isalpha(c)) // 判断是否为字母
{
c = tolower(c); // 将字母转换成小写
int index = c - 'a'; // 计算对应的下标
counts[index]++; // 将对应元素加1
}
}
// 对counts数组进行排序
for (int i = 0; i < 25; i++)
{
for (int j = i + 1; j < 26; j++)
{
if (counts[i] < counts[j] || (counts[i] == counts[j] && i > j))
{
int temp = counts[i];
counts[i] = counts[j];
counts[j] = temp;
}
}
}
// 输出结果
for (int i = 0; i < 26; i++)
{
if (counts[i] > 0)
{
printf("%c(%c):%d\n", 'a' + i, toupper('a' + i), counts[i]);
}
else
{
printf("%c(%c):%d\n", 'a' + i, toupper('a' + i), 0);
}
}
return 0;
}
阅读全文