1. 程式人生 > >[Coursera C++程式設計] 第六週作業

[Coursera C++程式設計] 第六週作業

程式設計題 #1

來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

下面程式的輸出結果是:

A::Fun

C::Do

請填空:

1234567891011121314151617181920212223242526272829303132#include <iostream>using namespace std;class A { private: int nVal; public: void Fun() { cout <<
"A::Fun" << endl; } void Do() { cout << "A::Do" << endl; }};class B:public A { public: virtual void Do() { cout << "B::Do" << endl; }};class C:public B { public: void Do( ) { cout << "C::Do" <<endl; } void Fun() {
cout << "C::Fun" << endl; }};void Call(// ) { p.Fun(); p.Do();}int main() { C c; Call(c); return 0;}

輸入

輸出

A::Fun

C::Do

樣例輸入

1

樣例輸出

12A::FunC::Do
#include <iostream>
using namespace std;
class A {
private:
	int nVal;
public:
	void Fun()
	{
		cout << "A::Fun" << endl;
	}
	void Do()
	{
		cout << "A::Do" << endl;
	}
};
class B :public A {//A的派生
public:
	virtual void Do()
	{
		cout << "B::Do" << endl;
	}
};
class C :public B {//B的派生
public:
	void Do()
	{
		cout << "C::Do" << endl;
	}
	void Fun()
	{
		cout << "C::Fun" << endl;
	}
};
void Call( B & p)
	// 在此處補充你的程式碼
 {   
	
	p.Fun(); 
	p.Do();
}
int main() {
	C c;
	Call(c);
	return 0;
}

程式設計題#2

來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

下面程式的輸出結果是:

destructor B

destructor A

請完整寫出 class A。 限制條件:不得為 class A 編寫建構函式。

123456789101112131415#include <iostream>using namespace std;class A {// };class B:public A { public: ~B() { cout << "destructor B" << endl; }};int main() { A * pa; pa = new B; delete pa; return 0;}

輸入

輸出

destructor B

destructor A

樣例輸入

1

樣例輸出

#include <iostream>
using namespace std;
class A {
	// 在此處補充你的程式碼
public:
	virtual ~A() { cout << "destructor A" << endl; }
};
class B :public A {
public:
	~B() { cout << "destructor B" << endl; }
};
int main() {
	A * pa;
	pa = new B;
	delete pa;
	return 0;
}

程式設計題 #3

來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

下面的程式輸出結果是:

A::Fun

A::Do

A::Fun

C::Do

請填空:

123456789101112131415161718192021222324252627282930313233#include <iostream>using namespace std;class A { private: int nVal; public: void Fun() { cout << "A::Fun" << endl; } virtual void Do() { cout << "A::Do" << endl; }};class B:public A { public: virtual void Do() { cout << "B::Do" << endl; }};class C:public B { public: void Do( ) { cout << "C::Do" << endl; } void Fun() { cout << "C::Fun" << endl; }};void Call(// ) { p->Fun(); p->Do();}int main() { Call( new A() ); Call( new C() ); return 0;}

輸入

輸出

A::Fun

A::Do

A::Fun

C::Do

樣例輸入

1

樣例輸出

1234A::FunA::DoA::FunC::Do
#include <iostream>
using namespace std;
class A {
private:
	int nVal;
public:
	void Fun()
	{
		cout << "A::Fun" << endl;
	}
	virtual void Do()
	{
		cout << "A::Do" << endl;
	}
};
class B :public A {
public:
	virtual void Do()
	{
		cout << "B::Do" << endl;
	}
};
class C :public B {
public:
	void Do()
	{
		cout << "C::Do" << endl;
	}
	void Fun()
	{
		cout << "C::Fun" << endl;
	}
};
void Call( A * p
	// 在此處補充你的程式碼
) {
	p->Fun(); p->Do();
}
int main() {
	Call(new A());
	Call(new C());
	return 0;
}

程式設計題#4: 魔獸世界終極版

來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

注意: 總時間限制: 2000ms 記憶體限制: 65536kB

描述

魔獸世界的西面是紅魔軍的司令部,東面是藍魔軍的司令部。兩個司令部之間是依次排列的若干城市,城市從西向東依次編號為1,2,3 .... N ( N <= 20 )。紅魔軍的司令部算作編號為0的城市,藍魔軍的司令部算作編號為N+1的城市。司令部有生命元,用於製造武士。

兩軍的司令部都會製造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五種。每種武士都有編號、生命值、攻擊力這三種屬性。

雙方的武士編號都是從1開始計算。紅方製造出來的第 n 個武士,編號就是n。同樣,藍方製造出來的第 n 個武士,編號也是n。

武士在剛降生的時候有一個初始的生命值,生命值在戰鬥中會發生變化,如果生命值減少到0(生命值變為負數時應當做變為0處理),則武士死亡(消失)。

有的武士可以擁有武器。武器有三種,sword, bomb,和arrow,編號分別為0,1,2。

武士降生後就朝對方司令部走,在經過的城市如果遇到敵人(同一時刻每個城市最多隻可能有1個藍武士和一個紅武士),就會發生戰鬥。每次戰鬥只有一方發起主動進攻一次。被攻擊者生命值會減去進攻者的攻擊力值和進攻者手中sword的攻擊力值。被進攻者若沒死,就會發起反擊,被反擊者的生命值要減去反擊者攻擊力值的一半(去尾取整)和反擊者手中sword的攻擊力值。反擊可能致敵人於死地。

如果武士在戰鬥中殺死敵人(不論是主動進攻殺死還是反擊殺死),則其司令部會立即向其傳送8個生命元作為獎勵,使其生命值增加8。當然前提是司令部得有8個生命元。如果司令部的生命元不足以獎勵所有的武士,則優先獎勵距離敵方司令部近的武士。

如果某武士在某城市的戰鬥中殺死了敵人,則該武士的司令部立即取得該城市中所有的生命元。注意,司令部總是先完成全部獎勵工作,然後才開始從各個打了勝仗的城市回收生命元。對於因司令部生命元不足而領不到獎勵的武士,司令部也不會在取得戰利品生命元后為其補發獎勵。

如果一次戰鬥的結果是雙方都倖存(平局),則雙方都不能拿走發生戰鬥的城市的生命元。

城市可以插旗子,一開始所有城市都沒有旗子。在插紅旗的城市,以及編號為奇數的無旗城市,由紅武士主動發起進攻。在插藍旗的城市,以及編號為偶數的無旗城市,由藍武士主動發起進攻。

當某個城市有連續兩場戰鬥都是同一方的武士殺死敵人(兩場戰鬥之間如果有若干個戰鬥時刻並沒有發生戰鬥,則這兩場戰鬥仍然算是連續的;但如果中間有平局的戰鬥,就不算連續了) ,那麼該城市就會插上勝方的旗幟,若原來插著敗方的旗幟,則敗方旗幟落下。旗幟一旦插上,就一直插著,直到被敵人更換。一個城市最多隻能插一面旗幟,旗幟沒被敵人更換前,也不會再次插同顏色的旗。

各種武器有其特點:

sword武器的初始攻擊力為擁有它的武士的攻擊力的20%(去尾取整)。但是sword每經過一次戰鬥(不論是主動攻擊還是反擊),就會變鈍,攻擊力變為本次戰鬥前的80% (去尾取整)。sword攻擊力變為0時,視為武士失去了sword。如果武士降生時得到了一個初始攻擊力為0的sword,則視為武士沒有sword.

arrow有一個攻擊力值R。如果下一步要走到的城市有敵人,那麼擁有arrow的武士就會放箭攻擊下一個城市的敵人(不能攻擊對方司令部裡的敵人)而不被還擊。arrow使敵人的生命值減少R,若減至小於等於0,則敵人被殺死。arrow使用3次後即被耗盡,武士失去arrow。兩個相鄰的武士可能同時放箭把對方射死。

擁有bomb的武士,在戰鬥開始前如果判斷自己將被殺死(不論主動攻擊敵人,或者被敵人主動攻擊都可能導致自己被殺死,而且假設武士可以知道敵人的攻擊力和生命值),那麼就會使用bomb和敵人同歸於盡。武士不預測對方是否會使用bomb。

武士使用bomb和敵人同歸於盡的情況下,不算是一場戰鬥,雙方都不能拿走城市的生命元,也不影響城市的旗幟。

不同的武士有不同的特點。

dragon可以擁有一件武器。編號為n的dragon降生時即獲得編號為 n%3 的武器。dragon還有“士氣”這個屬性,是個浮點數,其值為它降生後其司令部剩餘生命元的數量除以造dragon所需的生命元數量。dragon 在一次在它主動進攻的戰鬥結束後,如果還沒有戰死,而且士氣值大於0.8,就會歡呼。dragon每取得一次戰鬥的勝利(敵人被殺死),士氣就會增加0.2,每經歷一次未能獲勝的戰鬥,士氣值就會減少0.2。士氣增減發生在歡呼之前。

ninjia可以擁有兩件武器。編號為n的ninjia降生時即獲得編號為 n%3 和 (n+1)%3的武器。ninja 捱打了也從不反擊敵人。

iceman有一件武器。編號為n的iceman降生時即獲得編號為 n%3 的武器。iceman 每前進兩步,在第2步完成的時候,生命值會減少9,攻擊力會增加20。但是若生命值減9後會小於等於0,則生命值不減9,而是變為1。即iceman不會因走多了而死。

lion 有“忠誠度”這個屬性,其初始值等於它降生之後其司令部剩餘生命元的數目。每經過一場未能殺死敵人的戰鬥,忠誠度就降低K。忠誠度降至0或0以下,則該lion逃離戰場,永遠消失。但是已經到達敵人司令部的lion不會逃跑。Lion在己方司令部可能逃跑。lion 若是戰死,則其戰鬥前的生命值就會轉移到對手身上。所謂“戰鬥前”,就是每個小時的40分前的一瞬間。

wolf降生時沒有武器,但是在戰鬥中如果獲勝(殺死敵人),就會繳獲敵人的武器,但自己已有的武器就不繳獲了。被繳獲的武器當然不能算新的,已經被用到什麼樣了,就是什麼樣的。

以下是不同時間會發生的不同事件:

在每個整點,即每個小時的第0分, 雙方的司令部中各有一個武士降生。

紅方司令部按照 iceman、lion、wolf、ninja、dragon 的順序製造武士。

藍方司令部按照 lion、dragon、ninja、iceman、wolf 的順序製造武士。

製造武士需要生命元。

製造一個初始生命值為 m 的武士,司令部中的生命元就要減少 m 個。

如果司令部中的生命元不足以製造某武士,那麼司令部就等待,直到獲得足夠生命元后的第一個整點,才製造該武士。例如,在2:00,紅方司令部本該製造一個 wolf ,如果此時生命元不足,那麼就會等待,直到生命元足夠後的下一個整點,才製造一個 wolf。

在每個小時的第5分,該逃跑的lion就在這一時刻逃跑了。

在每個小時的第10分:所有的武士朝敵人司令部方向前進一步。即從己方司令部走到相鄰城市,或從一個城市走到下一個城市。或從和敵軍司令部相鄰的城市到達敵軍司令部。

在每個小時的第20分:每個城市產出10個生命元。生命元留在城市,直到被武士取走。

在每個小時的第30分:如果某個城市中只有一個武士,那麼該武士取走該城市中的所有生命元,並立即將這些生命元傳送到其所屬的司令部。

在每個小時的第35分,擁有arrow的武士放箭,對敵人造成傷害。放箭事件應算髮生在箭發出的城市。注意,放箭不算是戰鬥,因此放箭的武士不會得到任何好處。武士在沒有敵人的城市被箭射死也不影響其所在城市的旗幟更換情況。

在每個小時的第38分,擁有bomb的武士評估是否應該使用bomb。如果是,就用bomb和敵人同歸於盡。

在每個小時的第40分:在有兩個武士的城市,會發生戰鬥。 如果敵人在5分鐘前已經被飛來的arrow射死,那麼仍然視為發生了一場戰鬥,而且存活者視為獲得了戰鬥的勝利。此情況下不會有“武士主動攻擊”,“武士反擊”,“武士戰死”的事件發生,但戰鬥勝利後應該發生的事情都會發生。如Wolf一樣