語句結構循環結構和無條件轉向語句_第1頁
語句結構循環結構和無條件轉向語句_第2頁
語句結構循環結構和無條件轉向語句_第3頁
語句結構循環結構和無條件轉向語句_第4頁
語句結構循環結構和無條件轉向語句_第5頁
已閱讀5頁,還剩38頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章

語句結構-循環結構

本章要點●C語言中3個基本循環結構while、do-while、

for的特點和應用。●怎樣避免“無限循環”。●循環結構的嵌套。●循環結構中的無條件控制語句(goto、break和

continue)的應用。15.1概述實現循環的語句(三種):用while語句 用do-while語句 用for語句 循環:就是在滿足一定條件時重復執行一段程序。被重復執行的語句或模塊,稱為循環體。注意:設計一個合理的循環結構,要使循環條件由一個狀態轉變為另一個狀態,使循環正常終止。否則,這種循環就變為“無限循環”,或稱“死循環”。25.2while循環用while語句實現當型循環:即先判斷后執行while語句的一般形式:

while(表達式)語句流程圖:表達式語句下一語句假(0)真(非0)當表達式的值為真(非0)時,執行其中的循環體,然后回過頭來再判斷表達式的值,如此重復;當表達式的值為假(0)時,結束循環。3while語句的一般形式:while(表達式)語句如:intk=1,s=0; while(k<=100)

{s=s+k;k++;}循環控制表達式循環控制變量循環體注意:若循環體包含一條以上的語句,應以復合語句出現;循環前,必須給循環控制變量賦初值;循環體中,必須有改變循環控制變量值的語句存在。(使循環趨向結束的語句)循環體可以為空 4【例5.1】計算分析:這是一個累加求和問題

s=1+2+3s=s+k和的當前值和的新值求和項當前值s=0s=0+1s=1+2s=3+3k=1k=2k=3#include“stdio.h”main(){int

k,s;s=0;k=1;while(k<=3){s=s+k;k++;}printf("s=%d\n",s);}根據N-S圖,用while語句寫程序s=65#include"stdio.h"main(){

intc=0;

while(c<=255){

printf("%c",c++);if(c%32==0)

printf("c=%d\n",c);/*顯示已輸出字符個數*/}}【例5.2】用while循環,打印ASCII表全部字符。6【例5.3】讀程序#include<stdio.h>voidmain(){int

k,s,n;

printf(“entern:”);

scanf(“%d”,&n);s=0;k=1;while(k<=n){s+=k;k++;}printf(“∑%d=%d\n”,n,s);}entern:515#include<stdio.h>voidmain(){int

k,t,n;

printf(“entern:”);

scanf(“%d”,&n);t=1;k=1;while(k<=n){t*=k;k++;}

printf(“%d!=%d\n”n,t);}entern:5120t=n!#include<stdio.h>voidmain(){int

k,t,n,s;

printf(“entern:”);

scanf(“%d”,&n);t=1;k=1;s=0;while(k<=n){t*=k;s+=t;k++;}

printf(“s=%d\n”,n,s);}s=1!+2!+…+n!entern:51537例5.4:求12+22+32+…….+1002的和。

main(){ longsum=0;

intc=1; while(c<=100) {sum+=c*c; c++; }

printf(“%d,%ld\n”,c,sum);}輸出的c=101當c<=100時,反復執行

c=101時,停止循環

注意:缺少了語句c++;c的值在循環中不會變,while中的條件就不會變,就成了無限循環(死循環)!循環之初的c與sum值8#include"stdio.h"main(){ longfa=1,sum=0;

int

n,c=1;

scanf("%d",&n);

while(c<=n)

{

fa=fa*c; sum=sum+fa; c=c+1; }

printf("n=%d\tsum=%ld\n",n,sum);}

例5.5:求1!+2!+3!+…….+n!的和。9

例5.6:鍵盤輸入一個整數m,判斷m是不是素數。

main(){

int

m,c=2;

scanf("%d",&m);

while(m%c) c++;

if(c==m)

printf("%disaprimenumber.\n",m); else

printf("%disnotaprimenumber.\n",m);}105.3do-while循環用do-while語句用來實現直到型循環:即先執行后判斷條件do-while語句的一般形式:

do語句

while(表達式);注意:分號“;”不可省略!表達式語句下一語句假(0)真(非0)11#include<stdio.h>voidmain(){int

k,s;s=0;k=1;

while(k<=3){s=s+k;k++;}

printf("s=%d\n",s);}用while語句寫程序:【例5.7】計算#include<stdio.h>voidmain(){int

k,s;s=0;k=1;do{s=s+k;k++;}

while(k<=3);

printf("s=%d\n",s);}用do-while語句寫程序:先判斷后執行先執行后判斷12

while循環和do_while循環的比較:一般情況下,while循環和do_while循環可以用來處理同一個問題。但while循環可以一次也不執行循環體(循環條件一開始就不滿足時),而do_while循環時,至少要執行一次循環體。用do_while循環做的事情,都可以用while循環來做;而用while循環來做的事情,do_while循環不一定能做。所以一般用while循環比較方便。使用do_while循環結構時,特別要注意該結構的最后有一個分號。練習:用do-while改寫判斷m是不是素數的程序。13

5.4

for循環結構

for循環結構的一般形式是:

for(表達式1;表達式2;表達式3) 語句(循環體)

表達式1也稱初始化表達式,用來設定循環控制變量或其他變量的初值,若有多個變量需要初始化時,表達式1要使用逗號表達式。

表達式2也稱循環條件表達式,用來決定是否執行循環體。當表達式值為非0時,執行循環體,當表達式的值為0時循環終止。

表達式3也稱增量表達式,執行一次循環體后,求解一次表達式3的值,用來改變循環變量的值,修正表達式2。表達式3也可用逗號表達式。14for循環結構的執行過程如圖所示。表達式2循環體求解表達式1非00圖5.5for循環結構流程圖求解表達式315for循環的其它形式:for循環一般形式:for(表達式1;表達式2;表達式3)語句(循環體)表達式1可以移到for語句的前面表達式1;for(;表達式2;表達式3)語句(循環體)表達式3可以移到循環體里面for(表達式1;表達式2;){語句表達式3;}16表達式1省略時,應在for前給循環變量賦初值如:k=1;for(;k<=3;k++)s=s+k;

表達式3省略時循環體內應有使循環條件改變的語句如:for(k=1;k<=3;){s=s+k;k++;}

同時省略表達式1和表達式3,只有表達式2,此時相當于while語句。如:

表達式2一般是關系或邏輯表達式,也可以是算術或字符表達式,只要值不為0就執行循環體。如:for(k=1;k-4;k++)s=s+k;k=1;for(;k<=3;){s=s+k;k++;}k=1;while(k<=3){s=s+k;k++;}說明17例5.8:用for循環求解在100~200范圍內“既能被5整除又能被6整除”的數。#include"stdio.h"main(){

inti;

for(i=100;i<=200;i++) if(i%5==0&&i%6==0)

printf("\t%d",i);}18例5.9:用for循環判斷整數m是不是素數。

main(){

int

m,c=2;

scanf("%d",&m);

while(m%c) c++;

if(c==m)

printf("%disaprimenumber.\n",m); else

printf("%disnotaprimenumber.\n",m);}#include"stdio.h"main(){

int

m,c=2;

scanf("%d",&m);

for(;m%c;c++);

if(c==m)

printf("%disaprimenumber.\n",m); else

printf("%disnotaprimenumber.\n",m);}19例5.10:用for循環輸出Fibonacci數列:

1、1、2、3、5、8…的前20個數。#include"stdio.h"main(){

int

x,y,i;

for(x=1,y=1,i=1;i<=10;i++) { printf("%12d%12d",x,y); if(i%2==0)

printf("\n"); x=y+x; y=x+y; }}20練習:用while和for循環求100以內的奇數、偶數之和。#include<stdio.h>main(){int

ou=0,ji=0,n=1;

while(n<=100){ji+=n;

ou+=n+1;n+=2;}

printf(“ji=%d,ou=%d\n",ou,ji);}用while語句寫程序#include<stdio.h>main(){int

ou=0,ji=0;for(n=1;n<=100;n+=2){ji+=n;

ou+=n+1;}

printf(“ji=%d,ou=%d\n",ou,ji);}用for語句寫程序21幾種循環的比較對比while(表達式)語句do語句while(表達式);for(表達式1;表達式2;表達式3)語句循環控制條件表達式表達式表達式2循環控制變量賦初值在while之前在do-while之前表達式1;也可以在for之前循環控制變量改變值在循環體內在循環體內表達式3;也可以在循環體內22

5.5循環結構的嵌套

自身嵌套:while循環結構的循環體中可以包含while循環;do_while循環結構的循環體中可以包含do_while循環;for循環結構的循環體中可以包含for循環。此外,這幾種循環結構之間還可以相互嵌套。一般循環體中的循環稱為“內循環”,包含內循環的循環稱為“外循環”,當然,這只是指二重循環。另外還有多層嵌套的情況,這屬于多重循環。

23循環嵌套的說明嵌套的循環控制變量名不能相同內循環變化快,外循環變化慢如:for(i=1;i<=9;i++){for(j=1;j<=9;j++)

printf(“%d”,i*j);

printf(“\n”);}正確確定循環體24例5.11:用for循環嵌套打印九九乘法表。#include"stdio.h"

main()

{

int

i,j;

for(i=1;i<=9;i++)

{

for(j=1;j<=9;j++)

printf("%3d",i*j);

printf("\n");

}

}25例5.12:要付零錢19元,現有1元,2元和5元的紙幣10張,請問有幾種付法?

#include"stdio.h"main(){

int

x,y,z,i=1;

for(x=0;x<10;x++)

for(y=0;y<=9;y++) { z=10-x-y; if(x+2*y+5*z==19)

printf("%d:\tx=%d\ty=%d\tz=%d\n",i++,x,y,z); }}26例5.13:求50以內的全部勾股數并打印輸出。#include"stdio.h"main(){

int

x,y,z,i=1;

for(z=5;z<=50;z++)

for(y=4;y<z;y++)

for(x=3;x<=y;x++)

if(x*x+y*y==z*z) printf("%3d:%3d%3d%3d\n",i++,x,y,z);}27

5.6無條件轉向語句

無條件轉向語句(或稱無條件控制語句)是指當程序執行到該語句時,程序無條件轉移到程序的某個地方執行。C語言提供三個無條件控制語句:break語句,continue語句和goto語句。

break語句主要用于循環結構和switch語句結構中。continue語句主要用于循環結構中。結構化程序設計要求少用或盡量不用goto語句。28

1.break語句

break語句由關鍵字break后加分號“;”組成。它的一般形式是:break;例5.14:求12+22+32+…….+1002的和。#include"stdio.h"main(){ longsum=0;

int

c=1;

while(8) { sum=sum+c*c; c++;

if(c>100)break; }

printf("sum=%ld\n",sum);}29例5.15:求整數m是否是素數。#include"stdio.h"main(){

int

m,c=2;

scanf("%d",&m); for(;;) {

if(m%c==0)break; c++; }

if(c==m)

printf("%disaprimenumber.\n",m); else

printf("%disnotaprimenumber.\n",m);}30例5.16:求200~230之間的全部素數。#include"stdio.h"#include"math.h"

main()

{

int

m,c,k;

for(m=201;m<230;m=m+2)

{

k=(int)sqrt(m);

for(c=2;c<=k;c++)

if(m%c==0)break;

if(c>k)

printf("%disaprimenumber.\n",m);

}

}312.continue語句

一般形式是:continue;

作用:結束本次循環(即跳過循環體中尚未執行的語句)。注意break語句和continue語句的區別:

break語句是跳出整個循環結構,不再在循環結構中做任何事情。而continue語句只是結束本次循環,繼續進行循環條件的判斷,來決定循環是否繼續進行。32對于while或do_while,循環體中執行continue語句后直接進行循環條件的判斷來決定循環是否繼續;而對于for循環,執行continue語句后,還應執行增量表達式(表達式3)后再進行循環條件的判斷來決定循環是否繼續。33例5.21:求200~230之間和400~430的全部素數。#include"stdio.h"#include"math.h"main(){

int

m,c,k;

for(m=201;m<430;m+=2) {

if(m>230&&m<400)continue; k=(int)sqrt(m);

for(c=2;c<=k;c++)

if(m%c==0)break;

if(c==k+1)

printf("%disaprimenumber.\n",m); }}343.goto語句一般形式:goto

語句標號;程序中與之對應的應有:語句標號:語句例5.22求1~100間的奇數和。#include"stdio.h"

main()

{

inti=1,sum=0;

loop:sum=sum+i;

i=i+2;

if(i<100)

gotoloop;

printf("sum=%d\n",sum);

}35

5.7應用舉例數學上的遞推(recurence)方法在程序設計中應用很多。遞推方法解題的關鍵是確定遞推公式和初始條件。根據初始條件的不同,遞推又可分為“順推”和“倒推”兩種形式:順推是數列后面的值要根據前面的值才能推算出來。如例5.13求Fibonacci數列屬順推。倒推是數列前面的值要根據后面的值才能推算出來。例5.23“猴子吃桃”問題屬倒推。遞推方法在程序設計中通過變量的迭代(iterate)方法來實現。36例5.23:猴子吃桃”問題(倒推)。

猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到第十天早上想吃時,發現只剩一個桃子。求第一天共摘了多少桃子。分析:“猴子吃桃”問題成了倒推的問題,設第n天的桃子數為a(n)個,前一天的桃子數為a(n-1)個.則有:a(n)=a(n-1)/2-1

即:a(n-1)=2(a(n)+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論