C語言控制結(jié)構(gòu)_第1頁
C語言控制結(jié)構(gòu)_第2頁
C語言控制結(jié)構(gòu)_第3頁
C語言控制結(jié)構(gòu)_第4頁
C語言控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩124頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第三章程序控制語句教學(xué)目標(biāo)1掌握選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)控制語句的作用與使用規(guī)范2學(xué)習(xí)結(jié)構(gòu)化程序設(shè)計(jì)中常用的基本算法3進(jìn)行算法設(shè)計(jì)訓(xùn)練,能綜合控制結(jié)構(gòu)語句解決一般問題4能正確輸入輸出數(shù)據(jù),并學(xué)習(xí)程序調(diào)試基本方法本章內(nèi)容3.1順序結(jié)構(gòu)與基本輸入輸出3.2分支結(jié)構(gòu)3.3循環(huán)結(jié)構(gòu)3.4循環(huán)程序設(shè)計(jì)3.5應(yīng)用舉例3.1順序結(jié)構(gòu)與基本輸入輸出3.1.1C語句概述3.1.2順序結(jié)構(gòu)程序設(shè)計(jì)3.1.3字符輸入輸出3.1.4格式輸入輸出3.1.1C語句概述源程序的基本組成單位是語句,語句用于完成一定的操作任務(wù)。C語句有以下五類:1.說明語句變量定義、變量說明、函數(shù)說明、結(jié)構(gòu)說明等int

x,y=4; 定義整形變量x、y,并初始化變量yexternint

x,y;說明整形變量x、y是已被定義的全局變量int

max(int,int); 聲明函數(shù)max3.1.1C語句概述2.控制語句,完成程序流程控制if()~else~ 選擇結(jié)構(gòu)語句for()~ 循環(huán)語句switch 多分支選擇結(jié)構(gòu)語句return 從函數(shù)返回語句……3.表達(dá)式語句:在表達(dá)式后面加分號構(gòu)成。例:a=3;/*賦值語句*/i++;/*算術(shù)表達(dá)式語句*/

表達(dá)式能構(gòu)成語句是C的特色。4.空語句:只有分號“;”組成的語句,什么也不執(zhí)行,但占據(jù)了一個(gè)語句的位置,也起一條語句的作用。常用于需要一個(gè)語句但不需要任何操作的情況。3.1.1C語句概述5.復(fù)合語句(語句塊)

由大括號{}括起來的語句序列,在語法上復(fù)合語句被看作一條語句。例:{intx,y;z=x+y;t=z/100;

printf("%f",t);}復(fù)合語句常用于任何需要一條語句的地方。3.1.1C語句概述3.1.2順序結(jié)構(gòu)程序設(shè)計(jì)例3-1鍵盤輸入一個(gè)三位數(shù),輸出逆序后的數(shù)。#include<stdio.h>voidmain(){intx,y,a,b,c;

printf("Pleaseinputanum:");

scanf("%d",&x);a=x/100;b=x/10%10;c=x%10;y=100*c+10*b+a;printf("x=%d,y=%d\n",x,y);}

順序結(jié)構(gòu),就是語句按照編寫的順序依次執(zhí)行。C中的輸入輸出1.C本身沒有輸入輸出語句,數(shù)據(jù)的I/O由函數(shù)實(shí)現(xiàn)。2.源程序的開頭使用如下語句:#include<stdio.h>#include“stdio.h”

3.1.3字符輸入輸出1.字符輸出函數(shù)putchar()int

putchar(intc)作用:向終端輸出一個(gè)字符。參數(shù)C可以int型與char型。例:#include"stdio.h"voidmain(){chara,b,c;a='B';b='O';c='Y';

putchar(a);putchar(b);putchar(c);}程序輸出:BOY注:若要輸出小寫的boy,程序怎樣修改?若沒有#include“stdio.h”會怎樣?實(shí)例函數(shù)參數(shù)可以是轉(zhuǎn)義字符例:putchar('\n');輸出換行符putchar('\101');輸出字符'A'putchar('\'');輸出單引號'putchar('\012');輸出換行符putchar('\015');輸出回車.不換行,光標(biāo)到本行首

轉(zhuǎn)義字符2.字符輸入函數(shù)getchar()形式:int

getchar(void)作用:從stdin(鍵盤)輸入一個(gè)字符,同時(shí)有回顯。函數(shù)無參數(shù),返回接收到的輸入字符原型定義:stdio.h

常用用法:變量=getchar();#include"stdio.h"voidmain(){charc;c=getchar();

putchar(c);

ORputchar(getchar());}輸出(如在鍵盤上輸入“a”):a↙a實(shí)例3.1.4格式輸入與輸出1.格式輸出函數(shù)printf()作用:按指定的格式輸出指定數(shù)據(jù)一、printf()的一般格式printf("格式控制",輸出列表);例: inti=3; doublef=4.56;

printf("i=%d,f=%lf\n",i,f);1.格式控制:控制按指定格式輸出后面的參數(shù)。以“”括起。格式控制組成:普通字符(不含%的字符),原樣輸出(可為轉(zhuǎn)義字符)格式說明符(%格式字符),控制輸出數(shù)據(jù)的格式。2.輸出表列:需要輸出的數(shù)據(jù),以,分隔??蔀槌?、變量、表達(dá)式、函數(shù),受格式控制中格式符的控制。也可以沒有輸出表列,如:

printf(“Name\tAdd\tTel\n”);printf函數(shù)格式二、格式字符1.d格式符:按十進(jìn)制有符號數(shù)格式輸出%d按int型數(shù)據(jù)實(shí)際長度輸出%md

按m指定的寬度輸出(不足補(bǔ)空格,大于m位時(shí)按實(shí)際長度輸出),右對齊%ld,%mld

輸出longint

型數(shù)據(jù),m指定輸出寬度%hd,%mhd輸出shortint型數(shù)據(jù)%0md,%0mld,%0mhd0(數(shù)字0)表示位數(shù)不足m時(shí)補(bǔ)0%-md,%-mld

左對齊輸出,右邊補(bǔ)空格注:%后面的m(位數(shù)控制)、0(位數(shù)不足補(bǔ)0)對于其他格式符也適用。例:(□表示空格)inti=123;longj=123456;printf("%d□%5d□%05d,□%ld□%8ld□%08ld",i,i,i,j,j,j);結(jié)果:123□□□123□00123,□123456□□□123456□00123456強(qiáng)調(diào):對long型數(shù)據(jù)要用%ld輸出,若用%d可能會發(fā)生錯(cuò)誤。同理,shortint

數(shù)據(jù)要用%hd2.o(字母)格式符:按八進(jìn)制無符號數(shù)的格式輸出。符號位作為數(shù)一并輸出。例:shortinta=-1;

printf(“a=%hd,%ho\n”,a,a);結(jié)果:a=-1,1777773、x格式符:按十六進(jìn)制無符號數(shù)格式輸出int型數(shù)。4、u格式符:以無符號十進(jìn)制形式輸出整數(shù)對longint數(shù)據(jù)都需要附加l,對shortint

需要附加h如%lo,%10hx,%-10lo5、c格式符:以字符形式輸出。例:charc=‘\101’;printf("%c",c);也可以使用:%mc、%-mc6、s格式符:以字符串格式輸出。%s例:printf("%s","CHINA");%msm指定寬度(不足時(shí)左補(bǔ)空格,大于時(shí)按實(shí)際寬度輸出),右對齊%-ms左對齊,不足m時(shí)右補(bǔ)空格%m.ns

輸出占m列,取字符串左端n個(gè)字符,左補(bǔ)空格%-m.ns

同上,n個(gè)字符輸出,占m列,右補(bǔ)空格7、f格式符:按小數(shù)格式輸出實(shí)數(shù)。printf("%0.3f",123.45678);顯示123.457%f按小數(shù)格式輸出,整數(shù)部分全輸出,6位小數(shù)%m.nf輸出占m列(含小數(shù)點(diǎn)),其中n位小數(shù)(四舍五入)%-m.nf同上,左對齊%lf用于double型數(shù)據(jù)8.e格式符:以標(biāo)準(zhǔn)指數(shù)形式輸出實(shí)數(shù)%e指數(shù)形式輸出實(shí)數(shù),尾數(shù)保留6位小數(shù)。%m.ne

n指保留尾數(shù)部分小數(shù)位數(shù),右對齊%-m.ne

左對齊%ledoublea=-1.1e300;printf("a=%le,sizeof=%d\n",a,sizeof(a));輸出:a=-1.100000e+300,sizeof=82.格式輸入函數(shù)scanf()一、一般格式作用:按規(guī)定格式輸入形式:int

scanf("格式控制",地址列表)原型定義:stdio.h將鍵盤輸入的數(shù)據(jù)按指定的格式接收、轉(zhuǎn)換后,送到相應(yīng)的地址中。#include"stdio.h"voidmain(){int

a,b,c;

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

printf("%d,%o,%x\n",a,b,c);}運(yùn)行時(shí)輸入:10□11□12↙程序輸出:10,13,c二、格式說明與printf()的格式控制類似格式字符說明d

用于輸入十進(jìn)制數(shù)o用于輸入八進(jìn)制數(shù)x用于輸入十六進(jìn)制數(shù)c用于接收單個(gè)字符s接收字符串認(rèn)為空格是結(jié)束符f用于輸入實(shí)數(shù)(小數(shù)或指數(shù)均可接收)e與f相同附加格式說明符l用于long(%ld)和double(%lf)型數(shù)據(jù)h用于短整型數(shù)據(jù)(%hd、%ho、%hx)域?qū)挘ㄒ粋€(gè)正整數(shù))指定輸入所占寬度*表示對應(yīng)輸入量不賦給一個(gè)變量1.可以指定輸入數(shù)據(jù)的列數(shù),系統(tǒng)自動按它截取所需數(shù)據(jù)。例:scanf("%2d%3d",&a,&b);輸入123456↙系統(tǒng)自動將12賦給a,345賦給b。2.*格式用于跳過一個(gè)數(shù)據(jù)域scanf("%2d□%*3d□%2d",&a,&b);輸入:12□345□67↙結(jié)果,a=12,345被跳過,b=67。*主要用于利用現(xiàn)有數(shù)據(jù)時(shí),跳過某些數(shù)據(jù)項(xiàng)。3.輸入實(shí)數(shù)不能規(guī)定精度.如:scanf("%7.2f",&a);說明1、sacnf()中的變量必須使用地址。

inta,b;

scanf(“%d,%d”,a,b);

錯(cuò)誤

scanf(“%d,%d”,&a,&b);正確2、scanf()的“格式控制”中,可以使用普通字符,但在輸入時(shí)必須輸入這些字符,成為數(shù)據(jù)輸入時(shí)的分隔符。例:scanf("%d,%d",&a,&b);輸入:3,4↙(逗號與"%d,%d"中的逗號對應(yīng))三.使用scanf()函數(shù)的注意事項(xiàng)例:scanf("%d□□%d",&a,&b);輸入:3□□4↙(兩個(gè)或以上空格)例:scanf("%d:%d:%d",&h,&m,&s);輸入:12:23:36↙(與格式控制中的冒號對應(yīng))例:scanf("a=%d,b=%d,c=%d",&a,&b,&c);輸入:a=12,b=24,c=36↙(a=,b=,c=及逗號與格式控制相對應(yīng))3、在用“%c”輸入時(shí),空格、回車、TAB等均作為有效字符被接收。例:scanf("%c%c%c",&c1,&c2,&c3);輸入:a□b□c↙結(jié)果:a→c1,□→c2,b→c3(其余被丟棄)若輸入:123ab結(jié)果:1→c1,2→c2,3→c34、輸入數(shù)據(jù)時(shí),遇以下情況結(jié)束一個(gè)數(shù)據(jù)的輸入:(不是結(jié)束該scanf函數(shù))。①遇空格、“回車”、“跳格”鍵或用戶指定的分隔符。②遇寬度結(jié)束。③遇非法輸入。5、注意%c與%d混合使用時(shí)的問題。例:scanf(“%c%d%c”,&a,&b,&c);執(zhí)行:a12c↙結(jié)果:a=’a’,b=12,c=’c’ a□12□c↙結(jié)果:a=’a’,b=12,c=□6、數(shù)據(jù)類型與格式符匹配使用%f%lf用于實(shí)型%d%o%x用于整型%c用于字符型問題與討論1.scanf函數(shù)變量名前沒有&會怎樣?編譯器會報(bào)錯(cuò)嗎?2.a=getchar()與scanf("%c",&a)的異同3.怎樣設(shè)計(jì)scanf使得輸入數(shù)據(jù)時(shí)減少出錯(cuò)?3.2分支結(jié)構(gòu)程序需要進(jìn)行比較與邏輯判斷,根據(jù)判斷結(jié)果決定不同的操作。確定判斷的條件確定判斷結(jié)果為“真”或“假”時(shí)執(zhí)行的不同操作2.2.4關(guān)系運(yùn)算符與關(guān)系表達(dá)式關(guān)系運(yùn)算:也稱比較運(yùn)算,比較兩個(gè)運(yùn)算對象的大小。關(guān)系表達(dá)式:關(guān)系運(yùn)算符連接的式子,關(guān)系表達(dá)式可能結(jié)果有:“真”(true)和“假”(false)。例:a>3、a==3、a!=31.關(guān)系運(yùn)算符及其優(yōu)先次序<小于優(yōu)先級相同(高)<=小于等于>大于>=大于等于==等于優(yōu)先級相同(低)!=不等于C中的邏輯值:0(假)1(真)關(guān)系表達(dá)式:用關(guān)系運(yùn)算符連接的表達(dá)式。關(guān)系表達(dá)式的值:

0、1與int

型等效例:若a=3,b=2,c=1,則:a>b 真,表達(dá)式的值為1

(a>b)==c 真,表達(dá)式的值為1

b+c<a假,表達(dá)式的值為0

d=a>b

d的值等于1

f=a>b>c

f的值等于0注意:數(shù)學(xué)式a>b>c應(yīng)寫為a>b&&b>c2.關(guān)系表達(dá)式3.關(guān)系運(yùn)算的特點(diǎn)右結(jié)合雙目運(yùn)算符優(yōu)先級例:c>a+b

等效于 c>(a+b)

a>b!=c 等效于 (a>b)!=c

a==b<c 等效于 a==(b<c)

a=b>c 等效于 a=(b>c)2.3.3邏輯運(yùn)算符與邏輯表達(dá)式1.邏輯運(yùn)算符及其優(yōu)先次序

&&邏輯與“雙目運(yùn)算符”:要求兩個(gè)操作數(shù),如:(a>b)&&(x>y)||邏輯或!邏輯非單目運(yùn)算符,要求一個(gè)操作數(shù),如:!(a>b)優(yōu)先級:!高于&&高于||1&&1=11&&0=00&&1=00&&0=01||1=11||0=10||1=10||0=0!1=0!0=1邏輯運(yùn)算規(guī)則表混合運(yùn)算:!a&&b==c||x*2>y+3&&c++按右圖優(yōu)先級運(yùn)算。用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來。在C中,參與邏輯運(yùn)算的數(shù)據(jù)可為任意類型,非0即為真,0為假。例:’a’+’b’||’c’ 值為1 ‘a(chǎn)’&&’\0’ 值為0 5>3&&2||8<8-!0 值為1編譯器在求解邏輯表達(dá)式的值時(shí),采用“非完全求解”的方法,即:當(dāng)求得表達(dá)式為真后,就結(jié)束求解;只有在需要執(zhí)行下一個(gè)邏輯運(yùn)算時(shí),才繼續(xù)運(yùn)算。

2.邏輯表達(dá)式1.a(chǎn)&&b&&c只有a為真時(shí),才判別b的值;只有a和b均為真時(shí),才判別c的值。只要a為假,就不再判別b和c的值,直接求得表達(dá)式的值為假。2.a(chǎn)||b||c只要a為真,就不再判別b和c的值,直接求得表達(dá)式的值為真。只有a為假時(shí),才判別b的值;只有a和b均為假時(shí),才判別c的值。即:對&&而言,當(dāng)左邊為0時(shí),不再計(jì)算右邊表達(dá)式 對||而言,當(dāng)左邊為1時(shí),不再計(jì)算右邊表達(dá)式例:計(jì)算(a=5>3)&&(b=’a’==’b’)&&(b=3>1)后

a的值為1,b的值為0應(yīng)用:常直接用邏輯表達(dá)式構(gòu)造條件。例如閏年條件:(y%4==0&&y%100!=0)||(y%400==0)條件PTF語句塊1語句塊2exprstatement1statement2非0==03.2分支結(jié)構(gòu)3.2.1if語句1.if-else分支if(表達(dá)式)語句塊1;else

語句塊2;例3-6輸入一個(gè)字符,判斷它是否為英文小寫字母。#include<stdio.h>voidmain(){charc;

printf("Pleaseinputacharacter:");c=getchar();

if(c>='a'&&c<='z')

printf("Itisalowercase.\n");else

printf("Itisnotalowercase.\n");}if-else使用說明(1)if語句中的條件表達(dá)式一般是關(guān)系表達(dá)式或者邏輯表達(dá)式。

if(a==b&&x==y)printf("a=b,x=y");

也可以為任意數(shù)值類型,如:

if(3-5%2)printf("yes");elseprintf("no");

輸出yesif(3)printf("O.K.");

輸出O.k

判別條件是:“非零即真”if-else使用說明(2)“程序塊1”和“程序塊2”必須是單條語句,若是兩條以上的語句,則必須用{}將多條語句括起來成為一條復(fù)合語句,使它們成為一個(gè)語句單元。

if(score>=60)

printf("Passed\n"); else

{

printf("Failed\n");

printf("Youmusttakethiscourseagain\n"); }變量score的值大于60時(shí),程序?qū)⑤敵觯篜assedYoumusttakethiscourseagainif-else使用說明(3)if~else語句執(zhí)行完畢后執(zhí)行if~else的后續(xù)語句。系統(tǒng)將整個(gè)if~else結(jié)構(gòu)處理為一條語句單元。2.if分支if(表達(dá)式)語句;

exprstatement非0==0條件PTF語句1例3-9輸入三個(gè)數(shù),按由小到大的順序輸出#include<stdio.h>voidmain(){inta,b,c,t;scanf("%d%d%d",&a,&b,&c);if(a>b){t=a;a=b;b=t;/*變量a與b互換,t為中間變量*/}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%d,%d,%d\n",a,b,c);}例3-8設(shè)計(jì)一個(gè)加法計(jì)算訓(xùn)練程序,由機(jī)器隨機(jī)產(chǎn)生兩個(gè)整數(shù),讓用戶計(jì)算兩數(shù)之和,若用戶計(jì)算正確則打印“Right”,否則打印“Wrong”。#include<stdio.h>voidmain(){int

a,b,s;a=rand();/*rand()是庫函數(shù),隨機(jī)產(chǎn)生一個(gè)0-32767之間的數(shù)*/b=rand();

printf("%d+%d=",a,b);

scanf("%d",&s);/*用戶輸入結(jié)果*/

if(s==a+b)/*計(jì)算機(jī)判斷用戶結(jié)果是否正確*/

printf("Right\n");else

printf("Wrong\n");}

常見錯(cuò)誤

多條語句為內(nèi)嵌時(shí)忘記用{}括起來。在if(表達(dá)式)之后多加一個(gè)分號。比較運(yùn)算符“==”與賦值運(yùn)算符“=”混淆使用。最常見的錯(cuò)誤為:if(x==1)誤寫為:if(x=1)…………

無論x的原值是什么,賦值表達(dá)式x=1的值總為1,其作為條件時(shí)恒為真。3.if…elseif…else多分支if(表達(dá)式1)語句1;else

If(表達(dá)式2)語句2;

else If(表達(dá)式3)語句3 …… else if(表達(dá)式m)語句m else語句n條件1TF語句1條件2語句2語句3條件3……例3-10應(yīng)用多分支結(jié)構(gòu)編寫此程序,根據(jù)用戶輸入的自變量x的值,計(jì)算y的值。voidmain(){floatx;

printf("pleaseinputx:");

scanf("%f",&x);

if(x<0.0)

printf("y=0\n");elseif(x<=30)

printf("y=%f\n",x);

elseif(x<=60)

printf("y=%f\n",x*x);elseprintf("y=%f\n",x*x*x);}例3-10條件PTF語句1語句2條件PTF語句1條件1TF語句1條件2語句2語句3條件3……分支結(jié)構(gòu)流程圖條件PTF語句1語句2條件PTF語句1條件1TF語句組語句組條件2條件3語句組語句組語句組語句組語句組語句組If-else嵌套流程圖3.2.2if語句的嵌套if(條件表達(dá)式1)if(條件表達(dá)式2)程序塊1;else程序塊2;elseif(條件表達(dá)式3)程序塊3;else程序塊4;if~else的內(nèi)嵌程序塊中又包含一個(gè)或多個(gè)if~else語句稱為if語句的嵌套,常用于實(shí)現(xiàn)多路選擇。嵌套if語句時(shí),必須特別注意if與else配對。配對原則:從最內(nèi)層開始,else總是與它上面最接近的(未曾配對的)if配對。避免if與else配對錯(cuò)位的最佳辦法是加大括號,同時(shí),為了便于閱讀,使用適當(dāng)?shù)目s進(jìn),(只有大括號能保證if和else不錯(cuò)位配對,縮進(jìn)僅便于閱讀)If與else的匹配例:if(a==b)

if(b==c)

printf(“a==b==c”);else

printf(“a!=b”);修改:if(a==b){if(b==c)

printf(“a==b==c”);}else

printf(“a!=b”);實(shí)現(xiàn)if~else

正確配對方法:加{}實(shí)現(xiàn)if~else正確配對方法if(p1)

{if(p2)語句A;}else

if(p3)語句B;

else語句C;語句D;比較差異:if(p1) if(p2)語句A;

else

if(p3)語句B;

else語句C;語句D;#include<stdio.h>voidmain(){int

a,b,c,max;

printf("pleaseinputthreenumbers:\n");

scanf("%d%d%d",&a,&b,&c);max=a;

if(c>b)

if(c>a)max=c;else

if(b>a)max=b;

printf("themaxis%d\n",max);}max=a;if(c>b){

if(c>a)max=c;}else{

if(b>a)max=b;}

printf("themaxis%d\n",max);}運(yùn)行時(shí):pleaseinputthreenumbers:輸入:253輸出:themaxis2良好習(xí)慣

(1)相配對的if與else書寫于同一列上,

內(nèi)嵌語句縮格書寫,以表明層次結(jié)構(gòu)。(2)if語句多重嵌套實(shí)現(xiàn)多路選擇時(shí),應(yīng)盡可能的在else中分支,即在else中嵌套另一個(gè)if語句,而不要在if中嵌套。(3)具體實(shí)現(xiàn)時(shí),每一個(gè)if的條件為真時(shí)只有唯一的一種情況,而將剩余的各路選擇放在else中一次次細(xì)分。在if語句中,在“表達(dá)式”為“真”和“假”時(shí),都只執(zhí)行一個(gè)賦值語句給同一個(gè)變量賦值,例如:if(a>b)max=a;else

max=b;可以用如下賦值語句來處理:max=(a>b)?a:b;條件運(yùn)算符要求有三個(gè)操作對象,稱為“三目運(yùn)算符”(它是C語言中唯一的一個(gè)三目運(yùn)算符)。3.2.3條件運(yùn)算符

條件表達(dá)式的一般形式:

表達(dá)式1?表達(dá)式2:表達(dá)式3說明:1.執(zhí)行順序:先求解表達(dá)式1的值,若其為真,求解表達(dá)式2的值,做為整個(gè)條件表達(dá)式的值;若表達(dá)式1為假,則求解表達(dá)式3的值,且整個(gè)條件表達(dá)式的值等于表達(dá)式3。max=(a>b)?a:b

把條件表達(dá)式的值賦給max。

3.2.3條件運(yùn)算符2.優(yōu)先級:高于賦值運(yùn)算符,低于算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和邏輯運(yùn)算。max=(a>b)?a:b

max=a>b?a:ba>b?a:b+1 (a>b)?a:(b+1)3.結(jié)合性:右結(jié)合。a>b?a:c>d?c:d

(a>b)?a:(c>d?c:d)4.if~else與條件表達(dá)式的替代:

if(a>b)printf("%d",a); elseprintf("%d",b);

替代:printf("%d",a>b?a:b);

條件運(yùn)算符說明5.表達(dá)式1、表達(dá)式2、表達(dá)式3的類型可以不同。6.可以嵌套。max=(a>b?a:b)>c?(a>b?a:b):c例:P48例3-13,大小寫轉(zhuǎn)換。(read)if(ch>=‘a(chǎn)’&&ch<=‘z’)ch-=32;或:

ch-=(ch>=‘z’&&ch<=‘z’)?32:0條件運(yùn)算符說明3.2.4switch語句其一般形式:switch(表達(dá)式){case常量表達(dá)式1:語句1;break;case常量表達(dá)式2:語句2;break;┆case常量表達(dá)式n:語句n;break;default:語句n+1}{}不能省各常量值必須不相等break用于跳出switch例:根據(jù)考試成績的等級(grade)

打印出百分制分?jǐn)?shù)段:grade=getchar();switch(grade){case'A':printf(“90~100\n");case'B':printf("75~89\n");case'C':printf("60~74\n");case'D':printf("<60\n");default:printf("error\n");}如果輸入A,回車,輸出?當(dāng)grade='A'時(shí),程序從printf(“90~100\n")開始執(zhí)行,因此輸出結(jié)果為:

90~10075~8960~74<60error本例中,原意是輸出一個(gè)值,要實(shí)現(xiàn)這一要求,應(yīng)在語句后加break語句。1、switch語句的執(zhí)行部分由一對大花括號括起來,case和后面的常量表達(dá)式之間要有空格。2、每一個(gè)case后面的常量值必須各不相同3、當(dāng)每一個(gè)case語句后均有break語句時(shí),case出現(xiàn)的次序不影響執(zhí)行結(jié)果。(default總是放在最后,這時(shí),deafult后不需要break語句)。4、break語句的功能是跳出所在的switch語句,轉(zhuǎn)而執(zhí)行switch后面的語句。break不是語法必須的語句,而是邏輯上實(shí)現(xiàn)多路選擇的必須。Switch說明5、case后面包含多個(gè)語句時(shí),不需要加大括號。(從:開始執(zhí)行).6、多個(gè)case可以共用一組執(zhí)行語句,例、case'A':case'B':case'C':printf(">60\n");break;7、case后面必須是整形常量或字符型常量。Switch說明例3-15五分制成績轉(zhuǎn)換成百分制#include<stdio.h>voidmain(){charc1,c2;

printf("pleaseinputthescore:");

scanf("%c%c",&c1,&c2);例3-15五分制成績轉(zhuǎn)換成百分制switch(c1){case'5':switch(c2){case'+':printf("100\n");break;case'\n':printf("90\n");break;case'-':printf("85\n");break;}break;case'4':switch(c2){case'+':printf("80\n");break;case'\n':printf("75\n");break;case'-':printf("70\n");break;}break;case'3':printf("60\n");break;case'2':case'1':printf("<60\n");break;}}3.3循環(huán)結(jié)構(gòu)在一個(gè)算法中,某些步驟需要反復(fù)多次地執(zhí)行時(shí),需要設(shè)計(jì)一個(gè)循環(huán)。循環(huán)是在給定循環(huán)條件為真時(shí)由計(jì)算機(jī)重復(fù)執(zhí)行一組循環(huán)體語句的控制結(jié)構(gòu)。循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序三種基本結(jié)構(gòu)之一。構(gòu)建循環(huán)讓計(jì)算機(jī)反復(fù)執(zhí)行一組操作語句,從而完成大量類同的計(jì)算。根據(jù)開始循環(huán)的初始條件和結(jié)束循環(huán)的條件不同,C語言中用如下語句實(shí)現(xiàn)循環(huán)1、用while語句。2、用do-while語句。3、用for語句。循環(huán)構(gòu)成3.3.1while語句一般形式:while(表達(dá)式)

循環(huán)體語句;作用:實(shí)現(xiàn)“當(dāng)型”循環(huán)。當(dāng)“表達(dá)式”為非0(真)時(shí),執(zhí)行“循環(huán)體語句”,其后回到循環(huán)開始while處再次判斷表達(dá)式真假,……,直至表達(dá)式為假,結(jié)束循環(huán),執(zhí)行while后續(xù)。特點(diǎn):循環(huán)體只能是一條語句。若有多條語句,使用{}使之成為復(fù)合語句。表達(dá)式一般是關(guān)系或邏輯表達(dá)式。當(dāng)然,在C中也可以為任意類型表達(dá)式。循環(huán)結(jié)構(gòu)流程圖實(shí)例例3-16求

voidmain(){int

i,n,sum=0;i=1;

printf(“pleaseinput:”);

scanf(“%d”,&n);while(i<=n){ sum+=i; i++;}

printf("%d",sum);}1.注意給出循環(huán)的初始條件,如本例中“sum=0i=1”。2.循環(huán)體包含一個(gè)以上的語句時(shí),用大括號括起來,形成復(fù)合語句。3.循環(huán)體中必須有使循環(huán)趨于結(jié)束的語句,否則程序進(jìn)入“死循環(huán)”(不結(jié)束)。4.書寫方式:縮格書寫。n3.3.2do-while語句一般形式:do{循環(huán)體語句}while(表達(dá)式);執(zhí)行過程:從do開始,先執(zhí)行一次“循環(huán)體語句”,然后判斷“表達(dá)式”,“表達(dá)式”非0,重回do處再次執(zhí)行“循環(huán)體語句”,直到“表達(dá)式”為0,循環(huán)結(jié)束。先循環(huán)后判斷用do-while語句求下面程序的功能是?voidmain(){ints=0,n;

scanf(“%d”,&n);do {s+=n; n--; }while(n>0);

printf(“s=%d\n”,s);}例3-17計(jì)算x的y次方#include<math.h>#include<stdio.h>voidmain(){

int

y,i;doublex,z;

printf("Pleaseinputxandy:");

scanf("%lf%d",&x,&y);z=1;i=1;

do{z*=x;i++;}while(i<=fabs(y)); if(y<0)z=1/z;printf("result=%lf\n",z);}循環(huán)條件一開始為假,循環(huán)執(zhí)行一次。while和do-while是可以互換的。在一般情況下,用while和do-while語句解決同一問題時(shí),若二者的循環(huán)體部分是一樣的,它們的結(jié)果也一樣。但當(dāng)循環(huán)條件一開始就為“假”時(shí),兩種循環(huán)的結(jié)果不同。這是因?yàn)榇藭r(shí)while循環(huán)的循環(huán)不被執(zhí)行,而do-while循環(huán)的循環(huán)體被執(zhí)行一次。While和do-while例3-17計(jì)算x的y次方修正#include<math.h>#include<stdio.h>voidmain(){

int

y,i;doublex,z;

printf("Pleaseinputxandy:");

scanf("%lf%d",&x,&y);z=1;i=1;

if(y!=0)do{z*=x;i++;}while(i<=fabs(y));if(y<0)z=1/z;printf("result=%lf\n",z);}3.3.3for語句

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

{循環(huán)體語句;

}執(zhí)行過程:(1)求表達(dá)式1;(2)求表達(dá)式2,若為“真”,執(zhí)行“循環(huán)語句”;若為假,轉(zhuǎn)第(5)步。(3)求表達(dá)式3。(4)轉(zhuǎn)第(2)步。(5)執(zhí)行for語句下面的語句。for循環(huán)流程圖例3-18用for循環(huán)求1+2+3+……+100#include<stdio.h>voidmain(){

int

i,sum;

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

printf("sum=%d\n",sum);}for語句中: “表達(dá)式1”循環(huán)變量初始化 “表達(dá)式2”判別循環(huán)條件 “表達(dá)式3”循環(huán)控制變量更新例:for(sum=0,i=1;i<=100;i++) sum=sum+i;這里,循環(huán)條件由變量i設(shè)定,變量i稱為“循環(huán)變量”。for語句

(1)表達(dá)式1和表達(dá)式3經(jīng)常是逗號表達(dá)式,可以分別或同時(shí)省略。for語句省略“表達(dá)式1”?!氨磉_(dá)式1”的作用是設(shè)定循環(huán)初始條件,“表達(dá)式1”省略后,應(yīng)在for語句前面設(shè)置循環(huán)初始條件。例:i=1;for(;i<=100;i++)

sum=sum+i;/*注意,“表達(dá)式1”后面的分號不能省略*/for語句說明for語句省略“表達(dá)式3”。表達(dá)式3用于修改控制循環(huán)條件(修正循環(huán)變量的值),若省略,應(yīng)在循環(huán)體語句中增加修改循環(huán)變量值的語句,以保證循環(huán)能正常結(jié)束。例:for (sum=0,i=1;i<=100;□){ sum=sum+i; i++;} for語句說明for語句說明同時(shí)省略“表達(dá)式1”和“表達(dá)式3”,只有“表達(dá)式2”。例:i=1;sum=0;for(;i<=100;){sum+=i;i++;}i=1;sum=0;for(;i<=100;){sum+=i++;}(2)表達(dá)式2是循環(huán)條件。如果省略“表達(dá)式2(循環(huán)條件)”,則不判別循環(huán)條件,認(rèn)為循環(huán)循環(huán)條件始終為“真”,循環(huán)將無終止地進(jìn)行下去。for(i=1,sum=0;;i++)sum+=i;相當(dāng)于:for(i=1,sum=0;1;i++)sum+=i;(3)循環(huán)體只能是一條語句,若包含多條語句,應(yīng)用{}括起來。for語句說明(4)for語句的其他變形例1:for(sum=0,i=1;i<=100;) sum=sum+i++;例2:sum=0,i=1;for(;;){sum=sum+i++;

if(i>100)break;}(5)各表達(dá)式可為逗號表達(dá)式

for(i=0,j=100;i<=j;i++,j--) k=i+j;for語句說明例3-19用for語句計(jì)算x的y次方,y為整數(shù)。x與y的值都由鍵盤輸入。voidmain(){int

y,i;doublex,z;

printf("Pleaseinputxandy:");

scanf("%lf%d",&x,&y);for(z=1,i=1;i<=fabs(y);i++) z*=x;if(y<0)z=1/z;

printf("result=%lf\n",z);}例3-20求最高分與平均分例3-20歌手大獎(jiǎng)賽,有裁判12人。編寫計(jì)算歌手得分程序,鍵盤輸入12個(gè)成績,輸出最高分、最低分與最終得分。#defineN12voidmain(){inti;floatscore,max,min,sum,aver;

scanf("%f",&score);max=min=sum=score;

for(i=1;i<=N-1;i++){scanf("%f",&score);

if(score>max)max=score;

if(score<min)min=score; sum+=score;}aver=(sum-max-min)/(N-2);

printf("max=%6.2f,min=%6.2f,average=%6.2f\n",max,min,aver);}3.3.4循環(huán)的嵌套循環(huán)嵌套:一個(gè)循環(huán)(稱為“外循環(huán)”)的循環(huán)體內(nèi)包含另一個(gè)循環(huán)(稱為“內(nèi)循環(huán)”)。內(nèi)循環(huán)中還可以包含循環(huán),形成多層循環(huán)。(循環(huán)嵌套的層數(shù)理論上無限制)。三種循環(huán)(while、do-while、for)可以互相嵌套。多重循環(huán)的使用與單一循環(huán)完全相同,但應(yīng)特別注意內(nèi)、外層循環(huán)條件的變化。內(nèi)、外層循環(huán)變量賦初值的位置、變量名的使用等。注意:外循環(huán)必須完整地包含內(nèi)循環(huán)。do{…… while() {……} for(;;) {……do{……}while();

…… }}while();例:1!+2!+3!+……+n!voidmain(){longs=0,k;

int

i,n,j;

scanf(“%d”,&n);

for(i=1;i<=n;i++){k=1;

for(j=1;j<=i;j++) k*=j; s+=k;}

printf(“s=%ld\n”,s);}voidmain(){longs=0,k;

int

i,n,j;k=1;

scanf(“%d”,&n);

for(i=1;i<=n;i++){

for(j=1;j<=i;j++) k*=j; s+=k;}

printf(“s=%ld\n”,s);}求1!+1!*2!+……+1!*2!*……*n!voidmain(){longs=0,k;

int

i,n;

scanf(“%d”,&n);

for(i=1,k=1;i<=n;i++) {k*=i; s+=k; }printf(“s=%ld\n”,s);}循環(huán)嵌套實(shí)例例3-21打印九九乘法表。例3-22編程輸出如下圖形:

12223333344444445555555553.3.5break與continue語句1.break語句在while、for、do-while或switch結(jié)構(gòu)中使用,可使程序立即退出該結(jié)構(gòu),轉(zhuǎn)而執(zhí)行該結(jié)構(gòu)后的第一條語句。注:break只可跳出所在的一重循環(huán)。在多重循環(huán)中使用,只能跳出其所在的內(nèi)層循環(huán)。Break跳出分析A;While(p1){B;for(C;p2;D) {E; if(p3)break; F; }G;}H; 例3-23求滿足表達(dá)式1+2+3+……+n<=1000的最大的n

#include<stdio.h>voidmain(){int

i,sum;

for(sum=0,i=1;;i++){sum+=i;

if(sum>1000)break;}

printf("n=%d\n",i-1);}#include<stdio.h>voidmain(){intsum=1,i;

for(i=1;sum<1000;i++){ sum+=i;}

printf("i=%d\n",i-2);}2.continue語句作用:提前結(jié)束本次循環(huán)體的執(zhí)行,回到循環(huán)的起始處,接著進(jìn)行下一次循環(huán)條件的判別。說明:對于while,continue是回到while處再次判斷條件,根據(jù)條件決定是否進(jìn)行下一次循環(huán);對do-while,回到do處,重新執(zhí)行循環(huán)體語句,并不判別循環(huán)條件。對for,來到表達(dá)式3處,執(zhí)行表達(dá)式3后再判斷表達(dá)式2。While(p1){A; if(p2)continue; do{

if(p3)continue; B;

}while(p4); for(C;p5;D)

{if(p6)continue elsebreak;

}

}E;輸出100~200之間不能被3整除的數(shù)。voidmain(){intn;for(n=100;n<=200;n++){if(n%3==0)

continue;

printf("%5d",n);}}voidmain(){intn;for(n=100;n<=200;n++){if(n%3!=0)

printf("%5d",n);}}例3-24鍵盤輸入一組學(xué)生成績,輸出其中已及格的數(shù)據(jù)(>=60)。輸入時(shí)以負(fù)數(shù)作為輸入的結(jié)束。

voidmain(){ints=1;

while(s>=0){scanf("%d",&s);

if(s<60) continue;

printf("%d",s);}

printf("\n");}可否不使用continue?break語句和continue語句說明1.注意各自的功能while(表達(dá)式1) while(表達(dá)式1){ {if(表達(dá)式2)if(表達(dá)式2)break;continue;} }break語句跳出循環(huán)continue語句結(jié)束本次循環(huán)體的執(zhí)行,進(jìn)入下一次循環(huán)2.都不能單獨(dú)使用。break只能用于循環(huán)與switch控制結(jié)構(gòu)中,continue只能用于循環(huán)控制結(jié)構(gòu)中。3.3.6goto語句(無條件轉(zhuǎn)移語句)一般形式:goto

語句標(biāo)號功能:無條件轉(zhuǎn)向“語句標(biāo)號”處執(zhí)行。語句標(biāo)號為一個(gè)標(biāo)識符,放在語句前面,用:與語句分隔。goto語句引起一個(gè)無條件的轉(zhuǎn)移,會破壞其他控制結(jié)構(gòu),不符合結(jié)構(gòu)化程序設(shè)計(jì)原則,破壞了程序結(jié)構(gòu)的清晰,因此,一般應(yīng)避免使用goto語句。例3-25計(jì)算n+(n+1)+(n+2)+……+100#include<stdio.h>voidmain(){

int

i,s=0;

scanf("%d",&i);

if(i>100){

printf("Error");

gotoend;}

start:/*語句標(biāo)號*/

if(i<=100){s+=i++;

gotostart;}

printf("s=%d",s);end:printf("\n");/*帶語句標(biāo)號的語句*/}3.4循環(huán)程序設(shè)計(jì)3.4.1循環(huán)設(shè)計(jì)循環(huán)是在循環(huán)條件為真時(shí)反復(fù)執(zhí)行的一組計(jì)算機(jī)指令,是計(jì)算機(jī)解題的一個(gè)重要結(jié)構(gòu)。循環(huán)控制有兩種基本方法:計(jì)數(shù)法和標(biāo)志法。1.計(jì)數(shù)器控制的循環(huán)事先準(zhǔn)確地知道循環(huán)次數(shù),因此設(shè)計(jì)一個(gè)循環(huán)控制變量,由變量值來控制循環(huán)次數(shù)。每循環(huán)一次,循環(huán)變量的值會遞增(增值通常為1或-1),當(dāng)其值達(dá)到終值時(shí)結(jié)束循環(huán)。2.標(biāo)志控制的循環(huán)事先不知道準(zhǔn)確的循環(huán)次數(shù),由某一目標(biāo)值標(biāo)記循環(huán)的結(jié)束。C語言程序所需的任何控制形式可以用下面三種控制結(jié)構(gòu)完成:順序結(jié)構(gòu)、if結(jié)構(gòu)、while結(jié)構(gòu)。一、循環(huán)設(shè)計(jì)程序設(shè)計(jì)的首要工作是算法設(shè)計(jì),離開了算法也就沒有了程序。算法,是指完成某一項(xiàng)工作而采取的方法和步驟,具體到程序設(shè)計(jì),是對解題過程的準(zhǔn)確而完整的描述,并用一種程序設(shè)計(jì)語言的來實(shí)現(xiàn)。循環(huán)主要用來解決程序設(shè)計(jì)中兩類基本的算法:窮舉和迭代。3.4.2基本算法窮舉的基本思想是對問題的所有可能狀態(tài)一一測試,直到找到解或?qū)⑷靠赡軤顟B(tài)都測試過為止。窮舉是一種重復(fù)型算法,其核心是設(shè)計(jì)循環(huán),在循環(huán)體中依次測試。例0:最大公因數(shù)例1:百錢百雞例2:最值問題。輸入十個(gè)數(shù),輸出其中最大、平均值。例3:素?cái)?shù)問題。判斷x是不是素?cái)?shù)。[例3-30]例4:輸出100-1000之間所有素?cái)?shù),每行輸出5個(gè)。例5:韓信點(diǎn)兵1.窮舉判斷素?cái)?shù)韓信點(diǎn)兵韓信有一隊(duì)兵,他想知道有多少人,便讓士兵排隊(duì)報(bào)數(shù)。按1-5報(bào)數(shù)最后一人報(bào)1;按1-6報(bào)數(shù)末一人報(bào)5;按1-7報(bào)數(shù)最后一人報(bào)4;按1-11報(bào)數(shù)最末一人報(bào)10。韓信有多少兵?思考:設(shè)士兵數(shù)為x,滿足以下關(guān)系式:x%5==1&&x%6==5&&x%7==4&&x%11==10用窮舉法對x從1開始測試,直到找到滿足關(guān)系式的x按照特定規(guī)律和方法,不斷用新值取代變量的舊值,或由舊值遞推出變量新值,直至問題解決為止,這種解決問題的方法為迭代。迭代的關(guān)鍵因素是:迭代初值、迭代公式和迭代次數(shù)(精度要求)。例0:最大

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論