精華區beta NTUE-CS102 關於我們 聯絡資訊
原來這麼久沒寫串了(?) 中間應該是只有建構、解構函式跟這禮拜突然就過去的字串處理 有缺什麼提醒一下...我總覺得週二我都睡很大(死) : 對了,字串處理略...除非有誰有好點子可以拿來玩 以及一個半作業 分別是練習建構函式的小作業、模擬發牌的作業這樣 : 前者一樣略 maaa 雖然號稱能解決問題的都是好寫法 不過以我接觸過的兩三次歷史紀錄,期中考一定指定作法的-_____- -- : 節儉空間,一次說明建、解構函式算了(被打) 如果把一個class視做是一個小型的函式 比如說 int main() { int a; cin >>a; cout <<a <<endl; return 0; } 這樣的程式內容,目的是輸入、輸出a 那麼,我們設計時會讓程式 1.在開始時建立(建構)出變數a 2.對a進行處理 3.結束(解構)程式 -- 用同樣的觀點來看建、解構函式 那就是說,當我建立起某個物件時 電腦會主動作的事情就是建構函式內定義的內容 (類似於上面那個小程式的int a) 而當我刪除、某個物件的生命結束時 電腦則會主動去做解構函式內定義的事情 (return 0,我知道解構這邊這樣解釋差很大(死)) 大概先抱持這樣的感覺就好 再來知道建解構預設函式名稱為 類別名稱 、 ~類別名稱 還有只要沒宣告,編譯器都會設定建解構函式內容是空的就好 : 近似於這樣的空程式 int main() { ; } -- 面對期中考的話,就拿這個類別當再來的範例 class stack{ public: void setnum(int NUM) {num=NUM;}; void setptr(stack* PTR) {ptr=PTR;}; int getnum() {return num;}; stack* getptr(){return ptr;}; private: stack* ptr; int num; }; 應該有相當比例的都是用串列去寫這個題目 在其中會遇到很多,要把初始沒有內容的ptr指向NULL,避免出現錯誤的情況 如果說,這個類別宣告成物件時,裡面的指標就可以預設為NULL的話 這程式就可以寫的比較順暢了 希望物件建構初始時的動作,就是建構函式了 -- 先把這個類別加點東西,變成它的完整樣貌 class stack{ public: stack () {;}; //這是建構函式 void setnum(int NUM) {num=NUM;}; void setptr(stack* PTR) {ptr=PTR;}; int getnum() {return num;}; stack* getptr(){return ptr;}; ~stack() {;}; //這是解構函式 private: stack* ptr; int num; }; 也就是說,不管怎樣這個建解構都存在 然後呢...我們期待預設ptr指向NULL --> 創建時物件會自己去設定ptr 因此,修改建構函式為 -- stack () {ptr=NULL;}; 就能做到創立後,ptr會自己指向NULL這點了...在後面也可以拿掉很多特例內容 再來,我們又想setnum其實只在程式開始時設定那一次 那能不能像int a=10;這樣直接輸入,就能減少函式的宣告、簡化程式碼? 所以說呢...我們又把建構函式作了些變化 讓他能輸入一個參數進去,方便處理、簡化函式與使用時的程式碼 stack (int NUM=0) {ptr=NULL; num=NUM;}; 於是乎,宣告時就能直接使用 stack iamstack(1); 來讓stack這個物件的兩個變數設在 num == 1 跟 ptr==NULL了 下頁放個改完的樣貌 -- class stack{ public: stack (int NUM=0) {ptr=NULL; num=NUM;}; void setnum(int NUM) {num=NUM;}; void setptr(stack* PTR) {ptr=PTR;}; int getnum() {return num;}; stack* getptr(){return ptr;}; ~stack() {;}; private: stack* ptr; int num; }; 再來一頁延伸使用...雖然我現在想不到什麼好用法 -- 在建構函式處,因為是"函式",所以也可以做些其他事情 比如寫成 stack (int NUM=0) { ptr=NULL; num=NUM; cout <<num <<"We are the world, We are the children."; num=num*10+5-6; }; 這樣子另外輸出些什麼、做些處理一類的做法也是建解構函式能做的事情 不過一下我還真的想不到什麼(死) 再來稍微講一下解構函式... 因為跟建構雷同處很多,所以應該不會用太多篇幅 -- 與之相反,解構函式即物件被刪除時做的行為 像是delete或程式結束時進行記憶體釋放作業時都算 大概有一點像是物件留下遺言這種感覺(?) 嗯...以當初做那作業時我遇到能用在解構函式的問題.... 大概就是在想怎樣可以很簡單的把全部串列delete而已 像是說一整個串列接在一起,我能不能砍掉head,就能把全串砍掉這樣的事情 所以說...我可以把解構寫成 ~stack() {delete ptr;}; 這樣子去產生一個連鎖效應,當我delete某個物件時 讓電腦自己幫我把其後整個串列delete這樣 當然,一樣可以寫成 ~stack() { cout << "I don't want to die"}; 這種鬼東西就是了(毆) -- (中略) 最後是模擬發牌,也就是亂數的應用題.. : 我覺得寫這段時腦袋有點問題...作法有多少種一直沒想通差異性 函式庫 相關函式庫 #include <stdlib.h> #include <time.h> 函式 函式 srand(); time(); rand(); srand -> 設定亂數種子,種子是用來生成一系列不同亂數的初始值,接受unsigned int rand -> 預設應該生成一個0~32767(?) 範圍的數 time -> 回傳現在時間,輸入格式是一個time_t的指標,輸出從指定時間起至今過幾秒 : 預設為1970/1/1,也就是給予NULL顯示的時間 -- 題目是模擬發牌 從發牌大概有這樣兩種 1.發牌時才產生還沒有出現過的某張卡 2.先有一疊卡片、洗完牌後從最上頭開始抽 然後,判斷是不是發過的卡片應該都是一個表格配置 0 1 2 3 4 5 6 7 8 9 10 11 12 0 : 0 0 0 0 0 0 0 0 0 0 0 0 0 1 : 0 0 0 0 0 0 0 0 0 0 0 0 0 2 : 0 0 0 0 0 0 0 0 0 0 0 0 0 3 : 0 0 0 0 0 0 0 0 0 0 0 0 0 發過的0變1,或發過的1變0...發出來之前確定一下有沒有發過 有發過就重新再挑一張 -- 先看第一種寫法... 其中,不論何者都是要先決定卡片花色 所以說....我直覺想到是分別處理 先決定花色,再決定數值 也就是... pattern=rand()%4; number=rand()%13; 這樣亂數兩個數值的作法 : 在優良的亂數情況下,這種產生法不會影響亂度..雖然這個內建的rand不是優良的(跑) 比較好、也比較快的方式是 tmp=rand(); pattern=tmp/4; number=tmp/13; 這樣去決定花色與數值 至於說為什麼是取4跟13的餘數...只是單純容易使用在陣列裡面 -- 好啦...有花色有數值 再來就是你要在發出每張牌時才決定那張是什麼 還是先發出五張後,再逐個輸出的差別而已了 : 即使我總覺得好像還有幾種發法...(抓頭) 至於數值與花色、AKQJ的轉換 那就看你想寫成if或switch都可以,指定特定部分轉換就好 另外一個作法應該不會看到人做 作法是建一個大小為52的int陣列裝1~52,然後連續用亂數將其中任意兩數位置兩兩互換 換到最後再從[0]開始一張一張抽出 因為覺得沒什麼好寫的...所以就不在過程間放code了 下頁放個沒什麼優化、上課刻出來的53行 就見笑了 -- #include<iostream> #include<stdlib.h> #include<time.h> using namespace std; int main() { bool poker[4][13]; for (int i=0;i<4;i++) for (int j=0;j<13;j++) poker[i][j]=false; //seed set srand(time(NULL)); //deal for (int i=0;i<4;i++){ cout <<"The " <<i+1 <<" person\n"; for (int j=0;j<5;j++){ int color=rand()%4; int num=rand()%13; while (poker[color][num]){ color=rand()%4; num=rand()%13; } poker[color][num]=true; switch (color){ case 0: cout <<"Club"; break; case 1: cout <<"Diamond"; break; case 2: cout <<"Heart"; break; case 3: cout <<"Spade"; break; } if (num == 12) cout <<'K'; else if (num == 11) cout <<'Q'; else if (num == 10) cout <<'J'; else if (num == 0) cout <<'A'; else cout <<num+1; cout <<"\t"; } cout <<"\n"; } } 亂寫一氣的lol -- 至於說洩出來的題目內容嘛... 第一步是想到隨機生成方塊來做串列,不過這似乎不夠讓人有考試的感覺 所以說有可能像是撲克牌第二種寫法一樣要求隨機移動方塊 也就是...做出一個堆方塊的雛形,然後隨機生成一堆移動方法丟進去跑 : 雖然我也有一種陪NPC打牌的錯覺...去年好像當一般作業hmmmmm 然後呢..又因為指定要帶課本,所以會讓人想到 1.考字串處理的函式庫 2.指定課本習題 1看命...有可能冒出來11-31頁..感覺意外的有可能(?) 2的部份就先做看看7-62 1.2.4.9,9會出也是隨機生成10個數作排序啦 另外是8-43 1 -- 本命 ○楽園の巫女  博麗 霊夢 職業:博麗神社の巫女さん  Hakurei Reimu   能力:主に空を飛ぶ程度の能力 @東方project系列 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 115.43.42.173
yantchen:噗噗 絕對沒有你想的那麼難XD 04/16 23:59
yantchen:其實沒有限定要帶課本啦 只是上機考都可以帶課本我提醒一 04/17 00:00
game0416:hmmmmmmm 可是我覺得都不難說(毆 04/17 00:00
Arashinoon:鳳郎你12345忘了刪=ˇ= 04/17 00:24
ip3311:未看先推 04/17 00:25
CaptainWill:未看先推 04/17 00:29
※ 編輯: game0416 來自: 115.43.42.173 (04/17 00:34)
Arashinoon:看完給推 考試大概也就那樣了吧 04/17 00:42
CaptainWill:王老大表示: 04/17 00:43
yantchen: 你覺得妳們猜的中嗎XD 04/17 00:46
Arashinoon: 科科 04/17 00:46
CaptainWill: 我也會科科笑 04/17 00:47
yantchen: +1 04/17 00:49
pk873: 推 04/17 01:43
gcobc12632: ? 04/17 02:25