作者game0416 (鳳狼)
看板NTUE-CS102
標題Re: [閒聊] 程設作業
時間Fri Apr 16 23:56:00 2010
原來這麼久沒寫串了(?)
中間應該是只有建構、解構函式跟這禮拜突然就過去的字串處理
有缺什麼提醒一下...我總覺得週二我都睡很大(死)
: 對了,字串處理略...除非有誰有好點子可以拿來玩
以及一個半作業
分別是練習建構函式的小作業、模擬發牌的作業這樣
: 前者一樣略
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