




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6章——循環結構的程序設計第6章——循環結構的程序設計2內存分配指令分配數據描述過程描述順序訪問第三章第四、五章
解決的問題:當過程中出現選擇結構問題時,針對問題的類型,可有三種不同的條件判定方法來描述過程。本章新問題2內存分配指令分配數據過程順序第三章第四、五章解第3
頁循環語句的執行流程
while語句
for語句
do-while語句掌握簡單算法設計輸出簡單圖形
窮舉法當問題中需要多次使用同一過程時,用循環的方法來描述過程。第3頁循環語句的執行流程當問題中需要多次使用同一過程時第4
頁§6.1循環的概念提出問題?提問:從鍵盤上輸入10個整數并求和,怎么編程?回答:在程序中寫10個scanf語句,還可以寫%d%d...提問:從鍵盤上輸入500個整數并求和,怎么編程?回答:這個,嗯……???不會讓我寫500個......換一個角度來看待這些問題,
→以上問題的實質是:將scanf函數重復執行N遍。
→引出一個概念“循環”--反復地執行同一段程序第4頁§6.1循環的概念提出問題?提問:從鍵盤上輸入1第5
頁§6.1循環概念循環反復執行同一段程序,直到滿足一定的條件后才停止執行該段程序。C語言中控制循環的語句:
whilefordo-while第5頁§6.1循環概念循環第6
頁§6.2while語句while語句格式while(表達式)語句;
說明:語句可是簡單語句,也可是復合語句。while語句的執行流程表達式?執行語句成立不成立執行while循環之后的語句循環控制條件循環體第6頁§6.2while語句while語句格式表達式?第7
頁§6.2while語句-實例(數字計算)例C3_5101.C從鍵盤輸入10個整數,求這10個整數之和。count<10?count=count+1成立不成立輸出結果total計數器count=0累加器total=0輸入numtotal+=num開始結束while(count<10){}count++;scanf("%d",&num);total+=num;程序主體第7頁§6.2while語句-實例(數字計算)例C3_第8
頁§6.2while語句-實例 #include<stdio.h>main(){intcount,num,total;
/*count:計數器,num:輸入的整數*/
count=0;total=0;/*total:存放累加和*/例C3_5101
while(count<10)/*循環控制條件*/{
count++;/*循環體*/
printf("EntertheNo.%d=",count);scanf("%d",&num);total+=num;/*計算累加和*/
} printf("Total=%d\n",total);}第8頁§6.2while語句-實例 #include第9
頁§6.2while語句-實例(字符處理)例C3_5103.C:從鍵盤中讀入一系列字符,直到讀入字母a時才停止。ch!=’a’?顯示ch成立不成立ch=讀入一個字符ch=讀入下一個字符開始結束while(ch!=’a’){}ch=getchar();putchar(ch);ch=getchar();分析:由于不知道要讀入的字符數量,只知停止條件是讀入字母a,則只能將循環控制條件設為ch!='a'。程序主體:第9頁§6.2while語句-實例(字符處理)例C3_第10
頁§6.2while語句-實例#include<stdio.h>main(){charch;ch=getchar();while(
ch!='a')
{
putchar(ch); ch=getchar();
}}ch!=’a’?顯示ch成立不成立ch=讀入一個字符ch=讀入下一個字符開始結束第10頁§6.2while語句-實例#include第11
頁§6.2while語句-注意事項while使用注意1.while(0){....}由于循環的條件表達式恒等于0,循環體永遠也不會執行,是編程者的錯誤。2.while(1){....}由于循環的條件表達式恒等于1,所以不可能通過循環控制條件來結束循環體的執行,稱為“死循環”。3.為了保證循環正常運行,應該特別注意:循環控制條件控制條件的初始狀態(初始值)循環體內部對控制條件的影響第11頁§6.2while語句-注意事項while使用第12
頁§6.3for語句for語句格式for(表達式1;表達式2;表達式3)語句;for語句的執行流程循環初始條件循環控制條件
表達式2?執行語句成立不成立執行for循環之后的語句執行表達式3執行表達式1循環體for語句等價于下列語句:表達式1;while(表達式2){
語句;
表達式3;}第12頁§6.3for語句for語句格式循環初始條件循第13
頁§6.3for語句-實例(數字計算)例C3_5203.C:求1到10的階乘。 遞推公式: n!=1 當n=1時
n!=(n-1)!*n 當n>1時#include<stdio.h> main() {longintn=1; inti;
for
(
i=1;i<=10;i++
)
{
n=n*i;/*求N!*/ printf("%2d!=%ld\n",i,n);
}
}例C3_5203for語句最常用的形式for(初值;控制條件;增量)語句;第13頁§6.3for語句-實例(數字計算)例C3_5第14
頁§6.3for語句-實例語句中的逗號(,)運算
逗號(,)運算常見的三種用途是:1.在變量說明表中用來分隔變量,起分隔符的作用。如:inti,
j,k,
m[3],*p;2.在函數的參數表中分隔參數。如:printf("n=%d,x=%d\n",n,x);3.在語句中使用。其形式是:表達式n1,表達式n2;用逗號分隔開的表達式從左到右進行計算,結果的類型和值是最右邊表達式的類型和值。第14頁§6.3for語句-實例語句中的逗號(,)運算第15
頁§6.3for語句-實例(符號處理)例C3_5205.C:用逗號運算輸出下列字符串。azbycxdwevfugthsirjqkplomn
分析:奇數位上的字符從'a'開始逐次遞增,偶數位上的字符從'z'開始逐次遞減 #include<stdio.h>main(){chari,j; /*i:奇位字符
j:偶位字符
*//*i從’a’開始逐次遞增,j從’z’開始逐次遞減*/
for(i='a',j='z';i<j;i++,
j--) printf(”%c%c”,i,j);/*輸出兩個字符*/
printf("\n");}例C3_5205第15頁§6.3for語句-實例(符號處理)例C3_5第16
頁§6.3for語句–注意事項for語句的變化形式
for語句中的三個表達式中的任意一個都是可以省略的(在語法上被接受),但是邏輯不合理。1.省略表達式2,則:for(表達式1;;表達式3)就形成了一個死循環。2.省略表達式1和表達式3,則:for(;表達式2;)等同于:while(表達式)
據此結論:所有用while語句實現的循環都可以用for語句實現。3.表達式1、2、3全省略,則:for
(;;)等同于:while
(1)第16頁§6.3for語句–注意事項for語句的變第17
頁§6.4do-while語句do-while語句格式
do
語句
while(
表達式);do-while語句的執行流程表達式?執行語句成立不成立執行while子句之后的語句循環控制條件循環體第17頁§6.4do-while語句do-while語第18
頁§6.4do-while語句-實例–數字計算例C3_5301.C:輸入一個>=0
的整數,要求以相反的順序輸出該數。例如:輸入12345,則輸出為54321。
基本思路:可以從個位開始,按位輸出整數的每一位
main(){unsignedintnumber;printf("Inputthenumber:");scanf("%d",&number); do{printf("%d",number%10);
number/=10;/*number縮小10倍*/ }while(number!=0);}例C3_5301思考:使用while或for語句,如何實現?例C3_53011兩個程序有何區別?前面的程序可以處理數字0,后面的程序不能處理第18頁§6.4do-while語句-實例–數字計第19
頁§6.4do-while語句-實例–符號處理例C3_5302.C從鍵盤輸入任意的字符,按下列規則進行分類計數。第一類’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’第二類
’+’,’-’,’*’,’/’,’%’,’=’第三類其它字符當輸入字符’\’
時先計數然后停止接收輸入。第19頁§6.4do-while語句-實例–符號處第20
頁§6.4do-while語句-實例
main(){intclass1=0,class2=0,class3=0;charch; do{
putchar(ch=getch());/*函數的嵌套調用*/
switch
(ch)
{case
’0’:case
’1’:case
’2’:case
’3’:
case
’4’:case’5’:case
’6’:case’7’:
case
’8’:case
’9’:class1++;break;/*對分類1計數*/
case
’+’:case’-’:case
’*’:case
’/’:
case’%’:case
’=’:class2++;break;/*對分類2計數*/
default:class3++;break;/*對分類3計數*/
}}while(ch!=’\\’);
printf("class1=%d,class2=%d,class3=%d\n",class1,class2,class3);}例C3_5302第20頁§6.4do-while語句-實例main(第21
頁§6.4do-while語句–注意事項do-while語句特點
do-while與while和for的最大區別:
do-while語句先執行循環體然后再判斷循環控制條件,而while和for卻是先判斷條件之后再執行循環體。 使用do-while構成的循環,循環體部分至少要執行一次; 而采用while和for構成的循環,循環體部分有可能一次也不會執行。第21頁§6.4do-while語句–注意事項do第22
頁§6.5循環語句小結C語言提供三種循環:for、while、do-while:
1、for和while先判斷循環條件后執行循環體,do-while語句先執行循環體后判斷循環條件。 2、while和do-while語句的條件表達式只有1個;for語句有3個表達式,表達式2是條件表達式。 3、while、do-while、for可以相互替換使用。 4、while語句多用于不需要賦初值的或循環次數不定的情況。
for語句多用于要賦初值或循環次數固定的情況。
do-while語句多用于至少要運行一次的循環。 5、循環語句可以嵌套,可以并列,但不能交叉。第22頁§6.5循環語句小結C語言提供三種循環:for第23
頁§6.5循環語句小結為了保證循環體正常運行,應該特別注意:循環控制條件控制條件的初始狀態(初始值)循環體內部對控制條件的影響以上三個方面相互配合,相互影響,共同完成循環控制第23頁§6.5循環語句小結為了保證循環體正常運行,應第24
頁循環中的常見算法問題1
-循環與遞推例C3_5204.C: 草原上有一對小兔子,它們剛出生后的第1個月就會逐步長大,到了第2個月末就生出一對小兔子。第3個月大兔子會繼續生一對小兔子,而第2個月出生的小兔子會逐步長大。第4個月時,第1月出生的兔子繼續生育,第2月出生的小兔子也可以生育一對小兔子了,第3月出生的小兔子則逐步長大……
假設這些草原的兔子非常長壽,可以認為它們不會死亡。請建立數學模型,計算第N個月時,草原上將會有多少對兔子?第24頁循環中的常見算法問題1-循環與遞推例C3_5第25
頁循環與遞推例C3_5204.C:數列1、1、2、3、5、8、13、21、…是著名的菲波那奇數列,其遞推通項公式為: U1=U2=1 Un=Un-1+Un-2 (n>=3)
為求出第N項的值,請編寫程序。
根據遞推通項公式,可用遞推法編寫程序,計算第N項的值。遞推法:由初始的已知條件開始,先計算出第(N-1)步的結果,再利用前面已知的(N-1)項結果,按照遞推公式(或遵照遞推規則),推出第N步結果。
遞推法是程序設計中最常用的方法之一,使用遞推法必須有明確的遞推初始值和遞推規則(遞推公式)。第25頁循環與遞推例C3_5204.C:數列1、1、2、第26
頁循環與遞推例C3_5204.C程序un=un_1=1;for(i=3;i<=n;i++){
un_2=un_1;un_1=un;un=un_2+un_1;}i<=n?向前傳遞前兩項un_2=un_1un_1=un成立不成立初始化:un=un_1=1計算un=un_2+un_1遞推項:i=3i++數列對應關系:
un_2,un_1,un遞推計算第26頁循環與遞推例C3_5204.C程序i<=n?第27
頁循環與遞推例C3_5204.C程序#include<stdio.h>main(){intn,i,un_2,un_1,un;
for(;;){printf("Inputn=?");scanf("%d",&n);
if(n>=3)
break;/*退出for循環*/
elseprintf("\nInputniserror!\n");}
/*控制輸入正確的N值*/
un=un_1=1;/*設置遞推初始值*/
for(i=3;i<=n;i++)/*用遞推法計算第N項的值*/
{
un_2=un_1;un_1=un;un=un_2+un_1;
}printf("No.%dis%d\n",n,un);}例C3_5204第27頁循環與遞推例C3_5204.C程序例C3_520循環中的常見算法問題2
-循環的嵌套在一個循環結構的循環體中又包含了另一個循環結構,稱為循環的嵌套。嵌套形式多種多樣,可嵌套任意的一個或多個循環。例:x=1while(x<=9){for(i=1;i<=9;i++)printf(“%5d”,x*i);
x++;printf(“\n”);}for(i=1;i<=9;i++){
for(j=1;j<=9;j++)printf(“%5d”,i*j);
printf(“\n”);}for(i=1;i<=9;i++){j=1;
do{printf(“%5d”,i*j);j++;}while(j<10);printf(“\n”);}注意大括號{}的使用{}不要可以嗎?循環中的常見算法問題2-循環的嵌套在一個循環結構的循環體中循環的嵌套-結構規則
外循環內循環交叉循環外循環入口內循環出口內循環出口外循環出口如:打印乘法九九表外循環出口1.在嵌套的循環中外循環與內循環變量不可同名。2.外循環與內循環不可交叉。循環的嵌套-結構規則外循環內循環交叉循環外循環內循環第30
頁循環的嵌套-實例循環嵌套在循環體中,又包含有循環語句,構成循環嵌套。
例C3_5107.C:輸出下三角形乘法九九表。123456789---------------------------------------12436948121651015202561218243036714212835424981624324048566491827364554637281假設:行號為i,列號為ji=6j=5i*j(1<=i<=9)(1<=j<=i)則:第i
行中一共要輸出i個乘積第30頁循環的嵌套-實例循環嵌套i=6(1<=i<=9)第31
頁循環的嵌套-實例 #include<stdio.h>main(){inti=1,j;/*i:行計數器j:列計數器*/
while(i<=9)/*控制打印表頭*/
printf("%4d",i++);
printf("\n------------------------------------\n");i=1;
while(i<=9){j=1;/*列計數器置1*/
while(j<=i)/*嵌套的二重循環。輸出第i行*/ {printf("%4d",i*j);
j++;/*列計數器+1*/}
printf("\n");/*一行輸出結束后,輸出\n*/i++;/*行計數器+1*/}}例C3_5107外層循環體執行1次,內層循環要完整執行1次第31頁循環的嵌套-實例 #include<st第32
頁循環的嵌套-for語句-實例例C3_5202.C:用for語句實現打印乘法九九表。#include<stdio.h>main(){inti,j; for(i=1;i<10;i++) printf("%4d",i);/*打印表頭*/
printf("\n-----------------------------------\n");
for(i=1;i<10;i++
)/*控制打印表體*/
for(j=1;
j<=i;
j++
)printf((j==i)?
"%4d\n"
:"%4d",i*j);}例C3_5202輸出函數printf中使用了“?”操作,含義相當于:
if(j==i) printf("%4d\n",i*j);
else printf("%4d",i*j);第32頁循環的嵌套-for語句-實例例C3_5202第33
頁§6.6轉移語句轉移語句的作用改變程序的運行流程。C語言轉移語句
breakcontinuegotoreturn第33頁§6.6轉移語句轉移語句的作用第34
頁§6.6.1break語句格式break;break語句的功能1.在switch語句中結束case子句,使控制轉到switch語句之外。2.在循環語句的循環體中使用,結束循環過程,使控制轉移到整個循環語句之外的下一條語句處。第34頁§6.6.1break語句格式第35
頁表達式2?成立不成立執行后續語句執行表達式3執行表達式1§6..1break語句break語句的執行流程表達式?成立不成立執行后續語句breakbreak表達式?成立不成立執行后續語句breakwhile語句for語句do-while語句第35頁表達式2?成立不成立執行后續語句執行表達式3執行第36
頁§6.6.1break語句-實例例C3_6101.C:求給定整數的約數中最大的三位數?
main(){intj;longn;
printf("Pleaseinputnumber:");scanf("%ld",&n);
/*所求的約數的可能取值是從999到100,j從大到小*/
for(j=999;j>=100;j--)
if(n%j==0)/*若能夠整除j,則j是約數*/
{
printf(”3digitsin%ld=%d\n”,n,j);
break;/*控制退出循環*/
}}例C3_6101第36頁§6.6.1break語句-實例例C3_610第37
頁§6.6.1break語句-實例break語句使用注意:
1、在嵌套循環中,break語句僅能退出一層(當前層)循環。 2、若在循環語句中包含了switch語句,那么switch語句中的break
語句僅能使控制退出switch語句。
3、break
語句并不是程序設計中必不可少的語句,可以通過改變程序的結構去掉。第37頁§6.6.1break語句-實例break語句第38
頁§6.6.2continue語句continue語句格式continue;continue語句的功能
continue語句僅能在循環語句中使用.它的作用不是結束循環,而是開始一次新的循環。 對于for語句,將控制轉到執行表達式3和條件測試部分;對于while和do-while語句,將控制轉到條件測試部分;
從邏輯上講,改變if語句的條件表達式所表示的條件,就可以不需要使用continue語句。第38頁§6.6.2continue語句continu第39
頁§6.6.2continue語句continue語句的執行流程表達式2?continue成立不成立執行后續語句執行表達式3執行表達式1表達式?continue成立不成立執行后續語句表達式?continue成立不成立執行后續語句while語句for語句do-while語句第39頁§6.6.2continue語句continu第40
頁§6.6.2continue語句-實例例C3_6201.C:輸入10個整數,求其中正數的個數及平均值,精確到小數點后兩位。
main(){inti,count=0,j,sum=0;for(i=1;i<=10;i++){printf("Inputinteger:");scanf("%d",&j);
if(j<=0)
continue;/*結束本次循環,不進行后續操作*/
count++;/*計數器*/
sum+=j;/*求累加和*/}
if(count>0)printf("Plusnumer:%d,averagevalue:%.2f", count,1.0*sum/count);
elseprintf("Plusnumer:0,averagevalue:0");}例C3_6201改變if語句的條件表達式,可以不需要使用continue。第40頁§6.6.2continue語句-實例例C3_第41
頁§6.6.3goto語句goto語句格式goto
標號;goto語句的功能 1、將控制轉移到標號所指定的語句處繼續執行。 2、標號的唯一功能就是作為goto語句的目標。標號的作用域是它所在的整個函數。goto語句的使用說明
在C語言中,goto語句并不是必不可少的,使用
goto語句的地方都可以用C的其它控制流程語句改寫。第41頁§6.6.3goto語句goto語句格式第42
頁§6.6.3goto語句-實例例C3_6301.C:已知一首項大于0的等差數列的前四項和為26,前四項的積為880,求這數列。設數列的第一項為a(a>0),公差為d(d>0)。則該數列滿足條件:
a+(a+d)+(a+2*d)+(a+3*d)=4*a+6*d=26a*(a+d)*(a+2*d)*(a+3*d)=880則可以推出,首項a和公差d的取值范圍為:
1<=a<=51<=d<=3可以使用窮舉的方法,在首項a和公差d的取值范圍內進行判斷。第42頁§6.6.3goto語句-實例例C3_6301第43
頁§6.6.3goto語句-實例main(){inta,b,c,d,i;
for
(a=1;a<=5;++a)/*在a的范圍內窮舉*/
for(d=1;d<=3;++d)/*在d的范圍內窮舉*/
{b=a+(a+d)+(a+2*d)+(a+3*d);/*前四項的和*/
c=a*(a+d)*(a+2*d)*(a+3*d);/*前四項的積*/
if(b==26&&c==880)/*若滿足條件*/
goto
out;/*退出二重循環*/
}
out:for(i=0;i<=20;++i)/*輸出運行結果*/
printf("%d,",a+i*d);}第43頁§6.6.3goto語句-實例main()第44
頁§6.6.3goto語句-實例main(){inta,b,c,d,i,flag=1;/*flag:標志變量*/
for
(a=1;a<=5&&flag;++a)/*flag!=0是進行循環*/
for(d=1;d<=3&&flag;++d)
{b=a+(a+d)+(a+2*d)+(a+3*d);/*前四項的和*/
c=a*(a+d)*(a+2*d)*(a+3*d);/*前四項的積*/
if(b==26&&c==880)/*若滿足條件*/
{for(i=0;i<=20;++i)/*輸出結果*/
printf("%d,",a0+i*d0);
flag
=0;/*控制退出二重循環*/}
}}通過增加標志變量可以有效地控制循環第44頁§6.6.3goto語句-實例main()通第45
頁§6.6.4return語句return語句格式格式一:return;格式二:return(表達式);return
語句的功能
1.return語句使程序從被調用函數中返回到調用函數的調用處繼續運行。2.如果return后跟一表達式,則該表達式的值會從被調用函數中帶回到調用它的函數,稱為返回值。第45頁§6.6.4return語句return語句循環程序設計循環程序的實現要點:歸納出哪些操作需要反復執行?
循環體這些操作在什么情況下重復執行?
循環條件選用合適的循環語句forwhiledo-while循環具體實現時考慮(循環條件):事先給定循環次數,首選for通過其他條件控制循環,考慮while或do-while循環程序設計循環程序的實現要點:#include<stdio.h>intmain(void){inti,mark,max,n;
printf("Entern:");
scanf("%d",&n);printf("Enter%dmarks:",n);scanf("%d",&mark);/*讀入第一個成績*/
max=mark;/*假設第一個成績是最高分*/
for(i=1;i<n;i++)
{
scanf("%d",&mark);
if(max<mark)
max=mark;}
printf("Max=%d\n",max);return0;}例4-7輸入一批學生的成績,求最高分(for)markmaxmaxmarkEntern:5Enter5maks:6788735482Max=88Entern:0#include<stdio.h>例4-7輸入一批學生的#include<stdio.h>intmain(void){intmark,max;printf(“Entermarks:");scanf("%d",&mark);/*讀入第一個成績*/
max=mark;/*假設第一個成績最高分*/
while(mark>=0){if(max<mark)
max=mark;
scanf("%d",&mark);};
printf("Max=%d\n",max);return0;}例4-7輸入一批學生的成績,求最高分(while)Entermarks:6788735482-1Max=88Entermarks:-1#include<stdio.h>例4-7輸入一批學生的#include<stdio.h>intmain(void){intmark,max;
max=-1;/*給max賦一個小初值*/
printf(“Entermarks:");
do{scanf("%d",&mark);
if(max<mark)
max=mark;}while(mark>=0);printf("Max=%d\n",max);}例4-7輸入一批學生的成績,求最高分(do-while)Entermarks:6788735482-1Max=88Entermarks:-1#include<stdio.h>例4-7輸入一批學生的第50
頁§6.2while語句-實例例1:分析程序的運行結果 #include<stdio.h>main(){ intn=0; while(n<3) printf(”nis%d\n”,n); n++; printf(”That\’sallthisprogramdoes.\n”);}例C3_51011{}結果:程序將不停的打印“nis0”,直至終止程序無法正常終止的程序,稱為“死循環”。結論:while語句循環體中,一定要有能夠對循環控制條件產生影響的語句。避免出現“死循環”現象。第50頁§6.2while語句-實例例1:分析程序的運第51
頁§6.2while語句-實例例2:分析下列程序段
index=1; while(index<5) printf(”Goodmorning!\n”); 分析:
程序段將無限制打印字符串。 因為循環中沒有任何語句可以改變循環控制變量index的初值1。第51頁§6.2while語句-實例例2:分析下列程序第52
頁§6.2while語句-實例例3:分析下列程序段
index=1; while(--
index<5) printf(”Goodmorning!\n”); 分析:
仍有問題,程序改變了index,但方向錯了。 在index達到系統能夠處理的最大負數時,將會產生下溢而終止程序。 結論: 循環體中必須有能夠使循環正常停止的條件。第52頁§6.2while語句-實例例3:分析下列程序第53
頁§6.2while語句-實例例3:求1到100的之和。
main(){inttotal=0,i=1;
while(i<=100) {
total=total+i;
i++;
}
printf(”Total=%d\n",total);}例C3_51041
變形1:while(i<=100) total+=i++;
==>total+=i;
++i
變形2:inti=0;
while(++i<=100) ==>++i;判斷i<=100 total+=i;
變形3:inti=0;
while(i++<
100) ==>判斷i<100;i++ total+=i;
變形4:inti=0;
while(i
<100) total+=++i;
==>++i;total+=i第53頁§6.2while語句-實例例3:求1到100第6章——循環結構的程序設計第6章——循環結構的程序設計55內存分配指令分配數據描述過程描述順序訪問第三章第四、五章
解決的問題:當過程中出現選擇結構問題時,針對問題的類型,可有三種不同的條件判定方法來描述過程。本章新問題2內存分配指令分配數據過程順序第三章第四、五章解第56
頁循環語句的執行流程
while語句
for語句
do-while語句掌握簡單算法設計輸出簡單圖形
窮舉法當問題中需要多次使用同一過程時,用循環的方法來描述過程。第3頁循環語句的執行流程當問題中需要多次使用同一過程時第57
頁§6.1循環的概念提出問題?提問:從鍵盤上輸入10個整數并求和,怎么編程?回答:在程序中寫10個scanf語句,還可以寫%d%d...提問:從鍵盤上輸入500個整數并求和,怎么編程?回答:這個,嗯……???不會讓我寫500個......換一個角度來看待這些問題,
→以上問題的實質是:將scanf函數重復執行N遍。
→引出一個概念“循環”--反復地執行同一段程序第4頁§6.1循環的概念提出問題?提問:從鍵盤上輸入1第58
頁§6.1循環概念循環反復執行同一段程序,直到滿足一定的條件后才停止執行該段程序。C語言中控制循環的語句:
whilefordo-while第5頁§6.1循環概念循環第59
頁§6.2while語句while語句格式while(表達式)語句;
說明:語句可是簡單語句,也可是復合語句。while語句的執行流程表達式?執行語句成立不成立執行while循環之后的語句循環控制條件循環體第6頁§6.2while語句while語句格式表達式?第60
頁§6.2while語句-實例(數字計算)例C3_5101.C從鍵盤輸入10個整數,求這10個整數之和。count<10?count=count+1成立不成立輸出結果total計數器count=0累加器total=0輸入numtotal+=num開始結束while(count<10){}count++;scanf("%d",&num);total+=num;程序主體第7頁§6.2while語句-實例(數字計算)例C3_第61
頁§6.2while語句-實例 #include<stdio.h>main(){intcount,num,total;
/*count:計數器,num:輸入的整數*/
count=0;total=0;/*total:存放累加和*/例C3_5101
while(count<10)/*循環控制條件*/{
count++;/*循環體*/
printf("EntertheNo.%d=",count);scanf("%d",&num);total+=num;/*計算累加和*/
} printf("Total=%d\n",total);}第8頁§6.2while語句-實例 #include第62
頁§6.2while語句-實例(字符處理)例C3_5103.C:從鍵盤中讀入一系列字符,直到讀入字母a時才停止。ch!=’a’?顯示ch成立不成立ch=讀入一個字符ch=讀入下一個字符開始結束while(ch!=’a’){}ch=getchar();putchar(ch);ch=getchar();分析:由于不知道要讀入的字符數量,只知停止條件是讀入字母a,則只能將循環控制條件設為ch!='a'。程序主體:第9頁§6.2while語句-實例(字符處理)例C3_第63
頁§6.2while語句-實例#include<stdio.h>main(){charch;ch=getchar();while(
ch!='a')
{
putchar(ch); ch=getchar();
}}ch!=’a’?顯示ch成立不成立ch=讀入一個字符ch=讀入下一個字符開始結束第10頁§6.2while語句-實例#include第64
頁§6.2while語句-注意事項while使用注意1.while(0){....}由于循環的條件表達式恒等于0,循環體永遠也不會執行,是編程者的錯誤。2.while(1){....}由于循環的條件表達式恒等于1,所以不可能通過循環控制條件來結束循環體的執行,稱為“死循環”。3.為了保證循環正常運行,應該特別注意:循環控制條件控制條件的初始狀態(初始值)循環體內部對控制條件的影響第11頁§6.2while語句-注意事項while使用第65
頁§6.3for語句for語句格式for(表達式1;表達式2;表達式3)語句;for語句的執行流程循環初始條件循環控制條件
表達式2?執行語句成立不成立執行for循環之后的語句執行表達式3執行表達式1循環體for語句等價于下列語句:表達式1;while(表達式2){
語句;
表達式3;}第12頁§6.3for語句for語句格式循環初始條件循第66
頁§6.3for語句-實例(數字計算)例C3_5203.C:求1到10的階乘。 遞推公式: n!=1 當n=1時
n!=(n-1)!*n 當n>1時#include<stdio.h> main() {longintn=1; inti;
for
(
i=1;i<=10;i++
)
{
n=n*i;/*求N!*/ printf("%2d!=%ld\n",i,n);
}
}例C3_5203for語句最常用的形式for(初值;控制條件;增量)語句;第13頁§6.3for語句-實例(數字計算)例C3_5第67
頁§6.3for語句-實例語句中的逗號(,)運算
逗號(,)運算常見的三種用途是:1.在變量說明表中用來分隔變量,起分隔符的作用。如:inti,
j,k,
m[3],*p;2.在函數的參數表中分隔參數。如:printf("n=%d,x=%d\n",n,x);3.在語句中使用。其形式是:表達式n1,表達式n2;用逗號分隔開的表達式從左到右進行計算,結果的類型和值是最右邊表達式的類型和值。第14頁§6.3for語句-實例語句中的逗號(,)運算第68
頁§6.3for語句-實例(符號處理)例C3_5205.C:用逗號運算輸出下列字符串。azbycxdwevfugthsirjqkplomn
分析:奇數位上的字符從'a'開始逐次遞增,偶數位上的字符從'z'開始逐次遞減 #include<stdio.h>main(){chari,j; /*i:奇位字符
j:偶位字符
*//*i從’a’開始逐次遞增,j從’z’開始逐次遞減*/
for(i='a',j='z';i<j;i++,
j--) printf(”%c%c”,i,j);/*輸出兩個字符*/
printf("\n");}例C3_5205第15頁§6.3for語句-實例(符號處理)例C3_5第69
頁§6.3for語句–注意事項for語句的變化形式
for語句中的三個表達式中的任意一個都是可以省略的(在語法上被接受),但是邏輯不合理。1.省略表達式2,則:for(表達式1;;表達式3)就形成了一個死循環。2.省略表達式1和表達式3,則:for(;表達式2;)等同于:while(表達式)
據此結論:所有用while語句實現的循環都可以用for語句實現。3.表達式1、2、3全省略,則:for
(;;)等同于:while
(1)第16頁§6.3for語句–注意事項for語句的變第70
頁§6.4do-while語句do-while語句格式
do
語句
while(
表達式);do-while語句的執行流程表達式?執行語句成立不成立執行while子句之后的語句循環控制條件循環體第17頁§6.4do-while語句do-while語第71
頁§6.4do-while語句-實例–數字計算例C3_5301.C:輸入一個>=0
的整數,要求以相反的順序輸出該數。例如:輸入12345,則輸出為54321。
基本思路:可以從個位開始,按位輸出整數的每一位
main(){unsignedintnumber;printf("Inputthenumber:");scanf("%d",&number); do{printf("%d",number%10);
number/=10;/*number縮小10倍*/ }while(number!=0);}例C3_5301思考:使用while或for語句,如何實現?例C3_53011兩個程序有何區別?前面的程序可以處理數字0,后面的程序不能處理第18頁§6.4do-while語句-實例–數字計第72
頁§6.4do-while語句-實例–符號處理例C3_5302.C從鍵盤輸入任意的字符,按下列規則進行分類計數。第一類’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’第二類
’+’,’-’,’*’,’/’,’%’,’=’第三類其它字符當輸入字符’\’
時先計數然后停止接收輸入。第19頁§6.4do-while語句-實例–符號處第73
頁§6.4do-while語句-實例
main(){intclass1=0,class2=0,class3=0;charch; do{
putchar(ch=getch());/*函數的嵌套調用*/
switch
(ch)
{case
’0’:case
’1’:case
’2’:case
’3’:
case
’4’:case’5’:case
’6’:case’7’:
case
’8’:case
’9’:class1++;break;/*對分類1計數*/
case
’+’:case’-’:case
’*’:case
’/’:
case’%’:case
’=’:class2++;break;/*對分類2計數*/
default:class3++;break;/*對分類3計數*/
}}while(ch!=’\\’);
printf("class1=%d,class2=%d,class3=%d\n",class1,class2,class3);}例C3_5302第20頁§6.4do-while語句-實例main(第74
頁§6.4do-while語句–注意事項do-while語句特點
do-while與while和for的最大區別:
do-while語句先執行循環體然后再判斷循環控制條件,而while和for卻是先判斷條件之后再執行循環體。 使用do-while構成的循環,循環體部分至少要執行一次; 而采用while和for構成的循環,循環體部分有可能一次也不會執行。第21頁§6.4do-while語句–注意事項do第75
頁§6.5循環語句小結C語言提供三種循環:for、while、do-while:
1、for和while先判斷循環條件后執行循環體,do-while語句先執行循環體后判斷循環條件。 2、while和do-while語句的條件表達式只有1個;for語句有3個表達式,表達式2是條件表達式。 3、while、do-while、for可以相互替換使用。 4、while語句多用于不需要賦初值的或循環次數不定的情況。
for語句多用于要賦初值或循環次數固定的情況。
do-while語句多用于至少要運行一次的循環。 5、循環語句可以嵌套,可以并列,但不能交叉。第22頁§6.5循環語句小結C語言提供三種循環:for第76
頁§6.5循環語句小結為了保證循環體正常運行,應該特別注意:循環控制條件控制條件的初始狀態(初始值)循環體內部對控制條件的影響以上三個方面相互配合,相互影響,共同完成循環控制第23頁§6.5循環語句小結為了保證循環體正常運行,應第77
頁循環中的常見算法問題1
-循環與遞推例C3_5204.C: 草原上有一對小兔子,它們剛出生后的第1個月就會逐步長大,到了第2個月末就生出一對小兔子。第3個月大兔子會繼續生一對小兔子,而第2個月出生的小兔子會逐步長大。第4個月時,第1月出生的兔子繼續生育,第2月出生的小兔子也可以生育一對小兔子了,第3月出生的小兔子則逐步長大……
假設這些草原的兔子非常長壽,可以認為它們不會死亡。請建立數學模型,計算第N個月時,草原上將會有多少對兔子?第24頁循環中的常見算法問題1-循環與遞推例C3_5第78
頁循環與遞推例C3_5204.C:數列1、1、2、3、5、8、13、21、…是著名的菲波那奇數列,其遞推通項公式為: U1=U2=1 Un=Un-1+Un-2 (n>=3)
為求出第N項的值,請編寫程序。
根據遞推通項公式,可用遞推法編寫程序,計算第N項的值。遞推法:由初始的已知條件開始,先計算出第(N-1)步的結果,再利用前面已知的(N-1)項結果,按照遞推公式(或遵照遞推規則),推出第N步結果。
遞推法是程序設計中最常用的方法之一,使用遞推法必須有明確的遞推初始值和遞推規則(遞推公式)。第25頁循環與遞推例C3_5204.C:數列1、1、2、第79
頁循環與遞推例C3_5204.C程序un=un_1=1;for(i=3;i<=n;i++){
un_2=un_1;un_1=un;un=un_2+un_1;}i<=n?向前傳遞前兩項un_2=un_1un_1=un成立不成立初始化:un=un_1=1計算un=un_2+un_1遞推項:i=3i++數列對應關系:
un_2,un_1,un遞推計算第26頁循環與遞推例C3_5204.C程序i<=n?第80
頁循環與遞推例C3_5204.C程序#include<stdio.h>main(){intn,i,un_2,un_1,un;
for(;;){printf("Inputn=?");scanf("%d",&n);
if(n>=3)
break;/*退出for循環*/
elseprintf("\nInputniserror!\n");}
/*控制輸入正確的N值*/
un=un_1=1;/*設置遞推初始值*/
for(i=3;i<=n;i++)/*用遞推法計算第N項的值*/
{
un_2=un_1;un_1=un;un=un_2+un_1;
}printf("No.%dis%d\n",n,un);}例C3_5204第27頁循環與遞推例C3_5204.C程序例C3_520循環中的常見算法問題2
-循環的嵌套在一個循環結構的循環體中又包含了另一個循環結構,稱為循環的嵌套。嵌套形式多種多樣,可嵌套任意的一個或多個循環。例:x=1while(x<=9){for(i=1;i<=9;i++)printf(“%5d”,x*i);
x++;printf(“\n”);}for(i=1;i<=9;i++){
for(j=1;j<=9;j++)printf(“%5d”,i*j);
printf(“\n”);}for(i=1;i<=9;i++){j=1;
do{printf(“%5d”,i*j);j++;}while(j<10);printf(“\n”);}注意大括號{}的使用{}不要可以嗎?循環中的常見算法問題2-循環的嵌套在一個循環結構的循環體中循環的嵌套-結構規則
外循環內循環交叉循環外循環入口內循環出口內循環出口外循環出口如:打印乘法九九表外循環出口1.在嵌套的循環中外循環與內循環變量不可同名。2.外循環與內循環不可交叉。循環的嵌套-結構規則外循環內循環交叉循環外循環內循環第83
頁循環的嵌套-實例循環嵌套在循環體中,又包含有循環語句,構成循環嵌套。
例C3_5107.C:輸出下三角形乘法九九表。123456789---------------------------------------12436948121651015202561218243036714212835424981624324048566491827364554637281假設:行號為i,列號為ji=6j=5i*j(1<=i<=9)(1<=j<=i)則:第i
行中一共要輸出i個乘積第30頁循環的嵌套-實例循環嵌套i=6(1<=i<=9)第84
頁循環的嵌套-實例 #include<stdio.h>main(){inti=1,j;/*i:行計數器j:列計數器*/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 無中介房屋買賣協議書
- 一年級數學20以內三個數加減混合運算競賽考核訓練題帶答案
- 三位數除以兩位數水平作業練習題大全附答案
- 農村綠色發展生態保護補償協議
- 醫院剪彩活動方案
- 廈門小學生中秋活動方案
- 衛生寢室活動方案
- 雙十一家電營銷活動方案
- 單親兒童捐款活動方案
- 華為發布活動方案
- 南岸區小升初試題及答案
- 監護人安全培訓試卷(答案)
- 小學綜合實踐活動與勞動教育有效整合的策略研究
- 《中國慢性阻塞性肺疾病基層診療與管理指南(2024年)》解讀課件
- 環保設備行業市場分析與銷售技巧課件
- 細胞器互作機制-深度研究
- JJF1033-2023計量標準考核規范
- 個人閱兵申請書
- 人工智能導論-第2版-全套課件
- 電大《Python語言基礎》實驗6:文件讀寫基本操作
- 中國廚電用微晶玻璃行業市場競爭現狀及發展前景研判報告
評論
0/150
提交評論