片头
嗨!小伙伴们,今天我们将学习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 >= ca是最大值否则c是最大值否则如果 b >= cb是最大值否则c是最大值
*/int main() {int a, b, c;cin >> a >> b >> c;if (a > b) {if (a > c) {cout << a << endl;}else {//a<ccout << c << endl;}}else {//a<bif (b > c) {cout << b << endl;}else {//b<ccout << 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;elsecout << "pomba" << endl;}else if (b == "mamifero") {if (c == "onivoro")cout << "homem" << endl;elsecout << "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;elsecout << "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++蓝桥杯基础篇(二),希望这篇文章对友友们有所帮助!!!
求点赞收藏加关注!!!
谢谢大家!!!