WEB前端全棧成長計劃第一階段》第三章——常用標簽">《WEB前端全棧成長計劃第一階段》第三章——常用標簽
838
2022-05-29
一、if語句
用if語句可以構成分支結構。它根據給定的條件進行判斷, 以決定執行某個分支程序段。
C語言的if語句有三種基本形式。
1.1 第一種形式為基本形式 if(表達式) 語句;
其語義是:如果表達式的值為真,則執行其后的語句, 否則不執行該語句。
其過程可表示為:
void main(){ int a,b,max; printf("\n input two numbers: "); scanf("%d%d",&a,&b); max=a; if (max
本例程序中,輸入兩個數a,b。把a先賦予變量max,再用if語句判別max和b的大小,如max小于b,則把b賦予max。因此max中總是大數,最后輸出max的值。
1.2 第二種形式為if-else形式
if(表達式) 語句1; else 語句2;
其語義是:如果表達式的值為真,則執行語句1,否則執行語句2 。
void main(){ int a, b; printf("input two numbers: "); scanf("%d%d",&a,&b); if(a>b) printf("max=%d\n",a); else printf("max=%d\n",b); }
輸入兩個整數,輸出其中的大數。
改用if-else語句判別a,b的大小,若a大,則輸出a,否則輸出b。
1.3 第三種形式為if-else-if形式
前二種形式的if語句一般都用于兩個分支的情況。
當有多個分支選擇時,可采用if-else-if語句,其一般形式為:
if(表達式1) 語句1; else if(表達式2) 語句2; else if(表達式3) 語句3; … else if(表達式m) 語句m; else 語句n;
其語義是:依次判斷表達式的值,當出現某個值為真時, 則執行其對應的語句。
然后跳到整個if語句之外繼續執行程序。 如果所有的表達式均為假,則執行語句n 。
然后繼續執行后續程序。
if-else-if語句的執行過程如下。
#include"stdio.h" void main(){ char c; printf("input a character: "); c=getchar(); if(c<32) printf("This is a control character\n"); else if(c>='0'&&c<='9') printf("This is a digit\n"); else if(c>='A'&&c<='Z') printf("This is a capital letter\n"); else if(c>='a'&&c<='z') printf("This is a small letter\n"); else printf("This is an other character\n"); }
本例要求判別鍵盤輸入字符的類別。可以根據輸入字符的ASCII碼來判別類型。由ASCII碼表可知ASCII值小于32的為控制字符。 在“0”和“9”之間的為數字,在“A”和“Z”之間為大寫字母, 在“a”和“z”之間為小寫字母,其余則為其它字符。 這是一個多分支選擇的問題,用if-else-if語句編程,判斷輸入字符ASCII碼所在的范圍,分別給出不同的輸出。例如輸入為“g”,輸出顯示它為小寫字符。
1.4. 在使用if語句中還應注意以下問題
(1) 在三種形式的if語句中,在if關鍵字之后均為表達式。
該表達式通常是邏輯表達式或關系表達式, 但也可以是其它表達式,如賦值表達式等,甚至也可以是一個變量。例如: if(a=5) 語句;if(b) 語句; 都是允許的。只要表達式的值為非0,即為“真”。如在if(a=5)…;中表達式的值永遠為非0,所以其后的語句總是要執行的,當然這種情況在程序中不一定會出現,但在語法上是合法的。
又如,有程序段: if(a=b)
printf("%d",a);
else
printf(“a=0”); 本語句的語義是,把b值賦予a,如為非0則輸出該值,否則輸出“a=0”字符串。這種用法在程序中是經常出現的。
(2) 在if語句中,條件判斷表達式必須用括號括起來, 在語句之后必須加分號。
(3) 在if語句的三種形式中,所有的語句應為單個語句,如果要想在滿足條件時執行一組(多個)語句,則必須把這一組語句用{} 括起來組成一個復合語句。但要注意的是在}之后不能再加分號。
例如:
if(a>b){ a++; b++; } else{ a=0; b=10; }
1.5 if語句的嵌套
當if語句中的執行語句又是if語句時,則構成了if 語句嵌套的情形。
其一般形式可表示如下:
if(表達式) if語句; 或者為 if(表達式) if語句; else if語句;
在嵌套內的if語句可能又是if-else型的,這將會出現多個if和多個else重疊的情況,這時要特別注意if和else的配對問題。
例如:
if(表達式1) if(表達式2) 語句1; else 語句2; 其中的else究竟是與哪一個if配對呢? 應該理解為: 還是應理解為: if(表達式1) if(表達式1) if(表達式2) if(表達式2) 語句1; 語句1; else else 語句2; 語句2;
為了避免這種二義性,C語言規定,else 總是與它前面最近的if配對,因此對上述例子應按前一種情況理解。
比較兩個數的大小關系。
void main(){ int a,b; printf("please input A,B: "); scanf("%d%d",&a,&b); if(a!=b) if(a>b) printf("A>B\n"); else printf("A
本例中用了if語句的嵌套結構。 采用嵌套結構實質上是為了進行多分支選擇,下面代碼實際上有三種選擇即A>B、A
以使程序更便于閱讀理解。
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
1.6 條件運算符和條件表達式
如果在條件語句中,只執行單個的賦值語句時, 常可使用條件表達式來實現。不但使程序簡潔,也提高了運行效率。
條件運算符為?和:,它是一個三目運算符,即有三個參與運算的量。
由條件運算符組成條件表達式的一般形式為:
表達式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。
使用條件表達式時,還應注意以下幾點:
條件運算符的運算優先級低于關系運算符和算術運算符,但高于賦值符。因此 max=(a>b)?a:b可以去掉括號而寫為 max=a>b?a:b
條件運算符?和:是一對運算符,不能分開單獨使用。
條件運算符的結合方向是自右至左。
例如:
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語句時還應注意以下幾點:
在case后的各常量表達式的值不能相同,否則會出現錯誤。
在case后,允許有多個語句,可以不用{}括起來。
各case和default子句的先后順序可以變動,而不會影響程序執行結果。
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
本程序中,首先比較輸入的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"); } }
本例可用于四則運算求值。switch語句用于判斷運算符, 然后輸出運算值。當輸入運算符不是+,-,*,/時給出錯誤提示。
三、循環結構程序
循環結構是程序中一種很重要的結構。其特點是, 在給定條件成立時,反復執行某程序段,直到條件不成立為止。 給定的條件稱為循環條件,反復執行的程序段稱為循環體。 C語言提供了多種循環語句,可以組成各種不同形式的循環結構。
3.1 while語句
while語句的一般形式為: while(表達式)語句; 其中表達式是循環條件,語句為循環體。
while語句的語義是:計算表達式的值,當值為真(非0)時, 執行循環體語句。其執行過程如下表示。 統計從鍵盤輸入一行字符的個數。
#include
本例程序中的循環條件為getchar()!=’\n’,其意義是, 只要從鍵盤輸入的字符不是回車就繼續循環。循環體n++完成對輸入字符個數計數。從而程序實現了對輸入一行字符的字符個數計數。
使用while語句應注意以下幾點:
while語句中的表達式一般是關系表達或邏輯表達式,只要表達式的值為真(非0)即可繼續循環。
void main(){ int a=0,n; printf("\n input n: "); scanf("%d",&n); while (n--) printf("%d ",a++*2); }
本例程序將執行n次循環,每執行一次,n值減1。循環體輸出表達式a++2的值。該表達式等效于(a2;a++)
循環體如包括有一個以上的語句,則必須用{}括起來, 組成復合語句。
應注意循環條件的選擇以避免死循環。
void main(){ int a,n=0; while(a=5) printf("%d ",n++); }
本例中while語句的循環條件為賦值表達式a=5, 因此該表達式的值永遠為真,而循環體中又沒有其它中止循環的手段, 因此該循環將無休止地進行下去,形成死循環。
允許while語句的循環體又是while語句,從而形成雙重循環。
3.2 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); }
在本例中,循環條件改為–n,否則將多執行一次循環。這是由于先執行后判斷而造成的。
對于do-while語句還應注意以下幾點:
在if語句,while語句中, 表達式后面都不能加分號, 而在 do-while語句的表達式后面則必須加分號。
do-while語句也可以組成多重循環,而且也可以和while語句相互嵌套。
在do和while之間的循環體由多個語句組成時,也必須用{}括起來組成一個復合語句。
do-while和while語句相互替換時,要注意修改循環控制條件。
3.3 for語句
for語句是C語言所提供的功能更強,使用更廣泛的一種循環語句。
其一般形式為:
for(表達式1;表達式2;表達3)
語句;
表達式1 通常用來給循環變量賦初值,一般是賦值表達式。也允許在for語句外給循環變量賦初值,此時可以省略該表達式。
表達式2 通常是循環條件,一般為關系表達式或邏輯表達式。
表達式3 通常可用來修改循環變量的值,一般是賦值語句。
這三個表達式都可以是逗號表達式, 即每個表達式都可由多個表達式組成。三個表達式都是任選項,都可以省略。
一般形式中的“語句”即為循環體語句。
for語句的語義是:
首先計算表達式1的值。
再計算表達式2的值,若值為真(非0)則執行循環體一次, 否則跳出循環。
然后再計算表達式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語句中要注意以下幾點
for語句中的各表達式都可省略,但分號間隔符不能少。如:for(;表達式;表達式)省去了表達式1。for(表達式;;表達式)省去了表達式2。
for(表達式;表達式;)省去了表達式3。for(;;)省去了全部表達式。
在循環變量已賦初值時,可省去表達式1,如例3.27即屬于這種情形。如省去表達式2或表達式3則將造成無限循環, 這時應在循環體內設法結束循環。
例題即屬于此情況。
void main(){ int a=0,n; printf("\n input n: "); scanf("%d",&n); for(;n>0;) { a++;n--; printf("%d ",a*2); } }
本例中省略了表達式1和表達式3,由循環體內的n–語句進行循環變量n的遞減,以控制循環次數。
void main(){ int a=0,n; printf("\n input n: "); scanf("%d",&n); for(;;){ a++;n--; printf("%d ",a*2); if(n==0)break; } }
本例中for語句的表達式全部省去。由循環體中的語句實現循環變量的遞減和循環條件的判斷。當n值為0時,由break語句中止循環,轉去執行for以后的程序。在此情況下,for語句已等效于while(1)語句。如在循環體中沒有相應的控制手段,則造成死循環。
循環體可以是空語句。
#include"stdio.h" void main(){ int n=0; printf("input a string:\n"); for(;getchar()!='\n';n++); printf("%d",n); }
本例中,省去了for語句的表達式1,表達式3也不是用來修改循環變量,而是用作輸入字符的計數。這樣, 就把本應在循環體中完成的計數放在表達式中完成了。因此循環體是空語句。應注意的是,空語句后的分號不可少,如缺少此分號,則把后面的printf 語句當成循環體來執行。反過來說,如循環體不為空語句時, 決不能在表達式的括號后加分號, 這樣又會認為循環體是空語句而不能反復執行。這些都是編程中常見的錯誤,要十分注意。
for語句也可與while,do-while語句相互嵌套,構成多重循環。
以下形成都合法的嵌套。
(1)for(){… while() {…} … } (2)do{ … for() {…} … }while(); (3)while(){ … for() {…} … } (4)for(){ … for(){ … } } void main(){ int i,j,k; for(i=1;i<=3;i++) { for(j=1;j<=3-i+5;j++) printf(" "); for(k=1;k<=2*i-1+5;k++) { if(k<=5) printf(" "); else printf("*"); } printf("\n"); } }
四、轉移語句
程序中的語句通常總是按順序方向, 或按語句功能所定義的方向執行的。如果需要改變程序的正常流向, 可以使用本小節介紹的轉移語句。
在C語言中提供了4種轉移語句:
goto,break, continue和return。
其中的return語句只能出現在被調函數中, 用于返回主調函數,我們將在函數一章中具體介紹。 本小節介紹前三種轉移語句。
4.1 goto語句
goto語句也稱為無條件轉移語句,其一般格式如下: goto 語句標號; 其中語句標號是按標識符規定書寫的符號, 放在某一語句行的
前面,標號后加冒號(:)。語句標號起標識語句的作用,與goto 語句配合使用。
如:
label: i++; loop: while(x<7);
C語言不限制程序中使用標號的次數,但各標號不得重名。goto語句的語義是改變程序流向, 轉去執行語句標號所標識的語句。
goto語句通常與條件語句配合使用。可用來實現條件轉移, 構成循環,跳出循環體等功能。
但是,在結構化程序設計中一般不主張使用goto語句, 以免造成程序流程的混亂,使理解和調試程序都產生困難。
統計從鍵盤輸入一行字符的個數。
#include"stdio.h" void main(){ int n=0; printf("input a string\n"); loop: if(getchar()!='\n') { n++; goto loop; } printf("%d",n); }
本例用if語句和goto語句構成循環結構。當輸入字符不為’\n’時即執行n++進行計數,然后轉移至if語句循環執行。直至輸入字符為’\n’才停止循環。
4.2 break語句
break語句只能用在switch 語句或循環語句中, 其作用是跳出switch語句或跳出本層循環,轉去執行后面的程序。由于break語句的轉移方向是明確的,所以不需要語句標號與之配合。
break語句的一般形式為: break;
上面例題中分別在switch語句和for語句中使用了break 語句作為跳轉。使用break語句可以使循環語句有多個出口,在一些場合下使編程更加靈活、方便。
4.3 continue語句
continue語句只能用在循環體中,其一般格式是:
continue;
其語義是:結束本次循環,即不再執行循環體中continue 語句之后的語句,轉入下一次循環條件的判斷與執行。應注意的是, 本語句只結束本層本次的循環,并不跳出循環。
void main(){ int n; for(n=7;n<=100;n++) { if (n%7!=0) continue; printf("%d ",n); } } 輸出100以內能被7整除的數。 int n; for(n=7;n<=100;n++) { if (n%7!=0) continue; printf("%d ",n); }
本例中,對7~100的每一個數進行測試,如該數不能被7整除,即模運算不為0,則由continus語句轉去下一次循環。只有模運算為0時,才能執行后面的printf語句,輸出能被7整除的數。
#include"stdio.h" void main(){ char a,b; printf("input a string:\n"); b=getchar(); while((a=getchar())!='\n'){ if(a==b){ printf("same character\n"); break; }b=a; } }
檢查輸入的一行中有無相鄰兩字符相同。
char a,b; printf("input a string:\n"); b=getchar(); while((a=getchar())!='\n'){ if(a==b){ printf("same character\n"); break; }b=a; }
本例程序中,把第一個讀入的字符送入b。然后進入循環,把下一字符讀入a,比較a,b是否相等,若相等則輸出提示串并中止循環,若不相等則把a中的字符賦予b,輸入下一次循環。
輸出100以內的素數。素數是只能被1 和本身整除的數。可用窮舉法來判斷一個數是否是素數。
void main(){ int n,i; for(n=2;n<=100;n++){ for(i=2;i
本例程序中,第一層循環表示對1~100這100個數逐個判斷是否是素數,共循環100次,在第二層循環中則對數n用2~n-1逐個去除,若某次除盡則跳出該層循環,說明不是素數。 如果在所有的數都是未除盡的情況下結束循環,則為素數,此時有i>=n, 故可經此判斷后輸出素數。然后轉入下一次大循環。實際上,2以上的所有偶數均不是素數,因此可以使循環變量的步長值改為2,即每次增加2,此外只需對數n用2~n去除就可判斷該數是否素數。這樣將大大減少循環次數,減少程序運行時間。
#include"math.h" void main(){ int n,i,k; for(n=2;n<=100;n+=2){ k=sqrt(n); for(i=2;i
五、小結
從程序執行的流程來看, 程序可分為三種最基本的結構: 順序結構,分支結構以及循環結構
程序中執行部分最基本的單位是語句。
C語言的語句可分為五類:
(1) 表達式語句
任何表達式末尾加上分號即可構成表達式語句, 常用的表達式語句為賦值語句。
(2) 函數調用語句
由函數調用加上分號即組成函數調用語句。
(3) 控制語句
用于控制程序流程,由專門的語句定義符及所需的表達式組成。主要有條件判斷執行語句,循環執行語句,轉向語句等。
(4) 復合語句
由{}把多個語句括起來組成一個語句。 復合語句被認為是單條語句,它可出現在所有允許出現語句的地方,如循環體等。
(5) 空語句
僅由分號組成,無實際功能。
C語言中沒有提供專門的輸入輸出語句, 所有的輸入輸出都是由調用標準庫函數中的輸入輸出函數來實現的。
scanf和getchar函數是輸入函數,接收來自鍵盤的輸入數據。
scanf是格式輸入函數, 可按指定的格式輸入任意類型數據。
getchar函數是字符輸入函數, 只能接收單個字符。
printf和putchar函數是輸出函數,向顯示器屏幕輸出數據。
printf是格式輸出函數,可按指定的格式顯示任意類型的數據。
putchar是字符顯示函數,只能顯示單個字符。
關系表達式和邏輯表達式是兩種重要的表達式, 主要用于條件執行的判斷和循環執行的判斷。
C語言提供了多種形式的條件語句以構成分支結構。
(1) if語句主要用于單向選擇。
(2) if-else語句主要用于雙向選擇。
(3) if-else-if語和switch語句用于多向選擇。
這幾種形式的條件語句一般來說是可以互相替代的。
6.C語言提供了三種循環語句。
(1) for語句主要用于給定循環變量初值, 步長增量以及循環次數的循環結構。
(2) 循環次數及控制條件要在循環過程中才能確定的循環可用 while或do-while語句。
(3) 三種循環語句可以相互嵌套組成多重循環。循環之間可以并列但不能交叉。
(4) 可用轉移語句把流程轉出循環體外,但不能從外面轉向循環體內。
(5) 在循環程序中應避免出現死循環,即應保證循環變量的值在運行過程中可以得到修改,并使循環條件逐步變為假,從而結束循環。
C語言語句小結
名 稱 一 般 形 式 簡單語句 表達式語句表達式; 空語句; 復合語句 { 語句 } 條件語句 if(表達式)語句; if(表達式)語句1; else語句2; if(表達式1)語句1; else if(表達式2) 語句2…else語句 n; 開關語句 switch(表達式){ case常量表達式: 語句…default: 語句; } 循環語句 while語句 while(表達式)語句; for語句 for(表達式1; 表達式2; 表達式3)語句; break語句 break; goto語句 goto; continue語句 continue; return 語句 return(表達式);
C 語言
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。