5  选择结构程序设计
5-1 比较单分支、双分支、多分支if语句。
答:(1)多分支if语句可用多条单分支、双分支if语句等价实现。
2)双分支if语句形式上相当于单分支if语句扩展else分支而来。
3)单分支if语句可以认为是双分支if语句缺省else子句的特殊情况,一条双分支语句可用两条单分支语句实现。
思考:分支结构主要用在哪些情况下?它有哪几种形式?
5-2
, 下列描述哪些是正确的?
1if (x<0)y=−1
    else  if(x==0) y=0
    else  y=1
2if(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时,将会有什么结果?如果希望输入大写的MN与输入小写的mn时结果相同,程序如何修改?
  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:  //如果a0
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小时内删除。