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


轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/195250.html
標籤:其他
上一篇:關于下拉串列省市縣三級聯動封裝,純前端通過el-cascader選擇器郵政編碼實作,可實作一級二級三級聯動
下一篇:影像處理作業(二)
