語句結(jié)構(gòu)循環(huán)結(jié)構(gòu)和無條件轉(zhuǎn)向語句_第1頁
語句結(jié)構(gòu)循環(huán)結(jié)構(gòu)和無條件轉(zhuǎn)向語句_第2頁
語句結(jié)構(gòu)循環(huán)結(jié)構(gòu)和無條件轉(zhuǎn)向語句_第3頁
語句結(jié)構(gòu)循環(huán)結(jié)構(gòu)和無條件轉(zhuǎn)向語句_第4頁
語句結(jié)構(gòu)循環(huán)結(jié)構(gòu)和無條件轉(zhuǎn)向語句_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第5章

語句結(jié)構(gòu)-循環(huán)結(jié)構(gòu)

本章要點(diǎn)●C語言中3個基本循環(huán)結(jié)構(gòu)while、do-while、

for的特點(diǎn)和應(yīng)用?!裨鯓颖苊狻盁o限循環(huán)”?!裱h(huán)結(jié)構(gòu)的嵌套?!裱h(huán)結(jié)構(gòu)中的無條件控制語句(goto、break和

continue)的應(yīng)用。15.1概述實(shí)現(xiàn)循環(huán)的語句(三種):用while語句 用do-while語句 用for語句 循環(huán):就是在滿足一定條件時重復(fù)執(zhí)行一段程序。被重復(fù)執(zhí)行的語句或模塊,稱為循環(huán)體。注意:設(shè)計一個合理的循環(huán)結(jié)構(gòu),要使循環(huán)條件由一個狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€狀態(tài),使循環(huán)正常終止。否則,這種循環(huán)就變?yōu)椤盁o限循環(huán)”,或稱“死循環(huán)”。25.2while循環(huán)用while語句實(shí)現(xiàn)當(dāng)型循環(huán):即先判斷后執(zhí)行while語句的一般形式:

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

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

s=1+2+3s=s+k和的當(dāng)前值和的新值求和項(xiàng)當(dāng)前值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);}根據(jù)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);/*顯示已輸出字符個數(shù)*/}}【例5.2】用while循環(huán),打印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當(dāng)c<=100時,反復(fù)執(zhí)行

c=101時,停止循環(huán)

注意:缺少了語句c++;c的值在循環(huán)中不會變,while中的條件就不會變,就成了無限循環(huán)(死循環(huán))!循環(huán)之初的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:鍵盤輸入一個整數(shù)m,判斷m是不是素數(shù)。

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循環(huán)用do-while語句用來實(shí)現(xiàn)直到型循環(huán):即先執(zhí)行后判斷條件do-while語句的一般形式:

do語句

while(表達(dá)式);注意:分號“;”不可省略!表達(dá)式語句下一語句假(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語句寫程序:先判斷后執(zhí)行先執(zhí)行后判斷12

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

5.4

for循環(huán)結(jié)構(gòu)

for循環(huán)結(jié)構(gòu)的一般形式是:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句(循環(huán)體)

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

表達(dá)式2也稱循環(huán)條件表達(dá)式,用來決定是否執(zhí)行循環(huán)體。當(dāng)表達(dá)式值為非0時,執(zhí)行循環(huán)體,當(dāng)表達(dá)式的值為0時循環(huán)終止。

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

表達(dá)式3省略時循環(huán)體內(nèi)應(yīng)有使循環(huán)條件改變的語句如:for(k=1;k<=3;){s=s+k;k++;}

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

表達(dá)式2一般是關(guān)系或邏輯表達(dá)式,也可以是算術(shù)或字符表達(dá)式,只要值不為0就執(zhí)行循環(huán)體。如: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循環(huán)求解在100~200范圍內(nèi)“既能被5整除又能被6整除”的數(shù)。#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循環(huán)判斷整數(shù)m是不是素數(shù)。

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循環(huán)輸出Fibonacci數(shù)列:

1、1、2、3、5、8…的前20個數(shù)。#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練習(xí):用while和for循環(huán)求100以內(nèi)的奇數(shù)、偶數(shù)之和。#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幾種循環(huán)的比較對比while(表達(dá)式)語句do語句while(表達(dá)式);for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句循環(huán)控制條件表達(dá)式表達(dá)式表達(dá)式2循環(huán)控制變量賦初值在while之前在do-while之前表達(dá)式1;也可以在for之前循環(huán)控制變量改變值在循環(huán)體內(nèi)在循環(huán)體內(nèi)表達(dá)式3;也可以在循環(huán)體內(nèi)22

5.5循環(huán)結(jié)構(gòu)的嵌套

自身嵌套:while循環(huán)結(jié)構(gòu)的循環(huán)體中可以包含while循環(huán);do_while循環(huán)結(jié)構(gòu)的循環(huán)體中可以包含do_while循環(huán);for循環(huán)結(jié)構(gòu)的循環(huán)體中可以包含for循環(huán)。此外,這幾種循環(huán)結(jié)構(gòu)之間還可以相互嵌套。一般循環(huán)體中的循環(huán)稱為“內(nèi)循環(huán)”,包含內(nèi)循環(huán)的循環(huán)稱為“外循環(huán)”,當(dāng)然,這只是指二重循環(huán)。另外還有多層嵌套的情況,這屬于多重循環(huán)。

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

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

printf(“\n”);}正確確定循環(huán)體24例5.11:用for循環(huán)嵌套打印九九乘法表。#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元,現(xiàn)有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以內(nèi)的全部勾股數(shù)并打印輸出。#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無條件轉(zhuǎn)向語句

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

break語句主要用于循環(huán)結(jié)構(gòu)和switch語句結(jié)構(gòu)中。continue語句主要用于循環(huán)結(jié)構(gòu)中。結(jié)構(gòu)化程序設(shè)計要求少用或盡量不用goto語句。28

1.break語句

break語句由關(guān)鍵字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:求整數(shù)m是否是素數(shù)。#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之間的全部素數(shù)。#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;

作用:結(jié)束本次循環(huán)(即跳過循環(huán)體中尚未執(zhí)行的語句)。注意break語句和continue語句的區(qū)別:

break語句是跳出整個循環(huán)結(jié)構(gòu),不再在循環(huán)結(jié)構(gòu)中做任何事情。而continue語句只是結(jié)束本次循環(huán),繼續(xù)進(jìn)行循環(huán)條件的判斷,來決定循環(huán)是否繼續(xù)進(jìn)行。32對于while或do_while,循環(huán)體中執(zhí)行continue語句后直接進(jìn)行循環(huán)條件的判斷來決定循環(huán)是否繼續(xù);而對于for循環(huán),執(zhí)行continue語句后,還應(yīng)執(zhí)行增量表達(dá)式(表達(dá)式3)后再進(jìn)行循環(huán)條件的判斷來決定循環(huán)是否繼續(xù)。33例5.21:求200~230之間和400~430的全部素數(shù)。#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

語句標(biāo)號;程序中與之對應(yīng)的應(yīng)有:語句標(biāo)號:語句例5.22求1~100間的奇數(shù)和。#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應(yīng)用舉例數(shù)學(xué)上的遞推(recurence)方法在程序設(shè)計中應(yīng)用很多。遞推方法解題的關(guān)鍵是確定遞推公式和初始條件。根據(jù)初始條件的不同,遞推又可分為“順推”和“倒推”兩種形式:順推是數(shù)列后面的值要根據(jù)前面的值才能推算出來。如例5.13求Fibonacci數(shù)列屬順推。倒推是數(shù)列前面的值要根據(jù)后面的值才能推算出來。例5.23“猴子吃桃”問題屬倒推。遞推方法在程序設(shè)計中通過變量的迭代(iterate)方法來實(shí)現(xiàn)。36例5.23:猴子吃桃”問題(倒推)。

猴子第一天摘下若干個桃子,當(dāng)即吃了一半,還不過癮,又多吃了一個。第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到第十天早上想吃時,發(fā)現(xiàn)只剩一個桃子。求第一天共摘了多少桃子。分析:“猴子吃桃”問題成了倒推的問題,設(shè)第n天的桃子數(shù)為a(n)個,前一天的桃子數(shù)為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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論