题目:实现一个统计一段文字中英文字母 a-z 各出现的次数。
用户输入一段英文,程序统计英文字母 a-z(大写当小写处理)各出现的次数、并列出出现频率最多的字母以及次数。
要求:计数代码段不得使用 20 个或以上的 if 语句。
解题思路:用户输入的一段英文字符中可能包含小写字母、大写字母以及其他字符,所以需要先把可能的大写字母转化为对应的小写字母;然后是统计各字母出现的个数,如果直接使用if语句和switch的话,程序量会很大,所以考虑用数组。
先看主函数
int main()
{
char str1[500]; //用户输出的字符串长度不大于500
printf("请输入一段英文字符串:\n");
gets(str1); //用户输入
xiaoxie(str1); //把可能的大写转化为小写
tongji(str1); //程序主要部分:统计
return 0;
}
在主函数中,我们需要再定义两个函数:xiaoxie() 和 tongji() ,如下:
函数一:xiaoxie()
void xiaoxie(char *str0)
{
int count = strlen(str0); //获得字符串str0的长度
for(int i=0;i<count;i++)
{
if(str0[i]>='A' && str0[i]<='Z')
str0[i] = str0[i] + 32; //大写字母的ASCII码加32即为对应的小写字母
}
}
函数二:tongji() 统计函数为这个程序的重点,其内部又可以分成几个部分,如下:
1)统计各字母出现的个数
这里定义了两个数组来存放字母a-z和它出现的次数,其中zimu[]为字符串数组,cishu[]为普通数组,通过两个for循环嵌套来实现对字母出现次数的统计,第一个for循环是从用户输入的第一个字符依次到最后一个字符,第二个for循环是依次判断该字符是属于a-z中对应的哪个字母//统计各字母出现的个数
char zimu[26]="abcdefghijklmnopqrstuvwxyz";
int cishu[26]={ 0};
int count = strlen(str0);
for(int i=0;i<count;i++)
{
for(int j=0;j<26;j++)
{
if(str0[i]==zimu[j])
cishu[j]++;
}
}
2)打印出各字母出现的个数到屏幕上
printf("统计各字母出现的个数:\n");
for(int i=0;i<26;i++)
{
printf("%c:%d\t",zimu[i],cishu[i]);
if((i+1)%6==0)
printf("\n"); //每6个字母就换行
}
3)统计出现频率最高的字母及其次数
这是这个tongji()函数的重点,我认为也是难点 如果只是简单统计一个出现次数最多的字母,程序很简单,如下://统计出现频率最高的字母
int t,max=cishu[0];
for(int i=0;i<26;i++)
{
if(max<cishu[i])
{
max = cishu[i];
t = i;
}
}
printf("\n出现次数最多的字母是:%c,共出现%d次\n",zimu[t],max);
但是当最高次数的字母有多个时,它只能输出最前面一个
这显然是不行的,因此还需要改进,如下:
int t,max=cishu[0];
int j=0,c=0,a[1]={ 0};
for(int i=0;i<26;i++)
{
if(max<=cishu[i])
{
if(max==cishu[i])
{
a[j]=i; //出现字母次数相同时记下对应的i(存放到数组)
j++; //j为数组a[]组索引
}
else //即max<cishu[i]
{
max = cishu[i];
t = i; //更新max对应的i
c = j; //当旧的(数组存放的)字母次数不等于新的字母次数时,记下对应的j
}
}
}
printf("\n出现次数最多的字母是:%c",zimu[t]);
for(int i=c;i<j;i++)
{
printf("、%c",zimu[a[i]]);
}
printf(",共出现%d次\n",max);
改进后和之前最大的不同是,加了个统计出现相同次数的字母,即
if(max==cishu[i])
{
a[j]=i;
j++;
}
完整tongji()函数如下:
void tongji(char *str0)
{
char zimu[26]="abcdefghijklmnopqrstuvwxyz";
int cishu[26]={ 0};
int count = strlen(str0);
for(int i=0;i<count;i++)
{
for(int j=0;j<26;j++)
{
if(str0[i]==zimu[j])
cishu[j]++;
}
}
printf("统计各字母出现的个数:\n");
for(int i=0;i<26;i++)
{
printf("%c:%d\t",zimu[i],cishu[i]);
if((i+1)%6==0)
printf("\n");
}
int t,max=cishu[0];
int j=0,c=0,a[1]={ 0};
for(int i=0;i<26;i++)
{
if(max<=cishu[i])
{
if(max==cishu[i])
{
a[j]=i;
j++;
}
else
{
max = cishu[i];
t = i;
c = j;
}
}
}
printf("\n出现次数最多的字母是:%c",zimu[t]);
for(int i=c;i<j;i++)
{
printf("、%c",zimu[a[i]]);
}
printf(",共出现%d次\n",max);
}
程序完整代码
#include <stdio.h>
#include <string.h>
void xiaoxie(char *str0)
{
int count = strlen(str0);
for(int i=0;i<count;i++)
{
if(str0[i]>='A' && str0[i]<='Z')
str0[i] = str0[i] + 32;
}
}
void tongji(char *str0)
{
char zimu[26]="abcdefghijklmnopqrstuvwxyz";
int cishu[26]={ 0};
int count = strlen(str0);
for(int i=0;i<count;i++)
{
for(int j=0;j<26;j++)
{
if(str0[i]==zimu[j])
cishu[j]++;
}
}
printf("统计各字母出现的个数:\n");
for(int i=0;i<26;i++)
{
printf("%c:%d\t",zimu[i],cishu[i]);
if((i+1)%6==0)
printf("\n");
}
int t,max=cishu[0];
int j=0,c=0,a[1]={ 0};
for(int i=0;i<26;i++)
{
if(max<=cishu[i])
{
if(max==cishu[i])
{
a[j]=i;
j++;
}
else
{
max = cishu[i];
t = i;
c = j;
}
}
}
printf("\n出现次数最多的字母是:%c",zimu[t]);
for(int i=c;i<j;i++)
{
printf("、%c",zimu[a[i]]);
}
printf(",共出现%d次\n",max);
}
int main()
{
char str1[500];
printf("请输入一段英文字符串:\n");
gets(str1);
xiaoxie(str1);
tongji(str1);
return 0;
}
运行效果如下: