本章教學(xué)目標(biāo)了解學(xué)習(xí)算法的基本知識(shí)C程序的各種語(yǔ)句掌握算法_第1頁(yè)
本章教學(xué)目標(biāo)了解學(xué)習(xí)算法的基本知識(shí)C程序的各種語(yǔ)句掌握算法_第2頁(yè)
本章教學(xué)目標(biāo)了解學(xué)習(xí)算法的基本知識(shí)C程序的各種語(yǔ)句掌握算法_第3頁(yè)
本章教學(xué)目標(biāo)了解學(xué)習(xí)算法的基本知識(shí)C程序的各種語(yǔ)句掌握算法_第4頁(yè)
本章教學(xué)目標(biāo)了解學(xué)習(xí)算法的基本知識(shí)C程序的各種語(yǔ)句掌握算法_第5頁(yè)
已閱讀5頁(yè),還剩126頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第三章C程序控制結(jié)構(gòu)

本章教學(xué)目標(biāo):了解學(xué)習(xí)算法的基本知識(shí)、C程序的各種語(yǔ)句掌握算法描述方法、數(shù)據(jù)輸入與輸出、流程控制語(yǔ)句的格式、功能與用法學(xué)會(huì)編寫各種控制結(jié)構(gòu)程序

本章重點(diǎn)內(nèi)容:算法的描述方法,選擇語(yǔ)句、循環(huán)語(yǔ)句等控制語(yǔ)句的正確使用獨(dú)立設(shè)計(jì)結(jié)構(gòu)化程序的能力第3章C程序控制結(jié)構(gòu)

3.1算法3.2C語(yǔ)言概述3.3數(shù)據(jù)的輸入與輸出3.4順序結(jié)構(gòu)程序設(shè)計(jì)3.5選擇結(jié)構(gòu)程序設(shè)計(jì)3.6循環(huán)結(jié)構(gòu)程序設(shè)計(jì)3.7流程轉(zhuǎn)向3.8設(shè)計(jì)風(fēng)格3.1算法3.1.1算法的概念

1.計(jì)算機(jī)科學(xué)家N.沃思(NiklausWirth)對(duì)程序下的定義:數(shù)據(jù)結(jié)構(gòu)+算法=程序數(shù)據(jù)結(jié)構(gòu):對(duì)數(shù)據(jù)的描述和組織形式;算法:對(duì)操作或行為的描述,即操作步驟。

2.算法:

1)廣義的算法概念:做某件事的方法和步驟;

2)算法(Algorithm)解決一個(gè)具體問(wèn)題而采取的方法和有限步驟。或者是指對(duì)解題方案準(zhǔn)確而完整的描述,是一系列解決問(wèn)題的清晰指令。

3)計(jì)算機(jī)解題的算法分類:數(shù)值運(yùn)算、非數(shù)值運(yùn)算

一個(gè)算法應(yīng)該具有以下七個(gè)重要的特征:1、有窮性(Finiteness):算法的有窮性是指算法必須能在執(zhí)行有限個(gè)步驟之后終止;2、確切性(Definiteness):算法的每一步驟必須有確切的定義;3、輸入項(xiàng)(Input):一個(gè)算法有0個(gè)或多個(gè)輸入,以表示運(yùn)算對(duì)象的初始情況,所謂0個(gè)輸入是指算法本身定出了初始條件;4、輸出項(xiàng)(Output):一個(gè)算法有一個(gè)或多個(gè)輸出,以反映對(duì)輸入數(shù)據(jù)加工后的結(jié)果。沒有輸出的算法是毫無(wú)意義的;5、可行性(Effectiveness):算法中執(zhí)行的任何計(jì)算步驟都是可以被分解為基本的可執(zhí)行的操作步,即每個(gè)計(jì)算步都可以在有限時(shí)間內(nèi)完成(也稱之為有效性);6、高效性(Highefficiency):執(zhí)行速度快,占用資源少;7、健壯性(Robustness):對(duì)數(shù)據(jù)響應(yīng)正確。3.1.2算法的描述1、用自然語(yǔ)言表示算法用人們?nèi)粘J褂玫恼Z(yǔ)言(可以是漢語(yǔ)或英語(yǔ)或其它語(yǔ)言)描述算法。用自然語(yǔ)言表示通俗易懂,但文字冗長(zhǎng),容易出現(xiàn)“歧義性”。例1:求表達(dá)式1×2×3×4×5的積

步驟1:先求1×2,得到結(jié)果2步驟2:將步驟1得到的乘積2再乘以3,得到結(jié)果6步驟3:將6再乘以4,得24步驟4:將24再乘以5,得120如果要求1×2×…×1000,則要寫999個(gè)步驟思考題:如何改進(jìn)這個(gè)算法?

S1:使p=1S2:使i=2S3:使p×i,乘積仍放在變量p中,可表示為:

p×i→pS4:使i的值加1,即i+1→i。

S5:如果i不大于5,返回重新執(zhí)行步驟S3以及其后的步驟S4和S5;否則,算法結(jié)束。最后得到p的值就是5!的值。可以設(shè)兩個(gè)變量:一個(gè)變量代表被乘數(shù),一個(gè)變量代表乘數(shù)。不另設(shè)變量存放乘積結(jié)果,而直接將每一步驟的乘積放在被乘數(shù)變量中。設(shè)p為被乘數(shù),i為乘數(shù)。用循環(huán)算法來(lái)求結(jié)果,算法可改寫:S1:1→pS2:3→iS3:p×i

→pS4:i+2→iS5:若i≤1000,返回S3。否則,結(jié)束。

如果題目改為:求1×3×5×……×1000算法只需作很少的改動(dòng):用這種方法表示的算法具有通用性、靈活性。S3到S5組成一個(gè)循環(huán),在實(shí)現(xiàn)算法時(shí)要反復(fù)多次執(zhí)行S3,S4,S5等步驟,直到某一時(shí)刻,執(zhí)行S5步驟時(shí)經(jīng)過(guò)判斷,乘數(shù)i已超過(guò)規(guī)定的數(shù)值而不返回S3步驟為止。此時(shí)算法結(jié)束,變量p的值就是所求結(jié)果。例2

判定2000~2500年中的哪一年是閏年,將是閏年的輸出。

分析:閏年的條件是:(1)能被4整除,但不能被100整除的年份都是閏年,如:1996,2004年是閏年;(2)能被100整除,又能被400整除的年份是閏年。如:1600,2000年是閏年。(3)不符合這兩個(gè)條件的年份就不是閏年。

設(shè)y為被檢測(cè)的年份,算法可表示如下

S1:2000→yS2:若y不能被4整除,則輸出y“不是閏年”。然后轉(zhuǎn)到S6。S3:若y能被4整除,不能被100整除,則輸出y“是閏年”。然后轉(zhuǎn)到S6。S4:若y能被100整除,又能被400整除,輸出y“是閏年”,否則輸出“不是閏年”。然后轉(zhuǎn)到S6。S5:輸出y“不是閏年”。S6:y+1→yS7:當(dāng)y≤2500時(shí),轉(zhuǎn)S2繼續(xù)執(zhí)行,如y>2500,算法停止。

例3

對(duì)一個(gè)大于或等于3的正整數(shù),判斷它是不是一個(gè)素?cái)?shù)。概念:所謂素?cái)?shù),是指除了1和該數(shù)本身之外,不能被其它任何整數(shù)整除的數(shù)。例如,13是素?cái)?shù)。因?yàn)樗荒鼙?,3,4,…,12整除。分析:判斷一個(gè)數(shù)n(n≥3)是否素?cái)?shù)的方法:將n作為被除數(shù),將2到(n-1)各個(gè)整數(shù)輪流作為除數(shù),如果都不能被整除,則n為素?cái)?shù)。思考題:如何寫出這個(gè)算法?算法如下

:S1:輸入n的值S2:i=2(i作為除數(shù))S3:n被i除,得余數(shù)rS4:如果r=0,表示n能被i整除,則打印n“不是素?cái)?shù)”,算法結(jié)束。否則執(zhí)行S5S5:i+1→iS6:如果i≤n-1,返回S3。否則打印n“是素?cái)?shù)”。然后結(jié)束。實(shí)際上,n不必被2到(n-1)的整數(shù)除,只需被2到n/2間整數(shù)除,甚至只需被2到之間的整數(shù)除即可。

2用流程圖表示算法美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)ANSI(AmericanNationalStandardInstitute)規(guī)定了一些常用的流程圖符號(hào):起止框判斷框處理框輸入/輸出框注釋框流向線連接點(diǎn)例4

將求5!的算法用流程圖表示如果需要將最后結(jié)果打印出來(lái),可在菱形框的下面加一個(gè)輸出框。

例5

將例3判斷素?cái)?shù)的算法用流程圖表示流程圖是表示算法較好的工具。一個(gè)流程圖包括以下幾部分(1)表示相應(yīng)操作的框;(2)帶箭頭的流程線;(3)框內(nèi)外必要的文字說(shuō)明。3用偽代碼表示算法概念:偽代碼是用介于自然語(yǔ)言和計(jì)算機(jī)語(yǔ)言之間的文字和符號(hào)來(lái)描述算法。特點(diǎn):它如同一篇文章一樣,自上而下地寫下來(lái)。每一行(或幾行)表示一個(gè)基本操作。它不用圖形符號(hào),因此書寫方便、格式緊湊,也比較好懂,也便于向計(jì)算機(jī)語(yǔ)言算法(即程序)過(guò)渡。用處:適用于設(shè)計(jì)過(guò)程中需要反復(fù)修改時(shí)的流程描述。

IFxispositiveTHENprintxELSEprint-x

例6:“打印x的絕對(duì)值”的算法可以用偽代碼表示為:也可以用漢字偽代碼表示:

若x為正打印x

否則打印-x也可以中英文混用,如:

IFx為正

printxELSEprint–x開始

置t的初值為1

置i的初值為2

當(dāng)i<=5,執(zhí)行下面操作:使t=t×I

使i=i+1

{循環(huán)體到此結(jié)束}輸出t的值結(jié)束也可以寫成以下形式:

BEGIN{算法開始}

1

t2

iwhilei≤5{t×i

ti+1

i}printtEND{算法結(jié)束}例7求5!,用偽代碼表示算法:

4用計(jì)算機(jī)語(yǔ)言表示算法概念:用計(jì)算機(jī)實(shí)現(xiàn)算法。計(jì)算機(jī)是無(wú)法識(shí)別流程圖和偽代碼的。只有用計(jì)算機(jī)語(yǔ)言編寫的程序才能被計(jì)算機(jī)執(zhí)行。因此在用流程圖或偽代碼描述出一個(gè)算法后,還要將它轉(zhuǎn)換成計(jì)算機(jī)語(yǔ)言程序。特點(diǎn):用計(jì)算機(jī)語(yǔ)言表示算法必須嚴(yán)格遵循所用的語(yǔ)言的語(yǔ)法規(guī)則,這是和偽代碼不同的。用處:要完成一件工作,包括設(shè)計(jì)算法和實(shí)現(xiàn)算法兩個(gè)部分。設(shè)計(jì)算法的目的是為了實(shí)現(xiàn)算法。#include<stdio.h>voidmain(){inti,t;t=1;i=2;while(i<=5){t=t*I;i=i+1;}

printf(“%d\n”,t);}例11將求5!算法用C語(yǔ)言表示。3.2C語(yǔ)言的語(yǔ)句分類3.2.1C語(yǔ)言的語(yǔ)句

程序的執(zhí)行部分是由語(yǔ)句組成的,程序的功能也是由執(zhí)行語(yǔ)句實(shí)現(xiàn)的。

C語(yǔ)句可分為以下五類:表達(dá)式語(yǔ)句、函數(shù)調(diào)用語(yǔ)句、控制語(yǔ)句、復(fù)合語(yǔ)句和空語(yǔ)句。1、表達(dá)式語(yǔ)句表達(dá)式語(yǔ)句由表達(dá)式加上分號(hào)“;”組成,執(zhí)行表達(dá)式語(yǔ)句就是計(jì)算表達(dá)式的值。

其一般形式為:表達(dá)式;x=y+z;//賦值語(yǔ)句i++;//自加1語(yǔ)句,i值增1X=m>n?m:n;//條件表達(dá)式語(yǔ)句b==5;//比較表達(dá)式語(yǔ)句x&&y++||z;//邏輯表達(dá)式語(yǔ)句i=1,j=2,k=3;//逗號(hào)表達(dá)式語(yǔ)句例如:下列表達(dá)式語(yǔ)句函數(shù)調(diào)用語(yǔ)句由函數(shù)名、實(shí)際參數(shù)加上分號(hào)“;”組成,

一般形式為:函數(shù)名(實(shí)際參數(shù)表);

執(zhí)行函數(shù)語(yǔ)句就是調(diào)用函數(shù)體并把實(shí)際參數(shù)賦予函數(shù)定義中的形式參數(shù),然后執(zhí)行被調(diào)函數(shù)體中的語(yǔ)句,求取函數(shù)值。例如:

printf(“CProgram”);//調(diào)用輸出函數(shù),輸出字符串。

C語(yǔ)言提供了很多標(biāo)準(zhǔn)的庫(kù)函數(shù)供用戶使用。調(diào)用庫(kù)函數(shù)時(shí)必須用編譯預(yù)處理命令把相應(yīng)的頭文件包含到程序中,否則編譯時(shí)會(huì)因?yàn)橄到y(tǒng)不識(shí)別庫(kù)函數(shù)而報(bào)錯(cuò)。2、函數(shù)調(diào)用語(yǔ)句輸入輸出庫(kù)函數(shù)scanf()、printf()、getchar()、putchar()、gets()、puts()的函數(shù)聲明包含在stdio.h頭文件中,因此在程序中必須有編譯預(yù)處理命令:#include<stdio.h>數(shù)學(xué)庫(kù)函數(shù)sin(x)、cos(x)、exp(x)、fabs(x)、log(x)的函數(shù)聲明包含在math.h中,因此在程序中必須有編譯處理命令:#include<math.h>#include<stdio.h>#include<math.h>voidmain(){int

x,a,b;floaty,c;

scanf("%d,%d,%d",&a,&b,&x);y=fabs(a*sin(x)-b*log(x));

c=sin(3.14*x/180);printf("y=%f,c=%f\n",y,c);}例3-5:函數(shù)調(diào)用語(yǔ)句示例。

控制語(yǔ)句用于控制程序的流程,以實(shí)現(xiàn)程序的各種結(jié)構(gòu),通常由特定的語(yǔ)句定義符組成。C語(yǔ)言有九種控制語(yǔ)句,可分成以下三類:(1)條件判斷語(yǔ)句:if,switch語(yǔ)句(2)循環(huán)執(zhí)行語(yǔ)句:dowhile,while,for語(yǔ)句(3)轉(zhuǎn)向語(yǔ)句:break,goto

,continue,return語(yǔ)句3、控制語(yǔ)句4、復(fù)合語(yǔ)句

把多個(gè)語(yǔ)句用括號(hào){}括起來(lái)組成的一個(gè)語(yǔ)句稱復(fù)合語(yǔ)句。在程序中應(yīng)把復(fù)合語(yǔ)句看成是單條語(yǔ)句,而不是多條語(yǔ)句。例3-6:求sum=2+4+6+…+20#include<stdio.h>voidmain(){intsum,i;sum=0;i=2;while(i<=20){sum=sum+i;i=i+2;}/*復(fù)合語(yǔ)句*/printf("sum=%d\n",sum);}程序執(zhí)行后結(jié)果:sum=110例3-7:寫出下列程序的執(zhí)行結(jié)果。#include<stdio.h>voidmain(){intx=1,y=2;{intx=2;{intx=3;

printf(“x=%d,y=%d\n”,x,y);}

printf(“x=%d,y=%d\n”,x,y);}

printf(“x=%d,y=%d\n”,x,y);}程序的運(yùn)行結(jié)果:x=3,y=2x=2,y=2x=1,y=2

只有分號(hào)“;”組成的語(yǔ)句稱為空語(yǔ)句。空語(yǔ)句不產(chǎn)生任何操作運(yùn)算,只是出于語(yǔ)法上的需要,在某些必需的場(chǎng)合占據(jù)一個(gè)語(yǔ)句的位置。在程序中空語(yǔ)句可用來(lái)作空循環(huán)體。

例如:while(getchar()!='\n');

語(yǔ)句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。這里的循環(huán)體為空語(yǔ)句。5、空語(yǔ)句

1.輸入輸出通過(guò)調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)本來(lái)實(shí)現(xiàn)

1)標(biāo)準(zhǔn)庫(kù)函數(shù)在附錄D中給出

2)標(biāo)準(zhǔn)庫(kù)函數(shù)通過(guò)#include命令將有關(guān)的頭文件包含到用戶原程序中才能使用調(diào)用標(biāo)準(zhǔn)輸入輸出函數(shù),文件開頭要有預(yù)編譯命令:

#include<stdio.h>或#include“stdio.h”

2.函數(shù)調(diào)用語(yǔ)句格式:

函數(shù)名([實(shí)參表]);

3.常用的輸入輸出函數(shù):

1)字符輸入/輸出函數(shù):getchar、putchar;

2)格式化輸入/輸出函數(shù):scanf、printf;

3)字符串輸入/輸出函數(shù):gets、puts3.3數(shù)據(jù)的輸入與輸出3.3.1字符的輸入和輸出

1.getchar函數(shù)

1)函數(shù)格式:getchar()2)功能:從鍵盤上輸入一個(gè)字符,返回該字符的ASC碼值

3)字符輸入語(yǔ)句:變量=getchar();

charc;c=getchar();//函數(shù)不帶參數(shù)

2.putchar()函數(shù)

1)調(diào)用格式:putchar(參數(shù));

2)功能:將字符變量的內(nèi)容寫到屏幕上

3)參數(shù):字符變量或字符常量【例】putchar(‘8’);//輸出字符8putchar(‘B’);//直接輸出字母Bputchar(c);//輸出字符變量C的值例3-8:從鍵盤連續(xù)輸入三個(gè)字符,將它們反序輸出#include<stdio.h>voidmain(){charch1,ch2,ch3;

printf("inputthreecharacters:\n");ch1=getchar();/*調(diào)用字符輸入函數(shù)*/ch2=getchar();ch3=getchar();putchar(ch3);/*調(diào)用字符輸出函數(shù)*/putchar(ch2);putchar(ch1);}運(yùn)行程序時(shí)屏幕顯示inputthreecharacters:鍵盤輸入:abc

(按【Enter】鍵)屏幕顯示:cba一.格式化輸出【例】從屏幕上輸出一個(gè)整數(shù)#include<stdio.h>voidmain(){ inta=10;b=20;

printf(“輸出變量a和b的值:”);

printf(“a=%d,b=%d\n”,a,b);}1、printf()函數(shù)

格式:printf(格式控制字符串,[輸出項(xiàng)表列]);如:printf(“a=%d,b=%d\n”,a,b);

3.3.2格式化輸入與輸出2格式控制字符串格式控制字符串用于指定輸出格式,可由格式字符串和非格式字符串兩種組成。非格式字符串由普通字符和轉(zhuǎn)義字符組成格式字符串是以%開頭的字符串,在%后面跟各種格式字符,以說(shuō)明輸出數(shù)據(jù)的類型、形式、長(zhǎng)度、小數(shù)位數(shù)等。如“%d”表示按十進(jìn)制整型輸出,“%ld”表示按十進(jìn)制長(zhǎng)整型輸出,“%c”表示按字符型輸出等。(1)普通字符:在輸出時(shí),普通字符要原樣輸出,主要用于輸出提示信息。(2)轉(zhuǎn)義字符:轉(zhuǎn)義字符指明特定的操作,如‘\n’表示換行。(3)格式控制符:用來(lái)指定輸出列表項(xiàng)中各數(shù)據(jù)的輸出類型,格式字符的位置顯示對(duì)應(yīng)的輸出項(xiàng)的值,具體的字符和含義如表3-2所示。

3、輸出項(xiàng)表列輸出表列中給出了各個(gè)輸出項(xiàng),要求格式字符串和各輸出項(xiàng)在數(shù)量和類型上一一對(duì)應(yīng)。輸出項(xiàng)可以是常量、變量或表達(dá)式,輸出項(xiàng)之間用逗號(hào)隔開。如:printf(“a=%d,b=%d\n”,a,b);兩個(gè)格式控制符%d%d

對(duì)應(yīng)兩個(gè)輸出項(xiàng)a,b表3-2格式控制字符和意義格式字符格式字符意義d以十進(jìn)制形式輸出帶符號(hào)整數(shù)(正數(shù)不輸出符號(hào))o以八進(jìn)制形式輸出無(wú)符號(hào)整數(shù)(不輸出前綴O)x以十六進(jìn)制形式輸出無(wú)符號(hào)整數(shù)(不輸出前綴OX)u以十進(jìn)制形式輸出無(wú)符號(hào)整數(shù)f以小數(shù)形式輸出單、雙精度實(shí)數(shù)e以指數(shù)形式輸出單、雙精度實(shí)數(shù)g以%f%e中較短的輸出寬度輸出單、雙精度實(shí)數(shù)c輸出單個(gè)字符s輸出字符串例3-9:寫出下列程序的執(zhí)行結(jié)果。#include<stdio.h>voidmain(){inta=3,b=4;

printf(“outputtwodata:\n”);printf(“%d,%d\n”,a,b);printf(“a=%d,b=%d\n”,a,b);} 程序的運(yùn)行結(jié)果:outputtwodata:3,4a=3,b=4完整的格式說(shuō)明還包括一些修飾符,其形式為:

%[標(biāo)志][寬度][.精度][長(zhǎng)度]格式控制符其中,方括號(hào)[]中的項(xiàng)為可選項(xiàng),表示格式修飾符:4、格式修飾符修飾字符含義長(zhǎng)度l在d,o,x,u前,指定輸出精度為long型在e,f,g前,指定輸出精度為double型寬度m指定輸出數(shù)據(jù)域?qū)?數(shù)據(jù)長(zhǎng)度<m,左補(bǔ)空格;否則按實(shí)際輸出精度.n對(duì)實(shí)數(shù),指定小數(shù)點(diǎn)后位數(shù)(四舍五入)對(duì)字符串,指定實(shí)際輸出位數(shù)-輸出數(shù)據(jù)在域內(nèi)左對(duì)齊(缺省右對(duì)齊)+輸出有符號(hào)數(shù)的正負(fù)號(hào)(+或-)#在八進(jìn)制和十六進(jìn)制數(shù)前顯示前導(dǎo)0,0x0輸出數(shù)值時(shí)指定左面不使用的空位置自動(dòng)填0A、寬度(m)

用十進(jìn)制整數(shù)來(lái)表示數(shù)據(jù)輸出所占的位數(shù)。若實(shí)際位數(shù)大于定義的寬度,則按實(shí)際位數(shù)輸出,若實(shí)際位數(shù)小于定義的寬度則補(bǔ)以空格例3-10:寫出下列程序的執(zhí)行結(jié)果。#include<stdio.h>voidmain(){intx=567;printf(“%d\n”,x);printf(“%3d\n”,x);//寬度為3printf(“%8d\n”,x);//寬度為8}分析:第一條輸出語(yǔ)句中,沒指定輸出寬度,按實(shí)際位數(shù)輸出,占3位;第二條輸出語(yǔ)句中,指定寬度為3,寬度與實(shí)際位數(shù)一致,也占3位;第三條輸出語(yǔ)句中,指定寬度為8,大于數(shù)據(jù)的實(shí)際位數(shù),在數(shù)據(jù)左側(cè)補(bǔ)5個(gè)空格,再輸出3位數(shù)據(jù)。程序運(yùn)行結(jié)果:567567

567/*數(shù)據(jù)567左邊有5個(gè)空格*/例3-11:寫出下列程序的執(zhí)行結(jié)果。#include<stdio.h>voidmain(){printf("%10s\n","apple");printf("%3s\n","apple");printf("%10f\n",12.76543);printf("%15f\n",12.76543);}程序運(yùn)行結(jié)果:appleapple12.76543012.765430B、精度(.n)

精度格式符以“.”開頭,后跟十進(jìn)制整數(shù)。

本項(xiàng)的意義是:如果輸出數(shù)字,則表示小數(shù)的位數(shù);如果輸出的是字符串,則表示輸出字符的個(gè)數(shù)。

若實(shí)際位數(shù)大于所定義的精度數(shù),則截去超過(guò)的部分,若是實(shí)數(shù)會(huì)對(duì)小數(shù)部分四舍五入。

例如:%m.nf:表示輸出的數(shù)據(jù)共占m列,其中有n位小數(shù)。如果數(shù)值長(zhǎng)度小于m,則在左端補(bǔ)空格。

%m.ns:表示輸出共占m列,但只取字符串左端n個(gè)字符,這n個(gè)字符輸出在m列的右側(cè),左補(bǔ)空格。例3-12:寫出下列程序的執(zhí)行結(jié)果。#include<stdio.h>voidmain(){printf(“%10.3f\n”,1000.7654321);printf(“%10.3f\n”,1111000.7654321);printf(“%8.2s\n”,”Name”);}分析:第一條輸出語(yǔ)句中,小數(shù)占3位,小數(shù)點(diǎn)占1位,整數(shù)占4位,但指定的輸出寬度為10,所以在輸出結(jié)果左邊補(bǔ)2個(gè)空格;第二條輸出語(yǔ)句中,指定小數(shù)占3位,小數(shù)點(diǎn)占1位,整數(shù)占7位,3+1+7=11,超出了指定的輸出寬度10,整數(shù)部分按實(shí)際位數(shù)輸出;第三條輸出語(yǔ)句,截取字符串前2個(gè)字符,由于輸出寬度為8,在左端補(bǔ)6個(gè)空格。程序的運(yùn)行結(jié)果:1000.7651111000.765NaC、標(biāo)志標(biāo)志字符有‘-’、‘+’、‘#’和‘0’四種,含義見上表。例3-13:寫出下列程序的執(zhí)行結(jié)果。#include<stdio.h>voidmain(){printf(“%13f\n”,100.76543);printf(“%-13f\n”,100.76543);//-號(hào)表示左齊printf(“%+13f\n”,100.76543);//+號(hào)表示顯示正負(fù)號(hào)printf(“%+13f\n”,-100.76543);}程序的運(yùn)行結(jié)果:100.765430100.765430+100.765430-100.765430#include<stdio.h>voidmain(){inta=1234;floatf=123.456;printf(“%0+8d\n”,a);printf(“%0+10.2f\n”,f);}

例3-13b:寫出下列程序的執(zhí)行結(jié)果。2、格式化輸入函數(shù)--scanf

scanf函數(shù)稱為格式輸入函數(shù),即按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變量之中。scanf函數(shù)是一個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù),它的函數(shù)原型在頭文件“stdio.h”中,與printf函數(shù)相同。(1)一般形式:

scanf(“格式控制字符串”,地址表列);

功能:從標(biāo)準(zhǔn)輸入設(shè)備(stdin,如:鍵盤)讀取輸入的信息,可以讀入任何固有類型的數(shù)據(jù)并自動(dòng)把數(shù)值變換成適當(dāng)?shù)臋C(jī)內(nèi)格式。說(shuō)明:①格式控制字符串的作用與printf()函數(shù)相同。②地址表列中給出各變量的地址。例3-14:格式輸入函數(shù)示例一。#include<stdio.h>voidmain(){inta,b,c;printf("inputa,b,c\n");scanf("%d%d%d",&a,&b,&c);printf("a=%d,b=%d,c=%d\n",a,b,c);}程序運(yùn)行:inputa,b,c輸入369輸出a=3,b=6,c=9(3)格式字符串使用說(shuō)明格式字符串的一般形式為:%[*][輸入數(shù)據(jù)寬度][長(zhǎng)度]類型其中有方括號(hào)[]的項(xiàng)為任選項(xiàng)。各項(xiàng)的意義如下:①類型表示輸入數(shù)據(jù)的類型,其格式符和意義如表3-2所示。②“*”符“*”表示該輸入項(xiàng)讀入后不賦予相應(yīng)的變量,即跳過(guò)該輸入值。例如:scanf("%d%*d%d",&a,&b);當(dāng)輸入為:123時(shí),把1賦予a,2被跳過(guò),3賦予b。③寬度用十進(jìn)制整數(shù)指定輸入的寬度(即字符數(shù))。例如:scanf("%5d",&a);當(dāng)輸入:12345678只把12345賦予變量a,其余部分被截去。又如:scanf("%4d%4d",&a,&b);當(dāng)輸入:12345678將把1234賦予a,而把5678賦予b。④長(zhǎng)度長(zhǎng)度格式符為l和h,l表示輸入長(zhǎng)整型數(shù)據(jù)(如%ld)和雙精度浮點(diǎn)數(shù)(如%lf)。h表示輸入短整型數(shù)據(jù)。①scanf函數(shù)中沒有精度控制,如:scanf("%5.2f",&a);是非法的。不能企圖用此語(yǔ)句輸入小數(shù)部分為2位的實(shí)數(shù)。②scanf中要求給出變量地址,如給出變量名則會(huì)出錯(cuò)。如scanf("%d",a);是非法的,應(yīng)改為scnaf("%d",&a);才是合法的。③在輸入多個(gè)數(shù)值數(shù)據(jù)時(shí),若格式控制串中沒有非格式字符作輸入數(shù)據(jù)之間的間隔,則可用空格,TAB或回車作間隔。C編譯在遇到空格,Tab,回車或非法數(shù)據(jù)(如對(duì)“%d”輸入“12A”時(shí),A即為非法數(shù)據(jù))時(shí)即認(rèn)為該數(shù)據(jù)結(jié)束。(2)注意事項(xiàng):④在輸入字符數(shù)據(jù)時(shí),若格式控制串中無(wú)非格式字符,則認(rèn)為所有輸入的字符均為有效字符。例如:scanf("%c%c%c",&a,&b,&c);輸入為:def則把'd'賦予a,,空格賦予b,'e'賦予c。只有當(dāng)輸入為:def時(shí),才能把’d'賦于a,'e'賦予b,’f'賦予c。⑤如果在格式控制中加入空格作為間隔,如scanf("%c%c%c",&a,&b,&c);則輸入時(shí)各數(shù)據(jù)之間可加空格。⑥如果格式控制串中有非格式字符,則輸入時(shí)也要輸入該非格式字符。例如:scanf("%d,%d,%d",&a,&b,&c);其中用非格式符‘,’作間隔符,故輸入時(shí)應(yīng)為:5,6,7又如:scanf("a=%d,b=%d,c=%d",&a,&b,&c);則輸入應(yīng)為a=10,b=20,c=30從程序流程的角度來(lái)看,程序可以分為三種基本結(jié)構(gòu),即順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)是三種結(jié)構(gòu)中最簡(jiǎn)單的一種程序組織結(jié)構(gòu),其特點(diǎn)是完全按照程序中語(yǔ)句出現(xiàn)的先后順序依次執(zhí)行。順序結(jié)構(gòu)的程序主要由4部分組成:變量說(shuō)明部分、數(shù)據(jù)輸入部分、運(yùn)算部分、運(yùn)算結(jié)果輸出部分3.4順序結(jié)構(gòu)程序設(shè)計(jì)3.4順序結(jié)構(gòu)程序設(shè)計(jì)例3-15:從鍵盤輸入圓半徑,輸出圓面積(圓周率取3.14,計(jì)算結(jié)果保留小數(shù)點(diǎn)后兩位)分析:(1)聲明兩個(gè)變量r和s,其中r保存從鍵盤輸入的圓半徑,s用于保存圓面積。(2)從鍵盤輸入圓半徑數(shù)值,賦給變量r。(3)利用圓面積公式s=3.14*r*r求圓面積。(4)輸出s的值。根據(jù)以上分析,畫出算法流程圖如圖3-3所示程序代碼如下:#include<stdio.h>voidmain(){floatr,s;

printf("Pleaseinputr\n");scanf("%f",&r);s=3.14*r*r;printf("s=%.2f\n",s);}運(yùn)行時(shí)輸入半徑

2.5則輸出結(jié)果:s=19.63例3-16:利用三角形三條邊的邊長(zhǎng)求面積和周長(zhǎng)。分析:(1)已知的數(shù)據(jù)是三條邊,聲明三個(gè)變量a、b、c,用來(lái)存放邊長(zhǎng),還要聲明兩個(gè)變量s,l保存面積和周長(zhǎng),在計(jì)算面積時(shí)還用到半周長(zhǎng),另聲明一個(gè)變量m保存半周長(zhǎng);(2)從鍵盤輸入三條邊長(zhǎng)a,b,c;(3)計(jì)算周長(zhǎng)l=a+b+c,半周長(zhǎng)m=0.5*l;(4)利用面積公式

,計(jì)算面積s;(5)輸出面積s和周長(zhǎng)l。程序代碼如下:#include<stdio.h>#include<math.h>voidmain(){floata,b,c;floathl,l,s;printf("請(qǐng)輸入三角形的邊長(zhǎng)a,b,c\n");scanf("%f,%f,%f",&a,&b,&c);l=a+b+c;m=0.5*l;s=sqrt(m*(m-a)*(m-b)*(m-c));printf("s=%5.2f,l=%5.2f\n",s,l);}程序運(yùn)行:輸入a,b,c的值3,4,5輸出結(jié)果:s=6.00,l=12.00例3-18:輸入任意一個(gè)三位數(shù)字,將其各位數(shù)字反序輸出(例如,輸入123,輸出321)。算法分析:(1)聲明兩個(gè)變量num1,num2分別保存輸入的這個(gè)三位數(shù)和反序后的數(shù);(2)三位數(shù)的各位數(shù)字反序輸出,關(guān)鍵在于能否正確的求出三位數(shù)字的個(gè)位、十位及百位。可綜合利用整數(shù)的除法、求余數(shù)法來(lái)計(jì)算出這三個(gè)數(shù)字(3)個(gè)、十、百三個(gè)數(shù)字求出后,就可組成反序數(shù),輸出結(jié)果。程序代碼如下:#include<stdio.h>voidmain(){intnum1,num2;int

a,b,c;/*分別表示輸入的三位數(shù)的百位、十位、個(gè)位上的數(shù)字*/printf("請(qǐng)輸入一個(gè)三位數(shù):\n");scanf("%d",&num1);a=num1/100;b=num1/10%10;c=num1%10;num2=100*c+10*b+a;printf("整數(shù)%d的反序輸出:%d\n",num1,num2);}程序運(yùn)行:輸入num1的值567輸出結(jié)果:整數(shù)567的反序輸出:7653.5選擇結(jié)構(gòu)程序設(shè)計(jì)C語(yǔ)言提供了兩種控制語(yǔ)句來(lái)實(shí)現(xiàn)選擇結(jié)構(gòu),分別是if語(yǔ)句和switch語(yǔ)句。3.5.1if語(yǔ)句1、單分支if語(yǔ)句:if(表達(dá)式)[語(yǔ)句組1]2、執(zhí)行流程:①如果表達(dá)式的值為真,則執(zhí)行其后的語(yǔ)句。②如果表達(dá)式的值為假,不執(zhí)行該語(yǔ)句,直接退出選擇結(jié)構(gòu)。單分支if語(yǔ)句的執(zhí)行流程如圖①if后面的條件表達(dá)式必須放在圓括號(hào)()中②條件表達(dá)式的運(yùn)算結(jié)果只有“真”或“假”兩個(gè)值。③條件表達(dá)式一般是關(guān)系表達(dá)式或者邏輯表達(dá)式,例如:if(x==y)、if(a>b)||(c<d))、if(a+b>c)等。但也可以是其它表達(dá)式,如賦值表達(dá)式等,甚至也可以是一個(gè)變量或者常量。例如:“if(a=5)”和“if(a)”都是允許的。只要表達(dá)式的值為非0,即為“真”。④[語(yǔ)句組1]可以只包含一個(gè)簡(jiǎn)單語(yǔ)句,也可以是復(fù)合語(yǔ)句。如果是復(fù)合語(yǔ)句,則需要用{}括起來(lái),并且‘{’和‘}’必須成對(duì)出現(xiàn)。3、說(shuō)明:

例3-19:輸入一個(gè)數(shù),如果該數(shù)大于等于0,則輸出它的平方根,如果它小于0,則不做任何處理。分析:①聲明一個(gè)實(shí)型(單精度)變量num;②從鍵盤輸入一個(gè)實(shí)數(shù);③使用if語(yǔ)句實(shí)現(xiàn)選擇結(jié)構(gòu),條件表達(dá)式為num>0,若實(shí)數(shù)為正,輸出它的算術(shù)平方根,若為負(fù)數(shù),則不處理,直接結(jié)束。程序代碼:#include<stdio.h>#include<math.h>voidmain(){floatx;

scanf("%f",&x);

if(x>=0)

printf("%f\n",sqrt(x));}程序的運(yùn)行:輸入:81輸出:9.000000輸入:-25輸出:沒有任何信息1、語(yǔ)法格式:if(表達(dá)式)[語(yǔ)句組1]else[語(yǔ)句組2]2、執(zhí)行流程:①如果表達(dá)式的值為真,則執(zhí)行語(yǔ)句1,然后退出選擇結(jié)構(gòu)。②如果表達(dá)式的值為假,則執(zhí)行語(yǔ)句2,然后退出選擇結(jié)構(gòu)。雙分支if語(yǔ)句的執(zhí)行流程如圖所示。2.雙分支if語(yǔ)句3、說(shuō)明:①不要誤認(rèn)為if和else是2個(gè)獨(dú)立的語(yǔ)句,它們都屬于if語(yǔ)句中的一部分,else是if語(yǔ)句的子句。②雙分支if語(yǔ)句同樣要注意復(fù)合語(yǔ)句必須加{}。例如:if(x>y){x=y;y=x;}else{x++;y++;}

思考分析:上例如果不加{},結(jié)果如何?

例3-20:從鍵盤輸入兩個(gè)整數(shù),輸出兩者中的最大數(shù),用雙分支if語(yǔ)句實(shí)現(xiàn)。分析:①聲明兩個(gè)整型變量a,b,保存兩個(gè)整數(shù)②從鍵盤輸入a,b的值;③使用if-else語(yǔ)句實(shí)現(xiàn)雙分支選擇結(jié)構(gòu),找出兩個(gè)整數(shù)的大數(shù)程序代碼:#include<stdio.h>voidmain(){inta,b;printf("inputtwonumbers:\n");scanf("%d%d",&a,&b);if(a>b)

printf("max=%d\n",a);elseprintf("max=%d\n",b);}程序運(yùn)行:輸入:1520輸出:max=203.多分支if語(yǔ)句1、語(yǔ)法格式:

if(表達(dá)式1)[語(yǔ)句組1]elseif(表達(dá)式2)[語(yǔ)句組2]elseif(表達(dá)式3)[語(yǔ)句組3]…elseif(表達(dá)式n)[語(yǔ)句組n]else[語(yǔ)句組n+1]2、執(zhí)行流程:

依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)表達(dá)式的值為真時(shí),則執(zhí)行其對(duì)應(yīng)的語(yǔ)句。然后跳到if語(yǔ)句之外繼續(xù)執(zhí)行程序。如果所有的表達(dá)式均為假,則執(zhí)行語(yǔ)句n+1,然后退出選擇結(jié)構(gòu),繼續(xù)執(zhí)行后續(xù)程序。例3-21:從鍵盤輸入任意一個(gè)字符,判斷該字符是控制字符、數(shù)字、大寫字母、小寫字母還是其它字符?分析:①本例要求判斷鍵盤輸入字符的類型,可以根據(jù)字符的ASCII碼來(lái)判斷類型;②由ASCII碼表可知ASCII值小于32的為控制字符;③在“0”和“9”之間的為數(shù)字;④在“A”和“Z”之間的為大寫字母;⑤在“a”和“z”之間的為小寫字母;⑥其余則為其它字符;⑦這是一個(gè)多分支選擇的問(wèn)題,用if-else語(yǔ)句編程,判斷輸入字符的ASCII碼所在的范圍,分別給出不同的輸出。

例4-16:從鍵盤輸入字符,判斷其類型。ASCII碼值小于32為控制字符,在“0”和“9”之間的為數(shù)字,在“A”和“Z”之間為大寫字母,在“a”和“z”之間為小寫字母,其余則為其它字符。例如:輸入為“g”,輸出顯示它為小寫字符。程序代碼:#include<stdio.h>voidmain(){charc;

printf("inputacharacter:\n");c=getchar();

if(c<32)

printf("Thisisacontrolcharacter\n");elseif(c>='0'&&c<='9')

printf("Thisisadigit\n");elseif(c>='A'&&c<='Z')

printf("Thisisacapitalletter\n");elseif(c>='a'&&c<='z')

printf("Thisisasmallletter\n");elseprintf("Thisisanothercharacter\n");}程序運(yùn)行:輸入:A輸出:Thisisacapitalletter.

例4-17:用多分支if結(jié)構(gòu)來(lái)實(shí)現(xiàn)分段函數(shù):

2*x(x≤-10)y=x+5(-10<x≤2)

x-3(2<x≤10)

x/10(x>10)分析:程序代碼:#include<stdio.h>voidmain(){intx,y;

printf("inputx=");

scanf("%d",&x);if(x<=-10)y=2*x;elseif(x<=2)y=x+5;elseif(x<=10)y=x-3;elsey=x/10;

printf("y=%d\n",y);}程序運(yùn)行:輸入:5輸出:y=24.if語(yǔ)句的嵌套1、一般形式:嵌套的if語(yǔ)句有以幾種形式。if(表達(dá)式1){if(表達(dá)式2)語(yǔ)句1內(nèi)嵌ifelse

語(yǔ)句2}if(表達(dá)式1){if(表達(dá)式2)內(nèi)嵌if

語(yǔ)句1}else

語(yǔ)句3①②if(表達(dá)式1)語(yǔ)句1else{if(表達(dá)式3)語(yǔ)句3內(nèi)嵌ifelse

語(yǔ)句4}④③if(表達(dá)式1){if(表達(dá)式2)語(yǔ)句1內(nèi)嵌ifelse語(yǔ)句2}else{if(表達(dá)式3)語(yǔ)句3else語(yǔ)句4}內(nèi)嵌ifif(表達(dá)式1){if(表達(dá)式2)語(yǔ)句1內(nèi)嵌ifelse語(yǔ)句2}else{if(表達(dá)式3)語(yǔ)句3else語(yǔ)句4}內(nèi)嵌if2、說(shuō)明:①在書寫上,應(yīng)將處于同一層的if和其對(duì)應(yīng)的else縮進(jìn)對(duì)齊以增強(qiáng)程序可讀性。如圖所示。②特別注意if和else的配對(duì)問(wèn)題。為了避免這種二義性,C語(yǔ)言規(guī)定,else總是與它上面、距它最近、且尚未匹配的if配對(duì)。并且,為明確匹配關(guān)系、避免匹配錯(cuò)誤,強(qiáng)烈建議將內(nèi)嵌的if語(yǔ)句,一律用花括號(hào)括起來(lái)。例如:

if(表達(dá)式1)if(表達(dá)式2)語(yǔ)句1;else

語(yǔ)句2;其中的else究竟是與哪一個(gè)if配對(duì)呢?

例3-23:用嵌套的if結(jié)構(gòu)來(lái)實(shí)現(xiàn)分段函數(shù):

2*x(x≤-10)y=x+5(-10<x≤2)

x-3(2<x≤10)

x/10(x>10)

分析:用嵌套的if結(jié)構(gòu)來(lái)實(shí)現(xiàn)分段函數(shù)時(shí),就如同切西瓜,先將整個(gè)瓜劈成兩半,再分別各切成兩半。該分段函數(shù)在數(shù)軸上分段的節(jié)點(diǎn)坐標(biāo)為-10、2和10,首先以2為界限,用雙分支if-else結(jié)構(gòu)將函數(shù)分成兩段。然后,用同樣的方法將函數(shù)的左右兩段再分別分成兩段,依次類推,直到分段結(jié)束。程序代碼:#include<stdio.h>voidmain(){intx,y;printf("inputx=:");scanf("%d",&x);if(x<=2){if(x<=-10)y=2*x;elsey=x+5;}else{if(x<=10)y=x-3;elsey=x/10;}printf("y=%d\n",y);}

例3-24:從鍵盤輸入三個(gè)整數(shù),輸出最大的那個(gè)數(shù)。算法分析:(1)聲明所需的整型變量a、b、c,以及變量max。max用于保存最大的數(shù)。(2)從鍵盤上輸入3個(gè)整數(shù),分別保存在整型變量a、b和c中。(3)找出a、b、c中最大的數(shù),賦給max。(4)輸出max的值。程序代碼:#include<stdio.h>voidmain(){int

a,b,c,max;

printf("Pleaseinput3integernumber:");

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

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

printf("max=%d\n",max);}程序運(yùn)行:輸入a,b,c的值:51015輸出:max=153.5.2switch語(yǔ)句針對(duì)程序設(shè)計(jì)中的多分支問(wèn)題,C語(yǔ)言專門提供了一個(gè)專門用于處理多分支結(jié)構(gòu)的條件選擇語(yǔ)句,稱為switch語(yǔ)句。switch語(yǔ)句又稱開關(guān)語(yǔ)句,使用switch語(yǔ)句可以直接處理多個(gè)分支,而且可讀性好、程序?qū)哟我荒苛巳弧?、語(yǔ)法格式:switch(表達(dá)式){case常量表達(dá)式1:語(yǔ)句1;break;case常量表達(dá)式2:語(yǔ)句2;break;…case常量表達(dá)式n:語(yǔ)句n;break;default:語(yǔ)句n+1;}2、執(zhí)行流程:首先計(jì)算switch后面圓括號(hào)中表達(dá)式的值,然后用此值依次與各個(gè)case的常量表達(dá)式比較,當(dāng)表達(dá)式的值與某個(gè)常量表達(dá)式的值相等時(shí),即執(zhí)行此case其后的語(yǔ)句。如果此case后面有break語(yǔ)句,就跳出swtich控制結(jié)構(gòu);如果此case后面沒有break語(yǔ)句,則不再進(jìn)行判斷,繼續(xù)執(zhí)行后面所有case后的語(yǔ)句,直到遇到break語(yǔ)句或者switch語(yǔ)句執(zhí)行完畢。當(dāng)switch后面圓括號(hào)中表達(dá)式的值與所有case后的常量表達(dá)式均不相同時(shí),則執(zhí)行default后的語(yǔ)句,然后退出swtich語(yǔ)句。(1)switch是關(guān)鍵字,其后的表達(dá)式必須用“()”括起來(lái)。(2)表達(dá)式的數(shù)據(jù)類型可以是整數(shù)類型、字符類型或枚舉類型。(3)“()”中表達(dá)式結(jié)果類型必須與switch語(yǔ)句體中case后常量表達(dá)式數(shù)據(jù)類型一致。(4)case是關(guān)鍵字,其后每個(gè)常量表達(dá)式的值必須不相同,否則會(huì)出現(xiàn)二義性。(5)在case后,允許有多個(gè)語(yǔ)句,可以不用{}括起來(lái)。(6)各個(gè)case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。例如,可以先出現(xiàn)“default:…”。(7)當(dāng)表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式值相等時(shí),就執(zhí)行此case后面的語(yǔ)句;否則,就執(zhí)行default后面的語(yǔ)句。(8)關(guān)鍵字default并不是必須的,如果沒有default,當(dāng)所有case后面的常量表達(dá)式值都沒有與switch后圓括號(hào)表達(dá)式值相等時(shí),則什么也不執(zhí)行,直接退出swtich語(yǔ)句。(9)多個(gè)case可以共用一組執(zhí)行語(yǔ)句。3說(shuō)明例如:……scanf(“%d”,&i);switch(i){case1:case2:case3:printf(“C\n”);break;case4:printf(“D\n”);break;default:printf(“E\n”);}……

如果多種情況需要共用一個(gè)執(zhí)行語(yǔ)句,可用case的常量表達(dá)式將多種情況列出,在最后一種情況之后,才安排需要執(zhí)行的語(yǔ)句。本例中,只要i的值同1、2、3中的任何一個(gè)相匹配,均執(zhí)行語(yǔ)句:printf(“C\n”);break;(10)break語(yǔ)句在switch結(jié)構(gòu)中是可選的。如果沒有break語(yǔ)句,程序在執(zhí)行完相應(yīng)的case語(yǔ)句后不會(huì)退出,而是繼續(xù)執(zhí)行下一個(gè)case語(yǔ)句,直到switch語(yǔ)句結(jié)束。如果在case分支的最后使用break語(yǔ)句,執(zhí)行完該case分支的語(yǔ)句后,就終止switch語(yǔ)句的執(zhí)行。換句話說(shuō),break語(yǔ)句是用來(lái)跳過(guò)后面的case部分,結(jié)束switch控制結(jié)構(gòu),從而真正起到分支的作用。

例3-25:從鍵盤上輸入一個(gè)百分制整數(shù)成績(jī)score,按下列原則輸出其等級(jí):score≥90,等級(jí)為A;80≤score<90,等級(jí)為B;70≤score<80,等級(jí)為C;60≤score<70,等級(jí)為D;score<60,等級(jí)為E。算法分析:

score為整型數(shù),在score≥90的范圍內(nèi),可能取值有100,99……90,如果把這些值全部列出來(lái),太繁瑣。可以利用兩個(gè)整數(shù)相除結(jié)果為整數(shù)的特性,將取值100,99……90分別除以10后簡(jiǎn)化為10和9兩個(gè)值。score和score/10的對(duì)應(yīng)關(guān)系:score

score/10>=9010,970-897,860-69660以下5,4,3,2,1,0成績(jī)不在0~100之間defualt#include<stdio.h>voidmain(){intscore,grade;

printf(“Inputascore(0~100):\n”);

scanf(“%d”,&score);grade=score/10;/*將成績(jī)整除10,轉(zhuǎn)化成switch語(yǔ)句中的case標(biāo)號(hào)*/switch(grade){case10:case9:printf(“grade=A\n”);break; case8:printf("grade=B\n");break;case7:printf("grade=C\n");break;case6:printf("grade=D\n");break;case5:case4:case3:case2:case1:case0:printf(“grade=E\n”);break;default:printf(“Thescoreisoutofrange!\n”);}} 程序運(yùn)行:輸入:85輸出:grade=B例3-26:求一元二次方程ax2+bx+c=0的解(a≠0)。算法分析:(1)一元二次方程的求解,首先要確定方程的三個(gè)系數(shù)a,b,c的值,然后計(jì)算判別式的值,再根據(jù)判別式的值將其分為三種情況:大于0,等于0,小于0,分別用相應(yīng)的求根公式求出方程的根。(2)聲明三個(gè)變量a,b,c代表三個(gè)系數(shù),變量disc表示判別式,變量x1,x2表示要求的根。(3)由于實(shí)數(shù)在計(jì)算機(jī)中存儲(chǔ)時(shí),經(jīng)常會(huì)有一些微小誤差,所以判斷disc是否為0的方法是:判斷disc的絕對(duì)值是否小于一個(gè)很小的數(shù)(例如0.000001)。(4)使用if-else語(yǔ)句實(shí)現(xiàn)選擇結(jié)構(gòu)。3.5.3選擇結(jié)構(gòu)應(yīng)用舉例#include<stdio.h>#include<math.h>voidmain(){floata,b,c,disc,x1,x2,p,q;

scanf("%f,%f,%f",&a,&b,&c);disc=b*b-4*a*c;if(fabs(disc)<=1e-6) /*fabs():求絕對(duì)值庫(kù)函數(shù)*/printf("x1=x2=%7.2f\n",-b/(2*a));/*輸出兩個(gè)相等的實(shí)根*/else{if(disc>1e-6){x1=(-b+sqrt(disc))/(2*a);/*求出兩個(gè)不相等的實(shí)根*/x2=(-b-sqrt(disc))/(2*a);printf("x1=%7.2f,x2=%7.2f\n",x1,x2);}else{p=-b/(2*a); q=sqrt(fabs(disc))/(2*a);printf("x1=%.2f+%.2fi\n",p,q); printf("x2=%.2f-%.2fi\n",p,q);}}} 程序運(yùn)行:輸入:3,4,6輸出:x1=-0.67+1.25ix2=-0.67-1.25i例3-28:已知某公司銷售員工工資分成兩個(gè)部分,基本工資+業(yè)務(wù)提成,基本工資為1000元,每月的業(yè)務(wù)提成與銷售利潤(rùn)掛鉤,計(jì)算出某個(gè)員工的月工資。銷售利潤(rùn)profit(整數(shù))與業(yè)務(wù)提成的關(guān)系如下(計(jì)量單位:元):profit≤1000 沒有提成;1000<profit≤2000 提成10%;2000<profit≤5000 提成15%;5000<profit≤10000 提成20%;10000<profit 提成25%。設(shè)計(jì)分析:(1)數(shù)據(jù)部分:設(shè)員工工資變量salary,初值為1000,銷售利潤(rùn)變量為profit,再設(shè)標(biāo)號(hào)變量grade。(2)程序結(jié)構(gòu)為多分支選擇結(jié)構(gòu),為使用switch語(yǔ)句,必須將銷售利潤(rùn)profit與提成的關(guān)系,轉(zhuǎn)換成若干個(gè)整數(shù)與提成的關(guān)系一一對(duì)應(yīng)。分析本題可知,提成的變化點(diǎn)都是1000的整數(shù)倍(1000、2000、5000、……),如果將利潤(rùn)profit整除1000,則當(dāng):profit≤1000 對(duì)應(yīng)0、11000<profit≤2000 對(duì)應(yīng)1、22000<profit≤5000 對(duì)應(yīng)2、3、4、55000<profit≤10000 對(duì)應(yīng)5、6、7、8、9、1010000<profit 對(duì)應(yīng)10、11、12、……為解決相鄰兩個(gè)區(qū)間的重疊問(wèn)題,最簡(jiǎn)單的方法就是:利潤(rùn)profit先減1(最小增量),然后再整除1000即可:

profit≤1000 對(duì)應(yīng)01000<profit≤2000 對(duì)應(yīng)12000<profit≤5000 對(duì)應(yīng)2、3、45000<profit≤10000 對(duì)應(yīng)5、6、7、8、910000<profit 對(duì)應(yīng)10、11、12、……程序代碼:#include<stdio.h>voidmain(){longprofit;

intgrade;floatsalary=1000;

printf("Inputprofit:");

scanf("%ld",&profit);grade=(profit-1)/1000; /*將利潤(rùn)-1、再整除1000,轉(zhuǎn)化成case后的標(biāo)號(hào)*/switch(grade){case0:break; /*profit≤1000*/case1:salary+=profit*0.1;break;/*1000<profit≤2000*/case2:case3:case4:salary+=profit*0.15;break; /*2000<profit≤5000*/case5:case6:case7:case8:case9:salary+=profit*0.2;break; /*5000<profit≤10000*/default:salary+=profit*0.25; /*10000<profit*/}printf("salary=%.2f\n",salary);} 程序運(yùn)行:輸入:2500輸出:salary=1375.00循環(huán)結(jié)構(gòu)是程序中一種很重要的結(jié)構(gòu)。其特點(diǎn)是:在給定條件成立時(shí),反復(fù)執(zhí)行某程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。C語(yǔ)言提供了多種循環(huán)語(yǔ)句,可以組成各種不同形式的循環(huán)結(jié)構(gòu)。

3.6循環(huán)結(jié)構(gòu)程序設(shè)計(jì)問(wèn)題1:?jiǎn)栴}2:假如全班41人,欲從鍵盤上輸入每人的數(shù)學(xué)成績(jī),然后計(jì)算出全班同學(xué)的數(shù)學(xué)平均成績(jī)。要構(gòu)成一個(gè)有效的循環(huán),應(yīng)指定兩個(gè)條件:(1)需要重復(fù)執(zhí)行的操作,這稱為循環(huán)體;(2)循環(huán)結(jié)束的條件,即在什么情況下停止重復(fù)的操作。特點(diǎn)是:先判斷表達(dá)式,后執(zhí)行語(yǔ)句。while語(yǔ)句一般形式:while(循環(huán)條件表達(dá)式)

循環(huán)體語(yǔ)句;執(zhí)行流程:循環(huán)條件循環(huán)體假(0)真(非0)while3.6.1while語(yǔ)句例3-30用while循環(huán)求

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

i,sum=0;i=1;

while(i<=100){sum=sum+i;i++;}

printf("%d",sum);}循環(huán)終值循環(huán)條件算法分析:被加數(shù)i呈有規(guī)矩的遞增,累加和為sumsum=0i=1sum=0+1=sum+1i=2sum=0+1+2=sum+2i=3sum=0+1+2+3=sum+3……i=100sum=0+1+2+…+99+100=sum+100將單次的加法運(yùn)算過(guò)程可以描述為:i=i+1;sum=sum+i;,從1加到100需要重復(fù)100次,可以用循環(huán)來(lái)實(shí)現(xiàn)。循環(huán)體循環(huán)變量增值循環(huán)初值例3-30b:利用while語(yǔ)句計(jì)算n!(即:1*2*3*…*(n-1)*n)main(){inti=1,n,s=1;

scanf(“%d”,&n);

while(i<=n){s=s*i;i++;}

printf("s=%d\n",s);}

s=s*i;i++假真i<=n注意事項(xiàng):①while語(yǔ)句中的表達(dá)式一般是關(guān)系表達(dá)或邏輯表達(dá)式,只要表達(dá)式的值為真(非0)即可繼續(xù)循環(huán)。例如:

inta=0,n=5;

while(n--)

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

本例程序?qū)?zhí)行5次循環(huán),每執(zhí)行一次,n值減1。循環(huán)體輸出表達(dá)式a++的值。當(dāng)n--的值為0時(shí),退出循環(huán)。②循環(huán)體可以是簡(jiǎn)單語(yǔ)句,也可以是復(fù)合語(yǔ)句,甚至可以是一個(gè)控制結(jié)構(gòu)。循環(huán)體如包括有一個(gè)以上的語(yǔ)句,則必須用{}括起來(lái)。③循環(huán)控制變量值在循環(huán)體內(nèi)必須有所改變,才能使循環(huán)控制條件表達(dá)式的值不斷改變,直到循環(huán)結(jié)束,否則會(huì)造成死循環(huán)。例如:i=1;while(i<=100)sum=sum+i;i++;

這個(gè)循環(huán)永遠(yuǎn)不會(huì)結(jié)束,因?yàn)椤癷++;”不屬于循環(huán)體語(yǔ)句,循環(huán)控制變量i沒有在循環(huán)體內(nèi)被改變。代碼應(yīng)該修改為:i=1;while(i<=100){sum=sum+i;i++;}例3-31:輸入兩個(gè)正整數(shù)a、b,求它們的最大公約數(shù)。方法一:最大公約數(shù)定義法

分析:根據(jù)最大公約數(shù)的定義,a、b兩個(gè)數(shù)的最大公約數(shù)s一定是介于1到a之間的一個(gè)數(shù),不會(huì)大于a,且能同時(shí)被a和b整除。(1)先假設(shè)a、b的最大公約數(shù)為a,即s=a。(2)如果a或b中有一個(gè)數(shù)不能被s整除,即a%s!=0或b%s!=0,說(shuō)明s不是公約數(shù),執(zhí)行(3);否則,執(zhí)行(4)。(3)判斷比s小1的數(shù)是否是a和b的公約數(shù)。即執(zhí)行s=s-1后再返回(2)。(4)退出while循環(huán),輸出s。程序代碼:#include<stdio.h>voidmain(){

int

a,b,s;

printf("Pleaseinputtwopositivenumber:");

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

while(a%s!=0||b%s!=0){s=s-1;}

printf("最大公約數(shù)是%d\n",s);}程序運(yùn)行:輸入a,b的值:2024輸出最大公約數(shù)是:4方法二:輾轉(zhuǎn)相除法。分析:當(dāng)b不等于0時(shí),重復(fù)執(zhí)行運(yùn)算c=a%b,a=b,b=c消除相同的因子,直到b為0時(shí),a即為所求的解。#include<stdio.h>voidmain(){int

a,b,c;

printf("Pleaseinputtwopositivenumber:");

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

while(b!=0){c=a%b;a=b;b=c;}

printf("最大公約數(shù)是%d\n",a);}程序運(yùn)行:輸入a,b的值:1525輸出最大公約數(shù)是:53.6.2do-while語(yǔ)句do~while語(yǔ)句一般形式:do

循環(huán)體語(yǔ)句;

while(表達(dá)式);執(zhí)行流程:do循環(huán)體expr假(0)真(非0)while特點(diǎn):先執(zhí)行循環(huán)體,后判斷表達(dá)式說(shuō)明:至少執(zhí)行一次循環(huán)體#include<stdio.h>

voidmain()

{

溫馨提示

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

評(píng)論

0/150

提交評(píng)論