教你如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù)
最近網(wǎng)上看到一個話題,也很有意思的,就寫到這里來了。
上海地鐵的站名中,出現(xiàn)頻率最高的字是什么?
正好,練習自己的C++代碼能力,給定一些站名,計算一下。
首先是一個文件,記錄了所有的站名,這個文件內(nèi)容比較長,摘錄一部分下來。這個文件可以作為我們的輸入文件來用。
注意,這個文件內(nèi)容上只是把所有線路的名稱羅列了一遍,可能有重復。因此,在我們計算的一開始,要把這些內(nèi)容去重。
最前面的部分如下:
#include<iostream> #include<string> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; string name[15000]; int nPos=0; int main(){ freopen("Name.txt","r",stdin); freopen("Calc.txt","w",stdout); //1.排重 string s; while(cin>>s){ int flag=0; for(int i=1;i<=nPos;i++){ if(name[i]==s)flag=1; } if(flag==0)name[++nPos]=s; }
nPos這個變量用于記錄目前的name數(shù)組總共有多少個元素。大體邏輯就是這樣。
接下來,我們要統(tǒng)計出現(xiàn)的字符的數(shù)量。我們使用一個結構體來記錄:
struct Count{ char T[4];//出現(xiàn)的中文漢字 int times; Count(){ T[0]=T[1]=T[2]=T[3]=0; } }strCount[15000]; int sPos=0;
由于是中文漢字,我們考慮使用字符串來存儲,大小放大一點,就寫成4個字節(jié)吧。
我們從1開始,順次遍歷name數(shù)組的每個元素,然后把name中每個中文字符拿出來和strCount中比對。出現(xiàn)過就+1,沒出現(xiàn)過就新建一個。
for(int i=1;i<=nPos;i++){ for(int j=0;j+1<name[i].size();j+=2){ char c[3];c[0]=name[i].at(j);c[1]=name[i].at(j+1);c[3]='\0'; //提取成中文 int flag=0; for(int k=1;k<=sPos;k++){ if(check(strCount[k].T,c)){//這個字已經(jīng)出現(xiàn)過 strCount[k].times++; flag=1; } } if(flag==0){ strncpy(strCount[++sPos].T,c,2); strCount[sPos].times=1; } } }
這里用到了一個check函數(shù)判斷字符串的相等,由于只有2個元素所以直接寫就可以了,不用循環(huán)來比對了。
bool check(char *A,char *B){ if(A[0]==B[0] && A[1]==B[1] )return true; return false; }
然后最后的部分,進行排序和輸出。
bool comp(Count A,Count B){ return A.times>B.times; } int main(){ //中略 //3.輸出信息 sort(strCount+1,strCount+sPos+1,comp); for(int i=1;i<=50;i++){ cout<<strCount[i].T<<" "<<strCount[i].times<<endl; } return 0; }
最終的輸出結果,這里我們只輸出前50名,摘取一些貼在下面:
本文所有內(nèi)容下載見:http://xiazai.jb51.net/202201/yuanma/calc_jb51.rar
到此這篇關于教你如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù)的文章就介紹到這了,更多相關C++ 統(tǒng)計地鐵中站名出現(xiàn)字的個數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!