1. 程式人生 > >[Coursera C++程式設計] 期末考試—程式設計試題

[Coursera C++程式設計] 期末考試—程式設計試題

程式設計題#1:輸出200

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

使以下程式碼輸出結果為200.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#include<iostream>

using namespace std;

class Number {

public:

int num;

Number(int n=0): num(n) {}

// 在此處補充你的程式碼

};

int main() {

Number n1(10), n2(20);

Number n3;n3 = n1*n2;

cout << int(n3) << endl;

return 0;

}

輸入

不需要輸入。

輸出

輸出結果為200。

樣例輸入

1

不需要輸入。

樣例輸出

1

200

#include<iostream>
using namespace std;
class Number {
public:
	int num;
	Number(int n = 0) : num(n) {}
	// 在此處補充你的程式碼
	int operator * (Number &n)
	{
		return this->num * n.num;
	}
	operator int() { return num; }
	
};

int main() {
	Number n1(10), n2(20);
	Number n3; 
	n3 = n1*n2;
	cout << int(n3) << endl;
	return 0;
}

程式設計題#2:輸出指定結果一

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

填寫程式碼,使輸出結果為

2

2

8

10

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include <iostream>

using namespace std;

class Number {

public:

int num;

Number(int n): num(n) {

}

// 在此處補充你的程式碼

};

int main() {

Number a(2);

Number b = a;

cout << a.value() << endl;

cout << b.value() << endl;

a.value() = 8;

cout << a.value() << endl;

a+b;

cout << a.value() << endl;

return 0;

}

輸入

不需要輸入。

輸出

使輸出結果為

2

2

8

10

樣例輸入

1

不需要輸入。

樣例輸出

1

2

3

4

2

2

8

10

#include <iostream>
using namespace std;
class Number {
public:
	int num;
	Number(int n) : num(n) {
	}
	// 在此處補充你的程式碼
	int& value()
	{
		return num;
	}
	void operator + (Number& n)
	{
		this->num += n.num;
	}
};

int main() {
	Number a(2);
	Number b = a;
	cout << a.value() << endl;
	cout << b.value() << endl;
	a.value() = 8;
	cout << a.value() << endl;
	a + b;
	cout << a.value() << endl;
	return 0;
}

程式設計題#3:計算數列平方和

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

請寫出sum函式,使其可以計算輸入數列的平方和。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#include <iostream>

using namespace std;

// 在此處補充你的程式碼

int sqr(int n) {

return n * n;

}

int main() {

int t, n, a[0x100];

cin >> t;

for (int c = 0; c < t; ++c) {

cin >> n;

for (int i = 0; i < n; ++i) cin >> a[i];

cout << sum(a, n, sqr) << endl;

}

return 0;

}

輸入

第一行是一個整數 t (t <= 10),表示資料組數;

每組輸入資料包含兩行,第一行是一個整數 n (n <= 100),

第二行是 n 個用空格分隔開的整數

輸出

對每組輸入資料,輸出該組資料中 n 個整數的平方和

樣例輸入

1

2

3

4

5

2

2

4 3

3

0 1 2

樣例輸出

1

2

25

5

#include <iostream>
using namespace std;
// 在此處補充你的程式碼
int sum(int a[],int n,int (*sqr)(int)) {//函式指標int (*f) (int x);  宣告一個函式指標
	int sum = 0;
	for (int i = 0; i < n; i++) {
		sum += sqr(a[i]);
	}
	return sum;
}
int sqr(int n) {
	return n * n;
}
int main() {
	int t, n, a[0x100];
	cin >> t;
	for (int c = 0; c < t; ++c) {
		cin >> n;
		for (int i = 0; i < n; ++i) cin >> a[i];
		cout << sum(a, n, sqr) << endl;
	}
	return 0;
}

程式設計題#4:計算整數平方和

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

下列程式每次讀入一個整數N,若N為0則退出,否則輸出N和N的平方。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#include <iostream>

using namespace std;

// 在此處補充你的程式碼

int main(int argc, char* argv[]) {

CType obj;

int n;

cin>>n;

while ( n ) {

obj.setvalue(n);

cout<<obj++<<" "<<obj<<endl;

cin>>n;

}

return 0;

}

輸入

K個整數。除最後一個數據外,其他資料均不為0。

輸出

K-1行。第I行輸出第I個輸入數和它的平方。

樣例輸入

1

1 5 8 9 0

樣例輸出

1

2

3

4

1 1

5 25

8 64

9 81

#include <iostream>
using namespace std;
// 在此處補充你的程式碼
class CType {
private:
	int value;
public:
	int m;
	int sqr;
	CType() :value(0) {};
	void setvalue(int n) {
		value = n;
	}
	CType& operator++(int)
	{
		static CType tmp;//必須使用static變數,否則返回時記憶體就被釋放了
		tmp.value = value;
		value *= value;
		return tmp;
	
	}
	friend ostream& operator << (ostream& o, CType& cType)//此處必須為友元函式
	{
		o << cType.value;
		return o;
	}

};
int main(int argc, char* argv[]) {
	CType obj;
	int n;
	cin >> n;
	while (n) {
		obj.setvalue(n);
		cout << obj++ << " " << obj << endl;
		cin >> n;
	}
	return 0;
}

程式設計題#5:計算陣列的低3位之和

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

輸入一個正整數構成的陣列a[0], a[1], a[2], ... , a[n-1], 計算它們的二進位制低3位之和。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

// 在此處補充你的程式碼

int main(int argc, char* argv[]) {

int v, my_sum=0;

vector<int> vec;

cin>>v;

while ( v ) {

vec.push_back(v);

cin>>v;

}

for_each(vec.begin(), vec.end(), CMy_add(my_sum));

cout<<my_sum<<endl;

return 0;

}

輸入

陣列a,以0表示輸入結束。

輸出

一個整數 , 所輸入陣列各元素的二進位制低3位之和。

樣例輸入

1

1 3 9 7 3 6 20 15 18 17 4 8 18 0

樣例輸出

1

41

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 在此處補充你的程式碼
class CMy_add {
public:
	CMy_add(int &v ) :theValue(v) {}
	void operator() (int x)
	{
		x %= 8;//得到其低3位
		theValue += x;
	}
private:
	int& theValue;

};
int main(int argc, char* argv[]) {
	int v, my_sum = 0;
	vector<int> vec;
	cin >> v;
	while (v) {
		vec.push_back(v);
		cin >> v;
	}
	for_each(vec.begin(), vec.end(), CMy_add(my_sum))//此處my_sum和theValue公用一個地址
	cout << my_sum << endl;
	return 0;
}

程式設計題#6:MyString

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

請寫出 MyString類,使得下面程式的輸出結果符合下面的要求。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

#include <cstring>

#include <cstdlib>

#include <string>

#include <iostream>

using namespace std;

// 在此處補充你的程式碼

int CompareString( const void * e1, const void * e2)

{

MyString * s1 = (MyString * ) e1;

MyString * s2 = (MyString * ) e2;

if( * s1 < *s2 )

return -1;

else if( *s1 == *s2)

return 0;

else if( *s1 > *s2 )

return 1;

}

int main()

{

MyString s1("abcd-"),s2,s3("efgh-"),s4(s1);

MyString SArray[4] = {"big","me","about","take"};

cout << "1. " << s1 << s2 << s3<< s4<< endl;

s4 = s3;

s3 = s1 + s3;

cout << "2. " << s1 << endl;

cout << "3. " << s2 << endl;

cout << "4. " << s3 << endl;

cout << "5. " << s4 << endl;

cout << "6. " << s1[2] << endl;

s2 = s1;

s1 = "ijkl-";

s1[2] = 'A' ;

cout << "7. " << s2 << endl;

cout << "8. " << s1 << endl;

s1 += "mnop";

cout << "9. " << s1 << endl;

s4 = "qrst-" + s2;

cout << "10. " << s4 << endl;

s1 = s2 + s4 + " uvw " + "xyz";

cout << "11. " << s1 << endl;

qsort(SArray,4,sizeof(MyString),CompareString);

for( int i = 0;i < 4;i ++ )

cout << SArray[i] << endl;

//s1的從下標0開始長度為4的子串

cout << s1(0,4) << endl;

//s1的從下標5開始長度為10的子串

cout << s1(5,10) << endl;

return 0;

}

輸入

輸出

1. abcd-efgh-abcd-

2. abcd-

3.

4. abcd-efgh-

5. efgh-

6. c

7. abcd-

8. ijAl-

9. ijAl-mnop

10. qrst-abcd-

11. abcd-qrst-abcd- uvw xyz

about

big

me

take

abcd

qrst-abcd-

樣例輸入

1

樣例輸出

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

1. abcd-efgh-abcd-

2. abcd-

3.

4. abcd-efgh-

5. efgh-

6. c

7. abcd-

8. ijAl-

9. ijAl-mnop

10. qrst-abcd-

11. abcd-qrst-abcd- uvw xyz

about

big

me

take

abcd

qrst-abcd-

#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
using namespace std;
// 在此處補充你的程式碼
class MyString :public string {


public:
	MyString() : string() {};
	//1.0繼承類繼承父類所有的成員變數和成員函式,但不繼承建構函式和解構函式 
	//1.1繼承類的無參建構函式,會隱式呼叫父類的無參建構函式
	MyString(const char *s) :string(s) {};//型別轉換建構函式
										  //1.2繼承類的有參建構函式,如果父類也有有參建構函式,則必須顯示呼叫它 
										  //2.0這裡的引數根據reference有兩種選擇,此處必須用const char*,"xxx"的型別是const char* 
	MyString(const string &s) :string(s) {};//char*是資料型別,而string是類,要弄清楚。
											//1.3繼承類的複製建構函式必須要顯示的呼叫父類的複製建構函式,不然就會預設呼叫父類的無參建構函式 
	MyString(MyString& myStr) :string(myStr) {};//複製建構函式
												//我們發現在派生類的拷貝建構函式中的初始化列表中,
												//基類拷貝建構函式的引數是派生類,但是這樣子是沒有關係的,編譯系統會自動將派生類縮減成基類規模(這是我的個人理解,進行縮減的只是派生類的臨時物件,不會對引數進行修改),
												//然後傳入給基類的拷貝建構函式,然後在派生類的拷貝建構函式當中再將派生類比基類多出的成員變數進行拷貝。 
	MyString operator()(int i, int j) {
		return this->substr(i, j);
	}




};
int CompareString(const void * e1, const void * e2)
{
	MyString * s1 = (MyString *)e1;
	MyString * s2 = (MyString *)e2;
	if (*s1 < *s2)
		return -1;
	else if (*s1 == *s2)
		return 0;
	else if (*s1 > *s2)
		return 1;
}
int main()
{
	MyString s1("abcd-"), s2, s3("efgh-"), s4(s1);
	MyString SArray[4] = { "big","me","about","take" };
	cout << "1. " << s1 << s2 << s3 << s4 << endl;
	s4 = s3;
	s3 = s1 + s3;
	cout << "2. " << s1 << endl;
	cout << "3. " << s2 << endl;
	cout << "4. " << s3 << endl;
	cout << "5. " << s4 << endl;
	cout << "6. " << s1[2] << endl;
	s2 = s1;
	s1 = "ijkl-";
	s1[2] = 'A';
	cout << "7. " << s2 << endl;
	cout << "8. " << s1 << endl;
	s1 += "mnop";
	cout << "9. " << s1 << endl;
	s4 = "qrst-" + s2;
	cout << "10. " << s4 << endl;
	s1 = s2 + s4 + " uvw " + "xyz";
	cout << "11. " << s1 << endl;
	qsort(SArray, 4, sizeof(MyString), CompareString);
	for (int i = 0; i < 4; i++)
		cout << SArray[i] << endl;
	//s1的從下標0開始長度為4的子串
	cout << s1(0, 4) << endl;
	//s1的從下標5開始長度為10的子串
	cout << s1(5, 10) << endl;
	return 0;
}

程式設計題#7:字串排序

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

請按照要求對輸入的字串進行排序。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

#include <iostream>

#include <string>

#include <list>

using namespace std;

class A{

private:

string name;

public:

A(string n) :name(n){}

friend bool operator < (const class A& a1, const class A &a2);

friend bool operator == (const class A &a1, const class A &a2){

if (a1.name.size() == a2.name.size())

return true;

else

return false;

}

friend ostream & operator << (ostream &o, const A &a){

o << a.name;

return o;

}

string get_name() const{

return name;

}

int get_size() const{

return name.size();

}

};

// 在此處補充你的程式碼

int main(int argc, char* argv[])

{

list<A> lst;

int ncase, n, i = 1;

string s;

cin >> ncase;

while (ncase--){

cout << "Case: "<<i++ << endl;

cin >> n;

for (int i = 0; i < n; i++){

cin >> s;

lst.push_back(A(s));

}

lst.sort();

Show(lst.begin(), lst.end(), Print());

cout << endl;

lst.sort(MyLarge<A>());

Show(lst.begin(), lst.end(), Print());

cout << endl;

lst.clear();

}

return 0;

}

輸入

第一行是正整數T,表示測試資料的組數

每組測試資料輸入共兩行,

第一行是正整數N,表示字串個數

第二行是N個字串, 字串間用空格分離

輸出

對於每組測試資料,先輸出一行:

Case: n

如對第一組資料就輸出Case: 1

第二行按照字串長度從小到大排序之後輸出N個字串,字串之間以空格間隔(不會出現字串長度相同的情況)

第三行按照字串首字元ASCII碼序從小到大排序之後輸出N個字串,字串之間以空格間隔(不會出現字串首字母相同的情況)

樣例輸入

1

2

3

4

5

2

4

a bnss ds tsdfasg

5

aaa bbbb ccccd sa q

樣例輸出

1

2

3

4

5

6

Case: 1

a ds bnss tsdfasg

a bnss ds tsdfasg

Case: 2

q sa aaa bbbb ccccd

aaa bbbb ccccd q sa

#include <iostream>
#include <string>
#include <list>
using namespace std;

class A {
private:
	string name;
public:
	A(string n) :name(n) {}
	friend bool operator < (const class A& a1, const class A &a2);
	friend bool operator == (const class A &a1, const class A &a2) {
		if (a1.name.size() == a2.name.size())
			return true;
		else
			return false;
	}
	friend ostream & operator << (ostream &o, const A &a) {
		o << a.name;
		return o;
	}
	string get_name() const {
		return name;
	}
	int get_size() const {
		return name.size();
	}
};
// 在此處補充你的程式碼
bool operator < (const A& a1, const A& a2)
{
	return a1.get_size() < a2.get_size();
}

template <class Iterator, class Function>//函式模板
void Show(Iterator begin, Iterator end, Function print)
{
	for (Iterator iterator1 = begin; iterator1 != end; iterator1++)
	{
		print(*iterator1);
	}
}

class Print //函式物件類
{
public:
	void operator() (const A& a)
	{
		cout << a.get_name() << " ";
	}
};

template <class A>  //函式物件類模板
struct MyLarge
{
	inline bool operator() (const A& a1, const A& a2)
	{
		return a1.get_name() < a2.get_name();
	}
};

int main(int argc, char* argv[])
{
	list<A> lst;
	int ncase, n, i = 1;
	string s;
	cin >> ncase;
	while (ncase--) {
		cout << "Case: " << i++ << endl;
		cin >> n;
		for (int i = 0; i < n; i++) {
			cin >> s;
			lst.push_back(A(s));
		}
		lst.sort();//如上已經過載的A型別的“<”號,按size排序
		Show(lst.begin(), lst.end(), Print());//Print()為函式物件,用途類似於函式指標或函式名字

		cout << endl;
		lst.sort(MyLarge<A>());//按照函式物件的方式進行排序
		Show(lst.begin(), lst.end(), Print());
		cout << endl;
		lst.clear();
	}
	return 0;
}

程式設計題#8:計算整數k

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

輸入整數 n ( 0 <=n<= 2^30) , 以及整數i,j(0 <= i,j <31,i < j-1), 輸出整數k(按十六進位制輸出結果 ),k的第i位和n相同,第j位和n不同,i,j之間的位是1, 其他位都是0。這裡提到的所有的位,指的都是二進位制位,最右邊算第0位。

輸入

第一行是整數 t,表示資料組數。

每組輸入資料是一行,三個整數 n,i和j。

輸出

對每組輸入資料,按十六進位制輸出結果。

樣例輸入

1

2

3

2

23 3 5

7 0 2

樣例輸出

1

2

30

3

提示

本題請寫出完整的程式。

#include <iostream>

using namespace std;

// 在此處補充你的程式碼
int main(int argc, char* argv[])
{
	int t;
	cin >> t;
	while (t--) {
		int n, i, j;
		cin >> n >> i >> j;
		int  result = 0;
		if (n &(1 << i)) {//n的第i位為1,如果是0不需要改變
			result |= 1 << i;
		}
		if (!(n & (1 << j)))//n的第j位為0,如果是1不需要改變
		{
			result |= 1 << j;
		}
		for (int k = i + 1; k < j; k++)
		{
			result |= 1 << k;
		}
		cout << hex << result << endl;
	}
	
	
	return 0;
}

程式設計題#9:人群的排序和分類

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

對人群按照輸入的資訊進行排序和分類。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#include <iostream>

#include <set>

#include <iterator>

#include <algorithm>

using namespace std;

// 在此處補充你的程式碼

int main()

{

int t;

cin >> t;

set<A*,Comp> ct;

while( t -- ) {

int n;

cin >> n;

ct.clear();

for( int i = 0;i < n; ++i) {

char c; int k;

cin >> c >> k;

if( c == 'A')

ct.insert(new A(k));

else

ct.insert(new B(k));

}

for_each(ct.begin(),ct.end(),Print);

cout << "****" << endl;

}

}

輸入

第一行是整數t,表明一共t組資料. t < 20

對每組資料:

第一行是整數n,表示下面一共有n行。 0 < n < 100

下面的每行代表一個人。每行以一個字母開頭,代表該人所屬的類別,然後跟著一個整數,代表年齡。字母只會是 'A‘或‘B' 。整數範圍0到100。資料保證年齡都不相同。

輸出

對每組輸入資料,將這些人按年齡從小到大輸出。每個人先輸出類別,再輸出年齡。每組資料的末尾加一行 "****"

樣例輸入

1

2

3

4

5

6

7

8

9

10

2

4

A 3

B 4

A 5

B 6

3

A 4

A 3

A 2

樣例輸出

1

2

3

4

5

6

7

8

9

A 3

B 4

A 5

B 6

****

A 2

A 3

A 4

****

#include <iostream>
#include <set>
#include <iterator>
#include <algorithm>
using namespace std;
// 在此處補充你的程式碼
class A {
public:
	int age;
	char s;
	A(int a) : age(a), s('A') {}
	A(int a, char str) : age(a), s(str) {}

};
class B : public A
{
public:
	B(int b) :A(b, 'B') {}
};
struct Comp
{
	bool operator () (const A* x, const A* y) const
	{
		return x->age < y->age;
	}
};
void Print(const A* a)
{
	cout << a->s << " " << a->age << endl;
}

int main()
{

	int t;
	cin >> t;
	set<A*, Comp> ct;//A*為指向A的指標
	while (t--) {
		int n;
		cin >> n;
		ct.clear();
		for (int i = 0; i < n; ++i) {
			char c; int k;
			cin >> c >> k;

			if (c == 'A')
				ct.insert(new A(k));//new A(k)為動態記憶體分配,返回該記憶體空間的起始地址
			else
				ct.insert(new B(k));
		}
		for_each(ct.begin(), ct.end(), Print);
		cout << "****" << endl;
	}
}

程式設計題#10:輸出指定結果二

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 記憶體限制: 1024kB

描述

通過填空使得程式輸出的結果符合下面的要求。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include <iostream>

#include <map>

using namespace std;

// 在此處補充你的程式碼

int A::count = 0;

void func(B b) { }

int main()

{

A a1(5),a2;

cout << A::count << endl;

B b1(4);

cout << A::count << endl;

func(b1);

cout << A::count << endl;

A * pa = new B(4);

cout << A::count << endl;

delete pa;

cout << A::count << endl;

return 0;

}

輸入

不需要輸入。

輸出

使得程式的輸出結果是:

2

3

B::destructor

A::destructor

3

4

B::destructor

A::destructor

3

B::destructor

A::destructor

A::destructor

A::destructor

樣例輸入

1

不需要輸入。

樣例輸出

1

2

3

4

5

6

7

8

9

10

11

12

13

2

3

B::destructor

A::destructor

3

4

B::destructor

A::destructor

3

B::destructor

A::destructor

A::destructor

A::destructor

提示

int A::count = 0; 這個變數是用來記錄一共有多少個類A及類A的派生類的物件的。

#include <iostream>
#include <map>
using namespace std;
// 在此處補充你的程式碼
class A {
public:
	
	static int count;
	A() { count++; }
	A(int a) { count++; }
	virtual ~A()
	{
		cout << "A::destructor" << endl;
	}

	void operator delete(void* a)//過載delete
	{
		count--;
	}
};
class B: public A
{
public:
	B() :A() {}
	B(int b) :A() {}
	B& operator = (B& b)
	{
		return b;
	}
	virtual ~B()
	{
		cout << "B::destructor" << endl;
	}
};
int A::count = 0;
void func(B b) { }
int main()
{
	A a1(5), a2;
	cout << A::count << endl;
	B b1(4);
	cout << A::count << endl;
	func(b1);
	cout << A::count << endl;
	A * pa = new B(4);
	cout << A::count << endl;
	delete pa;
	cout << A::count << endl;
	return 0;
}

程式設計題#11:資料庫內的學生資訊

來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 3000ms 記憶體限制: 20480kB

描述

程式填空,使得下面的程式,先輸出

(Tom,80),(Tom,70),(Jone,90),(Jack,70),(Alice,100),

(Tom,78),(Tom,78),(Jone,90),(Jack,70),(Alice,100),

(70,Jack),(70,Tom),(80,Tom),(90,Jone),(100,Alice),

(70,Error),(70,Error),(80,Tom),(90,Jone),(100,Alice),

******

然後,再根據輸入資料按要求產生輸出資料

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

#include <iostream>

#include <string>

#include <map>

#include <iterator>

#include <algorithm>

using namespace std;

// 在此處補充你的程式碼

struct Student

{

string name;

int score;

};

template <class T>

void Print(T first,T last) {

for(;first!= last; ++ first)

cout << * first << ",";

cout << endl;

}

int main()

{

Student s[] = { {"Tom",80},{"Jack",70},

{"Jone",90},{"Tom",70},{"Alice"

                                   ,100} };

MyMultimap<string,int> mp;

for(int i = 0; i<5; ++ i)

mp.insert(make_pair(s[i].name,s[i].score));

Print(mp.begin(),mp.end()); //按姓名從大到小輸出

mp.Set("Tom",78); //把所有名為"Tom"的學生的成績都設定為78

Print(mp.begin(),mp.end());

MyMultimap<int,string,less<int> > mp2;

for(int i = 0; i<5; ++ i)

mp2.insert(make_pair(s[i].score,s[i].name));

Print(mp2.begin(),mp2.end()); //按成績從小到大輸出

mp2.Set(70,"Error");

            //把所有成績為70的學生,名字都改為"Error"

Print(mp2.begin(),mp2.end());

cout << "******" << endl;

mp.clear();

string name;

string cmd;

int score;

while(cin >> cmd ) {

if( cmd == "A") {

cin >> name >> score;

if(mp.find(name) != mp.end() ) {

cout << "erroe" << endl;

}

mp.insert(make_pair(name,score));

}

else if(cmd == "Q") {

cin >> name;

MyMultimap<string,int>::iterator p = mp.find

                            (name);

if( p!= mp.end()) {

cout << p->second << endl;

}

else {

cout << "Not Found" << endl;

}

}

}

return 0;

}

輸入

輸入資料的每一行,格式為以下之一:

A name score

Q name score

name是個不帶個空格的字串,長度小於 20

score是個整數,能用int表示

A name score 表示往資料庫中新增一個姓名為name的學生,其分數為score。開始時資料庫中一個學生也沒有。

Q name 表示在資料庫中查詢姓名為name的學生的分數

資料保證學生不重名。

輸入資料少於200,000行。

輸出

對於每個查詢,輸出學生的分數。如果查不到,則輸出 "Not Found"

樣例輸入

1

2

3

4

5

6

A Tom1 30

A Tom2 40

Q Tom3

A Tom4 89

Q Tom1

Q Tom2

樣例輸出

1

2

3

4

5

6

7

8

(Tom,80),(Tom,70),(Jone,90),(Jack,70),(Alice,100),

(Tom,78),(Tom,78),(Jone,90),(Jack,70),(Alice,100),

(70,Jack),(70,Tom),(80,Tom),(90,Jone),(100,Alice),

(70,Error),(70,Error),(80,Tom),(90,Jone),(100,Alice),

******

Not Found

30

40

提示

1) 編寫模板的時候,連續的兩個 “>”最好要用空格分開,以免被編譯器看作是 ">>"運算子。VS可能無此問題,但是Dev C++和伺服器上的編譯環境會有這個問題。

比如 vector<vector<int>> 有可能出錯,要改成 vector<vector<int> >

2) 在模板中寫迭代器時,最好在前面加上 typename關鍵字,否則可能會編譯錯。VS可能無此問題,但是Dev C++和伺服器上的編譯環境會有這個問題。

#include <iostream>
#include <string>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
// 在此處補充你的程式碼
template <class T>
struct bigger :public  binary_function<T, T, bool>
{
	bool operator()(const T &t1, const T &t2) const { return t2 < t1; }
};
template<class T1, class T2, class Comp = bigger<T1> >
class MyMultimap {
public:
	typedef multimap<T1, T2, Comp> MAP;
	typedef typename multimap<T1, T2, Comp>::iterator iterator;
	MAP mymap;
	iterator begin() { return mymap.begin(); }
	iterator end() { return mymap.end(); }
	void Set(T1 t1, T2 t2)
	{
		iterator i = mymap.begin();
		for (; i != mymap.end(); i++)
			if (i->first == t1)
				i->second = t2;
	}
	void insert(pair<T1, T2> p) { mymap.insert(p); }
	void clear() { mymap.clear(); }
	iterator find(T1 t) { return mymap.find(t); }
};
template<class T1, class T2>
ostream & operator<<(ostream &o, pair<T1, T2>p)
{
	o << "(" << p.first << "," << p.second << ")";
	return o;
}

struct Student
{
	string name;
	int score;
};
template <class T>
void Print(T first, T last) {
	for (; first != last; ++first)
		cout << *first << ",";
	cout << endl;
}
int main()
{

	Student s[] = { { "Tom",80 },{ "Jack",70 },
	{ "Jone",90 },{ "Tom",70 },{ "Alice",100 } };
	MyMultimap<string, int> mp;
	for (int i = 0; i<5; ++i)
		mp.insert(make_pair(s[i].name, s[i].score));
	Print(mp.begin(), mp.end()); //按姓名從大到小輸出

	mp.Set("Tom", 78); //把所有名為"Tom"的學生的成績都設定為78
	Print(mp.begin(), mp.end());


	MyMultimap<int, string, less<int> > mp2;
	for (int i = 0; i<5; ++i)
		mp2.insert(make_pair(s[i].score, s[i].name));

	Print(mp2.begin(), mp2.end()); //按成績從小到大輸出
	mp2.Set(70, "Error");          //把所有成績為70的學生,名字都改為"Error"
	Print(mp2.begin(), mp2.end());
	cout << "******" << endl;

	mp.clear();

	string name;
	string cmd;
	int score;
	while (cin >> cmd) {
		if (cmd == "A") {
			cin >> name >> score;
			if (mp.find(name) != mp.end()) {
				cout << "erroe" << endl;
			}
			mp.insert(make_pair(name, score));
		}
		else if (cmd == "Q") {
			cin >> name;
			MyMultimap<string, int>::iterator p = mp.find(name);
			if (p != mp.end()) {
				cout << p->second << endl;
			}
			else {
				cout << "Not Found" << endl;
			}
		}
	}
	return 0;
}

相關推薦

[Coursera C++程式設計] 期末考試程式設計試題

程式設計題#1:輸出200 來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。) 總時間限制: 1000ms 記憶體限制: 1024kB 描述 使以下程式碼輸出結果為200. 1 2

C++程式設計 期末考試 程式設計題1# 輸出200

程式設計題#1:輸出200 來源: 北京大學線上程式評測系統POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。) 總時間限制: 1000ms 記憶體限制: 1024kB 描述 使以下程式碼輸出結果為200. 輸入 不需要輸入。

C++程式設計 期末考試 程式設計題#7 字串排序

這道題我卡在傳遞函式物件上,說到底函式物件實質是一個類的物件,只是通過過載()運算子達到函式的作用。所以定義函式物件為形參時,應該同普通型別一樣,以型別名+物件名的形式展現。 如此,我也發現函式物件和函式作為實參時的不同點:函式是直接寫函式名,函式物件則是類名+(),應該是

程式設計入門——C語言 翁愷 期末考試程式設計

題目內容:分數可以表示為“分子/分母”的形式。編寫一個程式,要求使用者輸入一個分數,然後將其約分為最簡分式。最簡分式是指分子和分母不具有可以約分的成分了。如6/12可以被約分為1/2。當分子大於分母時,不需要表達為整數又分數的形式,即11/8還是11/8;而當分子分母相等時,仍然表達為1/1的分數形式。輸入格

MOOC中國大學慕課C語言期末程式設計試題

MOOC中國大學慕課C語言期末程式設計試題 1 星期推算。(20分) 題目內容:假設今天是星期日,編寫一個程式,求2018天后是星期幾。 輸出樣例:星期二 2 求和S。(20分) 題目內容:求s=1+(1+2)+…+(1+2+3+…+n)的值,其中n由鍵盤輸入。

程式設計入門——C語言 翁愷 期末考試測試

期末試卷返回 本次得分為:87.00/90.00, 本次測試的提交時間為:2018-05-20。 1單選(3分) 若變數已正確定義,執行 scanf("%d%c%f", &op1, &op, &op2); 輸入什麼之後,op1的值為1,op的值為’*’,op2的值為2.0. 得分/總

C語言程式設計進階 翁愷 期末考試

課程 名校 學校雲 學 · 問  新 客戶端 搜尋感興趣的課程 個人中心 翁愷 評價課程 公告 評分標準 課件 測驗與作業 考試 討論區 課程分享 微信提醒課程進度 掃碼下載APP 幫助中心 期

C語言程式設計進階 翁愷 期末考試程式設計題部分

1 最小包圍矩形(10分) 題目內容: 給定一組二維座標,表示直角座標系內的一個多邊形的連續的頂點的座標序列。計算能包圍這個多邊形的平行於座標軸的最小矩形,輸出它的左下角和右上角的座標。 輸入格式: 第一行是一個正整數n表示頂點的數量,第二行是n組整數,依次表示

面向考試程式設計C++筆記

為了學校的考試,做一下C++的筆記。 教材是  機械工業出版社/劉振安 的 C++程式設計 不推薦這本書。這本書太薄,很多東西寫得不夠詳細,也不繫統。基本上就是應付考試。 百度上面有PPT,估計一週就能看完這三百多頁ppt. https://wenku.baidu.com/

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

程式設計題#1來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)注意: 總時間限制: 1000ms 記憶體限制: 65536kB描述下面程式輸出的結果是:05請填空:12345678910111213#include <

Java程式設計綜合練習題(期末考試)

一:判斷題 1:如果使用import語句引入了整個包中的類,那麼可能會增加編譯時間。但絕對不會影響程式執行的效能,因為當程式執行時,只是將真正使用的類的位元組碼檔案載入到記憶體。 (T) 2:一個數組可以存放許多不同型別的數值。 (F)    3:

鄭大期末考試彙編程式設計題程式碼參考

2011級的,輸入數字停止。不能用.686指令集。不寫就好,預設.8086指令集。而且字串輸出碰到'$'才終止。而且指令集要寫在.model 前才有效,不要看列印店的參考程式碼。 .model small .stack .data hint byte 'Input num

Python語言程式設計(嵩天老師)期末考試—第四部分全部

今天下午抽空把最後一部分的考試考完了,總體來說,沒有前面的兩章困難,很多都是基礎問題,或者是書上的示例程式,進行了一些小的調整和修改,因為程式碼長度都不是很長,就把所有的程式放到一篇部落格裡。1.凱撒密碼B示例程式在課程配套教材《Python語言程式設計基礎》83頁。稍作修改

[Coursera C++程式設計] 第九周作業

程式設計題#1 來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。) 注意: 總時間限制: 1000ms 記憶體限制: 65536kB 描述 下面的程式用列舉法解決如下問題,請填空。 平面上的一個矩形,如果其邊平行於座

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

程式設計題 #1來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)注意: 總時間限制: 1000ms 記憶體限制: 65536kB下面程式的輸出結果是:A::FunC::Do請填空:1234567891011121314151

北航軟院2012級C#期末考試部分考題解答

linq 沒有 present prop between you 參數 變量 只讀 博主註:本渣渣水平有限,文中若有不對的地方敬請指出,謝謝。 一、選擇題(2*15=30) 1.In C# what is base class of all reference t

coursera 《現代操作系統》 -- 第十三周 期末考試

fda 意思 是什麽 tar -h bad 訪問 等待時間 ges 3 下列關於中斷和異常的敘述中,哪一個是錯誤的? x86系列處理器提供的4個處理器特權級別中R0的特權級別最高 中斷向量(中

這是C語言結課前(期末考試之前)寫給牛曉霞的一封信!

別人 red 角度 不想 通過 都沒有 我們 負責 有一種 致尊敬的牛曉霞老師: 這是黃領衫的感想,也是想告訴你的話! 在老師說要給班裏寫得好的人發黃領衫的時候,我當時的想法是我很有可能拿到這份獎品的,怎麽說呢,算是一種自信吧,或是對自己的態度的認可。雖然我能力可能不及他人

學習筆記-C語言1(程式設計入門)

C語言和C++是作為一名程式設計師必備技能,非科班出身的我對這些語言一直是一知半解,後來更是直接使用簡單易上手的python,matlab語言。今天終於開始系統的學習了C了,記錄一些學習筆記,方便後面檢視,如有不妥,還請幫忙指正。 1. 檔案開頭 檔案開頭要加入:# include<

C++基礎學習之程式設計模組(4)

函式和二維陣列 在C++中,二維陣列的定義完全與一維陣列不同: int data[3][4] = {{1, 2, 3, 4}, {9, 8, 7, 6}, {2, 4, 6, 8}}; data不能當作是一維陣列的指標然後去訪問12個元素,data[0~2]每個都是一個一維陣列