在日常生活中或是在程序處理的問題中常常遇到需要重復(fù)處理的問題。如
- 要想計(jì)算機(jī)輸入全班50個(gè)學(xué)生的成績
- 分別統(tǒng)計(jì)全班50個(gè)學(xué)生的平均成績
- 求30個(gè)整數(shù)之和
- 教師檢查30個(gè)學(xué)生的成績是否及格
大多數(shù)的應(yīng)用程序都會(huì)包含循環(huán)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)和順序結(jié)構(gòu)、選擇結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu),它們是各種復(fù)雜程序的基本構(gòu)造單元。
一、while循環(huán)語句
(一)為什么要用循環(huán)
1.用選擇結(jié)構(gòu)求整數(shù)數(shù)位
人vs計(jì)算機(jī)
相比人類文字能力強(qiáng),計(jì)算機(jī)對(duì)數(shù)字的計(jì)算能力強(qiáng),可重復(fù)執(zhí)行相同操作。比如369是3位,人眼睛一看就知道了。而計(jì)算機(jī)本質(zhì)是沒有生命的物體,沒有人類給予指令它什么也做不了,無法像人一眼看出是幾位數(shù)。那怎么讓計(jì)算機(jī)來判斷數(shù)位呢?
人的方式:眼睛一看就知道了。
計(jì)算機(jī)的方式:判斷數(shù)的范圍來決定它位數(shù)。
369屬于區(qū)間[100,999],所以369是3位。
例1:運(yùn)用上一章選擇結(jié)構(gòu),判斷4位數(shù)及以下正整數(shù)的數(shù)位。
問題分析:判斷4位數(shù)以下正整數(shù)的數(shù)位,運(yùn)用選擇結(jié)構(gòu)進(jìn)行判斷。判斷輸入的一個(gè)4位數(shù)及以下的正整數(shù)是1位、2位、3位還是4位?
模式識(shí)別:1位數(shù)屬于區(qū)間[0,9],2位數(shù)屬于區(qū)間[10,99],3位數(shù)屬于區(qū)間[100,999],4位數(shù)屬于區(qū)間[1000,9999]。用if語句嵌套結(jié)構(gòu)進(jìn)行判斷。
模型歸納:定義整型變量x,n分別用于存儲(chǔ)待判斷的整數(shù)和整數(shù)的位數(shù)。通過if選擇嵌套,判斷x為幾位數(shù)。
程序?qū)崿F(xiàn):
#include<stdio.h>
Int main(){
Int x;
Int n=1;
Scanf('%d',&c);
If(x>999){
n=4;
}else if(x>99){
n=3;}else if(x>9){
n=2;
}else if(x>0){
n=1;
}
Printf('%d\n',n);
Return 0;
}
如此可以判斷5位數(shù)、6位數(shù)、7位數(shù)、8位數(shù)…分別要用到4、5、6、7個(gè)else if.細(xì)細(xì)分析,數(shù)值越大,if選擇結(jié)構(gòu)越臃腫。那有沒有其他的方案呢?
(二)運(yùn)用循環(huán)求整數(shù)數(shù)位
當(dāng)整數(shù)非常大如12394958394382938503285時(shí),通過數(shù)數(shù)來確定位數(shù)。
人的方式:從左往右數(shù),一次劃掉一個(gè)數(shù)字。
計(jì)算機(jī)的方式:從右邊開始劃,去掉最右邊的數(shù),不斷地劃,直到?jīng)]數(shù)可以劃,每劃一次計(jì)數(shù)加1。這是一個(gè)重復(fù)執(zhí)行的過程,運(yùn)用到循環(huán)結(jié)構(gòu)。
注意計(jì)算機(jī)自己不會(huì)劃劃數(shù),但是可以按照人的指令來操作。運(yùn)用數(shù)學(xué)知識(shí)知,將整數(shù)整除10便可減少一位,并且是減少右邊的一位。
試試代碼:
Int x;
Int n=0;//計(jì)數(shù)器,表示整數(shù)的位數(shù)
Scanf('%d',&x);
n
x/1=10;
If(x>0){
n ;
x/10;
If(x>0){
n ;
x/10;
If(x>0){
n ;
x/10;
If(x>0){
n ;
x/10;
if
…)}
}
Printf('%d\n',n);
用前面學(xué)習(xí)的語法和算法知識(shí)試試這代碼,相同代碼重復(fù)出現(xiàn),每劃掉一位數(shù),就執(zhí)行相同的整除代碼。針對(duì)這種特點(diǎn),用循環(huán)結(jié)構(gòu)寫成代碼為:
int x;
Int n=0;//計(jì)數(shù)器,表示整數(shù)的位數(shù)
Scanf('%d',&x);
n
x/1=10;
while(x>0){
n ;
x/10;
}
Printf('%d\n',n);
分析代碼結(jié)構(gòu):
1.用戶輸入x;
2.初始化n為0;
3.x=x/10,去掉個(gè)位;
4.n ;
5.如果x>0,回到3;
6.否則n就是結(jié)果。
用while語句可實(shí)現(xiàn)這個(gè)循環(huán)結(jié)構(gòu)。
(三)while語句
while語句一般形式如下:
while(表達(dá)式)語句
其中“語句”就是循環(huán)體。循環(huán)體可以是一個(gè)語句,還可以是復(fù)合語句。
“表達(dá)式”也稱為循環(huán)條件表達(dá)式。當(dāng)表達(dá)式值為“真”時(shí),就執(zhí)行循環(huán)體育局;為“假”時(shí)就不執(zhí)行循環(huán)體語句。
while語句可簡單的幾位:只要當(dāng)循環(huán)條件表達(dá)式為真(即給定的條件成立),就執(zhí)行循環(huán)體語句。
通過下面的例子,來看怎樣利用while語句進(jìn)行循環(huán)設(shè)計(jì)
例求1 2 3 … 100
問題分析:累加求和并輸出。
模式識(shí)別:從左往右求和,每一次求和為下一次的一個(gè)加數(shù),另一個(gè)加數(shù)規(guī)律變化,這里是每次加1。
模式歸納:定義整型變量sum、i分別表示和和一個(gè)加數(shù),初始化為sum=0,i=1
Sum=sum I
i=i 1
運(yùn)用循環(huán)控制結(jié)構(gòu),i<=100,輸出sum即為累加和。
程序?qū)崿F(xiàn):
#include <stdio.h>
int main()
{
int i=1,sum=0;
while (i<=100)
{ sum=sum i;
i ;
}
printf('sum=%d\n',sum);
return 0;
}
其中i 不能丟,否則循環(huán)永不結(jié)束。
運(yùn)行結(jié)果:
注意:while語句中要有是循環(huán)結(jié)束的語句。
二、do…while語句
do---while語句的特點(diǎn):先無條件地執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立
do---while語句的一般形式為:
do
語句
while (表達(dá)式);
注意do…while();后面的分號(hào)要加上,否則語法錯(cuò)誤。
其流程圖為:
用do…while語句改寫上例代碼為:
#include <stdio.h>
int main()
{ int i=1,sum=0;
do
{
sum=sum i;
i ;
}while(i<=100);
printf('sum=%d\n',sum);
return 0;
}
while與do...while的區(qū)別
Do…while語句不論表達(dá)式是否成立均要先執(zhí)行一次。相比while語句只有當(dāng)表達(dá)式為真才執(zhí)行,否則一次也不執(zhí)行。