int main()
{
char str1[500]; //使用者輸出的字串長度不大於500
printf("請輸入一段英文字串:\n");
gets(str1); //使用者輸入
xiaoxie(str1); //把可能的大寫轉化為小寫
tongji(str1); //程式主要部分:統計
return 0;
}
在主函數中,我們需要再定義兩個函數:xiaoxie() 和 tongji() ,如下:
/************************
函數: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即為對應的小寫字母
}
}
//統計各字母出現的個數
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"); //每6個字母就換行
}
//統計出現頻率最高的字母
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;
}
執行效果如下: