?? caibook3.01
字號:
else printf("A=B\n");
}
比較兩個數的大小關系。
printf("please input A,B: ");
scanf("%d%d",&a,&b);
if(a!=b)
if(a>b) printf("A>B\n");
else printf("A<B\n");
else printf("A=B\n"); 本例中用了if語句的嵌套結構。 采用嵌套結構實質上是為了進
行多分支選擇,例3.16實際上有三種選擇即A>B、A<B或A=B。這種問
題用if-else-if語句也可以完成。而且程序更加清晰。因此, 在一
般情況下較少使用if語句的嵌套結構。 以使程序更便于閱讀理解。
void main(){
int a,b;
printf("please input A,B: ");
scanf("%d%d",&a,&b);
if(a==b) printf("A=B\n");
else if(a>b) printf("A>B\n");
else printf("A<B\n");
}條件運算符和條件表達式 如果在條件語句中,只執行單個的賦值語句時, 常可使用條件
表達式來實現。不但使程序簡潔,也提高了運行效率。
條件運算符為?和:,它是一個三目運算符,即有三個參與運算
的量。由條件運算符組成條件表達式的一般形式為: 表達式1? 表達式2: 表達式3 其求值規則為:如果表達式1的值為真,則以表達式2 的值作為
條件表達式的值,否則以表達式2的值作為整個條件表達式的值。 條件表達式通常用于賦值語句之中。例如條件語句: if(a>b) max=a;
else max=b;可用條件表達式寫為 max=(a>b)?a:b; 執行該語句的語義是:如a>b為真,則把a賦予max,否則把b 賦
予max。
使用條件表達式時,還應注意以下幾點:1. 條件運算符的運算優先級低于關系運算符和算術運算符,但高于
賦值符。因此 max=(a>b)?a:b可以去掉括號而寫為 max=a>b?a:b2. 條件運算符?和:是一對運算符,不能分開單獨使用。
3. 條件運算符的結合方向是自右至左。
例如:
a>b?a:c>d?c:d應理解為
a>b?a:(c>d?c:d) 這也就是條件表達式嵌套的情形,即其中的表達式3又是一個條
件表達式。
void main(){
int a,b,max;
printf("\n input two numbers: ");
scanf("%d%d",&a,&b);
printf("max=%d",a>b?a:b);
}
用條件表達式對上例重新編程,輸出兩個數中的大數。switch語句
C語言還提供了另一種用于多分支選擇的switch語句, 其一般
形式為: switch(表達式){
case常量表達式1: 語句1;
case常量表達式2: 語句2;
…
case常量表達式n: 語句n;
default : 語句n+1;
}
其語義是:計算表達式的值。 并逐個與其后的常量表達式值相
比較,當表達式的值與某個常量表達式的值相等時, 即執行其后的
語句,然后不再進行判斷,繼續執行后面所有case后的語句。 如表
達式的值與所有case后的常量表達式均不相同時,則執行default后
的語句。
void main(){
int a;
printf("input integer number: ");
scanf("%d",&a);
switch (a){
case 1:printf("Monday\n");
case 2:printf("Tuesday\n");
case 3:printf("Wednesday\n");
case 4:printf("Thursday\n");
case 5:printf("Friday\n");
case 6:printf("Saturday\n");
case 7:printf("Sunday\n");
default:printf("error\n");
}
}
本程序是要求輸入一個數字,輸出一個英文單詞。但是當輸入3
之后,卻執行了case3以及以后的所有語句,輸出了Wednesday 及以
后的所有單詞。這當然是不希望的。為什么會出現這種情況呢?這恰
恰反應了switch語句的一個特點。在switch語句中,“case 常量表
達式”只相當于一個語句標號, 表達式的值和某標號相等則轉向該
標號執行,但不能在執行完該標號的語句后自動跳出整個switch 語
句,所以出現了繼續執行所有后面case語句的情況。 這是與前面介
紹的if語句完全不同的,應特別注意。為了避免上述情況, C語言
還提供了一種break語句,專用于跳出switch語句,break 語句只有
關鍵字break,沒有參數。在后面還將詳細介紹。修改例題的程序,
在每一case語句之后增加break 語句, 使每一次執行之后均可跳出
switch語句,從而避免輸出不應有的結果。void main(){
int a;
printf("input integer number: ");
scanf("%d",&a);
switch (a){
case 1:printf("Monday\n");break;
case 2:printf("Tuesday\n"); break;
case 3:printf("Wednesday\n");break;
case 4:printf("Thursday\n");break;
case 5:printf("Friday\n");break;
case 6:printf("Saturday\n");break;
case 7:printf("Sunday\n");break;
default:printf("error\n");
}
}
在使用switch語句時還應注意以下幾點:1.在case后的各常量表達式的值不能相同,否則會出現錯誤。
2.在case后,允許有多個語句,可以不用{}括起來。
3.各case和default子句的先后順序可以變動,而不會影響程序執行
結果。
4.default子句可以省略不用。程序舉例
輸入三個整數,輸出最大數和最小數。
void main(){
int a,b,c,max,min;
printf("input three numbers: ");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{max=a;min=b;}
else
{max=b;min=a;}
if(max<c)
max=c;
else
if(min>c)
min=c;
printf("max=%d\nmin=%d",max,min);
}
本程序中,首先比較輸入的a,b的大小,并把大數裝入max, 小
數裝入min中,然后再與c比較,若max小于c,則把c賦予max;如果c
小于min,則把c賦予min。因此max內總是最大數,而min內總是最小
數。最后輸出max和min的值即可。 計算器程序。用戶輸入運算數和四則運算符, 輸出計算結果。
void main(){
float a,b,s;
char c;
printf("input expression: a+(-,*,/)b \n");
scanf("%f%c%f",&a,&c,&b);
switch(c){
case '+': printf("%f\n",a+b);break;
case '-': printf("%f\n",a-b);break;
case '*': printf("%f\n",a*b);break;
case '/': printf("%f\n",a/b);break;
default: printf("input error\n");
}
}
float a,b,s;
char c;
printf("input expression: a+(-,*,/)b \n");
scanf("%f%c%f",&a,&c,&b);
switch(c){
case '+': printf("%f\n",a+b);break;
case '-': printf("%f\n",a-b);break;
case '*': printf("%f\n",a*b);break;
case '/': printf("%f\n",a/b);break;
default: printf("input error\n");
}
本例可用于四則運算求值。switch語句用于判斷運算符, 然后
輸出運算值。當輸入運算符不是+,-,*,/時給出錯誤提示。
循環結構程序
循環結構是程序中一種很重要的結構。其特點是, 在給定條件
成立時,反復執行某程序段,直到條件不成立為止。 給定的條件稱
為循環條件,反復執行的程序段稱為循環體。 C語言提供了多種循
環語句,可以組成各種不同形式的循環結構。while語句
while語句的一般形式為: while(表達式)語句; 其中表達式是循環條件,語句為循環體。
while語句的語義是:計算表達式的值,當值為真(非0)時, 執
行循環體語句。其執行過程可用圖3—4表示。 統計從鍵盤輸入一行字符的個數。
#include <stdio.h>
void main(){
int n=0;
printf("input a string:\n");
while(getchar()!='\n') n++;
printf("%d",n);
} int n=0;
printf("input a string:\n");
while(getchar()!='\n')
n++;
printf("%d",n); 本例程序中的循環條件為getchar()!='\n',其意義是, 只要從
鍵盤輸入的字符不是回車就繼續循環。循環體n++完成對輸入字符個
數計數。從而程序實現了對輸入一行字符的字符個數計數。
使用while語句應注意以下幾點:1.while語句中的表達式一般是關系表達或邏輯表達式,只要表達式
的值為真(非0)即可繼續循環。
void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
while (n--)
printf("%d ",a++*2);
} int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
while (n--)
printf("%d ",a++*2); 本例程序將執行n次循環,每執行一次,n值減1。循環體輸出表
達式a++*2的值。該表達式等效于(a*2;a++)
2.循環體如包括有一個以上的語句,則必須用{}括起來, 組成復合
語句。3.應注意循環條件的選擇以避免死循環。void main(){
int a,n=0;
while(a=5)
printf("%d ",n++);
} int a,n=0;
while(a=5)
printf("%d ",n++); 本例中while語句的循環條件為賦值表達式a=5, 因此該表達式
的值永遠為真,而循環體中又沒有其它中止循環的手段, 因此該循
環將無休止地進行下去,形成死循環。4.允許while語句的循環體又是while語句,從而形成雙重循環。
do-while語句
do-while語句的一般形式為: do語句;
while(表達式); 其中語句是循環體,表達式是循環條件。
do-while語句的語義是:先執行循環體語句一次, 再判別表達
式的值,若為真(非0)則繼續循環,否則終止循環。其執行過程如圖
所示。
do-while語句和while語句的區別在于do-while是先執行后判斷,
因此do-while至少要執行一次循環體。而while是先判斷后執行,如
果條件不滿足,則一次循環體語句也不執行。while語句和do-while
語句一般都可以相互改寫。void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
do printf("%d ",a++*2);
while (--n);
}
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
do printf("%d ",a++*2);
while (--n); 在本例中,循環條件改為--n,否則將多執行一次循環。這是由
于先執行后判斷而造成的。對于do-while語句還應注意以下幾點:1.在if語句,while語句中, 表達式后面都不能加分號, 而在 do
-while語句的表達式后面則必須加分號。
2.do-while語句也可以組成多重循環,而且也可以和while語句相互
嵌套。
3.在do和while之間的循環體由多個語句組成時,也必須用{}括起來
組成一個復合語句。
4.do-while和while語句相互替換時,要注意修改循環控制條件。
for語句
for語句是C語言所提供的功能更強,使用更廣泛的一種循環語
句。其一般形式為: for(表達式1;表達式2;表達3)
語句; 表達式1通常用來給循環變量賦初值,一般是賦值表達式。也允
許在for語句外給循環變量賦初值,此時可以省略該表達式。
表達式2通常是循環條件,一般為關系表達式或邏輯表達式。
表達式3通常可用來修改循環變量的值,一般是賦值語句。
這三個表達式都可以是逗號表達式, 即每個表達式都可由多個
表達式組成。三個表達式都是任選項,都可以省略。
一般形式中的“語句”即為循環體語句。for語句的語義是:
1.首先計算表達式1的值。
2.再計算表達式2的值,若值為真(非0)則執行循環體一次, 否則跳
出循環。
3.然后再計算表達式3的值,轉回第2步重復執行。
在整個for循環過程中,表達式1只計算一次,表達式2和表達式
3則可能計算多次。循環體可能多次執行,也可能一次都不執行。for 語句的執行過程如圖所示。void main(){
int n,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s);
}
用for語句計算s=1+2+3+...+99+100
int n,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s); 本例for語句中的表達式3為n++,實際上也是一種賦值語句,相
當于n=n+1,以改變循環變量的值。void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d ",a*2);
}
用for語句修改例題。從0開始,輸出n個連續的偶數。 int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d ",a*2); 本例的for語句中,表達式1已省去,循環變量的初值在for語句
之前由scanf語句取得,表達式3是一個逗號表達式,由a++,n-- 兩
個表達式組成。每循環一次a自增1,n自減1。a的變化使輸出的偶數
遞增,n的變化控制循次數。在使用for語句中要注意以下幾點
1.for語句中的各表達式都可省略,但分號間隔符不能少。
如:for(;表達式;表達式)省去了表達式1。
for(表達式;;表達式)省去了表達式2。
for(表達式;表達式;)省去了表達式3。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -