統計輸出字符各個字母湧現頻率的解題思緒。本站提示廣大學習愛好者:(統計輸出字符各個字母湧現頻率的解題思緒)文章只能為提供參考,不一定能成為您想要的結果。以下是統計輸出字符各個字母湧現頻率的解題思緒正文
本文跟年夜家分享的是編寫一個法式,可以或許盤算輸出字符各個字母湧現的頻率,詳細以下
先跟年夜家展現一下終究成果:
方才接辦標題的時刻,我想得很龐雜,由於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:
以上就是盤算輸出字符各個字母湧現頻率的全體解題思緒,願望對年夜家的進修有所贊助。