清華C語言程序設(shè)計2語句和循環(huán)116_第1頁
清華C語言程序設(shè)計2語句和循環(huán)116_第2頁
清華C語言程序設(shè)計2語句和循環(huán)116_第3頁
清華C語言程序設(shè)計2語句和循環(huán)116_第4頁
清華C語言程序設(shè)計2語句和循環(huán)116_第5頁
已閱讀5頁,還剩111頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計第三章3.1根本語句一個c程序可以有假設(shè)干個源程序文件組成一個源文件可以有假設(shè)干個函數(shù)和預處理命令以及全局變量聲明局部組成一個函數(shù)有函數(shù)首部和函數(shù)體組成函數(shù)體由數(shù)據(jù)聲明和執(zhí)行語句組成C語句分為5類控制語句函數(shù)調(diào)用語句表達式語句空語句復合語句一、表達式語句有一個表達式加一個分號構(gòu)成一個語句

a=3;例:分號賦值表達式表達式語句+=二、空語句只有一個分號的語句;〔什么也不做〕用來做流程的轉(zhuǎn)向點用來作為循環(huán)語句中的循環(huán)體三、復合語句用一對{}括起來的語句

{ z=x+y; t=z/100; printf(“%f”,t); }例:一般格式:{[內(nèi)部數(shù)據(jù)說明;]語句1;……語句n;}(1)復合語句的}之前的分號不可省略,}之后,分號可有可無。(2)在復合語句中說明的變量,僅在復合語句中有效。注意四、控制語句完成一定的控制功能 1if()~else條件語句 2for()~循環(huán)語句 3while()~循環(huán)語句 4do~while();循環(huán)語句 5continue繼續(xù)語句6break間斷語句7switch()開關(guān)語句8goto轉(zhuǎn)向語句9return返回語句五、函數(shù)調(diào)用語句函數(shù)調(diào)用+語句例如:sin(0.5);scanf(“%d〞,&a);等等

本節(jié)要點關(guān)系運算符與關(guān)系表達式P27邏輯運算符與邏輯表達式P27選擇結(jié)構(gòu)程序設(shè)計循環(huán)的根本概念不同形式的循環(huán)控制多重循環(huán)問題3.2控制語句

主要內(nèi)容一、關(guān)系運算符和關(guān)系表達式二、邏輯運算符和邏輯表達式三、if語句四、witch語句五、程序舉例一、關(guān)系運算符和關(guān)系表達式1、關(guān)系運算符及其優(yōu)先次序1)<(小于)2)<=(小于或等于)3)>(大于)4)>=(大于或等于)5)==(等于)6)!=(不等于)優(yōu)先級相同(高)優(yōu)先級相同(低)C語言中沒有專用的邏輯值,1代表真,0代表假3、關(guān)系運算符的結(jié)合律C語言規(guī)定關(guān)系表達式采取左結(jié)合律。表達式中出現(xiàn)優(yōu)先級別為同一級別的運算符時,那么按從左到右結(jié)合方向處理。

inta=2,b=3,c=1;a>b<c值:1先計算a>b,值是0,再計算0<c,值是16>3<2值:1先計算6>3,值是1,再計算1<2,值為1例如例、以下程序輸出的結(jié)果是

。main(){inta=5,b=4,c=3,d;d=(a>b>c);printf("%d\n",d);}0二、邏輯運算符和邏輯表達式1、邏輯運算符及其優(yōu)先次序1)&&(邏輯與)相當于其他語言中的AND2)||(邏輯或)相當于其他語言中的OR3)!(邏輯非)相當于其他語言中的NOT例:a&&b假設(shè)a,b為真,那么a&&b為真。a||b假設(shè)a,b之一為真,那么a||b為真。!a假設(shè)a為真,那么!a為假。2、邏輯表達式用邏輯運算符將關(guān)系表達式或邏輯量連接起來的式子就是邏輯表達式。邏輯表達式的值應(yīng)該是一個邏輯量“真〞或“假〞。真用1表示,假用0表示運算數(shù)據(jù):0為假,而非0為真。運算規(guī)那么:0&&0=00&&1=01&&0=01&&1=10||0=00||1=01||0=01||1=1!0=1!1=0例:設(shè)a=4,b=5:!a的值為0a&&b的值為1a||b的值為1!a||b的值為14&&0||2的值為1例、當變量c的值不為2、4、6時,值也為“真〞的表達式是

〔〕A、(c==2)‖(c

==4)‖(c==6)

B、(c>=2&&c<=6)‖(c!=3)‖(c!=5)

C、(c>=2&&c<=6)&&!(c%2)

D、(c>=2&&c<=6)&&(c%2!=1)

〔2021年4月全國計算機等考試原題〕B3、邏輯運算符的結(jié)合律例:5>3&&8<4-!0

自左向右運算

1&&0邏輯值為08<3邏輯值為04-1值為3!0邏輯值為15>3邏輯值為1表達式值為0求解過程:求解表達式1求解表達式2結(jié)束,結(jié)果為假……結(jié)束,結(jié)果為假假假真真求解表達式n真在邏輯表達式的求解中,并不是所有的邏輯運算符都要被執(zhí)行。(1)a&&b&&c只有a為真時,才需要判斷b的值,只有a和b都為真時,才需要判斷c的值。(2)a||b||c只要a為真,就不必判斷b和c的值,只有a為假,才判斷b。a和b都為假才判斷c對于式:如有式:表達式1&&表達式2……&&表達式n對于表達式1||表達式2……||表達式n其求應(yīng)該如何求解?對于表達式1&&表達式2……&&表達式n其求應(yīng)該如何求解?例、用邏輯表達式來表示閏年的條件能被4整除,但不能被100整除。能被4整除,又能被400整除。答(year%4==0&&year%100!=0)||year%400==0案值為真(1)是閏年,否那么為非閏年。例、計算分段函數(shù)計算x<0,如果結(jié)果為1:計算:y=3-x;否那么,計算:y=2*x;需要根據(jù)x的值進行流程選擇〔分支〕。三、if語句例、求ax2+bx+c=0方程的根,需要判斷有無實根。1、If語句的三種根本形式〔1〕單分支選擇語句if〔表達式〕語句執(zhí)行過程:首先先判斷表達式的值假設(shè)為非0那么執(zhí)行語句;假設(shè)為0那么跳過該語句。例:if(x>y)printf(“%d〞,x);表達式語句真(非0)假(0)#include<stdio.h>main(){floatx,y;scanf(“%f〞,&x);y=2*x;if(x<0)y=3-x;printf(“y=%6.2f〞,y);}(2)雙分支選擇語句格式:if(表達式)語句1else語句2

條件

語句1

語句2YN執(zhí)行過程:首先先判斷表達式的值假設(shè)為非0那么執(zhí)行語句1。假設(shè)為0那么執(zhí)行語句2例:if(x>y)printf(“%d〞,x);elseprintf(“%d〞,y);#include<stdio.h>main(){floatx,y;scanf(“%f〞,&x);if(x<0)y=3-x;elsey=2*x;printf(“y=%6.2f〞,y);}注意:不管是單分支還是多分支,如果語句由多個語句構(gòu)成,必須要加上{}構(gòu)成復合語句;否那么,要不程序存在語法錯誤,要不就結(jié)果錯誤。例、有以下程序〔2006年4月全國計算機二級考試原題〕main(){inta=0,b=0,c=0,d=0;if(a=1)b=1;c=2;elsed=3;printf("%d,%d,%d,%d\n",a,b,c,d);}程序輸出〔〕A、0,1,2,0B、0,0,0,3C、1,1,2,0D、編譯有錯例、假設(shè)變量已正確定義,有以下程序段

int

a=3,b=5,c=7;

if(a>b)

a=b;c=a;

if(c!=a)

c=b;

printf("%d,%d,%d\n",a,b,c);

其輸出結(jié)果是〔〕

A、程序段有語法錯

B、3,5,3

C、3,5,5

D、3,5,7

〔2021年4月全國計算機等考試原題〕DA說明:(1)2種形式的if語句中在if后面都有表達式,一般為邏輯表達式或關(guān)系表達式。(2)第一,第二種形式的if語句中,在每個else前面有一個分號,整個語句結(jié)束處有一個分號。(3)在if和else后面可以只含有一個內(nèi)嵌的操作語句,也可以由多個操作語句,此時用花括號將幾個語句括起來成為一個復合語句。C語言中條件運算符的優(yōu)先級高于賦值運算符,但低于邏輯運算符。條件運算符要求有三個操作對象,稱三目〔元〕運算符。條件運算符的結(jié)合方向為“自右至左〞。如條件表達式:y=x>10?x/10:x>0?x:-x;從右至左結(jié)合,等價于:y=x>10?x/10:(x>0?x:-x);它的功能是:當x>10時,y的值為x/10;當x<10時,y的值取決于表達式x>0?〔3〕條件運算符?:P28格式:表達式1?表達式2:表達式3

表達式1表達式2表達式3YN例、輸入兩個實數(shù),按代數(shù)值由小到大的順序輸出這兩個數(shù)。

#include<stdio.h>

voidmain()

{floata,b,t;

scanf(″%f,%f″,&a,&b);

if(a>b)

{t=a;

a=b;

b=t;

}

printf(″%5.2f,%5.2f\n″,a,b);}

yna>bt=aa=bb=t例、輸入三個數(shù)a,b,c,要求按由小到大的順序輸出。Ifa>b將a和b對換Ifa>c將a和c對換Ifb>c將b和c對換a>ba>cb>ca和b交換a和c交換c和b交換yyynn

#include<stdio.h>

voidmain()

{floata,b,c,t;

scanf(″%f,%f,%f″,&a,&b,&c);

if(a>b)

{t=a;a=b;b=t;}

if(a>c)

{t=a;a=c;c=t;}

if(b>c)

{t=b;b=c;c=t;}

printf("%5.2f,%5.2f,%5.2f\n",a,b,c);

}2、If語句的嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套。形式:If()

if()語句1 else語句2else

if()語句3 else語句4內(nèi)嵌if內(nèi)嵌if匹配規(guī)那么:else總是與它上面的,最近的,同一復合語句中的,未配對的if語句配對。例:If()

if()語句1else

if()語句2else語句3例:If() {if()語句1}else

if()語句2else語句3當if和else數(shù)目不同時,可以加花括號來確定配對關(guān)系。

-1(x<0)例、有一個函數(shù)y=0(x=0),編一程序,輸入一個x1(x>0)值,輸出y值。算法1:算法1:

輸入x輸入x 若x<0,則y=-1若x<0,則y=-1 若x=0,則y=0否則: 若x>0,則y=1若x=0,則y=0 輸出y若x>0,則y=1輸出y

#include<stdio.h>voidmain(){intx,y;scanf(“%d〞,&x);{程序段}printf(“x=%d,y=%d\n〞,x,y);}上例中的程序段有四個,請判斷哪個是正確的?程序1:程序2:If(x<0)if(x>=0)Y=-1;if(x>0)y=1;Elseelsey=0;If(x==0)y=0;elsey=-1;Elsey=1;程序3:程序4:Y=-1;y=0;If(x!=0)if(x>=0)If(x>0)y=1;if(x>0)y=1;Elsey=0;Elsey=-1;正確正確例、輸入一個字符,判別它是否大寫字母,如果是,將它轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。然后輸出最后得到的字符。

#include<stdio.h>

voidmain()

{charch;

scanf("%c",&ch);

ch=(ch>='A'&&ch<='Z')?(ch+32):ch;

printf("%c\n",ch);

}

如果字符變量ch的值為大寫字母,那么條件表達式的值為〔ch+32〕,即相應(yīng)的小寫字母。如果ch的值不是大寫字母,那么條件表達式的值為ch,即不進行轉(zhuǎn)換。3、多分支選擇語句〔if語句的另一種嵌套方式〕執(zhí)行時先判斷表達式1的值非0就執(zhí)行下面的語句為0就執(zhí)行下一個判斷一直這樣做下去直到得出最后結(jié)果。多分支選擇結(jié)構(gòu)的語句形式:if(表達式)語句1

elseif(表達式)語句2

else…

表達式1真語句1假表達式2表達式3語句5語句3語句2真真假假多分支選擇流程寫一個程序完成以下功能:1輸入一個分數(shù)score2score<60輸出E360<=score<70輸出D475<=score<80輸出C580<=score<90輸出B590<=score輸出A多分支問題main(){intscore;sanf(“%d〞,&score);if(score<60)printf(“%c〞,’E’);elseif(score<70)printf(“%c〞,’D’);elseif(score<80)printf(“%c〞,’C’);elseif(score<90)printf(“%c〞,’B’);elseprintf(“%c〞,’A’);}程序二、switch語句switch語句的格式:switch〔表達式〕{case常量表達式1:語句1case常量表達式2:語句2…case常量表達式n:語句ndefault:語句n+1}

另一種多分支語句,根據(jù)表達式不同的值選擇不同的語句。例:要求按照考試成績的等級輸出百分制分數(shù)段,用switch語句實現(xiàn):switch〔grade〕{case′A′∶printf〔″85~100\n″〕;case′B′∶printf〔″70~84\n″〕;case′C′∶printf〔″60~69\n″〕;case′D′∶printf〔″<60\n″〕;default∶〔printf″error\n″〕;}說明:(1)switch后面括弧內(nèi)的“表達式〞,ANSI標準允許它為任何類型。但一般C語言要求語句中的表達式可以是整型或字符型,表達式的值,稱為開關(guān)值。(2)當表達式的值與某一個case后面的常量表達式的值相等時,就執(zhí)行此case后面的語句,假設(shè)所有的case中的常量表達式的值都沒有與表達式的值匹配的,就執(zhí)行default后面的語句。(3)每一個case的常量表達式的值必須互不相同,否那么就會出現(xiàn)互相矛盾的現(xiàn)象〔對表達式的同一個值,有兩種或多種執(zhí)行方案〕。(4)各個case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。例如,可以先出現(xiàn)“default:…〞,再出現(xiàn)“case′D′:…〞,然后是“case′A′:…〞。(5)執(zhí)行完一個case后面的語句后,流程控制轉(zhuǎn)移到下一個case繼續(xù)執(zhí)行?!癱ase常量表達式〞只是起語句標號作用,并不是在條件判斷。在執(zhí)行switch語句時,根據(jù)switch后面表達式的值找到匹配的入口標號,就從此標號開始執(zhí)行下去,不再進行判斷。應(yīng)該在執(zhí)行一個case分支后,可以用一個break語句來終止switch語句的執(zhí)行。(6)多個可以共用一組執(zhí)行語句。要求按照考試成績的等級輸出百分制分數(shù)段,用switch語句實現(xiàn):switch〔grade〕{default∶〔printf″error\n″〕;case′A′∶printf〔″85~100\n″〕;case′B′∶printf〔″70~84\n″〕;case′C′∶printf〔″60~69\n″〕;case′D′∶printf〔″<60\n″〕;}switch〔i〕

{case1:printf〔″A\n″〕;

case2:printf〔″B\n″〕;

case3:printf〔″C\n″〕;case4:printf〔″D\n″〕;

default:printf〔″E\n″〕;

}假設(shè)i=3時,那么會從i=3時做起始語句。如果給每條語句加上break這樣就只執(zhí)行一條語句C

D

E看下面的例子運行結(jié)果break;break;break;break;C

例、有以下程序

#include

<stdio.h>

main()

{

int

x=1,y=0,a=0,b=0;

switch(x)

{

case1:

switch(y)

{

case

0:

a++;

break;

case

1:

b++;

break;

}

case2:

a++;

b++;

break;

case3:

a++;

b++;

}

printf(“a=%d,b=%d\n〞,a,b);

}

程序的運行結(jié)果是〔〕。

A、a=1,b=0

B、a=2,b=2

C、a=1,b=1

D、a=2,b=1

內(nèi)層的break;只能跳出所在的層

〔2021年4月全國計算機等考試原題〕D三、選擇結(jié)構(gòu)程序舉例例、寫程序,判斷某一年是否閏年。 用以下圖來表示判斷閏年的算法。#include<stdio.h>

voidmain()

{intyear,leap;

scanf("%d",&year);

if(year%4==0)

{if(year%100==0)

{if(year%400==0)leap=1;

elseleap=0;}

elseleap=1;}

elseleap=0;

if(leap)printf("%dis",year);

elseprintf("%disnot",year);

printf("aleapyear.\n");}if〔year%4?。剑啊常欤澹幔穑剑埃唬澹欤螅澹椋妗玻澹幔颍ィ保埃埃。剑啊常欤澹幔穑剑保唬澹欤螅澹椋妗玻澹幔颍ィ矗埃埃。剑啊常欤澹幔穑剑埃唬澹欤螅澹欤澹幔穑剑?;運行情況:

1989↙

1989isnotaleapyear.2000↙

2000isaleapyear.例、求ax2+bx+c=0方程的解。根本的算法:①a=0,不是二次方程。②-4ac=0,有兩個相等實根。③-4ac>0,有兩個不等實根。④-4ac<0,有兩個共軛復根。#include<stdio.h>

#include<math.h>

voidmain()

{floata,b,c,disc,x1,x2,realpart,imagpart;

scanf("%f,%f,%f",&a,&b,&c);

printf("theequation");

if(fabs(a)<=1e-6)

printf("isnotaquadratic\\n");

else

{disc=b*b-4*a*c;

if(fabs(disc)<=1e-6)

printf("hastwoequalroots:%8.4f\n",-b/(2*a));

elseif(disc>1e-6)

{x1=(-b+sqrt(disc))/(2*a);

x2=(-b-sqrt(disc))/(2*a);

printf(″hasdistinctrealroots:%8.4fand%8.4f\n″,x1,x2);

}

else

{realpart=-b/(2*a);

imagpart=sqrt(-disc)/(2*a);

printf(″hascomplexroots∶\n″);

printf(″%8.4f+%8.4fi\n″,realpart,imagpart);

printf(″%8.4f-%8.4fi\n″,realpart,imagpart);

}

}}

例、運輸公司對用戶計算運費。路程〔s〕越遠,每公里運費越低。標準如下:s<250km沒有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣設(shè)每公里每噸貨物的根本運費為p,貨物重為w,距離為s,折扣為d,那么總運費f的計算公式為:f=p*w*s*〔1-d〕分析折扣變化的規(guī)律性:折扣的“變化點〞都是250的倍數(shù)在橫軸上加一種坐標c,c的值為s/250。c代表250的倍數(shù)。c<1,無折扣;1≤c<2,折扣d=2%;2≤c<4,d=5%;4≤c<8,d=8%;8≤c<12,d=10%;c≥12,d=15%。#include<stdio.h>

voidmain()

{intc,s;

floatp,w,d,f;

scanf("%f,%f,%d",&p,&w,&s);

if(s>=3000)c=12;

elsec=s/250;

switch(c){

case0:d=0;break;

case1:d=2;break;

case2:case3:d=5;break;

case4:case5:case6:case7:d=8;break;

case8:case9:case10:

case11:d=10;break;

case12:d=15;break;}

f=p*w*s*(1-d/100.0);

printf("freight=%15.4f\n",f);}思考:折扣標準如下:s<250km沒有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣怎樣使用switch語句?第三章

本節(jié)要點循環(huán)的根本概念不同形式的循環(huán)控制多重循環(huán)問題

主要內(nèi)容3.3.1概述3.3.2goto語句以及用goto語句構(gòu)成循環(huán)3.3.3用while語句實現(xiàn)循環(huán)3.3.4用do-while語句實現(xiàn)循環(huán)3.3.5用for語句實現(xiàn)循環(huán)3.3.6循環(huán)的嵌套3.3.7幾種循環(huán)的比較3.3.8break語句continue和語句3.3.9程序舉例3.3.1概述什么是循環(huán)?為什么要使用循環(huán)?問題1:問題2:求學生平均成績

分數(shù)相加后除以課數(shù)在許多問題中需要用到循環(huán)控制。循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的根本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復雜程序的根本構(gòu)造單元。計數(shù)法:預知循環(huán)的總次數(shù)。標志法:達到某目標,結(jié)束循環(huán)。窮舉:逐一測試問題的所有可能狀態(tài),直到解答或測試過所有可能的狀態(tài)為止。循環(huán)算法的兩種根本方法例1、判斷一個整數(shù)n是否是素數(shù)。所謂素數(shù)是只能被1和自身整除的數(shù)。算法:從2到n-1每個數(shù)都除一次,假設(shè)其中的某數(shù)能被n整除那么說明n不是素數(shù),否那么假設(shè)每一個都不能被n整除那么說明n是素數(shù)。例2、百錢百雞迭代:不斷用新值取代舊值,或由舊值遞推出變量的新值的過程。例1、求s=1+2+3+……+n算法:i=1到n,將每一個i加到累加和sum上,即:sum=sum+i例2、求斐波拉級數(shù):f0=1,f1=1,fn=fn-1+fn-2

3.3.2goto語句以及用goto語句構(gòu)成循環(huán)P57

goto語句——無條件轉(zhuǎn)向語句格式:goto語句標號;語句標號用標識符表示,它的定名規(guī)那么與變量名相同,即由字母、數(shù)字和下劃線組成,其第一個字符必須為字母或下劃線。例如:gotolabel_1;合法;goto123;不合法.結(jié)構(gòu)化程序設(shè)計方法主張限制使用goto語句,因為濫用goto語句將使程序流程無規(guī)律、可讀性差。一般來說,可以有兩種用途:(1)與if語句一起構(gòu)成循環(huán)結(jié)構(gòu);(2)從循環(huán)體中跳轉(zhuǎn)到循環(huán)體外。但是這種用法不符合結(jié)構(gòu)化原那么,一般不宜采用,只有在不得已時(例如能大大提高效率)才使用。例、用if語句和goto語句構(gòu)成循環(huán),求1到100的和

voidmain()

{inti,sum=0;

i=1;

loop:if(i<=100)

{sum=sum+i;

i++;

gotoloop;

}

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

}說明:這里用的是“當型〞循環(huán)結(jié)構(gòu),當滿足“i<=100〞時執(zhí)行花括弧內(nèi)的循環(huán)體。運行結(jié)果:5050

3.3.3while循環(huán)語句while語句用來實現(xiàn)“當型〞循環(huán)結(jié)構(gòu)。一般形式:while(表達式)語句當表達式為非0值時,執(zhí)行while語句中的內(nèi)嵌語句。其特點是:先判斷表達式,后執(zhí)行語句。例、求1到100的和

#include<stdio.h>

voidmain()

{inti,sum=0;

i=1;

while(i<=100)

{sum=sum+i;

i++;

}

printf(″%d\\n″,sum);

}說明:(1)循環(huán)體如果包含一個以上的語句,應(yīng)該用花括弧括起來,以復合語句形式出現(xiàn).(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。

運行結(jié)果:5050注意:循環(huán)體如果包含一個以上的語句,應(yīng)該用花括弧括起來,以復合語句形式出現(xiàn)。在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。如果無此語句,那么i的值始終不改變,循環(huán)永不結(jié)束。例、輸入n,求n的各位數(shù)字。算法:1輸入整數(shù)n;2判斷n是否為0,假設(shè)不為0那么執(zhí)行3;否那么轉(zhuǎn)3輸出n的個位數(shù),n%10;4求出個位數(shù)以外的數(shù)n,n=n/10;5重復2;6結(jié)束。思考:1、求n的各位數(shù)字之和;2、求n的各位數(shù)字之積;3、求n的數(shù)字位數(shù);4、判斷n是否為水仙花數(shù),所謂的水仙花數(shù)是:等于各位數(shù)字立方之和的三位數(shù)。

我們以上的算法是各位數(shù)字倒過來輸出的。思考一下怎樣順過來(從高位到低位)輸出?!彩?7年春考題〕2021年9月全國計算機二級考試原題D

3.3.4do-while循環(huán)語句do-while語句的特點:先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。一般形式:

do循環(huán)體語句

while(表達式);執(zhí)行過程:先執(zhí)行一次指定的循環(huán)體語句,然后判別表達式,當表達式的值為非零(“真〞)時,返回重新執(zhí)行循環(huán)體語句,如此反復,直到表達式的值等于0為止,此時循環(huán)結(jié)束。例、求1到100的和

#include<stdio.h>

voidmain()

{inti,sum=0;

i=1;

do

{sum=sum+i;

i++;

}

while(i<=100);

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

}運行結(jié)果:5050例〔2021年9月全國計算機等考試原題〕這是一個使用do-while的習題,具體分析見后面的習題2021年9月全國計算機二級考試原題5例、判斷某數(shù)是否為素數(shù)。例、輸出整數(shù)n的所質(zhì)因子。例、求兩數(shù)的最大公約數(shù)、最小公倍數(shù)。while語句和用do-while語句的比較:在一般情況下,用while語句和用do-while語句處理同一問題時,假設(shè)二者的循環(huán)體局部是一樣的,它們的結(jié)果也一樣。但是如果while后面的表達式一開始就為假(0值)時,兩種循環(huán)的結(jié)果是不同的。例、while和do-while循環(huán)的比較

(1)#include<stdio.h>(2)#include<stdio.h>

voidmain()voidmain()

{intsum=0,i;{intsum=0,i;

scanf(“%d″,&i);scanf(〞%d″,&i);

while(i<=10)do

{sum=sum+I;{sum=sum+i;

i++;i++;

}while(i<=10);

printf(“sum=%d\\n″

,sum);

}printf(“sum=%d\\n〞,sum);

}運行結(jié)果:1↙sum=55再運行一次:11↙sum=0運行結(jié)果:1↙sum=55再運行一次:11↙sum=11說明:(1)當while后面的表達式的第一次的值為“真〞時,兩種循環(huán)得到的結(jié)果相同。否那么,二者結(jié)果不相同。3.3.5for循環(huán)語句C語言中的for語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語句。一般形式:

for(表達式1;表達式2;表達式3)語句for語句的執(zhí)行過程:(1)先求解表達式1。(2)求解表達式2,假設(shè)其值為真(值為非0),那么執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第(3)步。假設(shè)為假(值為0),那么結(jié)束循環(huán),轉(zhuǎn)到第(5)步。(3)求解表達式3。(4)轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。(5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個語句

表達式2?執(zhí)行語句成立不成立執(zhí)行for循環(huán)之后的語句執(zhí)行表達式3執(zhí)行表達式1循環(huán)初始條件循環(huán)控制條件循環(huán)體for語句等價于以下語句:表達式1;while〔表達式2〕{語句;表達式3;}

for語句最簡單的形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)

例如:for(i=1;i<=100;i++)sum=sum+i;相當于:i=1;while(i<=100){sum=sum+i;i++;}

用for語句簡單、方便。

說明:(1)for語句的一般形式中的“表達式1〞可以省略,此時應(yīng)在for語句之前給循環(huán)變量賦初值。注意省略表達式1時,其后的分號不能省略。如for(;i<=100;i++)sum=sum+i;執(zhí)行時,跳過“求解表達式1〞這一步,其他不變。說明:(2)如果表達式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進行下去。也就是認為表達式2始終為真。例如:for(i=1;;i++)sum=sum+i;

表達式1是一個賦值表達式,表達式2空缺。它相當于:

i=1;while(1){sum=sum+1;i++;}說明:(3)表達式3也可以省略,但此時程序設(shè)計者應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束。如:for(i=1;i<=100;){sum=sum+i;i++;}在上面的for語句中只有表達式1和表達式2,而沒有表達式3。i++的操作不放在for語句的表達式3的位置處,而作為循環(huán)體的一局部,效果是一樣的,都能使循環(huán)正常結(jié)束。

說明:(4)可以省略表達式1和表達式3,只有表達式2,即只給循環(huán)條件。如:

for(;i<=100;)while(i<=100){sum=sum+i;相當于{sum=sum+i;i++;}i++;}

在這種情況下,完全等同于while語句??梢奻or語句比while語句功能強,除了可以給出循環(huán)條件外,還可以賦初值,使循環(huán)變量自動增值等。說明:(5)3個表達式都可省略,如:for(;;)語句相當于while(1)語句即不設(shè)初值,不判斷條件(認為表達式2為真值),循環(huán)變量不增值。無終止地執(zhí)行循環(huán)體。說明:(6)表達式1可以是設(shè)置循環(huán)變量初值的賦值表達式,也可以是與循環(huán)變量無關(guān)的其他表達式。如:

for(sum=0;i<=100;i++)sum=sum+i;表達式3也可以是與循環(huán)控制無關(guān)的任意表達式。

說明:表達式1和表達式3可以是一個簡單的表達式,也可以是逗號表達式,即包含一個以上的簡單表達式,中間用逗號間隔。如:

for(sum=0,i=1;i<=100;i++)sum=sum+i;或

for(i=0,j=100;i<=j;i++,j--)k=i+j;表達式1和表達式3都是逗號表達式,各包含兩個賦值表達式,即同時設(shè)兩個初值,使兩個變量增值.說明:

在逗號表達式內(nèi)按自左至右順序求解,整個逗號表達式的值為其中最右邊的表達式的值。如:

for(i=1;i<=100;i++,i++)sum=sum+i;相當于

for(i=1;i<=100;i=i+2)sum=sum+i;

說明:(7)表達式一般是關(guān)系表達式(如i<=100)或邏輯表達式(如a<b&&x<y),但也可以是數(shù)值表達式或字符表達式,只要其值為非零,就執(zhí)行循環(huán)體。2021年9月全國計算機二級考試原題說明:在switch中default的位置一般在最后,但位置可以任意,但是總是在所有關(guān)case都不匹配時才執(zhí)行它。答案為:A2021年9月全國計算機二級考試原題011233.3.5循環(huán)的嵌套一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu)稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)。三種循環(huán)(while循環(huán)、do-while循環(huán)和for循環(huán))可以互相嵌套。下面幾種都是合法的形式:(1)

while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…}{…}}while();}}while();

(4)

while()(5)for(;;)(6)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()

問題:輸出圖形

****************分析:一共4行,第i行輸出的空格數(shù)為:(7-i+1)/2第i行輸出i*2-1個‘*’,算法:當i<=7do{輸出(7-i+1)/2個空格;輸出i個‘*’換行;i+=2;}#include<stdio.h>main()

{

inti,j;

for(i=1;i<=7;i+=2)

{printf(“\n〞);

for(j=1;j<=(7-i+1)/2;j++)

putchar(‘’);/*輸出(7-i+1)/2個空格*/

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

putchar(’*’);/*輸出i個‘*’*/}

getch();

}〔2021年9全國計算機等考試原題〕例D小結(jié):幾種循環(huán)的比較(1)四種循環(huán)都可以用來處理同一問題,一般情況下它們可以互相代替。但一般不提倡用goto型循環(huán)。(2)在while循環(huán)和do-while循環(huán)中,只在while后面的括號內(nèi)指定循環(huán)條件,因此為了使循環(huán)能正常結(jié)束,應(yīng)在循環(huán)體中包含使循環(huán)趨于結(jié)束的語句(如i++,或i=i+1等)。

for循環(huán)可以在表達式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達式3中。因此for語句的功能更強,凡用while循環(huán)能完成的,用for循環(huán)都能實現(xiàn)。

(3)用while和do-while循環(huán)時,循環(huán)變量初始化的操作應(yīng)在while和do-while語句之前完成。而for語句可以在表達式1中實現(xiàn)循環(huán)變量的初始化。(4)while循環(huán)、do-while循環(huán)和for循環(huán),可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán)(break語句和continue語句見下節(jié))。而對用goto語句和if語句構(gòu)成的循環(huán),不能用break語句和continue語句進行控制。

3.3.6break語句和continue語句

一、break語句

break語句可以用來從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)下面的語句一般形式:

break;注意:break語句不能用于循環(huán)語句和switch語句之外的任何其他語句中。

例:floatpi=3.14159;for(r=1;r<=10;r++){area=pi*r*r;if(area>100)break;printf(″r=%f,area=%f\n″,r,area);}

程序的作用是計算r=1到r=10時的圓面積,直到面積area大于100為止。從上面的for循環(huán)可以看到:當area>100時,執(zhí)行break語句,提前結(jié)束循環(huán),即不再繼續(xù)執(zhí)行其余的幾次循環(huán)。例、判斷m是否素數(shù)。算法思想:讓m被2到除,如果m能被2~之中任何一個整數(shù)整除,那么提前結(jié)束循環(huán),此時i必然小于或等于k(即);如果m不能被2~k(即)之間的任一整數(shù)整除,那么在完成最后一次循環(huán)后,i還要加1,因此i=k+1,然后才終止循環(huán)。在循環(huán)之后判別i的值是否大于或等于k+1,假設(shè)是,那么說明未曾被2~k之間任一整數(shù)整除過,因此輸出“是素數(shù)〞。程序

#include<stdio.h>

#include<math.h>

voidmain()

{intm,i,k;

scanf(″%d″,&m);k=sqrt(m);

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

if(m%i==0)break;

if(i>k)printf("%disaprimenumber\n″,m);

elseprintf("%disnotaprimenumber\n″,m);

}

運行結(jié)果:

17↙17isaprimenumber

程序:求100~200間的全部素數(shù)。

#include<stdio.h>

#include<math.h>

voidmain()

{intm,k,i,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%10==0)printf(″\n″);

}

printf("\n");}運行結(jié)果:101103107109113127131137139149151157163167173179181191193197199

溫馨提示

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

評論

0/150

提交評論