[精讚] [會員登入]
706

【C++】使用struct array和一維int array模擬二維int array

主要是因為用sort去排序int array的二維陣列小編懶得研究,於是就研究了一種維持一維陣列但是有二維陣列效果的程式,小編就廢~~

分享此文連結 //n.sfs.tw/14884

分享連結 【C++】使用struct array和一維int array模擬二維int array@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2020-12-26 12:26:23 最後編修
2020-12-25 22:40:01 By 過路君子
 

大家好,這裡是今天只想耍廢一整天的小編過路君子

回到了圖像世界真美妙,純文字世界到底是什麼鬼,根本不是給人用的

 

會研究這個小編主要有兩個原因:第一、懶得去研究怎麼用sort排序二維陣列;第二、希望能只讀一次檔案就把所有資料處理完畢或是先整理再來慢慢料理。

這有「略微」的牽涉到指標,然後小編是用很偷懶的方式要記憶體,其實真的要寫應該要用new來要,以後再來考慮要不要完善這個非常非常陽春的程式碼。

先備知識:

1、struct和struct陣列在程式中的表達方式

2、函式function(副程式)

3、#include<fstream>使用方法

4、#define的用法,例如:#define add2(x) (x)+2之類的

5、指標(*)

6、這個程式檔是用來求總合(會溢位)、平均和中位數

因為上述那堆在網路上已經有一堆教學文章,然後小編這篇文章重點也不在這堆東西上,所以接下來小編會當各位上方都非常熟悉的前提來講解,要不然光指標小編就可以寫個五篇多的文章來介紹,根本講不完……

對了,小編實際處理的檔案是有20種資料然後數百行,全部貼出估計沒人要看,下面的示意圖就用5*4筆資料來做個示意就好~~

那就先上全程式碼,下面小編再來解釋:

※然後這是示範輸入資料,僅作示範,絕對會跟上方程式所處理的資料有落差,但概念一樣。

時間 參數1 參數2 參數3

491876 124110 105 2153
506417 126797 370 3499
530118 146530 92 3495
520414 133360 92 3204
536545 133814 55 3070

(以下僅節錄重點講解)

前五行

#include<algorithm>
#include<iostream>
#include<fstream>
#define UNI 19		//Type of data
#define MAX 5000	//Data quantity

基本定義,第一個是sort的定義籤頭檔;第二個是c++的標準籤頭檔;第三個則跟檔案的讀寫有關。

第四、第五行只是定義兩個變數而已,這樣以後要改動資料就只要改兩個地方就好,不用在程式裡慢慢的一個一個改,太白癡了。

 

第九到第十二行

struct ac
{
	int val[MAX];
}ss[UNI];

這次用來儲存每種資料的核心,因為要找出中位數,所以不能用新的資料覆蓋舊的資料,必須全部保存起來,進行排序。

在這裡小編創建了19個struct array,每個struct裡面有一個int array,而每個int array裡面有5000個int。

為什麼不是20個呢?因為每列的第一行是時間戳記(timestamp)不用處理^ ^

 

第十八到第二十行

int none, date[UNI], tol[UNI]={0}, much=0;
ifstream ux;
ofstream ui;

指定四個int型態的變數:none用來判斷是否還有時間戳記;date用來暫存從文件讀進來的資料,共19個;tol用來加總每一種資料,也是十九種資料各個的總和。

接下來指定兩種變數,ux是表示這個檔案呈現讀取狀態(不寫入資料),ui則是表示這個檔案呈現寫入狀態(不讀取其內資料);順帶一提,若要同時讀取和寫入檔案則是使用fstream搭配ios進行設定(ios::in和ios::out)。

 

第二十五到三十四行

while(ux>>none)
{
	for(int ky=0;UNI>ky;ky++)
	{
		ux >> date[ky];
		(ss+ky) -> val[much] = date[ky];
		tol[ky] += date[ky];
	}
	much++;
}

while迴圈的判斷條件其實也是小編滿喜歡使用的方式,因為每行固定20筆資料且第一筆資料我們不要,所以用此方式來判斷還有沒有資料,當然用feof也可以,就看個人喜好了。

接下來的for迴圈就是讀取資料的核心了,如果有心,三行可以併成兩行,但計算加總的功能小編先寫完才加上計算中位數的功能,當下寫怕邏輯崩壞所以分開寫,雖說中間還是歷經了三次邏輯崩壞......

可能直接讀程式碼會有點抽象,下面放出目前資料儲存狀況:

參數1(位於struct[0]的int array內) > 124110 126797 146530 133360 133814

參數2(位於struct[1]的int array內) > 105 370 92 92 55

參數3(位於struct[2]的int array內) > 2153 3499 3495 3204 3070

沒錯,時間戳記被小編拋棄了,因為我們不需要,而經過這個迴圈之後,原本我們的資料是一列有三種資料(不含時間戳記)共五行,現在就被整理成了一列只有一種資料共三行(同種類的放一起),直行橫列。

 

第四十五行+第七十四到七十七行

for(int ro=0;UNI>ro;ro++) sort((ss+ro)->val, ((ss+ro)->val)+much, compare);
bool compare(int a, int b) 
{
	return a > b;
}

這行簡單來說就是將剛剛我們分離出來的資料按照從大到小排序(降序),如果各位要資料按照從小到大排序(升序),就只要把return a>b;改成return a<b;就可以了。

關於sort的用法...小編就先丟定義出來:sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp);簡單來說,有三個參數要帶進sort裡面:第一個參數要放陣列起始位置、第二個參數要放陣列結束位置和第三個參數則是放排序的方式(要自己寫函式function放進去)。

那這裡小編一樣放上目前資料狀況,這樣比小編在上面打一堆字還有用:

ss -> val  =>  146530 133814 133360 126797 124110

(ss + 1) -> val  =>  370 105 92 92 55

(ss + 2) -> val  =>  3499 3495 3204 3070 2153

小編就直接簡化表示了,真的不懂意思就往回看吧,跟上面那一大串國字是同樣意思。

從上方就很明顯了吧,經過這一行,資料就已經整理完了!

 

接下來的程式碼就是去抓取中位數而已,想必如果各位上方那堆都看得懂的話,那單純的取值出來應該不會太難吧。

話說,光是從struct陣列裡面取指定的值出來就有四種寫法,目前小編也只記了兩種,也就是目前各位在上方看到的用'->'的寫法,另一種則是用'.'的寫法,剩下沒記。

再說一遍,這個程式碼小編寫的超級陽春,有很多問題都被小編先丟一旁,簡單舉幾個問題:一、資料超過21億就會溢位;二、增減資料種類個數都得動到程式碼,程式碼本身無法自動捕捉有幾種資料;三、這個程式碼只針對某個檔案,如果今天有複數的檔案要做同樣的事情,恐怕也得動到程式碼......諸如此類的問題待解決,還是個非常陽春的程式碼。

 

 

 

後記:

這樣詳細的整理下來,小編發現結果反而非核心程式的部分寫的比較長,到底是發生了什麼事情呢?

總之能刻出這個程式小編也很驚訝,基本上目前小編所有學過的東西都在裡面了,要再更花俏的技巧沒了,簡直根本就是一個大驗收,寫了很久、很痛苦,但寫完就一個字:超級開心!

這次也是初次挑戰用struct搭配int array來模擬int的二維陣列,結果竟然可行,實則也嚇到了小編自己,感覺後記有點太興奮了,就到這裡吧,挑戰~成功三分之一!

END

你可能感興趣的文章

【JDA/discord bot】取得頻道第一筆或最新(最後一筆)的歷史訊息 在不處理訊息的先後順序下取得相關的歷史訊息

【Arduino/LinkIt 7697】實作小小的 MQTT Publish & Subscribe 若是要多點對多點傳輸資料,那使用 MQTT 即可快速的達成我們所需的目的

【MySQL】每個類別中取前三高 一個由多層次所組成的SELECT述句

【Linux】[CentOS 8]如何更新sudo指令 上次會想要更新sudo這個指令的時間應該是2017年了吧?轉眼間就2021了耶

【ESXI & Oepnwrt】基本錯誤處理 Oepnwrt 為一個自由度超高的軟體,很多事情都能請其幫忙完成,但也因此很複雜,這邊簡單的介紹幾個錯誤的處理方式

【ThinkSpeak】一個IoT數據分析(IoT analytics)及呈現的網站 世界上有著各式各樣的需求,因而誕生出了各式各樣的網站,絕對不是沒有人提供,而是你不知道哪裡有這東西

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

高捷少女:美麗島的守護者③ 小雅閉上眼睛,思索在高捷發生的點點滴滴。她心意已決,在高捷的日子的確也有快樂的部分,不過她相信換個方向是更好的決定。有關高捷的所有美好回憶,小雅決定保留在心裡就好,繼續在高捷工作只會讓自己更痛苦而已,

高捷少女:美麗島的守護者⑥ 一陣貓叫傳到小雅耳中,原本要朝小雅撲過去的北風轉了個圈,從半空中落地,牠的表情宛如五雷轟頂。這聲音……難道是……

高捷少女:美麗島的守護者(終) 「我是她的師娘,妳一定就是艾米莉亞吧?小雅昨晚有跟我說到您。」「師娘?」艾米疑惑不解。

高捷少女:耐耐的新年驚喜① 耐耐拿出手機。「我回來囉。」她說。幾分鐘後,木門緩緩打開。當它完全開啟的那一刻,小穹手中的包包掉到地上;艾米揉揉雙眼,確定自己看見的景象;婕兒的三魂七魄飛到了九霄雲外。

婕兒──她的青春③ 「墮天使穹音!」婕兒拿出平底鍋。 耐耐憋著笑搖搖頭。「不是喔,她是我的……我的……」 「替身。」小穹小聲提醒忘記台詞的耐耐。