编写程序统计从键盘输入的一行文本中各个字母的个数。 输入以回车键结束。 不区分大小写,大写字母与相应的小写字母按照同一个字母看待。 要求输出按照各个字母出现的个数从大到小进行排序,出现的个数相同的,按照字母在字母表中的先后顺序进行排序。
要求:
- 各个字母出现的个数从大到小进行排序
- 出现的个数相同的,按照字母在字母表中的先后顺序进行排序
- 输出格式:
例如输入以下文本:
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
…
代码在此:
【看后面的思路有惊喜哦】
#include <stdio.h>//
int main ( )//现在程序没毛病了!//现在测试语句都删掉了//来看看最后成功的版本吧!//成功!!!^-^
{
char a[100];
int b[26] = {0},d[26];
gets(a);
// printf("%d\n",b[0]);
for (int i = 0; a[i] != '\0'; i++) {
switch (a[i]) {
case 'a':
case 'A':
b[0]++;
break;
case 'b':
case 'B':
b[1]++;
break;
case 'c':
case 'C':
b[2]++;
break;
case 'd':
case 'D':
b[3]++;
break;
case 'e':
case 'E':
b[4]++;
break;
case 'f':
case 'F':
b[5]++;
break;
case 'g':
case 'G':
b[6]++;
break;
case 'h':
case 'H':
b[7]++;
break;
case 'i':
case 'I':
b[8]++;
break;
case 'j':
case 'J':
b[9]++;
break;
case 'k':
case 'K':
b[10]++;
break;
case 'l':
case 'L':
b[11]++;
break;
case 'm':
case 'M':
b[12]++;
break;
case 'n':
case 'N':
b[13]++;
break;
case 'o':
case 'O':
b[14]++;
break;
case 'p':
case 'P':
b[15]++;
break;
case 'q':
case 'Q':
b[16]++;
break;
case 'r':
case 'R':
b[17]++;
break;
case 's':
case 'S':
b[18]++;
break;
case 't':
case 'T':
b[19]++;
break;
case 'u':
case 'U':
b[20]++;
break;
case 'v':
case 'V':
b[21]++;
break;
case 'w':
case 'W':
b[22]++;
break;
case 'x':
case 'X':
b[23]++;
break;
case 'y':
case 'Y':
b[24]++;
break;
case 'z':
case 'Z':
b[25]++;
default:
break;
}
}
for (int i = 0; i < 26; i++) {
d[i] = i + 1;
}
//printf("%d\n",b[0]);
for (int i = 0; i < 26; i++) {//??问题来源??
for (int j = 0; j < 25 - i ; j++) {//因为后面出现了j+1!!!已经超出了26!!
if (b[j] < b[j+1]) {
int c = b[j];
b[j] = b[j+1];
b [j+1] = c;
int m = d[j];
d[j] = d[j+1];
d[j+1] = m;
}
//printf("%d\n",b[0]);//最后一个出了问题//居然忘记删掉测试语句了!!
}
}
//printf("%d\n",b[0]);
for (int i = 0; i < 26; i++) {
//问题二:a去哪了?
printf("%c(%c):%d\n",d[i]+'A'-1,d[i]+'a'-1,b[i]);
}
}//没有地方报错,现在来检验一下
运行结果:
思路:
- 首先创建字符串并且接收
- 判别并计数【这里我有两种思维:1·如上程序。 2·用for循环计数,多创建两个数组(26)分别记大写小写的数,然后加在一个数组中。】
- 排序:注意两个条件1·多–>少 2· ascall码
- 输出
遇到的问题:
排序问题:如管交换位置则数组与下标的对应关系会被打破
解决办法:用一个新的数组存下标,对应字母每交换一次,下标数组也随之交换,最后下标数组将用于输出对应字母。
检验程序错误:
用printf来检查哪里的数据出错了【本来录制了视频,但是传不上来啊】
新的短代码:除了之后没有按照多少来打印,计数功能都实现了,另外注意字符串的长度可能不够!
#include <stdio.h>
//用下标表示字母,找到相应下标就可以给这个字母计数
int main( )
{
char a[1000];
int b[26] = {0};
int i = 0;
for (; i<1000; i++) {
a[i] = getchar();
if (a[i] == '\n') {
break;
}
if ('a' <= a[i]&&a[i] <= 'z')
b[a[i] - 'a']++;
else if ('A' <= a[i]&&a[i] <= 'Z')
b[a[i] - 'A']++;
}
for (i = 0; i <26; i++) {
printf("%c(%c):%d\n",i+'A',i+'a',b[i] );
}
}