1. 程式人生 > 其它 >【C語言】第4章 選擇結構程式設計

【C語言】第4章 選擇結構程式設計

第4章 選擇結構程式設計

C語言有兩種選擇語句:
if 語句,實現兩個分支的選擇結構
switch 語句,實現多分支的選擇結構

輸入3個數a,b,c,要求按由小到大的順序輸出。
可以先用虛擬碼寫出演算法:
if a>b,a和b對換    (a是a、b中的小者)
if a>c,a和c對換     (a是三者中最小者)
if b>c,b和c對換     (b是三者中次小者)
順序輸出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;  a=b;  b=t;   } 
   if(a>c)
   {   t=a;  a=c;  c=t;   }        
   if(b>c) 
   {   t=b;  b=c;  c=t;   }                        
   printf("%5.2f,%5.2f,%5.2f\n",a,b,c);  
   return 0;
}

最常用的3種 if 語句形式:
①if (表示式) 語句1
②if (表示式) 語句1
else 語句
③if(表示式1) 語句1
else if(表示式2) 語句2
else if(表示式3) 語句3

else if(表示式m) 語句m
else 語句m+1

關係運算符及其優先次序

C語言提供6種關係運算符:

   ① <  (小於)   ② <=     (小於或等於)   
   ③ >  (大於)   ④ >=     (大於或等於) 
   ⑤ ==   (等於)  ⑥ !=   (不等於) 
c>a+b       等效於  c>(a+b)
a>b==c     等效於  (a>b)==c
a==b<c     等效於   a==(b<c)
a=b>c       等效於   a=(b>c)

關係表示式
用關係運算符將兩個數值或數值表示式連線起來的式子
關係表示式的值是一個邏輯值,即“真”或“假”
在C的邏輯運算中,以“1”代表“真”,以“0”代表“假”

邏輯運算子及其優先次序

3種邏輯運算子:
&&(邏輯與) ||(邏輯或) !(邏輯非)

&&和||是雙目(元)運算子

!是一目(元)運算子

邏輯表示式:用邏輯運算子將關係表示式或其他邏輯量連線起來的式子

判斷年齡在13至17歲之內?
  age>=13 && age<=17
判斷年齡小於12或大於65?
  age<12 || age>65
判別某一年是否閏年,用邏輯表示式表示
閏年的條件是符合下面二者之一:
能被4整除,但不能被100整除,如2008
能被400整除,如2000
     (year%4 == 0 && year%100 !=0) || year%400 == 0
     如果表示式值為1,則閏年;否則為非閏年
條件表示式的一般形式為
表示式1?表示式2: 表示式3

條件運算子的執行順序:
求解表示式1
若為非0(真)則求解表示式2,此時表示式2的值就作為整個條件表示式的值
若表示式1的值為0(假),則求解表示式3,表示式3的值就是整個條件表示式的值
用switch語句實現多分支選擇結構
例4.6 要求按照考試成績的等級輸出百分制分數段,A等為85分以上,B等為70~84分,C等為60~69分 ,D等為 60分以下 。成績的等級由鍵盤輸入。

#include <stdio.h>
int main()
{ char grade;
   scanf("%c",&grade);
   printf("Your score:");
   switch(grade)
  { case 'A': printf("85~100\n");break;
     case 'B': printf("70~84\n");break;
     case 'C': printf("60~69\n");break;
     case 'D': printf("<60\n");break;    
     default:  printf("enter data error!\n");
   }
   return 0;
 }

switch語句的作用是根據表示式的值,使流程跳轉到不同的語句
switch語句的一般形式:

switch(表示式)
{   case  常量1:語句1
    case  常量2:語句2
       ┇        ┇          ┇
    case  常量n:語句n
    default  :  語句n+1
}
編寫程式,用switch語句處理選單命令。

#include <stdio.h>
int main()
{ void action1(int,int),action2(int,int);
   char ch;  int a=15,b=23;
   ch=getchar();
   switch(ch)
   { case 'a':
      case ‘A’: action1(a,b); break; 
      case 'b':
      case ‘B’: action2(a,b); break; 
      default:  putchar(‘\a’); 
   }
   return 0;
}
void action1(int x,int y) 
{
    printf("x+y=%d\n",x+y);
}
void action2(int x,int y) 
{
    printf("x*y=%d\n",x*y);
}
寫一程式,判斷某一年是否閏年。
用變數leap代表是否閏年的資訊。若閏年,令leap=1;非閏年,leap=0。最後判斷leap是否為1(真),若是,則輸出“閏年”資訊

#include <stdio.h>
int main()	
{int year, leap;
  printf("enter year:"); scanf("%d",&year);
  if (year%4==0)
      if (year%100==0)
          if (year%400==0)    leap=1;
          else    leap=0;	
      else    leap=1;
  else    leap=0;
  if (leap)     printf("%d is ",year);
  else  printf("%d is not ",year);
  printf("a leap year.\n");
  return 0;
}
求a*x^2+b*x+c = 0方程的根

#include <stdio.h>
#include <math.h>
int main()
{ double a, b, c, disc, x1, x2, realpart, imagpart;
  scanf("%lf,%lf,%lf",&a,&b,&c);
  printf("The equation ");
  if(fabs(a)<=1e-6)   printf("is not a quadratic\n");
  else
     {disc=b*b-4*a*c;
      if(fabs(disc)<=1e-6)   printf("has two equal roots:%8.4f\n", -b/(2*a));
      else
         if(disc>1e-6)
            { x1=(-b+sqrt(disc))/(2*a);
              x2=(-b-sqrt(disc))/(2*a);
              printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);
            }
if(fabs(a)<=1e-6)   printf("is not a quadratic\n");
  else
     {disc=b*b-4*a*c;
      if(fabs(disc)<=1e-6)   printf("has two equal roots:%8.4f\n", -b/(2*a));
      else
         if(disc>1e-6)
            { x1=(-b+sqrt(disc))/(2*a);
              x2=(-b-sqrt(disc))/(2*a);
              printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);
            }
         else
            { realpart=-b/(2*a);              
              imagpart=sqrt(-disc)/(2*a);       
              printf(" has complex roots:\n");         
              printf("%8.4f+%8.4fi\n“, realpart, imagpart); 
              printf("%8.4f-%8.4fi\n",  realpart, imagpart);   
	}
      }
    return 0;
}  
運輸公司對使用者計算運輸費用。路程(s km)越遠,每噸·千米運費越低。
標準如下: 
        s < 250 		沒有折扣
        250≤s < 500   	2%折扣
        500≤s < 1000   	5%折扣
      1000≤s < 2000 	8%折扣
      2000≤s < 3000 	10%折扣
      3000≤s  		15%折扣

#include <stdio.h>
int main()
{ 
   int c,s;
   float p,w,d,f;
   printf("please enter price,weight,discount:");   
   scanf("%f,%f,%d",&p,&w,&s); 
   if(s>=3000)  c=12;                               
   else   c=s/250; 
   switch(c)
     { case 0:   d=0; break; 
       case 1:   d=2; break;                          
       case 2: 
       case 3:   d=5; break;                           
       case 4: 
      case 5:      
      case 6:      
      case 7:   d=8; break;                           
      case 8:  case 9:  case 10:   
      case 11:  d=10; break;                        
      case 12:  d=15; break;  
    }
   f = p * w * s * (1 - d / 100);                   
   printf(“freight=%10.2f\n”,f); 
   return 0;
}