第5章 选择结构程序设计
5-1 比较单分支、双分支、多分支if语句。
答:(1)多分支if语句可用多条单分支、双分支if语句等价实现。
(2)双分支if语句形式上相当于单分支if语句扩展else分支而来。
(3)单分支if语句可以认为是双分支if语句缺省else子句的特殊情况,一条双分支语句可用两条单分支语句实现。
思考:分支结构主要用在哪些情况下?它有哪几种形式?
5-2
, 下列描述哪些是正确的?
(1) if (x<0)y=−1;
else if(x==0) y=0;
else y=1;
(2)if(x>=0)
if(x>0) y = 1 ;
else y = 0 ;
else y = -1 ;
(3) y = -1 ;
if(x!=0)
if(x>0) y = 1 ;
else y = 0 ;
(4)y = 0 ;
if (x>=0)
if(x>0) y = 1 ;
答:(1) 正确 ; (2) 正确 ;(3) 不正确 ;(4) 不正确 ;
思考 : 若将(3)改为: y = -1 ; (4) 改为:y = 0 ;
if(x>=0) /*删除原if(x>=0)*/
if(x>0) y =1 ; if(x>0) y = 1 ;
else y = 0 ; else y = -1 ;
后是否正确 ?
5-3 仔细阅读以下程序 , 指出程序的运行结果 .
#include<stdio.h>
main()
{ int a , b ;
a = b = 5 ;
if(a==1)
if(b==5)
{a+=b ;
printf("a=%d\n ",a) ;
}
else
{a-=b ;printf和scanf有什么不同
printf("a=%d\n",a) ;
}
printf("a+b=%d",a+b) ;
}
解 : 结果为 : a + b = 10
思考: 为何有三个printf 语句 ,却只有一行输出 ? 如果将第5行去掉或改为if(a==5) , 结果是否一样 ?
5-3仔细阅读以下程序 ,指出程序的运行结果 。
解: #include<stdio.h>
main()
{ int i =1 , j = 0 ,m = 1 ,n =2 ;
switch(i++)
{case 1 : m++ ;n++ ;
case 2 : switch(++j)
{case 1 : m++ ;
case 2 : n++ ;
}
case 3 : m++ ;n++ ;
break ;
case 4 :m++ ;n++ ;
}
printf("m=%d,n=%d" , m ,n) ;
}
解 : 结果为 : m =4 ,n = 5
思考:将switch(i++)改为switch(i)结果有何变化?去掉“break:”语句后,结果有何变化?
5-5 仔细阅读以下程序,指出程序的运行结果 。
#include<stdio.h>
main()
{ char ch ;
printf("Enter ch: ") ;
scanf("%c",&ch) ;
switch(ch)
{case 'm' : printf("Good morning !\n") ; break ;
case 'n' : printf("Good night!\n ") ; break ;
default : printf("I can not understand!\n") ; break ;
}
printf("All right!\n") ;
}
解 : 当输入m时结果为:
Enter ch : m
Good morning !
All right !
当输入n时结果为:
Enter ch : n
Good night !
All right !
当输入其它字符时结果为:
Enter ch : k
I can not understand !
All right !
思考:当输入大写的M与N时,将会有什么结果?如果希望输入大写的M,N与输入小写的m、n时结果相同,程序如何修改?
5-6编写程序,求三个数的最小值。进一步考虑求四个数、五个数及更多的数的最小值及最大值.
解:#include<stdio.h>
main()
{
int a1 ,a2 ,a3 ,min ;
scanf("%d,%d,%d",&a1,&a2,&a3) ;
min = a1 ;
if(a2<min) min = a2 ;
if(a3<min) min = a3 ;
printf("最小值为:%d\n",min) ;
}
思考:要求出最大值,是否将min改为max就可以了?关键应改什么地方 ?
5-7 编写程序,解方程ax+b=0 .
解: #include<stdio.h>
main()
{ float a,b,x ;
scanf("%f,%f",&a,&b) ;
if(a==0)
if(b==0) printf("x可为任意值!\n") ;
else printf("无解!\n") ;
else
{x=-b/a ;
printf("方程的根为:%f\n",x) ;
}
}
思考 : 此题与习题2-14的程序有何不同之处?具有了什么功能?
5-8 编写程序,解方程ax2+bx+c=0。要求分别用if语句和switch语句实现 。
解 : (1) 用if语句实现。
#include<stdio.h>
#include<math.h>
main()
{float a,b,c,d,x,x1,x2 ;
printf("请输入方程的三个系数a,b,c :" ) ;
scanf("%f,%f,%f",&a,&b ,&c) ;
if(a==0)
{if(b==0)
{if(c==0) printf("x可为任意值!\n") ;
else printf("无解!\n") ;
}
else
{x=-c/b ;
printf("方程的根=%f\n",x) ;
}
}
else
{d=b*b-4*a*c ;
if(d>=0)
{x1 = (-b+sqrt(d)/(2*a)) ;
x2 = (-b-sqrt(d)/(2*a)) ;
printf("第一个根=%f ,第二个根=%f\n",x1,x2);
}
else printf("方程无实根!\n") ;
}
}
(2) 用switch语句实现 。
#include<stdio.h>
#include<math.h>
main()
{float a,b,c,d,x,x1,x2 ;
printf("请输入方程的三个系数a,b,c :" ) ;
scanf("%f,%f,%f",&a,&b,&c) ;
switch((int) a) //先判断a是否为0
{case 0: //如果a为0
switch((int) b)
{case 0: //如果b也为 0
switch((int) c)
{case 0: //如果c也为0
printf("x可为任意值!\n") ;goto end ;
default:
printf("无解!\n") ; goto end ;
}
default:
x=-c/b ;
printf("方程的根为%f\n",x) ; goto end ;
}
default : // 如果a不为 0
{ d = b*b-4*a*c ;
if(d>=0)
{ x1 = (-b+sqrt(d)/(2*a)) ;
x2 = (-b-sqrt(d)/(2*a)) ;
printf( "第一个根=%f ,第二个根=%f\n",x1,x2);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论