C語言統(tǒng)計輸入字符各個字母出現(xiàn)頻率的解題思路
本文跟大家分享的是編寫一個程序,能夠計算輸入字符各個字母出現(xiàn)的頻率,具體如下
先跟大家展示一下最終結(jié)果:
剛剛接手題目的時候,我想得很復(fù)雜,因為26個字母中有大小寫嘛,小寫a~z,大寫A~Z
但是,無論是大寫還是小寫,字母都只有26個,在此,當(dāng)輸入大寫字母的時候,我們就將其轉(zhuǎn)換為小寫就ok啦
大寫字母轉(zhuǎn)換為小寫字母,有個很方便的函數(shù)tolow(),在ctype.h中,詳情文章末。
看過前一篇文章《c語言:計算輸入字符個數(shù)》中使用數(shù)組統(tǒng)計單詞長度的方法,在統(tǒng)計字母的個數(shù)的時候,依舊可以,只不過有些"小技巧"。
大小寫轉(zhuǎn)換與計算
if(isalpha(c)) /*詳情見文末*/ { c = tolower(c); //大寫轉(zhuǎn)換為小寫 ++char_count[c-'a']; }
通過上面的代碼將26個字母出現(xiàn)的頻率統(tǒng)計后(都存在數(shù)組中),再來打印直方圖,何為直方圖,就是那張圖拉,向上看。
由于要畫直方圖,所以用用到兩個for循環(huán)語句,通過觀察可以知道,直方圖的行數(shù)由max決定。
max如何求呢,看如下代碼:
max = 0; //初始化 /*找出出現(xiàn)頻率最高的字母*/ for(x = 0; x < 26; x++) { if(char_count[x] > max) { max = char_count[x]; printf("max is %d", max); } }
現(xiàn)在max也知道了,來畫出直方圖吧:
/*打印直方圖*/ for(; max > 0; max--) { for(x = 0; x < 26; x++) { if(char_count[x] >= max) { putchar('x'); } else putchar(''); } putchar('\n'); }
現(xiàn)在一切都o(jì)k啦,還差一個橫坐標(biāo),不然我們咋知道每一列代表的是哪一個字母呢:
/*打印下標(biāo),即abcdefghijklml....*/ for(x = 0; x < 26; x++) { putchar('a'+x); }
完整代碼:
#include <stdio.h> #include <ctype.h> main() { int x; //數(shù)組下標(biāo)變量,詳情看代碼 int max; //出現(xiàn)頻率最高的字母 int char_count[26]; //26個字母出現(xiàn)字?jǐn)?shù)的統(tǒng)計 char c; /*將數(shù)組初始化,因為我們還沒有輸入嘛,所以a~z都為0啦*/ for( x= 0; x < 26; x++) { char_count[x] = 0; } while((c = getchar()) != EOF) { if(isalpha(c)) /*詳情見文末*/ { c = tolower(c); //大寫轉(zhuǎn)換為小寫 ++char_count[c-'a']; } } max = 0; //初始化 /*找出出現(xiàn)頻率最高的字母*/ 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'); } /*打印下標(biāo),即abcdefghijklml....*/ for(x = 0; x < 26; x++) { putchar('a'+x); } return 0; }
ps:
以上就是計算輸入字符各個字母出現(xiàn)頻率的整體解題思路,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章

C++IO流之fstream,?stringstream使用小結(jié)

C++實現(xiàn)的一個可以寫遞歸lambda的Y函數(shù)

C++輕量級界面開發(fā)框架ImGUI介紹小結(jié)