第四章 选择结构程序设计
章节重点:这一章应着重掌握if...else语句、switch多分支语句、关系运算符和关系表达式、逻辑运算符和逻辑表达式、条件运算符和条件表达式、会使用选择结构的嵌套
(1)概念题(这里着重理解)
算数运算:+、-、*、/运算,对象为实数或复数,结果也为实数或者复数。
关系运算:>、>=、<、<=、==、!=,六种,关系运算的值为逻辑值,true、false。
逻辑运算:&&、||、!,三种,逻辑运算的值为逻辑值,true、false。
(2)概念题(这里着重理解)
在C的逻辑运算中 1 代表为 真,以 0 代表为 假 。
在逻辑表达式中的运算对象 非零 代表 真,以 0 代表 假 。
(3)a=3,b=4,c=5。写出逻辑表达式的值(详细讲解一道题)
a+b>3&&b==c
要掌握符号的优先级问题,因为a+b=7所以a+b>3为真,然后b是不等于c的所以为假,1&&0,结果为0。
这种题的解题技巧在先处理关系运算,处理完后在分析逻辑运算,分清运算符的结合方向为自右向左还是自左向右。
(4)输入三个数,输出最大值
# include
int main()
{
int a,b,c,max;
scanf("%d,%d,%d",&a,&b,&c);//注意输入格式
if(a>b)
max=a;
else
max=b;
if(max
(5)输入小于1000的正数,输出它的平方根(注意题目中的要求)
算法分析:注意求次方的sqrt()函数。想输出整形,可以直接赋值b为整形也可在输出格式中进行控制。
#include
#include
int main()
{
int a;double b;
printf("请输入一个小于1000的整数\n");
scanf("%d",&a);
if(a>1000)
printf("请重新输入一个小于1000的整数\n");
b=sqrt(a);
printf("%.0f",b);
}
(6)阶跃函数求值
#include
int main()
{
int x,y; //根据要求定义数据类型
printf("请输入x的值\n");
scanf("%d",&x);
if(x<1)
y=x;
else if((1<=x)&&(x<10))
y=2*x-1;
else
y=3*x-11;
printf("%d",y);
return 0;
}
(7)阶跃函数求值
这道题根据给出的程序,应该明白if与else的配对关系,else总是与他上面的最近的未配对的if配对。
程序1不能实现题目要求,当x输入负数时 ,y输出的是0,因为执行了else。当x输入为零时,就没有进入if的判断体。
程序2也不能实现题目要求,当x输入负数时,y输出0,因为不进入if判断体。当x输入0时,y=-1,执行else语句。
正确的缩进格式为:
1)
#include
int main()
{
int x,y;
printf("enter x:");
scanf("%d",&x);
y=-1;
if(x!=0)
if(x>0)
y=1;
else //else与最近的if相匹配
y=0;
printf("x=%d,y=%d\n",x,y);
return 0;
}
2)
# include
int main()
{
int x,y;
printf("enter x:");
scanf("%d",&x);
y=0;
if(x>=0)
if(x>0)
y=1;
else //else与它最近的if相匹配
y=-1;
printf("x=%d,y=%d\n",x,y);
return 0;
}
(8)成绩等级
算法分析:对于输出成绩等级,选择比较多,可选用switch多分支语句,也可使用if...else。
# include
int main ()
{
int score;
printf("请输入百分制成绩\n");
scanf("%d",&score);
switch(score/10){ //取除数
case 9:printf("A");break;
case 8:printf("B");break;
case 7:printf("C");break;
case 6:printf("D");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("E");break;//若值为5,4,3,2,1,0都执行E;
}
return 0;
}
(9)正整数
算法分析:借助判断位数,去输出数据,我完全使用取除数和余数进行运算输出。
# include
int main()
{
int num;
scanf("%d",&num);
if(num/10000)
printf("该整数为5位正整数\n");
printf("正序输出:%d",i/10000);//输出万位 正序输出
printf("%d",i%10000/1000);//输出千位
printf("%d",i%10000%1000/100);//输出百位
printf("%d",i%10000%1000%100/10);//输出十位
printf("%d\n",i%10000%1000%100%10);//输出个位
printf("逆序输出%d",i%10000%1000%100%10);
printf("%d",i%10000%1000%100/10);
printf("%d",i%10000%1000/100);
printf("%d",i%10000/1000);
printf("%d",i/10000);m);
else if(num/1000) //求出它是几位数并且正序输出、逆序输出
{printf("是四位数\n");
printf("正序%d",num/1000);
printf("%d",num%1000/100);
printf("%d",num%1000%100/10);
printf("%d\n",num%1000%100%10);
printf("逆序%d",num%1000%100%10);
printf("%d",num%1000%100/10);
printf("%d",num%1000/100);
printf("%d",num/1000);}
else if(num/100)
{printf("是三位数\n");
printf("正序%d",num/100);
printf("%d",num%100/10);
printf("%d\n",num%100%10);
printf("逆序%d",num%100%10);
printf("%d",num%100/10);
printf("%d",num/100);}
else if(num/10)
{printf("是二位数\n");
printf("正序%d",num/10);//正序
printf("%d\n",num%10);
printf("逆序%d",num%10);//逆序
printf("%d\n",num/10);
}
else
{printf("是个位数\n");
printf("正序%d\n",num/1);
printf("逆序%d",num/1);}
return 0;
}
(10)企业发放奖金根据利润提成
# include
int main()
{
double i;
printf("请输入利润:");
scanf("%lf",&i);
if(i<=100000)
printf("应发奖金:%.1f",i*0.1); //奖金后保留一位小数
else if(i>100000&&i<=200000)
printf("应发奖金:%.1f",(i-100000)*0.075+100000*0.1);
else if(i>200000&&i<=400000)
printf("应发奖金:%.1f",(i-200000)*0.05+200000*0.075);
else if(i>400000&&i<=600000)
printf("应发奖金:%.1f",(i-400000)*0.03+400000*0.05);
else if(i>600000&&i<=1000000)
printf("应发奖金:%.1f",(i-600000)*0.015+600000*0.03);
else if(i>1000000)
printf("应发奖金:%.1f",(i-1000000)*0.01+1000000*0.015);
return 0;
}
#include
int main()
{
double i;
int d;
printf("请输入利润:");
scanf("%lf",&i);
d=i/100000;
switch(d) //switch quantity not an integer.so double会报错
{
case 0: printf("应发奖金:%.1f",i*0.1);break;
case 1:
case 2: printf("应发奖金:%.1f",(i-100000)*0.075+100000*0.1);break;
case 3:
case 4: printf("应发奖金:%.1f",(i-100000)*0.075+100000*0.1);break;
case 5:
case 6: printf("应发奖金:%.1f",(i-400000)*0.03+400000*0.05);break;
case 7:
case 8:
case 9:
case 10:printf("应发奖金:%.1f",(i-600000)*0.015+600000*0.03);break;
default:printf("应发奖金:%.1f",(i-1000000)*0.01+1000000*0.015);//default不写break
}
return 0;
}
(11)输入四个整数,按要求由小到大排序
初级排序
#include
int main()
{
int a,b,c,d,t;
printf("请输入四个整数");
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;} //将最小值赋给a,下同
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",a,b,c,d);
return 0;
}
算法分析:为了方便,在这一章中我使用了后面的知识,运用数组将四个数据进行输入,使用冒泡法进行排序
#include
int main()
{
int a[4]; //定义数组大小
int temp,i,j;
for(i=0;i<4;i++)
scanf("%d",&a[i]);
for(j=0;j<3;j++) //使用冒泡法排序
for(i=0;i<3-j;i++)
if(a[i]>a[i+1])
{temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}
for(i=0;i<4;i++)
printf("%d ",a[i]);
return 0;
}
(12)输坐标,求该点的建筑高度
算法分析:通过x,y坐标的限制,进行判断坐标是否在圆塔内
# include
int main()
{
int x1=2,x2=-2,y1=2,y2=-2;
float x,y,d1,d2,d3,d4;
printf("请输入坐标:");
scanf("%f %f",&x,&y);
d1=(x-x1)*(x-x1)+(y-y1)*(y-y1); //点与点之间的距离公式为方便计算去掉根号,结果相同
printf("%f\n",d1); //结果更加直观,可省去
d2=(x-x2)*(x-x2)+(y-y2)*(y-y2);
printf("%f\n",d2);
d3=(x-x1)*(x-x1)+(y-y2)*(y-y2);
printf("%f\n",d3);
d4=(x-x2)*(x-x2)+(y-y1)*(y-y1);
printf("%f\n",d4);
if(d1>1&&2>1&&d3>1&&d3>1) //全部大于1,该点均不在四个圆中。
printf("该点的高度为0"); //如果有一个假条件,就说明在其中一个圆上。
else
printf("该点的高度为10");
return 0;
}