題目:實現一個統計一段文字中英文字母 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; }
運行效果以下:
索引