统计一段文字中英文字母 a-z 各出现的次数(通过数组)

题目:实现一个统计一段文字中英文字母 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)
功能:把字符串中的大写字母转化为小写字母
参数:字符串 char *str0
返回值:无
*************************/
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)
功能:统计字母a-z出现的次数,并得到出现频率最高的字母及次数
参数:字符串 char *str0
返回值:无
*************************/
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;
 }

运行效果如下:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46977029/article/details/109281888
今日推荐