题目描述:设计一个程序实现英文短文单词的统计任务。
(1)输入若干行英文,语句间用逗号,句点分隔,单词之间用空格分隔。
(2)统计并输出单词的总数。
(3)统计各英文字符出现的次数(标点符号及空格不统计),并按出现的次数降序输出。
(4)系统以菜单方式工作。
另:(1)句子末尾一定要输入句号,否则会导致输出的单词数少一
(2)引入c变量,解决因cnt数组中可能存在重复数据,而导致的有些字母重复出现的问题(假如cnt[0]=cnt[1]=1,在循环逆序识别到cnt[1]时就会把所有出现次数为1的字符输出);c的初值最好为·负值;记得更新c的值
(3)用两个数组记录对应字符出现次数
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char ch[1000];
int a;
char b[53] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
int cnt[60], cout[60];
int main() {
gets(ch);
int l = strlen(ch);
for (int i = 0; i < l; i++) {
if (ch[i] == '\0')
break;//一但识别到'\0',默认短文输入结束
else if (ch[i] == ' ' || ch[i] == ',' || ch[i] == '.') {
a++;
continue;//出现空格,逗号,句号表明前面一定有一个单词
} else {
for (int j = 0; j < 52; j++) {
if (ch[i] == b[j]) {
cnt[j]++;//特定下标对应特定字母,统计对应字符个数
cout[j]++;/*用两个数组存储是为了方便下面对其中一个数组操作,让字符出现次数从小到大(从大到小)顺序排列,然后通过另一个数组找出与该出现次数对应的字符*/
break;//ch[i]是一个字符,所以一旦识别到对应的b[j]就可以直接跳出循环,减少时间复杂度
}
}//统计不同字符个数
}
}
sort(cnt, cnt + 52);
int c = -1;
for (int i = 51; i >= 0; i--) {//因为上面按从小到大顺序排序,题目要求降序输出,所以这里逆序识别
if (cnt[i] != 0
&& cnt[i] != c) {//cnt[i]等于0,表示该字符未出现过;cnt[i]可能会有重复数据,cnt[i] != c可以防止有些字母重复出现
for (int j = 0; j < 52; j++) {
if (cout[j] == cnt[i]) {
printf("%c ", b[j]);//找出与该出现次数对应的字符并全部输出
}
}
}
c = cnt[i];//c需要不断更新
}
printf("\n");
printf("%d", a);
return 0;
}
第一次写题解,会有很多不足,欢迎指正呀