[土狗之路]coursera上C语言进阶第二周作业

摸爬滚打的,总算把第一门课弄完了,赶紧开工第二门。

第一题:

编程题#1:寻找下标

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

已知一个整数数组x[],其中的元素彼此都不相同。找出给定的数组中是否有一个元素满足x[i]=i的关系,数组下标从0开始。

举例而言,如果x[]={-2,-1,7,3,0,8},则x[3] = 3,因此3就是答案。

输入

第一行包含一个整数n (0 < n < 100),表示数组中元素的个数。
第二行包含n个整数,依次表示数组中的元素。

输出

输出为一个整数,即满足x[i]=i的元素,若有多个元素满足,输出第一个满足的元素。若没有元素满足,则输出“N”。

样例输入

第一组
6
-2 -1 7 3 4 8
第二组
6
9 9 9 9 9 9

样例输出

第一组
3
第二组
N

#include
using namespace std;
int main() {
	int n;
	cin >> n;
	int arr[100];
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	char find = 'N';
	for (int i = 0; i < n; i++) {
		if (i == arr[i]) {
			find = 'Y';
			cout << i << endl;
			break;
		}
	}
	if (find == 'N')
		cout << find;
	cout << endl;
	return 0;
}

这道题就是送分的,不多说了。
第二题四大湖很坑,我想了半天。

编程题#2:四大湖

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

我国有4大淡水湖。

A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。

B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。

C说:洪泽湖最小,洞庭湖第三。

D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。

已知这4个湖的大小均不相等,4个人每人仅答对一个,

请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给出他们的大小排名。

输入

无。

输出

输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。

样例输入

(无)

样例输出

3(样例输出仅供格式参考,此题只有一个解, 。)

#include
using namespace std;
int main() {
	int a, b, c, d;//四个湖
	for (int a = 1; a <= 4; a++) {
		for (int b = 1; b <= 4; b++) {
			if (a == b)//根据题意,不会有两个湖相等,所以如果相等,直接跳过,减少遍历次数,节约时间。
				continue;
			else {
				for (int c = 1; c <= 4; c++) {
					if (bool(c != b&&c != a) == 0) //理由同上
						continue;
					else {
						for (int d = 1; d <= 4; d++) {
							int O = bool(b == 1) + bool(d == 4) + bool(a == 3);//第一个人说的,用int来统计他说对的个数
							int P = bool(d == 1) + bool(b == 4) + bool(a == 2) + bool(c == 3);
							int Q = bool(d == 4) + bool(b == 3);
							int R = bool(a == 1) + bool(c == 4) + bool(d == 2) + bool(b == 3);
							if (c != d&&b!=d&d!=a&&O == 1 && P == 1 && Q == 1 && R == 1) {//每个人只能说对一句话
								cout << a << endl;
								cout << b << endl;
								cout << c << endl;
								cout << d << endl;
							}
						}
					}
				}
			}
		}
	}
	return 0;
}

接着第三题:

编程题#3:发票统计

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

有一个小型的报账系统,它有如下功能:

(1)统计每个人所报发票的总钱数

(2)统计每类发票的总钱数

将此系统简化为如下:假设发票类别共有A、B、C三种;一共有三个人,ID分别为1、2、3。

输入

系统输入包含三行,每行第一个数为人员ID(整型,1或2或3),第二个数为发票总张数(张数不超过100),之后是多个发票类别(字符型,A或B或C)和相应发票金额(单进度浮点型,不超过1000.0)。

输出

输出包含六行,前三行为每人(按ID由小到大输出)所报发票总钱数(保留两位小数),后三行为每类发票的总钱数(保留两位小数)。

样例输入

1 5 A 1.0 A 2.0 C 1.0 B 1.0 C 1
3 3 B 1 C 2 C 1
2 4 B 1 A 1 C 1 A 1

样例输出

1 6.00
2 4.00
3 4.00
A 5.00
B 3.00
C 6.00

#include
#include
using namespace std;
int main() {
	float countA = 0.00;
	float countB = 0.00;
	float countC = 0.00;
	float count1 = 0.00;
	float count2 = 0.00;
	float count3 = 0.00;
	for (int i = 0; i < 3; i++) {
		int ID;
		cin >> ID;
		int n;
		cin >> n;
		for (int j = 0; j < n;j++){
			char kind;
			float money;
			cin >> kind >> money;
			if(kind=='A')
				countA +=money;
			if (kind == 'B')
				countB += money;
			if (kind == 'C')
				countC += money;
			if (ID == 1)
				count1 += money;
			if (ID == 2)
				count2 += money;
			if (ID ==3)
				count3 += money;
		}
	}
	cout << "1 " << setiosflags(ios::fixed) <

嗯嗯,第四题了:

编程题#4:Tomorrow never knows?

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

甲壳虫的《A day in the life》和《Tomorrow never knows》脍炙人口,如果告诉你a day in the life,真的会是tomorrow never knows?相信学了计概之后这个不会是难题,现在就来实现吧。

读入一个格式为yyyy-mm-dd的日期(即年-月-日),输出这个日期下一天的日期。可以假定输入的日期不早于1600-01-01,也不晚于2999-12-30。

输入

输入仅一行,格式为yyyy-mm-dd的日期。

输出

输出也仅一行,格式为yyyy-mm-dd的日期

样例输入

2010-07-05

样例输出

2010-07-06

提示

闰年的标准:

(1)普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)

(2)世纪年能被400整除的是闰年。(如2000年是闰年,1100年不是闰年)

可以利用一个字符变量吃掉输入的短横线(减号),输出时请活用setfill和setw 控制符。

嗯,这道题的重点就是吃掉控制符,以及输出格式。

#include
#include 
using namespace std;
int main() {
	int year, month, day;
	char a, b;
	cin >> year >> a >> month >> b >> day;
		bool leap = false;//这个用来判断闰年,之前有题目写了这个,这里不多说
		bool special=false;//这里标记输入天数是否跨月,跨年,因为那些要特殊处理,其他的只要天数加1就好
		if (year % 4 == 0 & year % 100 != 0)
			leap = true;
		if (year % 400 == 0)
			leap = true;
		if (month == 2) {//对二月进行处理,注意闰年
			if (leap == true && day == 29) {
				month++;
				day = 1;
				special = true;
			}
			if (leap == false && day == 28) {
				month++;
				day = 1;
				special = true;
			}
		}
		if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && (day == 31)) {//对大月进行处理 
			if (month == 12) {//其中12月跨年,单独处理
				month = 1;
				day = 1;
				year++;
				special = true;
			}
			else {//其他的跨月
				day = 1;
				month++;
				special = true;
			}
		}
		if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 30) {然后对小月进行处理
			day = 1;
			month++;
			special = true;
		}
		if (special == false)//对不特殊的进行处理
			day++;
		cout << year << '-' << setw(2)<

第五题:

编程题#5:细菌实验分组

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

有一种细菌分为A、B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱。在一次为时一个 小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组。

输入

输入有多行,第一行为整数n(n≤100),表示有n个培养皿。

其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。

输出

输出有多行:

第一行输出A亚种培养皿的数量,其后每行输出A亚种培养皿的编号,按繁殖率升序排列。

然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。

样例输入

5
1 10 3456
2 10 5644
3 10 4566
4 20 234
5 20 232

样例输出

3
1
3
2
2
5
4

提示

亚种内部细菌繁殖能力差异 远远小于 亚种之间细菌繁殖能力差异。

也就是说,亚种间任何两组细菌的繁殖率之差都比亚种内部两组细菌的繁殖率之差大。

这题之前抄写过,所以这次用的就是抄写的作业。

#include 
using namespace std;
int main() {
	int n; // n为细菌的数量
		   // id记录细菌的编号, rate记录细菌的繁殖率,第i个细菌对应id[i]和rate[i]
	int id[100];
	double rate[100];

	cin >> n;
	for (int i = 0; i < n; i++) {
		int initial, final;
		cin >> id[i] >> initial >> final;
		rate[i] = (double)final / initial;
	}

	// 对整个细菌排序
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n - i - 1; j++) {
			if (rate[j + 1] > rate[j]) {
				int tmpId = id[j];
				id[j] = id[j + 1];
				id[j + 1] = tmpId;
				double tmpRate = rate[j];
				rate[j] = rate[j + 1];
				rate[j + 1] = tmpRate;
			}
		}
	}

	// 记录最大的差
	double maxDiff = 0;
	// 和最大差的下标
	int maxDiffIndex = 0;
	for (int i = 0; i < n - 1; i++) {
		double diff = rate[i] - rate[i + 1];
		if (maxDiff < diff) {
			maxDiff = diff;
			maxDiffIndex = i;
		}
	}

	//输出繁殖率较大的那组细菌
	cout << maxDiffIndex + 1 << endl;
	for (int i = maxDiffIndex; i >= 0; i--) {
		cout << id[i] << endl;
	}

	//输出繁殖率较小的那组细菌
	cout << n - maxDiffIndex - 1 << endl;
	for (int i = n - 1; i >= maxDiffIndex + 1; i--) {
		cout << id[i] << endl;
	}
	return 0;
}

最后一题:

编程题#6:流感传染

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

输入

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。

接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

接下来的一行是一个整数m,m不超过100.

输出

输出第m天,得流感的人数

样例输入

5
....#
.#.@.
.#@..
#....
.....
4

样例输出

16

#include
using namespace std;
int main() {
	char room[101][101];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> room[i][j];
		}
	}
	int m;
	cin >> m;
	for (int k = 0; k < m-1; k++) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (room[i][j] == '@') {
					if (i != 0 && room[i - 1][j] != '#' && room[i - 1][j] != '@')//边界不进行运算,严格控制在输入区间内
						room[i - 1][j] = '$';//这里用$标记待传染,因为遍历一遍之后才能够进行传染,否则会影响遍历结果,导致错误
					if (j != 0 && room[i][j - 1] != '#'&& room[i][j-1] != '@')
						room[i][j - 1] = '$';
					if (j != (n-1) && room[i][j + 1] != '#'&& room[i][j+1] != '@')
						room[i][j + 1] = '$';
					if (i != (n-1) && room[i + 1][j] != '#'&& room[i + 1][j] != '@')
						room[i + 1][j] = '$';
				}
			}		
			}
		for (int i = 0; i < n; i++) {//整个遍历之后,进行传染
			for (int j = 0; j < n; j++) {
				if (room[i][j] == '$')
					room[i][j] = '@';
			}
		}//然后一天结束,跟天黑请闭眼一样。
	}
	int count = 0;//然后开始数数
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (room[i][j] == '@')
				count++;
		}
	}
	cout << count << endl;
	return 0;
}


你可能感兴趣的:(C++相关)