第四章 选择结构程序设计

//习题1.什么是算术运算?什么是关系运算?什么是逻辑运算?

算术运算就是我们数学中的加、减、乘、除,以及取余,一般进行数值的运算。
关系运算就是判断给出的两个数值是否具有(大于、小于、等于、不等于)的运算。
逻辑运算就是判断给出的条件在逻辑上是否为‘真’或‘假’。


//习题2. C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

在C语言中,用1表示为真,用0表示为假。


//习题3.写出下面各逻辑表达式的值。设:a=3,b=4,c=5。

(1) a+b>c && b==c
0
(2) a||b+c && b一c
1
(3) !(a>b) && !c|| 1
1
(4) !(x=a) && (y=b) && 0
0
(5) !(a+b)+c-1 && b+c/2
1


//习题4.有3个整数a,b,c,由键盘输人,输出其中最大的数。
#include<stdio.h>
int main()
{
	float a,b,c,t;
	scanf("%f,%f,%f",&a,&b,&c);
	if(a>b)
	{
		t=a; //借助变量t,实现变量a和变量b互换值
		a=b;
		b=t;
	} //互换后,a小于或等于b
	if(a>c)
	{
		t=a; //借助变量t,实现变量a和变量c互换值
		a=c;
		c=t;
	} //呼唤后,a小于或等于c
	if(b>c) //还要
	{
		t=b; //借助变量t,实现变量b和变量c互换值
		b=c;
		c=t;
	} //互换后,b小于或等于c
	printf("%5.2f,%5.2f,%5.2f\n",a,b,c); //顺序输入a,b,c的值
	return 0;
}

//习题5.从键盘输人一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输人数据后先对其进行检查是否为小于1000的正数。若不是,则要求重新输人。
#include <stdio.h>
#include <math.h>
int main()
{
	int num,n;//num用来接收输入的数,n用来输出平方根
	printf("please enter a number:\n");
	scanf("%d",&num);
	while(abs(num)>=1000) //判断num是不是一个大于等于1000的正数
		scanf("%d",&num);
	n=sqrt(float(num)); //sqrt()为开方函数
	printf("num的平方根为%d",n);
	return 0;
}

//习题6.有一个函数:

这里是引用

写程序,输人x的值,输出y相应的值。

#include <stdio.h>
int main()
{
	int x,y;
	printf("please enter x:");
	scanf("%d",&x);
	if(x<1)
		y=x;
	else if((x>1)&&(x<10))
		y=2*x-1;
	else
		y=3*x-11;
	printf("y=%d\n",y);
	return 0;
}

//习题7.有一函数:

这里是引用

有人编写了以下两个程序,请分析它们是否能实现题目要求。不要急于上机运行程序,先分析两个程序的逻辑,画出它们的流程图,分析它们的运行情况。然后上机运行程序,观察和分析结果。

(1)
#include<stdio.h>
int main()
{
int x,y;
printf(" enter x:");
scanf(" %d",&x);
y=-1;
if(x!=0)
if(x>0)
y=1;
else
printf(“x= %d,y= %d\n”,x,y);
return 0;
}
(2)
#include<stdio.h>
int main()
{
int x,y;
printf(“enter x!”);
scanf("%d" ,&x);
y=0;
if(x>=0)
if(x>0)
y=1;
else
y=-1;
printf(“x= %d,y= %d\n”,x,y);
return 0;
}

(1)流程图
在这里插入图片描述

程序1在程序在第运行时会把else和最近的一个if看成一个语句,所以达不到预期的效果

(2)流程图
在这里插入图片描述

程序2也不可以达到预期的效果,原因同程序1


//习题8.给出一百分制成绩,要求输出成绩等级'A'B'C'D'、'E'。90分以上为'A',80~89分为'B',70~79分为‘C' ,60~69分为'D' ,60分以下为'E"。
#include <stdio.h>
int main()
{
	int score;
	printf("please enter score:");
	scanf("%d",&score);
	switch(score/10)
	{
	case 10:
	case 9:printf("该成绩为A\n");break;
	case 8:printf("该成绩为B\n");break;
	case 7:printf("该成绩为C\n");break;
	case 6:
	case 5:
	case 4:
	case 3:
	case 2:
	case 1:printf("改成绩为D\n");break;
	}
	return 0;
}

//习题9.给一个不多于5位的正整数,要求:

①求出它是几位数;

②分别输出每一位数字;

③按逆序输出各位数字,例如原数为321,应输出123。

#include <stdio.h>
int main()
{
	int num,n,count=0,m;
	printf("please enter num:");
	scanf("%d",&num);
	while(num>9999)
	{
		printf("please enter num:");
		scanf("%d",&num);
	}
	n=num; 
	while(n!=0)//(1)求输入的数字为几位数
	{
		count++;
		n=n/10;
	}
	printf("输入了一个%d位数\n",count);
	n=num;
	printf("分别输出每一个数字\n");//(2)分别输出每一位数字
	if(num>1000&&num<9999)//当它为4位数时
	{
		printf("%d\t",n/1000);
		n=n-n/1000*1000;
		printf("%d\t",n/100);
		n=n-n/100*100;
		printf("%d\t",n/10);
		n=n-n/10*10;
		printf("%d\n",n);
		/*如果是大于五位数的数字也可以改成下面这种形式
		int i=1000;
		while(n!=0)
		{
			printf("%d\t",n/i);
			n=n-n/i*i;
			i=i/10;
		}
		printf("\n");
		*/
	}
	else if(num>100&&num<999)//当它为3位数时
	{
	
		printf("%d\t",n/100);
		n=n-n/100*100;
		printf("%d\t",n/10);
		n=n-n/10*10;
		printf("%d\n",n);
	}
	else if(num>10&&num<99)//当它为2位数时
	{
		printf("%d\t",n/10);
		n=n-n/10*10;
		printf("%d\n",n);
	}
	else//当它为1位数时
		printf("%d\n",n);
	printf("按逆序输出每一位数字\n");
	while(num!=0) //(3)按逆序输出每一位数字
	{
		printf("%d\t",num%10);
		num=num/10;
	} 
	printf("\n");
	return 0;
}

//习题10.企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;利润高于100000元,低于200000元(100000<I<200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成7.5%;200000<1≤400000时,低于200000元的部分仍按上述办法提成(下同)。高于200000元的部分按5%提 成;400000<I≤600 000元时,高于400 000元的部分按3%提成;600 000<1<1 000 000时,高于600 000元的部分按1. 5%提成;I>100000时,超过1 000 000元的部分按1%提成。从键盘输人当月利润I,求应发奖金总数。

要求:

(1)用if语句编程序;

#include <stdio.h>
int main()
{
	float I,S;//I、S分别为利润、奖金总数;
	float n1,n2,n3,n4,n5,n6;
	printf("请输入利润:");
	scanf("%f",&I);
	n1=99999*0.1;//低于100000时的奖金
	n2=n1+(I-100000)*0.075;//高于100000低于200000的奖金
	n3=n2+(I-200000)*0.05;//高于200000低于400000的奖金
	n4=n2+(I-400000)*0.03;//高于400000低于600000的奖金
	n5=n2+(I-600000)*0.015;//高于600000低于1000000的奖金
	n6=n2+(I-1000000)*0.01;//高于600000低于1000000的奖金
	if(I<=100000)
		S=I*0.1;
	else if(I>100000&&I<=200000)
		S=n2;
	else if(I>200000&&I<=400000)
		S=n3;
	else if(I>400000&&I<=600000)
		S=n4;
	else if(I>600000&&I<=1000000)
		S=n5;
	else
		S=n6;
	printf("当利润为%.0f时能拿到%.2f奖金\n",I,S);
	return 0;
}

(2)用switch语句编程序。

#include <stdio.h>
int main()
{
	float I,S;//I、S分别为利润、奖金总数;
	float n1,n2,n3,n4,n5,n6;
	printf("请输入利润:");
	scanf("%f",&I);
	n1=99999*0.1;//低于100000时的奖金
	n2=n1+(I-100000)*0.075;//高于100000低于200000的奖金
	n3=n2+(I-200000)*0.05;//高于200000低于400000的奖金
	n4=n2+(I-400000)*0.03;//高于400000低于600000的奖金
	n5=n2+(I-600000)*0.015;//高于600000低于1000000的奖金
	n6=n2+(I-1000000)*0.01;//高于600000低于1000000的奖金
	switch(int(I)/100000)
	{
	case 0:S=I*0.1;break; //100000以下的奖金
	case 1:
	case 2:S=n2;break;//高于100000低于200000的奖金
	case 3:
	case 4:S=n3;break;//高于200000低于400000的奖金
	case 5:
	case 6:S=n4;break;//高于400000低于600000的奖金
	case 7:
	case 8:
	case 9:S=n5;break;//高于600000低于1000000的奖金
	case 10:S=n6;break;//高于1000000的奖金
	}
	printf("当利润为%.0f时能拿到%.2f奖金\n",I,S);
	return 0;
}

//习题11.输人4个整数,要求按由小到大的顺序输出。

#include<stdio.h>
int main()
{
	int a,b,c,d,t;//t用来交换两个数
	printf("please enter fours number:");
	scanf("%d%d%d%d",&a,&b,&c,&d);
	if(a>b)
	{t=a;a=b;b=t;}
	if(a>c)
	{t=a;a=c;c=t;}
	if(a>d)
	{t=a;a=d;d=t;}
	if(b>c)
	{t=b;b=c;c=t;}
	if(b>d)
	{t=b;b=d;d=t;}
	if(c>d)
	{t=c;c=d;d=t;}
	printf("%d %d %d %d\n",a,b,c,d);
	return 0;
}

//习题12.有4个圆塔,圆心分别为(2,2)、(一2,2)、(一2,一2)、(2,一2),圆半径为1,见图4.17。这4个塔的高度为10m,塔以外无建筑物。今输人任一点的坐标,求该点的建筑高度(塔外的高度为零)。
在这里插入图片描述

本题解题思路是:这里是引用
在这里插入图片描述

以下是代码实现:

#include <stdio.h>
#include <math.h> //需要使用到fabs,sqrt函数
int main()
{
	float x,y;
	printf("please enter x,y:");
	scanf("%f%f",&x,&y);
	x=fabs(x-2);y=fabs(y-2);//计算输入坐标距离圆心的位置
	if(sqrt(x*x+y*y)>1)//判断圆心到输入坐标位置是否大于半径
	{
		printf("输入坐标在圆塔外,该点建筑高度为0m");//输出判断结果
	}
	else
		printf("输入坐标在圆塔内,该点建筑高度为10m");
	printf("\n");
	return 0;
}
	
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值