教你如何使用C++ 統計地鐵中站名出現的字的個數

最近網上看到一個話題,也很有意思的,就寫到這裡來瞭。

上海地鐵的站名中,出現頻率最高的字是什麼?

正好,練習自己的C++代碼能力,給定一些站名,計算一下。

首先是一個文件,記錄瞭所有的站名,這個文件內容比較長,摘錄一部分下來。這個文件可以作為我們的輸入文件來用。

註意,這個文件內容上隻是把所有線路的名稱羅列瞭一遍,可能有重復。因此,在我們計算的一開始,要把這些內容去重。
最前面的部分如下:

#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數組總共有多少個元素。大體邏輯就是這樣。

接下來,我們要統計出現的字符的數量。我們使用一個結構體來記錄:

struct Count{
	char T[4];//出現的中文漢字 
	int times;
	Count(){
		T[0]=T[1]=T[2]=T[3]=0;
	}
}strCount[15000];
int sPos=0;

由於是中文漢字,我們考慮使用字符串來存儲,大小放大一點,就寫成4個字節吧。

我們從1開始,順次遍歷name數組的每個元素,然後把name中每個中文字符拿出來和strCount中比對。出現過就+1,沒出現過就新建一個。

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)){//這個字已經出現過
					strCount[k].times++;
					flag=1;
				}
			}
			if(flag==0){
				strncpy(strCount[++sPos].T,c,2);
				strCount[sPos].times=1;
			}
		}
}

這裡用到瞭一個check函數判斷字符串的相等,由於隻有2個元素所以直接寫就可以瞭,不用循環來比對瞭。

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名,摘取一些貼在下面:

本文所有內容下載見:http://xiazai.jb51.net/202201/yuanma/calc_jb51.rar

到此這篇關於教你如何使用C++ 統計地鐵中站名出現的字的個數的文章就介紹到這瞭,更多相關C++ 統計地鐵中站名出現字的個數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: