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

C++ Coroutine簡(jiǎn)單學(xué)習(xí)教程

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

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

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

C++基于socket編程實(shí)現(xiàn)聊天室功能