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

   日期:2020-10-29     浏览:188    评论:0    
核心提示:题目:实现一个统计一段文字中英文字母 a-z 各出现的次数。用户输入一段英文,程序统计英文字母 a-z(大写当小写处理)各出现的次数、并列出出现频率最多的字母以及次数。要求:计数代码段不得使用 20 个或以上的 if 语句。解题思路:用户输入的一段英文字符中可能包含小写字母、大写字母以及其他字符,所以需要先把可能的大写字母转化为对应的小写字母;然后是统计各字母出现的个数,如果直接使用if语句和switch的话,程序量会很大,所以考虑用数组。先看主函数int main() { char str

题目:实现一个统计一段文字中英文字母 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;
 }

运行效果如下:

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服