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

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

程式設計題#1

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

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

描述

下面程式輸出的結果是:

0

5

請填空:

12345678910111213#include <iostream>using namespace std;class A {public: int val;// };main() { A a; cout << a.val << endl; a.GetObj() = 5; cout << a.val
<< endl;}

輸入

輸出

0

5

樣例輸入

1

樣例輸出

1205

提示

所缺程式碼具有如下形式:

1234 A(_________________ ){ val = n; } ________________ GetObj() { return _________________; }
#include <iostream>
using namespace std;
class A {
public:
	int val;


	// 在此處補充你的程式碼  
	A(int n = 0) { val = n; }
	//A(){ val = 0; }  //考察建構函式和引用
	int& GetObj() {
		return val;    //返回val的引用  
	}

};
main() {
	A a;
	cout << a.val << endl;
	a.GetObj() = 5;
	cout << a.val << endl;
}

程式設計題 #2

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

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

描述

下面程式的輸出是:

10

請補足Sample類的成員函式。不能增加成員變數。

1234567891011121314#include <iostream>using namespace std;class Sample{public: int v; Sample(int n):v(n) { }// };int main() { Sample a(5); Sample b = a;
cout << b.v; return 0;}

輸入

輸出

10

樣例輸入

1

樣例輸出

110
#include <iostream>
using namespace std;
class Sample{
public:
    int v;
    Sample(int n):v(n) { }

	// 在此處補充你的程式碼
	Sample(Sample & c) {//考察複製建構函式
		v = c.v * 2;
	}

};
int main() {
    Sample a(5);
    Sample b = a;
    cout << b.v;
    return 0;
}

程式設計題 #3

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

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

描述

下面程式的輸出結果是:

5,5

5,5

請填空:

123456789101112131415161718#include <iostream>using namespace std;class Base {public: int k; Base(int n):k(n) { }};class Big {public: int v; Base b;// };int main() { Big a1(5); Big a2 = a1; cout << a1.v << "," << a1.b.k << endl; cout << a2.v << "," << a2.b.k << endl; return 0;}

輸入

輸出

5,5

5,5

樣例輸入

1

樣例輸出

125,55,5

提示

所缺程式碼具有如下形式:

12 Big ________________{ } Big ________________{ }
#include <iostream>
using namespace std;
class Base {
public:
    int k;
    Base(int n):k(n) { }
};
class Big {
public:
    int v; Base b;

	// 在此處補充你的程式碼
	Big(int n) :v(n),b(v){ }//考察成員物件


};
int main() {
    Big a1(5); Big a2 = a1;
    cout << a1.v << "," << a1.b.k << endl;
    cout << a2.v << "," << a2.b.k << endl;
    return 0;
}


程式設計題#4:魔獸世界之一:備戰

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

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

描述

魔獸世界的西面是紅魔軍的司令部,東面是藍魔軍的司令部。兩個司令部之間是依次排列的若干城市。

紅司令部,City 1,City 2,……,City n,藍司令部

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

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

武士在剛降生的時候有一個生命值。

在每個整點,雙方的司令部中各有一個武士降生。

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

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

製造武士需要生命元。

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

如果司令部中的生命元不足以製造某個按順序應該製造的武士,那麼司令部就試圖製造下一個。如果所有武士都不能製造了,則司令部停止製造武士。

給定一個時間,和雙方司令部的初始生命元數目,要求你將從0點0分開始到雙方司令部停止製造武士為止的所有事件按順序輸出。

一共有兩種事件,其對應的輸出樣例如下:

1) 武士降生

輸出樣例: 004 blue lion 5 born with strength 5,2 lion in red headquarter

表示在4點整,編號為5的藍魔lion武士降生,它降生時生命值為5,降生後藍魔司令部裡共有2個lion武士。(為簡單起見,不考慮單詞的複數形式)注意,每製造出一個新的武士,都要輸出此時司令部裡共有多少個該種武士。

2) 司令部停止製造武士

輸出樣例: 010 red headquarter stops making warriors

表示在10點整,紅方司令部停止製造武士

輸出事件時:

首先按時間順序輸出;

同一時間發生的事件,先輸出紅司令部的,再輸出藍司令部的。

輸入

第一行是一個整數,代表測試資料組數。

每組測試資料共兩行。

第一行:一個整數M。其含義為, 每個司令部一開始都有M個生命元( 1 <= M <= 10000)。

第二行:五個整數,依次是 dragon 、ninja、iceman、lion、wolf 的初始生命值。它們都大於0小於等於10000。

輸出

對每組測試資料,要求輸出從0時0分開始,到雙方司令部都停止製造武士為止的所有事件。

對每組測試資料,首先輸出"Case:n" n是測試資料的編號,從1開始 。

接下來按恰當的順序和格式輸出所有事件。每個事件都以事件發生的時間開頭,時間以小時為單位,有三位。

參考答案:

#include <iostream>  
#include <cstdio>  
#include <string>  
using namespace std;
const int  WARRIOR_NUM = 5;
/*
string Warrior::names[WARRIOR_NUM] = { "dragon","ninja","iceman","lion","wolf" };
紅方司令部按照 iceman、lion、wolf、ninja、dragon 的順序製造武士。
藍方司令部按照 lion、dragon、ninja、iceman、wolf 的順序製造武士。
*/
class Headquarter;
class Warrior
{
private:
	Headquarter * pHeadquarter;
	int kindNo; //武士的種類編號 0 dragon 1 ninja 2 iceman 3 lion 4 wolf  
	int no;
public:
	static string names[WARRIOR_NUM];
	static int initialLifeValue[WARRIOR_NUM];
	Warrior(Headquarter * p, int no_, int kindNo_);
	void PrintResult(int nTime);
};

class Headquarter
{
private:
	int totalLifeValue;
	bool stopped;
	int totalWarriorNum;
	int color;
	int curMakingSeqIdx; //當前要製造的武士是製造序列中的第幾個  
	int warriorNum[WARRIOR_NUM]; //存放每種武士的數量  
	Warrior * pWarriors[1000];
public:
	friend class Warrior;
	static int makingSeq[2][WARRIOR_NUM]; //武士的製作順序序列  
	void Init(int color_, int lv);
	~Headquarter();
	int Produce(int nTime);
	string GetColor();

};
Warrior::Warrior(Headquarter * p, int no_, int kindNo_) {
	no = no_;
	kindNo = kindNo_;
	pHeadquarter = p;
}
void Warrior::PrintResult(int nTime)
{
	string color = pHeadquarter->GetColor();
	printf("%03d %s %s %d born with strength %d,%d %s in %s headquarter\n",
		nTime, color.c_str(), names[kindNo].c_str(), no, initialLifeValue[kindNo],
		pHeadquarter->warriorNum[kindNo], names[kindNo].c_str(), color.c_str());
}
void Headquarter::Init(int color_, int lv)
{
	color = color_;
	totalLifeValue = lv;
	totalWarriorNum = 0;
	stopped = false;
	curMakingSeqIdx = 0;
	for (int i = 0; i < WARRIOR_NUM; i++)
		warriorNum[i] = 0;
}

Headquarter::~Headquarter() {
	for (int i = 0; i < totalWarriorNum; i++)
		delete pWarriors[i];
}

int Headquarter::Produce(int nTime)
{

	if (stopped)
		return 0;
	int searchingTimes = 0;
	while (Warrior::initialLifeValue[makingSeq[color][curMakingSeqIdx]] > totalLifeValue &&
		searchingTimes < WARRIOR_NUM) {
		curMakingSeqIdx = (curMakingSeqIdx + 1) % WARRIOR_NUM;
		searchingTimes++;
	}
	int kindNo = makingSeq[color][curMakingSeqIdx];
	if (Warrior::initialLifeValue[kindNo] > totalLifeValue) {
		stopped = true;
		if (color == 0)
			printf("%03d red headquarter stops making warriors\n", nTime);
		else
			printf("%03d blue headquarter stops making warriors\n", nTime);
		return 0;
	}
	//製作士兵:  
	totalLifeValue -= Warrior::initialLifeValue[kindNo];
	curMakingSeqIdx = (curMakingSeqIdx + 1) % WARRIOR_NUM;
	pWarriors[totalWarriorNum] = new Warrior(this, totalWarriorNum + 1, kindNo);
	warriorNum[kindNo]++;
	pWarriors[totalWarriorNum]->PrintResult(nTime);
	totalWarriorNum++;
	return 1;
}

string Headquarter::GetColor()
{
	if (color == 0)
		return "red";
	else
		return "blue";
}

string Warrior::names[WARRIOR_NUM] = { "dragon","ninja","iceman","lion","wolf" };
int Warrior::initialLifeValue[WARRIOR_NUM];
int Headquarter::makingSeq[2][WARRIOR_NUM] = { { 2,3,4,1,0 },{ 3,0,1,2,4 } }; //兩個司令部武士的製作順序序列  

int main() {
	int t;
	int m;
	Headquarter RedHead, BlueHead;
	cin >> t;
	int nCaseNo = 1;
	while (t--) {
		printf("Case:%d\n", nCaseNo++);
		cin >> m;
		for (int i = 0; i < WARRIOR_NUM; i++)
			cin>>Warrior::initialLifeValue[i];
		RedHead.Init(0, m);
		BlueHead.Init(1, m);
		int nTime = 0;
		while (true) {
			int tmp1 = RedHead.Produce(nTime);
			int tmp2 = BlueHead.Produce(nTime);
			if (tmp1 == 0 && tmp2 == 0)
				break;
			nTime++;
		}
	}

	return 0;
}