片头
嗨!小伙伴们,今天我们将学习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++蓝桥杯基础篇(二),希望这篇文章对友友们有所帮助!!!
求点赞收藏加关注!!!
谢谢大家!!!