C语言谭浩强第三版第五章例题及课后题:选择结构程序设计

目录

eg5.1输入两个实数,按代数值由小到大的顺序输出这两个数

eg5.2输入3个数,按由小到大的顺序输出

eg5.3编程实现符号函数,输入一个x,输出y值

eg5.4输入一个字符,判断是否是大写字母,若是转换为小写字母,输出,若不是,直接输出

eg5.5.判断某一年是否闰年 leap year 

eg5.6求ax^2+bx+c=0方程的解

eg5.7运输货物,不同距离价钱不同 switch case

5.4有三个整数abc,由键盘输入,输出其中最大的数

5.5有一个分段函数,输入x,输出y值

5.6按照成绩输出成绩等级

5.7给一个不多于五位的正整数,求出是几位数,分别输出每一位,逆序输出

5.8(缺)switch case的一个例子,太繁琐了

5.9输入4个整数,按有小到大的顺序输出

5.10有4个灯塔,位于灯塔区域的高度为10m,其余地方为0

 

eg5.1输入两个实数,按代数值由小到大的顺序输出这两个数

 

double类型的数据用scanf输入时要用%lf的形式输入

 

#include<stdio.h>

void main(void){
    double a,b;

    printf("请输入两个实数:");
    scanf("%f%f", &a, &b);
    printf("这两个实数为:%f, %f\n", a, b);
}

 

#include<stdio.h>

void main(void){
    double a,b;

    printf("请输入两个实数:");
    scanf("%lf%lf", &a, &b);
    printf("这两个实数为:%f, %f\n", a, b);
}

 

//eg5.1输入两个实数,按代数值由小到大的顺序输出这两个数


#include<stdio.h>

void main(void){
	double a,b;

	printf("请输入两个实数:");
	scanf("%lf%lf", &a, &b);
	printf("这两个实数为:%.2f, %.2f\n", a, b);

	if(a > b){
		printf("代数值由小到大的顺序为:%.2f, %.2f\n", b, a);
	}else{
		printf("代数值由小到大的顺序为:%.2f, %.2f\n", a, b);
	}
}

 

eg5.2输入3个数,按由小到大的顺序输出

//eg5.2输入3个数,按由小到大的顺序输出

/*
//自己
#include<stdio.h>

void main(void){
	double a,b,c;
	double max, medium, min;

	printf("请输入三个实数:");
	scanf("%lf%lf%lf", &a, &b, &c);
	printf("这三个实数为:%.2f, %.2f, %.2f\n", a, b, c);

	if(a > b && a > c){  //a是最大的
		max = a;
		if(b > c){
			medium = b;
			min = c;
		}
		else{
			medium = c;
			min = b;
		}		
	}else if(b > c){     //a不是最大的,b是最大的
		max = b;
		if(a > c){    
			medium = a;
			min = c;
		}else{
			medium = c;
			min = a;
		}
	}else{            //c是最大的
		max = c;
		if(a > b){
			medium = a;
			min = b;
		}else{
			medium = b;
			min = c;
		}
	}
	printf("由小到大的顺序为:%.2f, %.2f, %.2f\n", min, medium, max);
}

*/
//(课本)思想:通过比较赋值,让a成为这三个数中最小的一个,b次之,c为最大的,然后依次输出abc
#include<stdio.h>

void swap(double *a, double *b){
	double tmp;

	tmp = *a;
	*a = *b;
	*b = tmp;
}

void main(void){
	double a,b,c;

	printf("请输入三个实数:");
	scanf("%lf%lf%lf", &a, &b, &c);
	printf("这三个实数为:%.2f, %.2f, %.2f\n", a, b, c);

	if(a > b){
		swap(&a, &b);		//让a成为a,b中较小的一个
		printf("%.2f, %.2f\n", a, b);
	}

	if(a > c){          //让a成为a,c中较小的一个
		swap(&a, &c);
	}
	                    //此时,a是三者中最小的一个
	if(b > c){
		swap(&b, &c);     //让b成为b,c中较小的一个
	}
	                    //此时,b是三者中次小的一个

	printf("由小到大的顺序为:%.2f, %.2f, %.2f\n", a,b, c);
}

eg5.3编程实现符号函数,输入一个x,输出y值

double型的数据不能用%d的形式输出

//eg.5.3编程实现符号函数,输入一个x,输出y值

#include<stdio.h>

//符号函数signum
double signum(double x){
	double y;

	if(x > 0){
		y = 1;
	}else if(x = 0){
		y = 0;
	}else{
		y = -1;
	}
	//printf("y的值为:%f\n", y);

	return y;
}

void main(void){
	double x, y;

	printf("请输入一个实数:");
	scanf("%lf", &x);
	printf("输入的值为:%lf\n", x);

	y = signum(x);
	printf("y的值为:%.1f\n", y);

}

eg5.4输入一个字符,判断是否是大写字母,若是转换为小写字母,输出,若不是,直接输出

  char c; 

 (c >= 65 && c <= 97) ? c += 32 : c;       //(c >= 65 && c <= 97) ? c += 32; : c;    wrong form
   (c >= 'A' && c <= 'Z') ? c += 32 : c; 
可以直接写成上述的样子

条件运算符 https://blog.csdn.net/weixin_42072280/article/details/85006449

//eg5.4输入一个字符,判断是否是大写字母,若是转换为小写字母,输出,若不是,直接输出

#include<stdio.h>

void main(void){
	char c;

	printf("Please input a character: ");
	scanf("%c", &c);
	printf("This character is: %c\n", c);
/*
//myself
	if(c >= 65 && c <= 97){
		printf("This character is a capital character.\n");
		c += 32;
	}else{
		printf("This character isn't a capital character.\n");	
	}
*/
	
//textbook
//	(c >= 65 && c <= 97) ? c += 32 : c;       //(c >= 65 && c <= 97) ? c += 32; : c;    wrong form
	(c >= 'A' && c <= 'Z') ? c += 32 : c; 
	printf("Now this character is: %c\n", c);
}

eg5.5.判断某一年是否闰年 leap year 

      if((year % 4 == 0 && year % 100) || (year % 400 == 0)){
        leap = 1;
    }
 

//eg5.5.判断某一年是否闰年 leap year 

//闰年是公历中的名词。闰年分为普通闰年和世纪闰年。
//普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);
//世纪闰年:能被400整除的为世纪闰年。(如2000年是闰年,1900年不是闰年);

//测试   是     2004  2000 
//       不是   1989  1999  1900
#include<stdio.h>

void main(void){
	int year;
	int leap = 0;   //leap为1表示是闰年
	
	printf("请输入一个年份:");
	scanf("%d", &year);
	printf("此年份为:%d\n", year);
	
/*	写错了 对闰年的理解有误 
	if(year % 4 == 0){
		leap = 1;
	}else if(year % 100 == 0){
		if(year % 400 == 0){
			leap = 1;
		}
*/
/* 方法1 
	if(year % 4 == 0){      //能被4整除 
		if(year % 100){     //不能被100整除 
			leap = 1;	
		}else if(year % 400 == 0){	//不能被100整除 能被400整除	
			leap = 1;
		}
	} 
*/
//方法2  将所有的条件写成一个表达式 
	if((year % 4 == 0 && year % 100) || (year % 400 == 0)){
		leap = 1;
	}
	
	(leap == 1) ? printf("%d年是闰年", year) : 	printf("%d年不是闰年", year); 
	 
} 

eg5.6求ax^2+bx+c=0方程的解

double a;  //a为一个实数

if(a == 0)...    if(fabs(a) <= 1e-6)...

//对于判断a是否等于0时,要注意:由于a是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:if(a == 0)...,因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于0而导致结果错误。所以,采取的方法就是判别a的绝对值(fabs(a))是否小于一个很小的数(例如10^(-6)),如果小于此数,就认为a等于0. 

//eg5.6求ax^2+bx+c=0方程的解

#include<stdio.h>
#include<math.h>

void main(void){
	double a, b, c;
	double m, n;
	double x1, x2;
	double diata; 
	
	printf("请输入二元一次方程的三个系数:");
	scanf("%lf%lf%lf", &a, &b, &c);
	printf("三个系数为:%f %f %f\n", a, b, c);

/*	自己 将diata=0解释为无根 
	diata = pow(b,2) - 4*a*c;
	if(diata < 0){
		printf("该方程无根\n"); 
	}else{
		m = -b * 1.0 / (2 * a);
		n = sqrt(diata) * 1.0 / (2 * a);

		x1 = m + n;
		x2 = m - n;	
		printf("方程的根为:%lf, %lf\n", x1, x2);
	}
*/

/*	
//	课本+自己 
//若是a=0,则不是二次方程 
//将diata=0解释为有两个共轭复根  x=[-b±i√(4ac-b^2)]/(2a)
	
	if(a == 0){
		printf("该方程不是一元二次方程\n");
	}
	
	diata = pow(b,2) - 4*a*c;
	m = -b * 1.0 / (2 * a);

	if(diata < 0){
		n = sqrt((-1)*diata) * 1.0 / (2 * a);
		printf("该方程有两个共轭复根: %lf + i%lf, %lf - i%lf\n", m, n, m, n); 
	}else{
		n = sqrt(diata) * 1.0 / (2 * a);
		x1 = m + n;
		x2 = m - n;	

		(diata == 0) ? printf("该方程有一对相等的实根:%lf, %lf\n", x1, x2) :  printf("该方程有一对不相等的实根:%lf, %lf\n", x1, x2); 
	}
*/
//	课本 
//对于判断b^2-4ac是否等于0时,要注意:由于 b^2-4ac 是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:
//if(diata == 0)...,因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于0而导致结果错误。
//所以,采取的方法就是判别diata的绝对值(fabs(diata))是否小于一个很小的数(例如10^(-6)),如果小于次数,就认为diata等于0. 

	if(fabs(a) <= 1e-6){//if(a == 0){
		printf("该方程不是一元二次方程\n");
	}

	diata = pow(b,2) - 4*a*c;
	m = -b * 1.0 / (2 * a);
	
	if(diata < 0){
		n = sqrt((-1)*diata) * 1.0 / (2 * a);
		printf("该方程有两个共轭复根: %lf + i%lf, %lf - i%lf\n", m, n, m, n); 
	}else{
		n = sqrt(diata) * 1.0 / (2 * a);
		x1 = m + n;
		x2 = m - n;	

		(fabs(diata) <= 1e-6) ? printf("该方程有一对相等的实根:%lf, %lf\n", x1, x2) :  printf("该方程有一对不相等的实根:%lf, %lf\n", x1, x2);
		//(diata == 0) ? printf("该方程有一对相等的实根:%lf, %lf\n", x1, x2) :  printf("该方程有一对不相等的实根:%lf, %lf\n", x1, x2); 
	}

}

eg5.7运输货物,不同距离价钱不同 switch case

(1)在case子句后如果没有break;会一直往后执行一直到遇到break;才会跳出switch语句。

运行结果: 学英语学C语言好好休息 

(2)多个case可以共用一组执行语句

switch(c){    //记得一定要加break,否则就会一直运行直到遇到break,才会跳出switch语句 
        case 0: d = 0; break;
        case 1: d = 2; break;
        case 2: 
        case 3: d = 5;
        case 4: 
        case 5: 
        case 6: 
        case 7: d = 8;

        case 8: 
        case 9: 
        case 10: 
        case 11: d = 10;
        case 12: d = 15;
    }

//eg5.7运输货物,不同距离价钱不同
//测试: 输入100 20 300  输出588000(此处只写出一般结果,具体格式根据输出判定) 
#include<stdio.h>

void main(void){
	double p;  //每吨每千米货物的基本运费
	double w;  //货物的重量
	double s;  //距离
	double d;  //折扣
	double f;  //总运费
	int c;
	
	scanf("%lf%lf%lf", &p, &w, &s);
	printf("%f %f %f\n", p, w, s); 
	
	//switch(表达式)   表达式的值可以是整型、字符型
	//课本
	if(s >= 3000){
		c = 12;
	}else{
		c = s/250;
	}
	
	switch(c){    //记得一定要加break,否则就会一直运行直到遇到break,才会跳出switch语句 
		case 0: d = 0; break;
		case 1: d = 2; break;
		case 2: 
		case 3: d = 5;
		case 4: 
		case 5: 
		case 6: 
		case 7: d = 8;
		case 8: 
		case 9: 
		case 10: 
		case 11: d = 10;
		case 12: d = 15;
	}
	
	printf("d=%f\n", d);  //若每条语句下面不加break,则d的值为15 
	f = p*w*s*(1-d*0.01);
	printf("总运费为%f:\n", f);
}

5.4有三个整数abc,由键盘输入,输出其中最大的数

//5.4有三个整数abc,由键盘输入,输出其中最大的数

#include<stdio.h>

void main(void){
	int a, b, c;
	int max;
	
	printf("请输入三个整数:");
	scanf("%d%d%d", &a, &b, &c);
	printf("输入的三个整数为:%d %d %d\n", a, b, c);
	
	//max = (a > b) ? a : b;   //此处最好还是不要用max来接,可以用一个tmp,自己偷懒了哈哈
	//max = (max > c) ? max : c;
	
	max = ((a > b) ? a : b) > c ? ((a > b) ? a : b) : c;
	
	printf("这三个数中最大的数为:%d\n", max);
	 
} 

5.5有一个分段函数,输入x,输出y值

//5.5有一个分段函数,输入x,输出y值

#include<stdio.h>

double fun(double x){
	double y;
	
	if(x < 1){
		y = x;
	}else if(x >= 10){
		y = 3*x-11;
	}else{
		y = 2*x-1;
	}
	
	return y;
}

void main(void){
	double x;
	double y;
	
	printf("请输入实数x的值:");
	scanf("%lf", &x);
	printf("输入的值为:%f\n", x);
	
	y = fun(x);
	printf("对应的函数值为:%f\n", y);
		 
}

5.6按照成绩输出成绩等级

switch 语句根据控制表达式的值,可以把程序流跳转到多个语句中的一个执行:
switch (表达式) 语句
括号里的表达式具有整数类型,并且这里的语句就是该 switch 主体,它包括了多个 case 标签,以及最多一个 default 标签。
   括号里的表达式会被计算一次,并和 case 标签中的常量表达式做比较。如果表达式的值匹配其中的某个 case 常量,程序流就会跳转到该 case 标签后面的语句。如果没有匹配的 case 常量,程序流就会跳转到 default 标签后的语句(如果存在 default 标签)。
 

https://blog.csdn.net/YHxiaohao/article/details/79861154

//5.6按照成绩输出成绩等级
/*百分制
90分以上为A
80-89分为B
70-79分为C
60-69分为D
60分一下为E 
*/

/*
switch 语句根据控制表达式的值,可以把程序流跳转到多个语句中的一个执行:
switch (表达式) 语句
括号里的表达式具有整数类型,并且这里的语句就是该 switch 主体,它包括了多个 case 标签,以及最多一个 default 标签。
括号里的表达式会被计算一次,并和 case 标签中的常量表达式做比较。
如果表达式的值匹配其中的某个 case 常量,程序流就会跳转到该 case 标签后面的语句。
如果没有匹配的 case 常量,程序流就会跳转到 default 标签后的语句(如果存在 default 标签)。
*/

/*
//自己   有两个失误的地方 
//(1)没有处理100分的情况 按照自己的程序输出的话 100分的等级为E
//(2)对用户的输入进行判别的时候用的是if语句,应该要用 while语句,因为要多次判别,不是只判别一次 

#include<stdio.h>

char scoreRank(double score);

char scoreRank(double score){
	int s;
	char c; 
	
	s = score/10;
	
	switch(s){
		case 9: c = 'A'; break;
		case 8: c = 'B'; break;
		case 7: c = 'C'; break;
		case 6: c = 'D'; break;
		default : c = 'E'; break;
	}
	return c;
}

void main(void){
	double score;
	char c;
	
	printf("请输入成绩(0-100):");
	scanf("%lf", &score);
	
	if(score > 100 || score < 0){
		printf("您输入的成绩有误,请重新输入:"); 
		scanf("%lf", &score);
	}
	printf("您输入的成绩为:%f\n", score);
	
	c = scoreRank(score);
	printf("此学生的成绩等级为:%c", c);
	 
}
*/

//课本 
#include<stdio.h>

char scoreRank(double score);

char scoreRank(double score){
	int s;
	char c; 
	
	s = score/10;
	
	switch(s){
		case 10:                   //自己失误的地方 
		case 9: c = 'A'; break;
		case 8: c = 'B'; break;
		case 7: c = 'C'; break;
		case 6: c = 'D'; break;
		default : c = 'E'; break;
	}
	return c;
}

void main(void){
	double score;
	char c;
	
	printf("请输入成绩(0-100):");
	scanf("%lf", &score);
	
	while(score > 100 || score < 0){       //if(score > 100 || score < 0){
		printf("您输入的成绩有误,请重新输入:"); 
		scanf("%lf", &score);
	}
	printf("您输入的成绩为:%f\n", score);
	
	c = scoreRank(score);
	printf("此学生的成绩等级为:%c", c);
	 
}
 

5.7给一个不多于五位的正整数,求出是几位数,分别输出每一位,逆序输出

//5.7给一个不多于五位的正整数,求出是几位数,分别输出每一位,逆序输出

#include<stdio.h>

void main(void){
	unsigned int num;
	unsigned int number;
	int n = 0;             //记录位数 
	int diverse  = 0;  //diverse  自己起的名字
	int eachValue; 
	
	printf("请输入一个正整数(不多于五位):");
	scanf("%d", &num);
	
	while(num >= 100000 || num < 0){
		printf("输入有误,请重新输入:");
		scanf("%d", &num);
	}
	printf("输入的正整数为:%d\n", num);
	
	number = num;
	
	printf("%d每一位(由低到高)分别为:", number);
	while(num%10){
		n++; 
		eachValue = num % 10;
		printf("%d ", eachValue); 
		diverse = diverse*10 + eachValue;
		num/=10; 
	}	 
	printf("\n");
	printf("%d的位数为:%d\n", number, n);
	printf("%d的逆序表示为:%d\n", number, diverse);	
}

5.8(缺)switch case的一个例子,太繁琐了

5.9输入4个整数,按有小到大的顺序输出

//5.9输入4个整数,按有小到大的顺序输出

#include<stdio.h>

void swap(int *a, int *b);   //又一次掉在了函数调用的经典坑中,此处要修改a和b的值,故要传址 

void swap(int *a, int *b){
	int tmp;
	
	tmp = *a;
	*a = *b;
	*b = tmp;
	printf("%d %d \n", *a, *b);
}

void main(void){
	int a, b, c, d;
	
	printf("请输入四个整数:");
	scanf("%d%d%d%d", &a, &b, &c, &d);
	printf("输入的四个整数为:%d %d %d %d\n", a, b, c, d);
/*	错误 
	if(a > b){        
 		swap(a, b);          //让a成为a、b中较小的一个 
		if(a > c){
			swap(a, c);      //让a成为a、c中较小的一个 
			if(a > d){
				swap(a, d);  //让a成为a、d中较小的一个     所以,至此,a是最小的一个 
			}
		}		
	}
*/
/*错误 
	if(a > b){
		swap(&a, &b);   //让a成为a、b中较小的一个 
	}else if(a > c){
		swap(&a, &c);   //让a成为a、c中较小的一个 
	}else if(a > d){
		swap(&a, &d);   //让a成为a、d中较小的一个     所以,至此,a是最小的一个
	}
	
	if(b > c){
		swap(&b, &c);    //让b成为b、c中较小的一个 
	}else if(b > d){
		swap(&b, &d);    //让b成为b、d中较小的一个   所以,至此,b是次小的一个
	}
	
	if(c > d){
		swap(&c, &d);
	} 
*/
//正确  仔细分析,其实这种写法类似于将数据放在数组中进行排序,和最基本的排序算法原理是一样的 
	if(a > b){
		swap(&a, &b);   //让a成为a、b中较小的一个 	
	} 
	if(a > c){
		swap(&a, &c);   //让a成为a、c中较小的一个 
	}
	if(a > d){
		swap(&a, &d);   //让a成为a、d中较小的一个     所以,至此,a是最小的一个
	}
	
	if(b > c){
		swap(&b, &c);    //让b成为b、c中较小的一个 
	}
	if(b > d){
		swap(&b, &d);    //让b成为b、d中较小的一个   所以,至此,b是次小的一个
	}
	
	if(c > d){
		swap(&c, &d);
	} 
	
	printf("这四个整数按照从小到大的顺序输出为:%d %d %d %d\n", a, b, c, d);
	
} 

5.10有4个灯塔,位于灯塔区域的高度为10m,其余地方为0

//5.10有4个灯塔,位于灯塔区域的高度为10m,其余地方为0
//输入:点的坐标x, y
//输出:高度h
//测试:0.5 0.7  0
//      2.1 2.3 10 
#include<stdio.h>
#include<math.h>

void main(void){
	double x;
	double y;
	double dist;
	int h = 0;
	
	printf("请输入点的坐标(x, y):");
	scanf("%lf,%lf", &x, &y);
	printf("输入的点坐标为为:(%f, %f)\n", x, y);
	
	
	if(y > 0){
		if(x > 0){
			dist = pow((x-2), 2) + pow((x-2), 2);
		}else{
			dist = pow((x+2), 2) + pow((x-2), 2);
		}
	}else{
		if(x > 0){
			dist = pow((x-2), 2) + pow((x+2), 2);
		}else{
			dist = pow((x+2), 2) + pow((x+2), 2);
		}		
	}
	
	if(dist <= 1){
		h = 10;
	}
	printf("此位置的高度为:%d\n", h);
} 
 
 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安安csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值