版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ada_lake/article/details/87621485
算法笔记@Ada_Lake
算法笔记代码保留地~~~
2.3小节——C/C++快速入门->选择结构
问题 A: 例题4-1 一元二次方程求根
- 题目描述 ,求一元二次方程ax2+bx+c=0的根,三个系数a, b, c由键盘输入,且a不能为0,但不保证b2-4ac>0。程序中所涉及的变量均为double类型。
- 输入,以空格分隔的一元二次方程的三个系数,双精度double类型
- 输出,分行输出两个根如下 (注意末尾的换行) :
r1=第一个根
r2=第二个根
结果输出时,宽度占7位,其中小数部分2位。
如果方程无实根,输出一行如下信息 (注意末尾的换行) :
No real roots! - 样例输入, 1 2 3
- 样例输出, No real roots!
我的理解
毕竟是前面的基础知识,写下来是怕自己犯了没注意的小错误。
嗯,很简单的一道题
由题意知输出是有三种情况的,所以可以用条件判断 if else if else
**以下是代码**
// Ada
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c, r1, r2;
scanf("%lf %lf %lf", &a, &b, &c);
if( a ){
if(( pow(b, 2) - 4 * a *c ) > 0 ) {
r1 = ( -b + sqrt(pow(b, 2) - 4 * a * c) ) / 2 * a;
r2 = ( -b - sqrt(pow(b, 2) - 4 * a * c) ) / 2 * a;
printf("r1=%7.2f\n", r1);
printf("r2=%7.2f", r2);
}
else{
printf("No real roots!\n");
}
}
return 0;
}
问题 B: 例题4-2 比较交换实数值
- 题目描述 ,从键盘输入2个实数,按照代数值由小到大的顺序输出这两个数。
- 输入,用空格分隔的两个实数。
- 输出,从小到大输出这两个实数,中间以空格来分隔,小数在前,大数在后。
小数点后保留2位小数。
末尾输出换行符。 - 样例输入, 3.6 -2.3
- 样例输出, -2.30 3.60
我的理解
两者交换用第三个数
**以下是代码**
// Ada
#include<stdio.h>
int main(){
double a, b;
scanf("%lf %lf", &a, &b);
if( a > b){
printf("%.2f %.2f\n", b, a);
}
else{
printf("%.2f %.2f\n", a, b);
}
return 0;
}
问题 C: 例题4-3 比较交换3个实数值,并按序输出
- 题目描述 ,从键盘输入3个实数a, b, c,通过比较交换,将最小值存储在变量a中,最大值存储在变量c中,中间值存储在变量b中,并按照从小到大的顺序输出这三个数a, b, c。
末尾输出换行。 - 输入,输入以空格分隔的三个实数
- 输出,按照从小到大的顺序输出这三个实数,中间以空格分隔,最小值在前,最大值在后。小数点后保留2位小数。
注意末尾的换行。 - 样例输入, 3 7 1
- 样例输出, 1.00 3.00 7.00
我的理解
三个数相比较,平级关系用if
**以下是代码**
// Ada
#include<stdio.h>
int main(){
double a, b, c, t;
scanf("%lf %lf %lf", &a, &b, &c);
if( a > b ) {
t = a;
a = b;
b = t;
}
if ( a > c ) {
t = a;
a = c;
c = t;
}
if( b > c ) {
t = b;
b = c;
c = t;
}
printf("%.2f %.2f %.2f\n", a, b, c);
return 0;
}
问题 D: 习题4-4 三个整数求最大值
- 题目描述 ,有3个整数a, b, c,由键盘输入,输出其中最大的数。
- 输入,以空格分割的三个整数。
- 输出,三个数中的最大值,末尾换行。
- 样例输入, 1 3 2
- 样例输出, 3
我的理解
三个数相比较,三者取其一用if else if if
或者两两比较 用三目运算符 ( ? :)
**以下是代码**
// Ada
#include<stdio.h>
int main(){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if( ( a > b ) && ( a > c) ) {
printf("%d\n", a);
}
else if (( b > a ) &&( b > c)){
printf("%d\n", b);
}
else{
printf("%d", c);
}
return 0;
}
// Ada
#include<stdio.h>
int main(){
int a, b, c, temp1, temp2;
scanf("%d %d %d", &a, &b, &c);
temp1 = a > b ? a : b;
temp2 = c > temp1 ? c : temp1;
printf( "%d", temp2);
return 0;
}
问题 E: 习题4-10-1 奖金计算
- 题目描述 ,某企业发放的奖金根据利润提成。利润I低于或等于100000时,奖金可提10%;利润高于100000元,低于200000元(100000<I<=200000)时,低于100000元的部分仍按10%提成,高于100000元的部分提成比例为7.5%;200000<I<=400000时,低于200000元的部分仍按上述方法提成(下同),高于200000元的部分按5%提成;400000<I<=600000元时,高于400000元的部分按3%提成;600000<I<=1000000时,高于600000元的部分按1.5%提成;I>1000000元时,超过1000000元的部分按1%提成。
从键盘输出当月利润I,求应发奖金数,奖金精确到分。
要求用if语句实现。 - 输入,企业利润,小数,双精度double类型
- 输出,应发奖金数,保留2位小数,末尾换行。
- 样例输入, 1050
- 样例输出, 105.00
我的理解
题目太长,一般想的是switch case
但题目已经要求用if
**以下是代码**
// Ada
#include<stdio.h>
int main(){
double I, bouns;
scanf("%lf", &I);
if( I <= 100000 ) {
bouns = I * 0.1;
}
else if ( ( I >= 100000) && ( I <= 20000) ) {
bouns = ( 100000 * 0.1 ) + ( ( I - 100000 ) * 0.075 );
}
else if( ( I >= 200000 ) && ( I <= 400000 ) ) {
bouns = ( 100000 * 0.1 ) + ( 100000 * 0.075 ) + ( ( I - 200000 ) * 0.05 );
}
else if( ( I >= 400000 ) && ( I <= 600000 ) ) {
bouns = ( 100000 * 0.1 ) + ( 100000 * 0.075 ) + ( 200000 * 0.05) + ( ( I - 400000 ) * 0.03 );
}
else if( ( I >= 600000 ) && ( I <= 1000000 ) ) {
bouns = ( 100000 * 0.1 ) + ( 100000 * 0.075 ) + ( 200000 * 0.05) + ( 200000 * 0.03) + ( ( I - 600000 ) * 0.015 );
}
else{
bouns = ( 100000 * 0.1 ) + ( 100000 * 0.075 ) + ( 200000 * 0.05) + ( 200000 * 0.03) + ( 400000 * 0.015) + ( ( I - 1000000 ) * 0.010 );
}
printf("%.2f\n", bouns);
return 0;
}
**用swith的方法**
case里放的是表达式,但目前我看到的都是0-10的整数,因此使用时要想办法让判断条件由小于10000-100000变为0-10
**以下为代码**
// Ada
#include<stdio.h>
int main(){
double I, bouns, bonus1, bonus2, bouns3, bouns4, bouns5;
int b;
scanf("%lf", &I);
bonus1 = I * 0.1;
bonus2 = ( 100000 * 0.1 ) + ( ( I - 100000 ) * 0.075 );
bouns3 = ( 100000 * 0.1 ) + ( 100000 * 0.075 ) + ( ( I - 200000 ) * 0.05 );
bouns4 = ( 100000 * 0.1 ) + ( 100000 * 0.075 ) + ( 200000 * 0.05) + ( 200000 * 0.03) + ( ( I - 600000 ) * 0.015 );
bouns5 = ( 100000 * 0.1 ) + ( 100000 * 0.075 ) + ( 200000 * 0.05) + ( 200000 * 0.03) + ( 400000 * 0.015) + ( ( I - 1000000 ) * 0.010 );
b = I/100000;
switch(b){
case 0:
case 1:
bouns = bonus1;
break;
case 2:
case 3:
bouns = bonus2;
break;
case 4:
case 5:
bouns = bouns3;
break;
case 6:
case 7:
case 8:
case 9:
bouns = bouns4;
break;
case 10:
bouns = bouns5;
break;
}
printf("%.2f\n", bouns);
return 0;
}