第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;
}