算法笔记习题 2.3小节

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ada_lake/article/details/87621485

算法笔记@Ada_Lake

算法笔记代码保留地~~~

2.3小节——C/C++快速入门->选择结构

问题 A: 例题4-1 一元二次方程求根

  1. 题目描述 ,求一元二次方程ax2+bx+c=0的根,三个系数a, b, c由键盘输入,且a不能为0,但不保证b2-4ac>0。程序中所涉及的变量均为double类型。
  2. 输入,以空格分隔的一元二次方程的三个系数,双精度double类型
  3. 输出,分行输出两个根如下 (注意末尾的换行)
    r1=第一个根
    r2=第二个根
    结果输出时,宽度占7位,其中小数部分2位。
    如果方程无实根,输出一行如下信息 (注意末尾的换行)
    No real roots!
  4. 样例输入, 1 2 3
  5. 样例输出, 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 比较交换实数值

  1. 题目描述 ,从键盘输入2个实数,按照代数值由小到大的顺序输出这两个数。
  2. 输入,用空格分隔的两个实数。
  3. 输出,从小到大输出这两个实数,中间以空格来分隔,小数在前,大数在后。
    小数点后保留2位小数。
    末尾输出换行符。
  4. 样例输入, 3.6 -2.3
  5. 样例输出, -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个实数值,并按序输出

  1. 题目描述 ,从键盘输入3个实数a, b, c,通过比较交换,将最小值存储在变量a中,最大值存储在变量c中,中间值存储在变量b中,并按照从小到大的顺序输出这三个数a, b, c。
    末尾输出换行。
  2. 输入,输入以空格分隔的三个实数
  3. 输出,按照从小到大的顺序输出这三个实数,中间以空格分隔,最小值在前,最大值在后。小数点后保留2位小数。
    注意末尾的换行。
  4. 样例输入, 3 7 1
  5. 样例输出, 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 三个整数求最大值

  1. 题目描述 ,有3个整数a, b, c,由键盘输入,输出其中最大的数。
  2. 输入,以空格分割的三个整数。
  3. 输出,三个数中的最大值,末尾换行。
  4. 样例输入, 1 3 2
  5. 样例输出, 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 奖金计算

  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语句实现。
  2. 输入,企业利润,小数,双精度double类型
  3. 输出,应发奖金数,保留2位小数,末尾换行。
  4. 样例输入, 1050
  5. 样例输出, 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;
}	

猜你喜欢

转载自blog.csdn.net/Ada_lake/article/details/87621485