統計一段文字中英文字母 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);

改進後和以前最大的不一樣是,加了個統計出現相同次數的字母,即spa

if(max==cishu[i])
{ 
   a[j]=i;
   j++;
}

完整tongji()函數以下:code

/************************ 函數: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);
}

程序完整代碼blog

#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;
 }

運行效果以下:
在這裏插入圖片描述
在這裏插入圖片描述

索引

相關文章
相關標籤/搜索