?? 6.txt
字號:
6 循環控制 1
6.1 概述 1
6.2 goto語句以及用goto語句構成循環 1
6.3 while語句 2
6.4 do-while語句 4
6.5 for語句 6
6.6 循環的嵌套 9
6.7 幾種循環的比較 9
6.8 break和continue語句 9
6.8.1 break語句 9
6.8.2 continue 語句 10
6.9 程序舉例 11
6 循環控制
6.1 概述
循環結構是程序中一種很重要的結構。其特點是,在給定條件成立時,反復執行某程序段,直到條件不成立為止。給定的條件稱為循環條件,反復執行的程序段稱為循環體。C語言提供了多種循環語句,可以組成各種不同形式的循環結構。
1) 用goto語句和if語句構成循環;
2) 用while語句;
3) 用do-while語句;
4) 用for語句;
6.2 goto語句以及用goto語句構成循環
goto語句是一種無條件轉移語句, 與BASIC中的goto語句相似。goto 語句的使用格式為:
goto 語句標號;
其中標號是一個有效的標識符,這個標識符加上一個“:”一起出現在函數內某處, 執行goto語句后,程序將跳轉到該標號處并執行其后的語句。另外標號必須與goto語句同處于一個函數中,但可以不在一個循環層中。通常goto語句與if條件語句連用, 當滿足某一條件時, 程序跳到標號處運行。
goto語句通常不用,主要因為它將使程序層次不清,且不易讀,但在多層嵌套退出時, 用goto語句則比較合理。
【例6.1】用goto語句和if語句構成循環, 。
main()
{
int i,sum=0;
i=1;
loop: if(i<=100)
{sum=sum+i;
i++;
goto loop;}
printf("%d\n",sum);
}
6.3 while語句
while語句的一般形式為:
while(表達式)語句
其中表達式是循環條件,語句為循環體。
while語句的語義是:計算表達式的值,當值為真(非0)時, 執行循環體語句。其執行過程可用下圖表示。
【例6.2】用while語句求 。
用傳統流程圖和N-S結構流程圖表示算法,見圖:
main()
{
int i,sum=0;
i=1;
while(i<=100)
{
sum=sum+i;
i++;
}
printf("%d\n",sum);
}
【例6.3】統計從鍵盤輸入一行字符的個數。
#include <stdio.h>
main(){
int n=0;
printf("input a string:\n");
while(getchar()!='\n') n++;
printf("%d",n);
}
本例程序中的循環條件為getchar()!='\n',其意義是, 只要從鍵盤輸入的字符不是回車就繼續循環。循環體n++完成對輸入字符個數計數。從而程序實現了對輸入一行字符的字符個數計數。
使用while語句應注意以下幾點:
1) while語句中的表達式一般是關系表達或邏輯表達式,只要表達式的值為真(非0)即可繼續循環。
【例6.4】
main(){
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) 循環體如包括有一個以上的語句,則必須用{}括起來,組成復合語句。
6.4 do-while語句
do-while語句的一般形式為:
do
語句
while(表達式);
這個循環與while循環的不同在于:它先執行循環中的語句,然后再判斷表達式是否為真, 如果為真則繼續循環;如果為假, 則終止循環。因此, do-while循環至少要執行一次循環語句。其執行過程可用下圖表示。
【例6.5】用do-while語句求 。
用傳統流程圖和N-S結構流程圖表示算法,見圖:
main()
{
int i,sum=0;
i=1;
do
{
sum=sum+i;
i++;
}
while(i<=100)
printf("%d\n",sum);
}
同樣當有許多語句參加循環時, 要用"{"和"}"把它們括起來。
【例6.6】while和do-while循環比較。
(1)main()
{int sum=0,i;
scanf(“%d”,&i);
while(i<=10)
{sum=sum+i;
i++;
}
printf(“sum=%d”,sum);
}
(2)main()
{int sum=0,i;
scanf(“%d”,&i);
do
{sum=sum+i;
i++;
}
while(i<=10);
printf(“sum=%d”,sum);
}
6.5 for語句
在C語言中,for語句使用最為靈活,它完全可以取代 while 語句。它的一般形式為:
for(表達式1;表達式2;表達式3) 語句
它的執行過程如下:
1) 先求解表達式1。
2) 求解表達式2,若其值為真(非0),則執行for語句中指定的內嵌語句,然后執行下面第3)步;若其值為假(0),則結束循環,轉到第5)步。
3) 求解表達式3。
4) 轉回上面第2)步繼續執行。
5) 循環結束,執行for語句下面的一個語句。
其執行過程可用下圖表示。
for語句最簡單的應用形式也是最容易理解的形式如下:
for(循環變量賦初值;循環條件;循環變量增量) 語句
循環變量賦初值總是一個賦值語句, 它用來給循環控制變量賦初值; 循環條件是一個關系表達式,它決定什么時候退出循環;循環變量增量,定義循環控制變量每循環一次后 按什么方式變化。這三個部分之間用“;”分開。
例如:
for(i=1; i<=100; i++)sum=sum+i;
先給i賦初值1,判斷i是否小于等于100, 若是則執行語句,之后值增加1。再重新判斷, 直到條件為假,即i>100時,結束循環。
相當于:
i=1;
while(i<=100)
{ sum=sum+i;
i++;
}
對于for循環中語句的一般形式,就是如下的while循環形式:
表達式1;
while(表達式2)
{語句
表達式3;
}
注意:
1) for循環中的“表達式1(循環變量賦初值)”、“表達式2(循環條件)”和“表達式3(循環變量增量)”都是選擇項, 即可以缺省,但“;”不能缺省。
2) 省略了“表達式1(循環變量賦初值)”, 表示不對循環控制變量賦初值。
3) 省略了“表達式2(循環條件)”, 則不做其它處理時便成為死循環。
例如:
for(i=1;;i++)sum=sum+i;
相當于:
i=1;
while(1)
{sum=sum+i;
i++;}
4) 省略了“表達式3(循環變量增量)”, 則不對循環控制變量進行操作,這時可在語句體中加入修改循環控制變量的語句。
例如:
for(i=1;i<=100;)
{sum=sum+i;
i++;}
5) 省略了“表達式1(循環變量賦初值)”和“表達式3(循環變量增量)”。
例如:
for(;i<=100;)
{sum=sum+i;
i++;}
相當于:
while(i<=100)
{sum=sum+i;
i++;}
6) 3個表達式都可以省略。
例如:
for(;;)語句
相當于:
while(1)語句
7) 表達式1可以是設置循環變量的初值的賦值表達式,也可以是其他表達式。
例如:
for(sum=0;i<=100;i++)sum=sum+i;
8) 表達式1和表達式3可以是一個簡單表達式也可以是逗號表達式。
for(sum=0,i=1;i<=100;i++)sum=sum+i;
或:
for(i=0,j=100;i<=100;i++,j--)k=i+j;
9) 表達式2一般是關系表達式或邏輯表達式,但也可是數值表達式或字符表達式,只要其值非零,就執行循環體。
例如:
for(i=0;(c=getchar())!=’\n’;i+=c);
又如:
for(;(c=getchar())!=’\n’;)
printf(“%c”,c);
6.6 循環的嵌套
【例6.7】
main()
{
int i, j, k;
printf("i j k\n");
for (i=0; i<2; i++)
for(j=0; j<2; j++)
for(k=0; k<2; k++)
printf(“%d %d %d\n", i, j, k);
}
6.7 幾種循環的比較
1) 四種循環都可以用來處理同一個問題,一般可以互相代替。但一般不提倡用goto型循環。
2) while和do-while循環,循環體中應包括使循環趨于結束的語句。for語句功能最強。
3) 用while和do-while循環時,循環變量初始化的操作應在while和do-while語句之前完成,而for語句可以在表達式1中實現循環變量的初始化。
6.8 break和continue語句
6.8.1 break語句
break語句通常用在循環語句和開關語句中。當break用于開關語句switch中時,可使程序跳出switch而執行switch以后的語句;如果沒有break語句,則將成為一個死循環而無法退出。break在switch 中的用法已在前面介紹開關語句時的例子中碰到,這里不再舉例。
當break語句用于do-while、for、while循環語句中時,可使程序終止循環而執行循環后面的語句, 通常break語句總是與if語句聯在一起。即滿足條件時便跳出循環。
【例6.8】
main()
{
int i=0;
char c;
while(1) /*設置循環*/
{
c='\0'; /*變量賦初值*/
while(c!=13&&c!=27) /*鍵盤接收字符直到按回車或Esc鍵*/
{
c=getch();
printf("%c\n", c);
}
if(c==27)
break; /*判斷若按Esc鍵則退出循環*/
i++;
printf("The No. is %d\n", i);
}
printf("The end");
}
注意:
1) break語句對if-else的條件語句不起作用。
2) 在多層循環中, 一個break語句只向外跳一層。
6.8.2 continue 語句
continue語句的作用是跳過循環本中剩余的語句而強行執行下一次循環。continue語句只用在for、while、do-while等循環體中,常與if條件語句一起使用,用來加速循環。其執行過程可用下圖表示。
1) while(表達式1)
{ ……
if(表達式2)break;
……
}
2) while(表達式1)
{ ……
if(表達式2)continue;
……
}
【例6.9】
main()
{
char c;
while(c!=13) /*不是回車符則循環*/
{
c=getch();
if(c==0X1B)
continue; /*若按Esc鍵不輸出便進行下次循環*/
printf("%c\n", c);
}
}
6.9 程序舉例
【例6.10】用 公式求π。
N-S流程圖:
#include<math.h>
main()
{
int s;
float n,t,pi;
t=1,pi=0;n=1.0;s=1;
while(fabs(t)>1e-6)
{pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf("pi=%10.6f\n",pi);
}
【例6.11】判斷m是否素數。
N-S流程圖:
#include<math.h>
main()
{
int m,i,k;
scanf(“%d”,&m);
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k+1)
printf(“%d is a prime number\n”,m);
else
printf(“%d is not a prime number\n”,m);
}
【例6.12】求100至200間的全部素數。
#include<math.h>
main()
{
int m,i,k,n=0;
for(m=101;m<=200;m=m+2)
{
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k+1)
{printf(“%d”,m);
n=n+1;}
if(n%n==0)printf(“\n”);
}
printf(“\n”);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -