Bootstrap

C++蓝桥杯基础篇(二)

片头

嗨!小伙伴们,今天我们将学习C++蓝桥杯基础篇(二),继续练习相关习题,准备好了吗?咱们开始咯~


第1题

简单计算器输入两个数,以及一个运算符 +,-,*,/,输出这两个数运算后的结果。当运算符是/,且除数是0时,输出"Divided byzero!";当输入的字符不是 +,-,* , / 时,输出"Invalid operator!”

代码如下:

//简易计算器
//输入2个数,以及一个运算符+、-、*、/,输入这2个数运算后的结果
//当运算符是/,且除数是0时,输出"Divided by zero!",
//当输入的字符不是+、-、*、/时,输出"Invalid operator!"

int main() {
	int a, b;
	char c;
	cin >> a >> b >> c;

	if (c == '+') {
		cout << a + b << endl;
	}
	else if (c == '-') {
		cout << a - b << endl;
	}
	else if (c == '*') {
		cout << a * b << endl;
	}
	else if (c == '/') {
		if (b == 0) {
			cout << "Divided by zero!" << endl;
		}
		else cout << a / b << endl;
	}
	else {
		cout << "Invalid operator!" << endl;
	}

	return 0;
}

注意:当执行除法运算时,必须加上if-else条件判断;如果不加else,那么当除数为0时,依然会执行 a/b,编译器报错。 


第2题

输入一个0~100之间的分数,如果大于等于85,输出A,如果大于等于70并且小于85,输出B,如果大于等于60并且小于70,输出C,如果小于60,输出D

代码如下:

方法一:

int main() {
	int score;
	cin >> score;

	if (score >= 85) {
		cout << 'A' << endl;
	}
	else if (score >= 70 && score < 85) {
		cout << 'B' << endl;
	}
	else if (score >= 60 && score < 70) {
		cout << 'C' << endl;
	}
	else {
		cout << 'D' << endl;
	}
	return 0;
}

我们可以将上面的代码完善一下,可以将条件简化。 

方法二: 

int main() {
	int score;
	cin >> score;

	if (score >= 85) {
		cout << 'A' << endl;
	}
	else if (score >= 70) {
		cout << 'B' << endl;
	}
	else if (score >= 60) {
		cout << 'C' << endl;
	}
	else {
		cout << 'D' << endl;
	}
	return 0;
}

第3题

判断闰年。闰年有两种情况:(1)能被 100 整除时,必须能被 400 整除(2)不能被 100 整除时,被4整除即可。输入一个年份,如果是闰年输出yes,否则输出 no。

代码如下:

int main() {
	int year;
	cin >> year;

	if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
		cout << "yes" << endl;
	}
	else {
		cout << "no" << endl;
	}
	return 0;
}

第4题  最大值

输入3个数,输出3个数中的最大值

思路:我们可以使用if-else语句来实现,先比较2个数,再和第3个数进行比较

//输入3个数,输出3个数中的最大值
/*
    如果 a >= b,
	    如果 a >= c
		     a是最大值
		否则
		     c是最大值
	否则
	    如果 b >= c
		     b是最大值
		否则
			 c是最大值
*/

int main() {
	int a, b, c;
	cin >> a >> b >> c;

	if (a > b) {
		if (a > c) {
			cout << a << endl;
		}
		else {
		//a<c
			cout << c << endl;
		}
	}
	else {
		//a<b
		if (b > c) {
			cout << b << endl;
		}
		else {
		//b<c
			cout << c << endl;
		}
	}

	return 0;
}

方法二:我们直接进行比较,得出最大值

int main() {
	int a, b, c;
	cin >> a >> b >> c;

	if (a >= b && a >= c) {
		cout << a << endl;
	}
	else if (b >= a && b >= c) {
		cout << b << endl;
	}
	else {
		cout << c << endl;
	}
	return 0;
}

第5题  倍数

代码如下:

//倍数
//读取2个正整数值(A和B)
//如果其中1个是另一个的整数倍,则输出"Sao Multiplos"
//否则输出"Nao sao Multiplos"


int main() {
	int A, B;
	cin >> A >> B;

	if ((A % B == 0) || (B % A == 0)) {
		cout << "Sao Multiplos" << endl;
	}
	else {
		cout << "Nao sao Multiplos" << endl;
	}
	return 0;
}

第6题  零食

代码如下:

//零食
//某商店出售5种零食,零食编号1~5
//5种零食的价目表如下所示

//零食种类            价格
//零食   1           R$ 4.00
//零食   2           R$ 4.50
//零食   3           R$ 5.00
//零食   4           R$ 2.00
//零食   5           R$ 1.50

//现在给定某种零食的编号和数量,请你计算总价值
//输入包含2个整数x和y,其中x为零食编号,y为零食数量
//输出格式为"Total:R$ X",其中,X为总价值,保留2位小数

int main() {
	int x, y;
	cin >> x >> y;

	double ret = 0;

	if (x == 1) {
		ret = 4.00 * y;
	}
	else if (x == 2) {
		ret = 4.50 * y;
	}
	else if (x == 3) {
		ret = 5.00 * y;
	}
	else if (x == 4) {
		ret = 2.00 * y;
	}
	else if (x == 5) {
		ret = 1.50 * y;
	}
	printf("Total:R$ %.2lf\n", ret);

	return 0;
}

方法二:可以在最后计算总价格,减少代码量

int main() {
	int x, y;
	cin >> x >> y;

	double sale;

	if (x == 1) sale = 4;
	else if (x == 2) sale = 4.5;
	else if (x == 3) sale = 5;
	else if (x == 4) sale = 2;
	else if (x == 5) sale = 1.5;

	printf("Total:R$ %.2lf\n", y * sale);

	return 0;
}

第7题  区间

代码如下:

//区间
//给定一个浮点数,请你判断该数字属于以下哪个区间
//[0,25],(25,50],(50,75],(75,100]
//如果给定的数值小于0或大于100,
//则程序输出"Fora de intervalo",表示超出范围
//开区间(a,b):在实数a和实数b之间的所有实数,但不包含a和b
//闭区间[a,b]:在实数a和实数b之间的所有实数,包括a和b
//输入一个浮点数
//判断输入值位于哪个区间,按格式"Intervalo x"输出,
//其中,x为区间范围[0,25],(25,50],(50,75],(75,100]中的1个
//如果数值位于所有区间之外,则输出"Fora de intervalo"

int main() {
	double x;
	cin >> x;

	if (x >= 0 && x <= 25) {
		cout << "Intervalo [0,25]" << endl;
	}
	else if (x > 25 && x <= 50) {
		cout << "Intervalo (25,50]" << endl;
	}
	else if (x > 50 && x <= 75) {
		cout << "Intervalo (50,75]" << endl;
	}
	else if (x > 75 && x <= 100) {
		cout<< "Intervalo (75,100]" << endl;
	}
	else {
		cout << "Fora de intervalo" << endl;
	}

	return 0;
}

第8题  三角形

怎么判断能否构成三角形呢?三角形的任意两边之和大于第三边,两边之差小于第三边

代码如下:

//三角形
//读取3个浮点数(A,B,C)并验证是否可以用它们形成三角形
//如果可能,则计算并输出三角形的周长
//Perimetro = XX.X
//如果不可能,则计算并输出以A和B为底,以C为高的梯形面积
//Area = XX.X
//输入共一行,包含3个浮点数A,B,C
//输出答案,保留一位小数

int main17() {
	double A, B, C;
	cin >> A >> B >> C;

	double area;

	if (   (A + B > C && A - B < C)
		|| (A + C > B && A - C < B)
		|| (B + C > A && B - C < A)) {
		printf("Perimetro = %.1lf\n", A + B + C);
	}
	else {
		area = (A + B) * C * 0.5;
		printf("Area = %.1lf\n", area);
	}

	return 0;
}

方法二:

int main() {
	double a, b, c;
	cin >> a >> b >> c;

	if (a + b > c && a + c > b && b + c > a) {
		printf("Perimetro = %.1lf\n", a + b + c);
	}
	else {
		printf("Area = %.1lf\n", (a + b) * c * 0.5);
	}

	return 0;
}

第9题  游戏时间 

打个比方,我从下午2点开始打游戏,下午5点结束。那么持续时间为5-2=3小时。如果我从晚上10点开始打游戏,一直到凌晨2点,持续时间为24-22+2=4小时。

因此我们需要判断开始时间和结束时间的大小,如果结束时间>开始时间,持续时间为结束-开始;如果结束时间<开始时间,说明结束时间为第二天,应该用24点-开始时间+结束时间

代码如下:

//游戏时间
//读取2个整数A和B,表示游戏的开始时间和结束时间,以时间为单位
//计算游戏的持续时间,已知游戏可以在一天开始并在另一天结束
//最长持续时间为24小时
//如果A和B相等,则视为持续了24小时
//输入供一行,包含2个整数A和B
//输出格式为"O JOGO DUROU X HORA(S)",其中,X为游戏持续时间


int main1() {
	int A, B;
	cin >> A >> B;

	int ret;
	if (B > A) {
		ret = B - A;
	}
	else {
		ret = 24 - A + B;
	}

	cout << "O JOGO DUROU " << ret << " HORA(S)" << endl;

	return 0;
}

第10题  加薪

代码如下:

//加薪
//公司决定给员工加薪,加薪情况如下所示
//		薪水			涨薪幅度
//	  0~400.00			  15%
//  400.01~800.00		  12%
//  800.01~1200.00        10%
// 1200.01~2000.00         7%
// 超过 2000.00			   4%

//读取员工的工资,计算并输出员工的新工资,
//以及员工增加的收入和涨薪幅度

//输入共一行,包含一个保留2位小数的浮点数
int main() {
	double salary;			//员工工资
	cin >> salary;

	double new_salary;		//新工资
	double harvest;			//增加的收入
	double ret;				//涨薪幅度

	if (salary >= 0 && salary <= 400) {
		new_salary = salary * 1.15;
		harvest = new_salary - salary;
		ret = 0.15;
	}
	else if (salary > 400 && salary <= 800) {
		new_salary = salary * 1.12;
		harvest = new_salary - salary;
		ret = 0.12;
	}
	else if (salary > 800 && salary <= 1200) {
		new_salary = salary * 1.10;
		harvest = new_salary - salary;
		ret = 0.10;
	}
	else if (salary > 1200 && salary <= 2000) {
		new_salary = salary * 1.07;
		harvest = new_salary - salary;
		ret = 0.07;
	}
	else {
		new_salary = salary * 1.04;
		harvest = new_salary - salary;
		ret = 0.04;
	}

	printf("员工的新工资为: %.2lf\n", new_salary);
	printf("员工增加的收入为: %.2lf\n", harvest);
	printf("涨薪幅度为: %.0lf %%\n", ret * 100);

	return 0;
}

方法二:

int main() {
	double salary;			//员工工资
	cin >> salary;
	double ret;				//涨薪幅度

	if (salary <= 400)  ret = 0.15;
	else if (salary <= 800)  ret = 0.12;
	else if (salary <= 1200) ret = 0.10;
	else if (salary <= 2000) ret = 0.07;
	else ret = 0.04;
	
	printf("员工的新工资为: %.2lf\n", salary * (1 + ret));
	printf("员工增加的收入为: %.2lf\n", ret * salary);
	printf("涨薪幅度为: %.0lf %%\n", ret * 100);

	return 0;
}

第11题  动物

代码如下:

//动物
//给定3个单词,这些词将根据下表从左到右定义一个动物
//请你确定并输出这个动物的名称

int main() {
	string a, b, c;
	cin >> a >> b >> c;
	if (a == "vertebrado") {
		if (b == "ave") {
			if (c == "carnivoro")
				cout << "aguia" << endl;
			else
				cout << "pomba" << endl;
		}
		else if (b == "mamifero") {
			if (c == "onivoro")
				cout << "homem" << endl;
			else
				cout << "vaca" << endl;
		}
	}
	else if (a == "invertebrado") {
		if (b == "inseto") {
			if (c == "hematofago")
				cout << "pulga" << endl;
			else 
				cout << "lagarta" << endl;
		}
		else if (b == "anelideo") {
			if (c == "hematofago")
				cout << "sanguessuga" << endl;
			else
				cout << "minhoca" << endl;
		}
	}
	return 0;
}

第12题  选择练习1

代码如下:

//选择练习1
//读取4个整数值A,B,C,D
//如果4个整数值同时满足以下条件
// 1.B>C
// 2.D>A
// 3.C+D>A+B
// 4.C>0,D>0
// 5.A是偶数
// 则输出"Valores aceitos",否则,输出"Valores nao aceitos"

//输入占一行,包含4个整数A,B,C,D
//如果输入数值满足题目条件则输出"Valores aceitos"
//否则输出"Valores nao aceitos"
int main5() {
	int A, B, C, D;
	cin >> A >> B >> C >> D;

		if (B > C && D > A && ((C + D) > (A + B)) && C > 0 && D > 0 && (A % 2 == 0)) {
			cout << "Valores aceitos" << endl;
		}
		else {
			cout << "Valores nao aceitos" << endl;
		}
	return 0;
}

第13题  城市名称

代码如下:

//给定一个整数,根据下表确定并输出其对应的城市名称:
//  编号                 城市名称
//   61                   Brasilia
//   71                   Salvador
//   11                   Sao Paulo
//   21                Rio de Janeiro
//   32                Juiz de Fora
//   19                   Campinas
//   27                    Vitoria
//   31                Belo  Horizonte
//如果输入数字不在上表中,则输出"DDD nao cadastrado"

int main() {
	int num;
	cin >> num;

	if (num == 61)        cout << "Brasilia" << endl;
	else if (num == 71)   cout << "Salvador" << endl;
	else if (num == 11)   cout << "Sao Paulo" << endl;
	else if (num == 21)   cout << "Rio de Janeiro" << endl;
	else if (num == 32)   cout << "Juiz de Fora" << endl;
	else if (num == 19)   cout << "Campinas" << endl;
	else if (num == 27)   cout << "Vitoria" << endl;
	else if (num == 31)   cout << "Belo  Horizonte" << endl;
	else cout << "DDD nao cadastrado" << endl;

	return 0;
}

第14题  坐标

 代码如下:

//坐标
//给定2个保留1位小数的浮点数X,Y,用来表示一个点的横纵坐标
//请你判断该点在坐标系中的位置
//共一行,包含2个浮点数X,Y,表示点的横纵坐标
//如果点在第一象限,则输出"Q1",在第二象限,则输出"Q2"....
//如果点在原点处,则输出"Origem"
//如果点在x坐标轴上,则输出"Eixo X";在y坐标轴上,则输出"Eixo Y"


int main() {
	double x, y;    //点的横纵坐标
	cin >> x >> y;

	if (x == 0 && y == 0) cout << "Origem" << endl;
	else if (y == 0)      cout << "Eixo X" << endl;
	else if (x == 0)      cout << "Eixo Y" << endl;

	if (x > 0 && y > 0)       cout << "Q1" << endl;
	else if (x < 0 && y > 0)  cout << "Q2" << endl;
	else if (x < 0 && y < 0)  cout << "Q3" << endl;
	else if (x > 0 && y < 0)  cout << "Q4" << endl;

	return 0;
}

 第15题  三角形类型

注意:等边三角形一定是锐角三角形,不能是直角、钝角三角形。等腰三角形有可能是锐角三角形或者钝角三角形。

此外,题目明确输入的3个数随机,需要排成降序。我们可以在main函数外面定义Swap函数,在main函数中直接调用即可。

代码如下:

//三角形类型
//读取表示三角形3条边的3个浮点数(A,B,C),
//并按照降序排列,使A边是三边中最大的一边
//根据以下情况,确定它们可以组成的三角形类型:
//如果 A >= B + C ,
//则说明三条边不能构成三角形,请输出"NAO FORMA TRIANGULO"
//否则,说明三条边可以构成三角形,按照如下情况输出:
//如果 A*A = B*B + C*C , 请输出: TRIANGULO RETANGULO
//如果 A*A > B*B + C*C , 请输出: TRIANGULO OBTUSANGULO
//如果 A*A < B*B + C*C , 请输出: TRIANGULO ACUTANGULO
//如果三个边长度都相同 , 请输出: TRIANGULO EQUILATERO
//如果只有2个边长度相同而第3个边长度不同
//请输出: TRIANGULO ISOSCELES

//输入共一行,包含3个浮点数A,B,C
//输出A,B,C组成的三角形的类型
//上述条件可能满足不止一条,
//这种情况下将所有类型名称,按照题目介绍顺序输出,每行输出一条

//排降序
void Swap(double& m, double& n) {
	int temp = m;
	m = n;
	n = temp;
}


int main() {
	double a, b, c;
	cin >> a >> b >> c;

	if (a < b) Swap(a, b);
	if (a < c) Swap(a, c);
	if (b < c) Swap(b, c);

	if (a >= b + c)  cout << "不构成三角形" << endl;
	else {
	    if (a * a == b * b + c * c)			 cout << "直角三角形" << endl;
		else if (a * a > b * b + c * c)		 cout << "钝角三角形" << endl;
		else if (a * a < b * b + c * c)		 cout << "锐角三角形" << endl;
	    if (a == b && b == c)			     cout << "等边三角形" << endl;
		else if (a == b || a == c || b == c) cout << "等腰三角形" << endl;
	}
	return 0;
}

第16题  游戏时间2

诶,刚刚我们做了游戏时间1,这道题和上一道题有啥不一样的地方呢?

噢,现在是用小时和分钟来分别表示开始时间和结束时间。比如,开始时间为下午2点10分,结束时间为下午5点30分,一共持续了3个小时20分钟。再比如,开始时间为晚上22点30分,结束时间为凌晨3点50分,一共持续了2个小时20分钟。

但是,这只是我们人思考的方式。那么,怎么将这种方式转化为计算机能够执行的代码呢?

我们可以统一单位,将小时转换为分钟进行计算。最后将分钟转换为小时。 

思路:定义变量start和end分别表示开始时间和结束时间(统一将小时转换为分钟),如果结束时间>开始时间,那么用end-start;如果结束时间<开始时间,用24×60分钟-开始时间+结束时间,最后将得出的结果/60,得到小时,将结果%60,得到分钟。

代码如下:

//游戏时间2
//读取4个整数A,B,C,D,用来表示游戏的开始时间和结束时间
//其中A和B为开始时刻的小时和分钟数
//C和D为结束时刻的小时和分钟数
//请你计算游戏的持续时间
//比赛最短持续1分钟,最长持续24小时
//输入共一行,包含4个整数A,B,C,D
//输出格式为"O JOGO DUROU X HORA(S) E Y MINUTO(S)",
//表示游戏共持续了X小时Y分钟

int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;

	//统一单位,全部转化成分钟

	int start = a * 60 + b;
	int end = c * 60 + d;
	int ret;

	if (end > start) {
		ret = end - start;
	}
	else {
		ret = 24 * 60 - start + end;
	}

	cout << "O JOGO DUROU  " << ret / 60 << "  HORA(S) E  " << ret % 60 << "  MINUTO(S)";
	return 0;
}

第17题  税

对于这道题,我们需要分段考虑。

比如,我的工资为5000元,0~2000元的部分不收税,2000~3000元部分税率为8%,3000~4500元部分税率为18%,超过4500元的部分,税率为28%。那么,需要缴纳的税为:(3000-2000)× 8% +(4500-3000)× 18% + (5000-4500)× 28% = 490元。

代码如下:

//税
//读取一个保留2位小数的浮点数值,表示一个公民的工资
//在公民缴纳个人所得税时,不同收入部分需要缴纳的税率也是不同的
//请根据下表确定该公民需要缴纳的个人所得税是多少
//      薪资					税率
//	   0.00~2000.00			     无
//	2000.01~3000.00				 8%
//	3000.01~4500.00				18%
//  4500元以上					28%

//输入共一行,包含1个浮点数
//输出格式为"R$ X",其中,X为个税的金额,保留2位小数
//如果公民收入低于2000,则输出"Isento"

//易错题!!!!
int main() {
	double salary;
	cin >> salary;

	double temp = salary;

	double y;
	double tax;
	double Sum = 0;

	if (temp < 2000) cout << "Isento" << endl;
	else {
		if (temp > 2000) {
			y = 3000;
			tax = 0.08;
			if (temp < y) y = temp;
			Sum += (y - 2000) * tax;
		}
		if (temp > 3000) {
			y = 4500;
			tax = 0.18;
			if (temp < y) y = temp;
			Sum += (y - 3000) * tax;
		}
		if (temp > 4500) {
			tax = 0.28;
			Sum += (temp - 4500) * tax;
		}
		printf("R$ %.2lf\n", Sum);
	}
	return 0;
}

第18题  简单排序

代码如下:

//简单排序
//读取3个数并按升序对它们进行排序
//输入共一行,包含3个整数
//首先,将3个整数按照升序顺序输出,每行输出一个整数
//接着,输出一个空行
//紧接着,将3个整数按原输出顺序输出,每行输出一个整数

void Swap(int& m, int& n) {
	int temp = m;
	m = n;
	n = temp;
}


int main() {
	int a, b, c;
	cin >> a >> b >> c;

	int x = a, y = b, z = c; //用x,y,z分别保存原来a,b,c的值

	if (a > b) Swap(a, b);
	if (a > c) Swap(a, c);
	if (b > c) Swap(b, c);

	cout << a << endl << b << endl << c << endl << endl;

	cout << x << endl << y << endl << z << endl;


	return 0;
}

第19题  一元二次方程式

代码如下:

//一元二次方程公式
//读取3个浮点数a,b,c的值,
//利用一元二次方程求根公式对方程ax^2+bx+c = 0,进行求解
//一元二次方程求根公式为: 
// x1 = -b+sqrt(b^2-4ac)/2a ; x2 = -b-sqrt(b^2-4ac)/2a
//如果 b^2-4ac < 0,导致方程无解或 a = 0,则输出"Impossivel calcular"
//输入3个浮点数a,b,c
//参照输出格式,输出方程的根
//输出结果保留5位小数,如果无解则输出"Impossivel calcular"
//2个根可以按任意顺序输出,都算正确
//数据保证不存在只有1个解的情况

int main() {
	double a, b, c;
	cin >> a >> b >> c;

	double x1, x2;

	double delt = b * b - 4 * a * c;
	if (delt < 0 || a == 0) cout << "Impossivel calcular" << endl;
	else {
		x1 = (-b + sqrt(delt))  / (2 * a);
		x2 = (-b - sqrt(delt))  / (2 * a);

		printf("R1 = %.5lf\n", x1);
		printf("R2 = %.5lf\n", x2);
	}
	return 0;
}

第20题  平均数3

代码如下:

//平均数3
//读取4个数字N1,N2,N3,N4,
//这4个数字都是保留1位小数的浮点数,对应于学生获得的4个分数
//这4个分数的权重分别为2,3,4,1
//请计算学生成绩的平均值X并输出"Media: X"
//接下来分为以下3种情况:
// 1.如果平均值为7.0或更高,则输出"Aluno aprovado."
// 2.如果平均值小于5.0,则输出"Aluno reprovado."
// 3.如果平均值介于5.0和7.0之间,则输出"Aluno em exame."
//并再读取一个数字Y,然后输出"Nota do exame: Y"
//接下来重新计算平均值 Z = (X+Y)/2,
//如果 Z>=5.0 ,则输出"Aluno aprovado."
//否则输出"Aluno reprovado."
//最后输出"Media final: Z",表示学生的最终成绩

//输入中包含4个浮点数,表示学生的4个成绩
//也有部分满足情况3的数据,多包含一个浮点数
//输出的结果均保留1位小数,具体形式参照题目描述和输出样例

int main() {
	double n1, n2, n3, n4;
	scanf("%lf%lf%lf%lf", &n1, &n2, &n3, &n4);

	double X;
	X = (2 * n1 + 3 * n2 + 4 * n3 + 1 * n4) / (2 + 3 + 4 + 1);
	printf("Media: %.1lf\n", X);

	if (X >= 7.0) cout << "Aluno aprovado." << endl;
	else if (X < 5.0) cout << "Aluno reprovado." << endl;
	else {
		cout << "Aluno em exame." << endl;
		double Y;
		scanf("%lf", &Y);
		printf("Nota do exame: %.1lf\n", Y);
		double Z = (X + Y) / 2;
		if (Z >= 5.0) cout << "Aluno aprovado." << endl;
		else cout << "Aluno reprovado." << endl;
		printf("Media final: %.1lf\n", Z);
	}
	return 0;
}

片尾

今天我们学习了C++蓝桥杯基础篇(二),希望这篇文章对友友们有所帮助!!!

求点赞收藏加关注!!!

谢谢大家!!!

;