統計輸出字符各個字母湧現頻率的解題思緒。本站提示廣大學習愛好者:(統計輸出字符各個字母湧現頻率的解題思緒)文章只能為提供參考,不一定能成為您想要的結果。以下是統計輸出字符各個字母湧現頻率的解題思緒正文
本文跟年夜家分享的是編寫一個法式,可以或許盤算輸出字符各個字母湧現的頻率,詳細以下
先跟年夜家展現一下終究成果:
方才接辦標題的時刻,我想得很龐雜,由於26個字母中有年夜小寫嘛,小寫a~z,年夜寫A~Z
然則,不管是年夜寫照樣小寫,字母都只要26個,在此,當輸出年夜寫字母的時刻,我們就將其轉換為小寫就ok啦
年夜寫字母轉換為小寫字母,有個很便利的函數tolow(),在ctype.h中,概況文章末。
看過前一篇文章《c說話:盤算輸出字符個數》中應用數組統計單詞長度的辦法,在統計字母的個數的時刻,照舊可以,只不外有些"小技能"。
年夜小寫轉換與盤算
if(isalpha(c)) /*概況見文末*/
{
c = tolower(c); //年夜寫轉換為小寫
++char_count[c-'a'];
}
經由過程下面的代碼將26個字母湧現的頻率統計後(都存在數組中),再來打印直方圖,作甚直方圖,就是那張圖拉,向上看。
因為要畫直方圖,所以用用到兩個for輪回語句,經由過程不雅察可以曉得,直方圖的行數由max決議。
max若何求呢,看以下代碼:
max = 0; //初始化
/*找出湧現頻率最高的字母*/
for(x = 0; x < 26; x++)
{
if(char_count[x] > max)
{
max = char_count[x];
printf("max is %d", max);
}
}
如今max也曉得了,來畫出直方圖吧:
/*打印直方圖*/
for(; max > 0; max--)
{
for(x = 0; x < 26; x++)
{
if(char_count[x] >= max)
{
putchar('x');
}
else
putchar('');
}
putchar('\n');
}
如今一切都ok啦,還差一個橫坐標,否則我們咋曉得每列代表的是哪個字母呢:
/*打印下標,即abcdefghijklml....*/
for(x = 0; x < 26; x++)
{
putchar('a'+x);
}
完全代碼:
#include <stdio.h>
#include <ctype.h>
main()
{
int x; //數組下標變量,概況看代碼
int max; //湧現頻率最高的字母
int char_count[26]; //26個字母湧現字數的統計
char c;
/*將數組初始化,由於我們還沒有輸出嘛,所以a~z都為0啦*/
for( x= 0; x < 26; x++)
{
char_count[x] = 0;
}
while((c = getchar()) != EOF)
{
if(isalpha(c)) /*概況見文末*/
{
c = tolower(c); //年夜寫轉換為小寫
++char_count[c-'a'];
}
}
max = 0; //初始化
/*找出湧現頻率最高的字母*/
for(x = 0; x < 26; x++)
{
if(char_count[x] > max)
{
max = char_count[x];
printf("max is %d", max);
}
}
/*打印直方圖*/
for(; max > 0; max--)
{
for(x = 0; x < 26; x++)
{
if(char_count[x] >= max)
{
putchar('x');
}
else
putchar('');
}
putchar('\n');
}
/*打印下標,即abcdefghijklml....*/
for(x = 0; x < 26; x++)
{
putchar('a'+x);
}
return 0;
}
ps:
以上就是盤算輸出字符各個字母湧現頻率的全體解題思緒,願望對年夜家的進修有所贊助。