統計一段文字中英文字母 a-z 各出現的次數(通過陣列)

2020-10-28 13:00:27

題目:實現一個統計一段文字中英文字母 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;
 }

執行效果如下:
在這裡插入圖片描述
在這裡插入圖片描述