算法與程序設(shè)計(jì)基礎(chǔ)_第1頁(yè)
算法與程序設(shè)計(jì)基礎(chǔ)_第2頁(yè)
算法與程序設(shè)計(jì)基礎(chǔ)_第3頁(yè)
算法與程序設(shè)計(jì)基礎(chǔ)_第4頁(yè)
算法與程序設(shè)計(jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩133頁(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語(yǔ)言程序設(shè)計(jì)(第3版)中國(guó)鐵道出版社ChinaRailwayPublishingHouse普通高等教育“十一五”國(guó)家級(jí)規(guī)劃教材主教材:C語(yǔ)言程序設(shè)計(jì)(第三版)

書號(hào):ISBN978-7-113-09512-3

中國(guó)鐵道出版社2009年2月第3版

配套教材:C語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)教程

書號(hào):ISBN978-7-113-09513-0

中國(guó)鐵道出版社2009年2月第1版

作者電子郵箱:

Luojian116@126.com

wsjwhz@126.com3.1算法概述3.3結(jié)構(gòu)化程序設(shè)計(jì)方法3.2算法的常用表示方法3.4C語(yǔ)句概述3.6循環(huán)結(jié)構(gòu)程序設(shè)計(jì)

3.7綜合程序應(yīng)用舉例3.5選擇結(jié)構(gòu)程序設(shè)計(jì)第3章算法與程序設(shè)計(jì)基礎(chǔ)結(jié)束放映3.1算法概述程序(program)是計(jì)算機(jī)可以執(zhí)行的指令或語(yǔ)句序列。它是用計(jì)算機(jī)解決現(xiàn)實(shí)生活中的一個(gè)實(shí)際問(wèn)題而編制的。設(shè)計(jì)、編制、調(diào)試程序的過(guò)程稱為程序設(shè)計(jì)。編寫程序所用的語(yǔ)言即為程序設(shè)計(jì)語(yǔ)言,它為程序設(shè)計(jì)提供了一定的語(yǔ)法和語(yǔ)義,所編寫出的程序必須嚴(yán)格遵守它的語(yǔ)法規(guī)則,這樣編寫出來(lái)的程序才能被計(jì)算機(jī)所接受、運(yùn)行,并產(chǎn)生預(yù)期的結(jié)果。3.1.1算法的概念解決一個(gè)實(shí)際問(wèn)題而采取的方法和步驟,稱之為“算法”。對(duì)于同一個(gè)問(wèn)題,可能有不同的方法和步驟,即有不同的算法。

【例3.1】求1+2+3+4+…+100=?算法1步驟1:1+2=3步驟2:3+3=6步驟3:6+4=10…步驟99:4950+100=5050算法2步驟1:0+100=100步驟2:1+99=100步驟3:2+98=100…步驟50:49+51=100步驟51:100*50=5000步驟52:5000+50=5050算法3步驟1:k=1,s=0步驟2:如果k>100,則算法結(jié)束,s即為所求的和,輸出s;否則轉(zhuǎn)向步驟3步驟3:s=s+k,k=k+1步驟4:轉(zhuǎn)向步驟2當(dāng)然,算法也有優(yōu)劣之分,有的算法較簡(jiǎn)練,而有的算法較煩瑣。上面三個(gè)算法中,算法2比算法1步驟少,算法3比算法2步驟少,算法3的質(zhì)量最優(yōu)。一般地說(shuō),希望采用方法簡(jiǎn)單、運(yùn)算步驟少的方法。3.1.2算法的特性一個(gè)算法應(yīng)具有如下五個(gè)特點(diǎn):1.有窮性2.確定性3.可行性4.有零個(gè)或多個(gè)輸入5.有一個(gè)或多個(gè)輸出3.2算法的常用表示方法3.2.1自然語(yǔ)言表示法

所謂自然語(yǔ)言,就是人們?nèi)粘J褂玫恼Z(yǔ)言,可以是漢語(yǔ)、英語(yǔ)或其他語(yǔ)言。3.2.2流程圖流程圖是用圖形的方式來(lái)表示算法,用一些幾何圖形來(lái)代表各種不同性質(zhì)的操作。ANSI(美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì))規(guī)定的一些常用流程圖符號(hào)(見圖3-1)已被大多數(shù)國(guó)家接受。

1.順序結(jié)構(gòu)順序結(jié)構(gòu)的程序是按語(yǔ)句的書寫順序執(zhí)行的,用圖3-2表示2.選擇結(jié)構(gòu)選擇結(jié)構(gòu)或稱分支結(jié)構(gòu)、條件結(jié)構(gòu),用圖3-3表示

3.循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)又稱重復(fù)結(jié)構(gòu),有兩種方式:一種是先判斷條件,若條件成立再進(jìn)入循環(huán)體,可用圖3-4表示;另一種是先進(jìn)入循環(huán)體執(zhí)行,再判斷條件是否成立??捎脠D3-5表示。3.2.3N-S結(jié)構(gòu)流程圖1973年美國(guó)的計(jì)算機(jī)科學(xué)家I.Nassi和B.Shneiderman提出了一種新的流程圖形式。在這種流程圖中把流程線完全去掉了,全部算法寫在一個(gè)矩形框內(nèi),在框內(nèi)還可以包含其他框,即由一些基本的框組成一個(gè)較大的框。這種流程圖稱為N-S結(jié)構(gòu)流程圖(以兩人名字的頭一個(gè)字母組成)。3.2.4偽代碼表示法偽代碼(pseudocode)是用介于自然語(yǔ)言和計(jì)算機(jī)語(yǔ)言之間的文字和符號(hào)來(lái)表示算法,即計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言中具有的語(yǔ)句關(guān)鍵字用英文表示,其他的可用漢字,也可用英文,只要便于書寫和閱讀就可。3.2.5用計(jì)算機(jī)語(yǔ)言表示算法用計(jì)算機(jī)語(yǔ)言描述算法必須嚴(yán)格遵循所用語(yǔ)言的語(yǔ)法規(guī)則#include<stdio.h>voidmain(){

int

sign,i,n;floatsum;

printf("\nPleaseinputanintegerton:");

scanf("%d",&n);sign=1;sum=1;i=1;

while(i<=n){sign=(-1)*sign;sum=sum+sign/(3.0*i);i=i+1;}

printf("\nsum=%f",sum);}程序運(yùn)行結(jié)果如下:

Pleaseinputanintegerton:5sum=0.7388893.3結(jié)構(gòu)化程序設(shè)計(jì)方法在拿到一個(gè)需要求解的實(shí)際問(wèn)題之后,怎樣才能編寫出程序呢?以數(shù)值計(jì)算問(wèn)題為例,一般應(yīng)按圖3-12所示的步驟進(jìn)行。要設(shè)計(jì)出結(jié)構(gòu)化的程序,可采取以下的方法: ◆自頂向下 ◆逐步細(xì)化 ◆模塊化 ◆結(jié)構(gòu)化編碼【例3.5】輸入10個(gè)整數(shù)(每個(gè)數(shù)都≥3),打印出其中的素?cái)?shù)。分析:素?cái)?shù)又稱質(zhì)數(shù),是指只能被1和它本身整除的整數(shù)。本題采用自頂向下、逐步細(xì)化方法來(lái)處理這個(gè)問(wèn)題。先把這個(gè)問(wèn)題分為三部分(如圖3-14所示):①輸入10個(gè)數(shù)給x1~x10;②把其中的素?cái)?shù)找出來(lái)(或者把非素?cái)?shù)除去)③打印出全部素?cái)?shù)。對(duì)【例3.5】求解步驟進(jìn)行細(xì)化后得到的分步驟流程圖?!纠?.5】的完整流程圖3.4C語(yǔ)句概述1.說(shuō)明語(yǔ)句說(shuō)明語(yǔ)句用來(lái)定義變量的數(shù)據(jù)類型。例如:

int

sign,i,n;/*說(shuō)明sign,i,n是整型變量*/2.函數(shù)調(diào)用語(yǔ)句 由一個(gè)函數(shù)調(diào)用加一個(gè)分號(hào)構(gòu)成函數(shù)調(diào)用語(yǔ)句。如上例中的:printf("\nPleaseinputanintegerton:");scanf("%d",&n);3.表達(dá)式語(yǔ)句 在C語(yǔ)言中,由一個(gè)表達(dá)式加上一個(gè)分號(hào)就構(gòu)成了一條表達(dá)式語(yǔ)句。最典型的是,由賦值表達(dá)式加上分號(hào)構(gòu)成賦值語(yǔ)句。例如:sign=1;sum=1;i=1;sign=(-1)*sign;sum=sum+sign/(3.0*i);i=i+1;表達(dá)式能構(gòu)成語(yǔ)句是C語(yǔ)言的一重要特色。其實(shí)函數(shù)調(diào)用語(yǔ)句也是表達(dá)式語(yǔ)句,因?yàn)楹瘮?shù)調(diào)用也屬于表達(dá)式的一種。4.空語(yǔ)句僅由一個(gè)分號(hào)構(gòu)成的語(yǔ)句就是空語(yǔ)句。例如:

;5.復(fù)合語(yǔ)句

復(fù)合語(yǔ)句是由大括號(hào)括起來(lái)的,在邏輯上相關(guān)的一組語(yǔ)句。如上例中的:{sign=(-1)*sign;sum=sum+sign/(3.0*i);i=i+1;}6.控制語(yǔ)句 控制語(yǔ)句用來(lái)規(guī)定語(yǔ)句執(zhí)行的順序,C語(yǔ)言共有9種控制語(yǔ)句。(1)if(條件){…}else{…}(條件語(yǔ)句)(2)for(條件){…}(循環(huán)語(yǔ)句)(3)while(條件){…}(循環(huán)語(yǔ)句)(4)do{…}while(條件);(循環(huán)語(yǔ)句)(5)continue;(結(jié)束本次循環(huán)語(yǔ)句)(6)break;(結(jié)束循環(huán)語(yǔ)句或結(jié)束switch語(yǔ)句)(7)switch(表達(dá)式){…}(多分支選擇語(yǔ)句)(8)goto

標(biāo)號(hào);(轉(zhuǎn)向語(yǔ)句)(9)return(表達(dá)式);(從函數(shù)返回語(yǔ)句)3.5選擇結(jié)構(gòu)程序設(shè)計(jì)3.5.1關(guān)系運(yùn)算符和關(guān)系表達(dá)式關(guān)系表達(dá)式用關(guān)系運(yùn)算符連接起來(lái)的表達(dá)式稱為關(guān)系表達(dá)式,關(guān)系表達(dá)式的結(jié)果為邏輯值真(用“1”表示)或假(用“0”表示)。例如:

c>a+b

若a=3,b=4,c=9則結(jié)果為1a==b<c 若a=3,b=4,c=9則結(jié)果為0a=b>c 若b=4,c=9 則a的值為0

兩個(gè)數(shù)值進(jìn)行比較,是比較其數(shù)值的大小,兩個(gè)字符進(jìn)行比較,是比較其ASCII碼值的大小。3.5.2邏輯運(yùn)算符和邏輯表達(dá)式

1.邏輯運(yùn)算符及優(yōu)先次序邏輯運(yùn)算符與其他運(yùn)算符的運(yùn)算優(yōu)先順序如下圖所示:例如:原式可寫為(a>b)&&(x>y) a>b&&x>y(a==b)||(x==y) a==b||x==y(!a)||(a>b) !a||a>b2.邏輯表達(dá)式用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯表達(dá)式連接起來(lái)的式子稱邏輯表達(dá)式。例如,若a=4,b=2,x=6,y=7,則:a>b&&x>y表達(dá)式的結(jié)果為0a==b||x==y表達(dá)式的結(jié)果為0!a||a>b 表達(dá)式的結(jié)果為1注意:(1)在C語(yǔ)言中規(guī)定:非零為“真”,“真”用1表示;零為“假”,“假”用0表示。例如:

'a'&&'b' 其結(jié)果為1!5.34 其結(jié)果為0(2)對(duì)邏輯表達(dá)式的求解,并不是所有的邏輯運(yùn)算符都被執(zhí)行,只是在必須執(zhí)行下一個(gè)邏輯運(yùn)算符才能求出表達(dá)式的解時(shí),才執(zhí)行該運(yùn)算符?!纠?.6】運(yùn)行下面的程序四次,若分別輸入000,101,123,100,分別寫出其對(duì)應(yīng)的輸出結(jié)果。#include<stdio.h>voidmain(){

int

a,b,c;

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

printf("e=%d,a=%d,b=%d,c=%d\n", ++a&&b--&&++c,a,b,c);

printf("a=%d,b=%d,c=%d,e=%d,\n",

a,b,c,++a&&b--&&++c);c=a||((a=c)>b);

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

printf("e=%d,a=%d,b=%d,c=%d\n", --c||b--||++a,a,b,c);

printf("a=%d,b=%d,c=%d,e=%d\n",

a,b,c,--c||b--||++a);}在VisualC++6.0環(huán)境下運(yùn)行,若輸入000↙其輸出為:e=0,a=1,b=-1,c=0a=2,b=-2,c=1,e=1,a=2,b=-2,c=1e=1,a=2,b=-3,c=0a=2,b=-3,c=-1,e=1在TurboC2.0環(huán)境下運(yùn)行,若輸入000↙其輸出為:e=0,a=0,b=0,c=0a=2,b=-2,c=1,e=1,a=2,b=-2,c=1e=1,a=2,b=-2,c=1a=2,b=-3,c=-1,e=13.5.3if語(yǔ)句C語(yǔ)言提供了兩種格式:格式1:if(表達(dá)式)語(yǔ)句;該語(yǔ)句的功能是:首先計(jì)算表達(dá)式的值,然后判斷表達(dá)式的值是否為非零(真),若為非零(真),則執(zhí)行語(yǔ)句。其執(zhí)行過(guò)程見圖3-22所示【例3.7】輸入一個(gè)字符c,若c是字母,則輸出“Yes!”。#include<stdio.h>voidmain(){charc;c=getchar();

if(c>='a'&&c<='z'||c>='A'&&c<='Z')printf("Yes!");}運(yùn)行情況如下:x↙Yes!程序如下:#include<math.h>#include<stdio.h>voidmain(){floatx;doublez;

printf("\nx=");

scanf("%f",&x);

if(x<0)z=-1;

if(x==0)z=0;

if(x>0)z=log(x);

printf("z=%f\n",z);}格式2:

if(表達(dá)式)語(yǔ)句1;else語(yǔ)句2;該語(yǔ)句的功能是:首先計(jì)算表達(dá)式的值,然后判斷表達(dá)式的值是否為非零(真),若非零(真),則執(zhí)行語(yǔ)句1,否則執(zhí)行語(yǔ)句2。其執(zhí)行過(guò)程下圖【例3.9】輸入兩個(gè)數(shù)并判斷兩數(shù)是否相等。程序清單如下:#include<stdio.h>voidmain(){

int

a,b;

printf("Enterintegera:");

scanf("%d",&a);

printf("Enterintegerb:");

scanf("%d",&b);

if(a==b)printf("a==b\n");elseprintf("a!=b\n");}【例3.10】輸入一個(gè)整數(shù),若該數(shù)不為零,則輸出。#include<stdio.h>voidmain(){intx;

scanf("%d",&x);

if(x)printf("\nx=%d",x);}程序運(yùn)行結(jié)果如下:-5↙

{輸入}x=-5 {輸出}說(shuō)明:if后面的表達(dá)式可以為任何類型的表達(dá)式,只要表達(dá)式的結(jié)果為非零,則表示條件成立,否則表示條件不成立??偨Y(jié):1.if后面的表達(dá)式可以為任何類型的表達(dá)式,只要表達(dá)式的結(jié)果為非零,則表示條件成立,否則表示條件不成立。2.if語(yǔ)句中的語(yǔ)句1,語(yǔ)句2可以是一條語(yǔ)句,也可以是由{}構(gòu)成的一個(gè)復(fù)合語(yǔ)句,如果在該語(yǔ)句處需要寫多條語(yǔ)句才能完成所必要的功能時(shí),就使用復(fù)合語(yǔ)句的形式。3.在格式2中的else前面的語(yǔ)句必須要有一個(gè)分號(hào),整個(gè)語(yǔ)句結(jié)束處有一個(gè)分號(hào)。如例3.9中的if語(yǔ)句。3.5.4if語(yǔ)句的嵌套在一個(gè)if語(yǔ)句中,如果又完全包含了另一個(gè)(或者多個(gè))if語(yǔ)句,則稱為if語(yǔ)句的嵌套。

if嵌套的一般形式如下:

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

else語(yǔ)句2;elseif(表達(dá)式3)語(yǔ)句3;else語(yǔ)句4;if語(yǔ)句的嵌套既可以嵌套在if后面,也可以嵌套在else后面,具體嵌套的位置要根據(jù)實(shí)際需要而定?!纠?.11】編寫程序,求下列分段函數(shù)的值?!纠?.11】的程序清單如下:#include<math.h>#include<stdio.h>voidmain(){floatx;doublez;

printf("\nx=");

scanf("%f",&x);

if(x<0)z=-1;elseif(x>0)z=log(x);elsez=0;

printf("z=%f\n",z);}對(duì)【例3.11】程序的另一種修改:#include<math.h>#include<stdio.h>voidmain(){floatx;doublez;

printf("\nx=");

scanf("%f",&x);

if(x<=0)

if(x<0)z=-1;elsez=0;elsez=log(x);

printf("z=%f\n",z);}else的最近配對(duì)原則:C語(yǔ)言規(guī)定:else總是與它上面最近的且又沒(méi)有配對(duì)的if語(yǔ)句進(jìn)行配對(duì)。在下面這條嵌套的if語(yǔ)句中

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

else語(yǔ)句2;elseif(表達(dá)式3)語(yǔ)句3;else語(yǔ)句4;若把else語(yǔ)句2去掉,變成:

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

elseif(表達(dá)式3)語(yǔ)句3;else語(yǔ)句4;

第一個(gè)else將和哪個(gè)if配對(duì)?根據(jù)else的最近配對(duì)原則,第一個(gè)else將與第2個(gè)if(表達(dá)式2)語(yǔ)句1;配對(duì),如圖3-27所示。在下面的if嵌套語(yǔ)句中if(表達(dá)式1)if(表達(dá)式2)語(yǔ)句1;elseif(表達(dá)式3)語(yǔ)句3;else語(yǔ)句4;

如果用戶希望else只能和if(表達(dá)式1)配對(duì),而不是與現(xiàn)在的if(表達(dá)式2)語(yǔ)句1;配對(duì),則應(yīng)該在if(表達(dá)式2)語(yǔ)句1;的兩端加上花括號(hào),從而確定了新的配對(duì)關(guān)系,修改后的結(jié)果:if(表達(dá)式1){if(表達(dá)式2)語(yǔ)句1;}elseif(表達(dá)式3)語(yǔ)句3;else語(yǔ)句4;【例3.12】寫出下面程序的運(yùn)行結(jié)果。#include<stdio.h>voidmain(){int

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

if(c)

if(a>b)

printf("\nmax=%d",a);else

printf("\nmax=%d",b);else

printf("\nc=%d",c);}運(yùn)行結(jié)果如下:c=03.5.5條件運(yùn)算符和條件表達(dá)式

條件運(yùn)算符(?:)是C語(yǔ)言中唯一的一個(gè)三目運(yùn)算符,其格式如下:

表達(dá)式1?表達(dá)式2:表達(dá)式3功能:如果表達(dá)式1的值為真,則該條件表達(dá)式的結(jié)果取表達(dá)式2的值,否則取表達(dá)式3的值。例如:下述的if語(yǔ)句

if(a>b)max=a;elsemax=b;可以用條件表達(dá)式來(lái)改寫:

max=a>b?a:b;條件表達(dá)式說(shuō)明:1.條件表達(dá)式的執(zhí)行順序:先計(jì)算表達(dá)式1的值,若表達(dá)式1的值為真,則計(jì)算表達(dá)式2的值,并把該值作為整個(gè)條件表達(dá)式的結(jié)果,表達(dá)式3不會(huì)計(jì)算;否則計(jì)算表達(dá)式3的值,并把表達(dá)式3的值作為整個(gè)條件表達(dá)式的結(jié)果,此時(shí)表達(dá)式2不會(huì)計(jì)算。2.運(yùn)算優(yōu)先級(jí):高于賦值運(yùn)算符,低于算術(shù)運(yùn)算符和關(guān)系運(yùn)算符。例:max=(a>b)?a:b相當(dāng)于max=((a>b)?a:b)a>b?a:b+1相當(dāng)于a>b?a:(b+1)3.條件運(yùn)算符的結(jié)合方向?yàn)椤白杂抑磷蟆?。如:a>b?a:c>d?c:d相當(dāng)于a>b?a:(c>d?c:d)【例3.13】閱讀下面的程序,若輸入為59,則輸出結(jié)果是什么?#include<stdio.h>voidmain(){

intscore;chargrade;

printf("pleaseinputascore:\n");

scanf("%d",&score);grade=score>=90?'A':(score>=60?'B':'C');

printf("%dbelongsto%c",score,grade);}運(yùn)行結(jié)果如下:pleaseinputascore:59↙59belongstoC3.5.6switch語(yǔ)句

switch語(yǔ)句屬于多分支結(jié)構(gòu)語(yǔ)句,通常用于描述有多種情況的選擇,其格式如下:

switch(表達(dá)式) { case常量表達(dá)式1: 語(yǔ)句1; case常量表達(dá)式2: 語(yǔ)句2; … case常量表達(dá)式n:

語(yǔ)句n; default:

語(yǔ)句(n+1); }上式中的default:和語(yǔ)句(n+1);可以省略不寫。

switch語(yǔ)句的執(zhí)行過(guò)程如下:首先計(jì)算表達(dá)式的值,然后用此值來(lái)查找各個(gè)case后面的常量表達(dá)式,直到找到一個(gè)等于表達(dá)式值的常量表達(dá)式,則轉(zhuǎn)向該case后面的語(yǔ)句去執(zhí)行;若表達(dá)式的值與下面任何一個(gè)case常量表達(dá)式的值都不相等,則自動(dòng)轉(zhuǎn)去執(zhí)行default部分的語(yǔ)句;如果沒(méi)有default部分,退出該switch語(yǔ)句,執(zhí)行switch語(yǔ)句后面的那條語(yǔ)句。

【例3.14】

編寫一個(gè)程序,要求輸入學(xué)生的分?jǐn)?shù),輸出其成績(jī)的分?jǐn)?shù)段,用A、B、C、D、E分別表示90分以上、80~89分、70~79分、60~69分和不及格(0~59分)5個(gè)分?jǐn)?shù)段?!纠?.14】的程序清單。#include<stdio.h>voidmain(){int

score,grade;

printf("\nInputascore(0~100):");

scanf("%d",&score);grade=score/10;

switch(grade){case0:case1:case2:case3:case4:case5:printf("grade=E!\n");break;case6:printf("grade=D!\n");break;case7:printf("grade=C!\n");break;case8:printf("grade=B!\n");break;case9:case10:printf("grade=A!\n");break;default:printf("Thescoreisoutofrange!\n");}}【例3.14】程序的運(yùn)行結(jié)果:Inputascore(0~100):50↙{輸入分?jǐn)?shù)}grade=E! {輸出結(jié)果}再運(yùn)行一次:Inputascore(0~100):90↙grade=A! {輸出結(jié)果}switch語(yǔ)句的補(bǔ)充說(shuō)明:(1)switch后的表達(dá)式,可以是整型或字符型,也可以是枚舉類型,不能是除這三種類型以外的其它類型;(2)每個(gè)case后的常量表達(dá)式只能是常量組成的表達(dá)式,當(dāng)switch后的表達(dá)式的值與某一個(gè)常量表達(dá)式的值一致時(shí),程序就轉(zhuǎn)到此case后的語(yǔ)句開始執(zhí)行;如果沒(méi)有一個(gè)常量表達(dá)式的值與switch后的值一致,就執(zhí)行default部分的語(yǔ)句;(3)每個(gè)case后的常量表達(dá)式的值必須互不相同,否則程序就無(wú)法判斷應(yīng)該執(zhí)行哪個(gè)語(yǔ)句;(4)case的擺放順序并不影響執(zhí)行結(jié)果,但通常情況下是將出現(xiàn)頻率較高(即較常使用的case部分,盡量往前擺放;另外,default部分也不一定非要放在最后;(5)在執(zhí)行完一個(gè)case后面的語(yǔ)句后,程序流程轉(zhuǎn)到下一個(gè)case后的語(yǔ)句開始執(zhí)行,直至整個(gè)switch語(yǔ)句結(jié)束,別誤解為執(zhí)行完一個(gè)case語(yǔ)句之后,程序就會(huì)轉(zhuǎn)到switch后的語(yǔ)句去執(zhí)行。(6)如果希望在執(zhí)行完某個(gè)case語(yǔ)句之后,轉(zhuǎn)到執(zhí)行switch下面的那條語(yǔ)句,則應(yīng)該在該case語(yǔ)句的最后補(bǔ)上break語(yǔ)句(即跳轉(zhuǎn)語(yǔ)句)。在執(zhí)行完break語(yǔ)句之后,會(huì)跳出switch語(yǔ)句,轉(zhuǎn)去執(zhí)行switch后面的語(yǔ)句?!纠?.21】從鍵盤輸入一個(gè)日期,判斷這一天是這一年的第幾天?#include<stdio.h>voidmain(){intday,month,year,sum,leap;

printf("\nPleaseinputyear,month,day\n");

scanf("%d,%d,%d",&year,&month,&day);

switch(month)/*先計(jì)算某個(gè)月之前總天數(shù)*/{

case1:sum=0;break;

case2:sum=31;break;

case3:sum=59;break;

case4:sum=90;break;

case5:sum=120;break;

case6:sum=151;break;

case7:sum=181;break;

case8:sum=212;break;

case9:sum=243;break;

case10:sum=273;break;

case11:sum=304;break;

case12:sum=334;break;

default:printf("dataerror");}sum+=day;/*總天數(shù)再加上輸入的幾號(hào)*/

if(year%400==0||(year%4==0&&year%100!=0))

leap=1; /*判斷出是閏年*/

elseleap=0;

if(leap==1&&month>2)sum++;

/*如果是閏年且月份大于2,則總天數(shù)應(yīng)再加1天*/

printf("Itisthe%dth

day.",sum);}【例3.15】程序分析:以2008年7月19日為例,首先應(yīng)該把7月份之前共六個(gè)月的總天數(shù)加起來(lái),然后再加上本月的19天就得到本年度的第幾天。特殊情況下,若該年是閏年且輸入月份值大于二月份時(shí),需要考慮多加一天。程序運(yùn)行結(jié)果如下:Pleaseinputyear,month,day

2008,7,19↙{輸入年月日}Itisthe201thday.{輸出}3.5.7選擇結(jié)構(gòu)程序設(shè)計(jì)舉例【例3.16】求一元二次方程ax2+bx+c=0的實(shí)數(shù)解,并顯示結(jié)果,這里假設(shè)a≠0。圖3-29用嵌套的if語(yǔ)句求一元二次方程的解#include<stdio.h>#include<math.h>voidmain(){floata,b,c,d;

printf("\na=");

scanf("%f",&a);

printf("b=");

scanf("%f",&b);

printf("c=");

scanf("%f",&c);d=b*b-4*a*c;

if(d>0){printf("\nx1=%f",(-b+sqrt(d))/(a*2));printf("\nx2=%f",(-b-sqrt(d))/(a*2));}else

if(d==0)printf("\nx1=x2=%f",(-b)/(a*2));elseprintf("\nTheequationhasnorealroot!");}【例3.16】的程序清單【例3.16】程序的運(yùn)行結(jié)果:第一次運(yùn)行:572↙ {輸入a,b,c}x1=-0.400000{輸出}x2=-1.000000第二次運(yùn)行:441↙

x1=x2=-0.500000第三次運(yùn)行:414↙Theequationhasnorealroot!【例3.17】輸入兩個(gè)正整數(shù)a和b,其中a不大于31,b最大不超過(guò)三位數(shù)。使a在左,b在右,拼成一個(gè)新的數(shù)c。例如a=23,b=30,則c為2330。若a=1,b=15,則c為115。分析:根據(jù)以上問(wèn)題,可以從中抽象分析出以下數(shù)學(xué)模型,決定c的值的計(jì)算公式如下:當(dāng)b為一位數(shù)時(shí),c=a*10+b;

當(dāng)b為二位數(shù)時(shí),c=a*100+b;當(dāng)b為三位數(shù)時(shí),c=a*1000+b;因此,求c的公式為c=a*k+b(k的取值可以為10、100或1000)?!纠?.17】的流程圖。#include<stdio.h>voidmain(){int

a,b,c,k;

printf("\nInputtwopositiveintegernumber:");

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

if(a<0||b<0||a>31||b>999){c=-1; /*出錯(cuò)標(biāo)志,代表輸入數(shù)據(jù)有誤*/

printf("Inputdataerror!");}else{if(b<10)k=10;elseif(b<100)k=100; elseif(b<1000)k=1000;c=a*k+b;}

printf("\na=%2d,b=%3d,c=%5d",a,b,c);}【例3.17】的程序清單【例3.17】程序運(yùn)行結(jié)果:第一次運(yùn)行:Inputtwopositiveintegernumber:23,30↙a=23,b=30,c=2330 {有效的結(jié)果}第二次運(yùn)行:(2)Inputtwopositiveintegernumber:44,19↙Inputdataerror!a=44,b=19,c=-1{無(wú)效的結(jié)果,因?yàn)閍>31}例3.18:假設(shè)個(gè)人所得稅的計(jì)征辦法是月收入低于1000元者,不計(jì)稅,高于1000元低于2000元者,高出部分征收5%;高于2000元低于5000元者,高出部分征收10%;高于5000元低于是10000元,高出部分征收15%,高于10000元的征收35%。輸入一個(gè)人的月收入,求出其應(yīng)交的個(gè)人所得稅。#include<stdio.h>voidmain(){longintr;floatf;

printf("Inputanintegertor:");

scanf(“%ld”,&r); {輸入月收入}if(r>0){switch(r/1000){case0:f=0;break;case1:f=(r-1000)*0.05;break;case2:case3:

case4:f=1000*0.05+(r-2000)*0.1;break;【例3.18】的程序清單

case5:case6:case7:case8:case9:f=1000*0.05+3000*0.1+(r-5000)*0.15;break;default:f=1000*0.05+3000*0.1+5000*0.15+(r-10000)*0.35;}

printf(“f=%f”,f); {輸出所得稅}}else

printf(“Inputadataerror!”); {輸入數(shù)據(jù)有誤}}【例3.19】輸入兩個(gè)實(shí)數(shù)a,b,再輸入一個(gè)運(yùn)算符(可以是+,-,*或/),根據(jù)運(yùn)算符計(jì)算并輸出a,b兩個(gè)數(shù)的和、差、積和商。#include<stdio.h>voidmain(){floata,b;charc;

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

switch(c){case'+':printf("%f+%f=%f\n",a,b,a+b);break;case'-':printf("%f-%f=%f\n",a,b,a-b);break;case'*':printf("%f*%f=%f\n",a,b,a*b);break;case'/':if(b)printf("%f/%f=%f\n",a,b,a/b);break;default:printf("Can'tcompute!");}}【例3.19】運(yùn)行結(jié)果如下:第一次運(yùn)行:58+↙ {輸入}5.000000+8.000000=13.000000 {輸出}第二次運(yùn)行:56/↙{輸入}5.000000/6.000000=0.833333 {輸出}【例3.20】給一個(gè)不多于5位的正整數(shù),編程求:①它是幾位數(shù),②逆序打印出各位數(shù)字,③若為兩位以上的數(shù),則判斷該數(shù)是否為回文數(shù)。分析:分解出該數(shù)每一個(gè)數(shù)位上的數(shù)字。若萬(wàn)位數(shù)大于零,則為5位數(shù);否則,若千位數(shù)大于零,則為4位數(shù);否則,若百位數(shù)大于零,則為3位數(shù);否則,若十位數(shù)大于零,則為兩位數(shù);否則,若個(gè)位數(shù)大于零,則為1位數(shù),否則提示輸入錯(cuò)誤。所謂回文數(shù),是指左右對(duì)稱的數(shù),即從左往右讀與從右往左讀得到的結(jié)果一樣,譬如161就是回文數(shù)。若為5位數(shù),只需判斷該數(shù)的個(gè)位數(shù)與萬(wàn)位數(shù)是否相同,十位數(shù)與千位數(shù)是否相同,若兩者均相同,則為回文數(shù)。對(duì)于其他位數(shù)的判斷,請(qǐng)讀者自已歸納?!纠?.20】程序清單如下:#include<stdio.h>voidmain(){

int

a,b,c,d,e;longx;do{printf("\nPleaseinputapositiveintegernumbertox:");

scanf("%ld",&x);}while(x<=0||x>=100000);/*上述循環(huán)能夠確保輸入的x值一定是一個(gè)不超過(guò)5位的正整數(shù)*/a=x/10000; /*分解出萬(wàn)位數(shù)字*/b=x%10000/1000; /*千位數(shù)字*/c=x%1000/100; /*百位數(shù)字*/d=x%100/10; /*十位數(shù)字*/e=x%10; /*個(gè)位數(shù)字*/if(a>0)/*萬(wàn)位數(shù)字*/{printf("thereare5,%d%d

%d

%d%d\n",e,d,c,b,a);

if(e==a&&d==b)printf("thisnumberisahuiwen\n");elseprintf("thisnumberisnotahuiwen\n");}else

if(b>0)/*千位數(shù)字*/{printf("thereare4,%d%d%d%d\n",e,d,c,b);

if(e==b&&d==c)printf("thisnumberisahuiwen\n");elseprintf("thisnumberisnotahuiwen\n");}else

if(c>0)/*百位數(shù)字*/{printf("thereare3,%d%d%d\n",e,d,c);

if(e==c)printf("thisnumberisahuiwen\n");elseprintf("thisnumberisnotahuiwen\n");}

else

if(d>0)/*十位數(shù)字*/{printf("thereare2,%d%d\n",e,d);

if(e==d)printf("thisnumberisahuiwen\n");elseprintf("thisnumberisnotahuiwen\n");}else/*個(gè)位數(shù)字*/

if(e>0)printf("thereare1,%d\n",e);}【例3.20】程序運(yùn)行結(jié)果:Pleaseinputapositiveintegernumbertox:543↙thereare3,345thisnumberisnotahuiwen再運(yùn)行一次:Pleaseinputapositiveintegernumbertox:121↙thereare3,121thisnumberisahuiwen3.6循環(huán)結(jié)構(gòu)程序設(shè)計(jì)在C語(yǔ)言中提供了四種實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的方法:(1)goto語(yǔ)句以及用goto語(yǔ)句構(gòu)成的循環(huán)(2)用while語(yǔ)句(3)用do-while語(yǔ)句(4)用for語(yǔ)句3.6.1goto語(yǔ)句以及用goto語(yǔ)句

構(gòu)成的循環(huán)goto語(yǔ)句為無(wú)條件轉(zhuǎn)向語(yǔ)句,其格式為

goto

語(yǔ)句標(biāo)號(hào);通常在兩種情況下使用goto語(yǔ)句:(1)與if語(yǔ)句一起構(gòu)成循環(huán)結(jié)構(gòu);(2)從循環(huán)體中跳轉(zhuǎn)到循環(huán)體外,但在C語(yǔ)言中可以用break語(yǔ)句和continue語(yǔ)句跳出本層循環(huán)和結(jié)束本次循環(huán)?!纠?.21】用if語(yǔ)句和goto語(yǔ)句構(gòu)成循環(huán),求

#include<stdio.h>voidmain(){

inti=1;

intsum=0;loop:if(i<=100){sum+=i; i++;

gotoloop;}printf("\n1+2+3+…+100=%d",sum);}運(yùn)行結(jié)果如下:1+2+3+…+100=5050說(shuō)明:處于loop語(yǔ)句標(biāo)識(shí)符和gotoloop之間的語(yǔ)句序列構(gòu)成該程序的循環(huán)體,語(yǔ)句標(biāo)識(shí)符loop后面要加冒號(hào)(:)。3.6.2while語(yǔ)句while語(yǔ)句又稱當(dāng)循環(huán)語(yǔ)句,其一般的形式如下:

while(表達(dá)式)循環(huán)體語(yǔ)句;while語(yǔ)句的執(zhí)行過(guò)程:第1步:計(jì)算表達(dá)式的值,若表達(dá)式的值為真(非0),則執(zhí)行第二步,若表達(dá)式的值為假(值為0),則轉(zhuǎn)到第四步執(zhí)行。第2步:執(zhí)行循環(huán)體語(yǔ)句,循環(huán)體語(yǔ)句可以是簡(jiǎn)單的一條語(yǔ)句,也可以是由多條語(yǔ)句構(gòu)成的復(fù)合語(yǔ)句。第3步:轉(zhuǎn)到第一步執(zhí)行。第4步:結(jié)束循環(huán),執(zhí)行while語(yǔ)句后的第一條語(yǔ)句。

【例3.22】用while語(yǔ)句來(lái)求100以內(nèi)偶數(shù)的和。#include<stdio.h>voidmain(){

intsum=0,i=2;

while(i<=100){sum=sum+i;i=i+2;}printf("2+4+…+100=%d",sum);}有關(guān)while循環(huán)的說(shuō)明:(1)while循環(huán)的次數(shù)可以事先不清楚,因?yàn)樵谘h(huán)執(zhí)行時(shí),能夠根據(jù)條件來(lái)判定循環(huán)是否終止;(2)循環(huán)體語(yǔ)句可以是簡(jiǎn)單的語(yǔ)句,也可以是復(fù)合語(yǔ)句;若為復(fù)合語(yǔ)句,則需要用花括號(hào)括起來(lái);(3)在循環(huán)體語(yǔ)句中,一定要有改變循環(huán)條件的語(yǔ)句,使循環(huán)最終能夠終止。例如:【例3.22】中的i=i+2;就是控制循環(huán)變量i不斷地加2,朝著循環(huán)的終止條件(i<=100)逼近;此處若刪除循環(huán)控制語(yǔ)句i=i+2;,即i值永遠(yuǎn)不變,則循環(huán)條件(i<=100)即2<=100永真,此時(shí)的無(wú)限循環(huán)稱為死循環(huán),編程時(shí)應(yīng)杜絕死循環(huán)的出現(xiàn)?!纠?.23】閱讀下面的程序,寫出運(yùn)行結(jié)果。#include<stdio.h>voidmain(){

inti=1,s=1;

while(i<7)s*=i;

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

顯然,本例在循環(huán)體中缺少用來(lái)控制循環(huán)變量的值變化的語(yǔ)句,因此導(dǎo)致程序中出現(xiàn)死循環(huán)。若上述程序在VisualC++6.0環(huán)境下運(yùn)行,由于死循環(huán),因此不會(huì)出現(xiàn)運(yùn)行結(jié)果,此時(shí)應(yīng)該按下組合鍵【Ctrl+Break】,或者單擊運(yùn)行窗口上的“關(guān)閉”按鈕來(lái)終止程序的運(yùn)行,返回到編輯狀態(tài)對(duì)程序進(jìn)行修改。3.6.3do-while語(yǔ)句do-while循環(huán)語(yǔ)句又稱直到型循環(huán)語(yǔ)句,但是與Pascal語(yǔ)言中的repeat-until語(yǔ)句又有所不同。C語(yǔ)言中do-while語(yǔ)句的格式:do

循環(huán)體語(yǔ)句;while(表達(dá)式);

do-while語(yǔ)句的執(zhí)行過(guò)程如下:(1)執(zhí)行循環(huán)體語(yǔ)句,循環(huán)體語(yǔ)句可以是簡(jiǎn)單的一條語(yǔ)句,也可以是由多條語(yǔ)句構(gòu)成的復(fù)合語(yǔ)句;(2)計(jì)算表達(dá)式的值,如果表達(dá)式的值為真(非0),則執(zhí)行第(1)步,若表達(dá)式的值為假(值為0),則轉(zhuǎn)到第(3)步執(zhí)行;(3)循環(huán)結(jié)束之后,將執(zhí)行do-while語(yǔ)句下面的那條語(yǔ)句?!纠?.24】用do-while語(yǔ)句來(lái)實(shí)現(xiàn)求100以內(nèi)的奇數(shù)和。

N-S流程圖如下圖所示?!纠?.24】的程序清單如下:#include<stdio.h>voidmain(){

intsum=0,i=1;do{sum+=i;i=i+2;}while(i<=100);

printf("\n1+3+…+99=%d\n",sum);}運(yùn)行結(jié)果如下:1+3+…+99=2500說(shuō)明:(1)do…while語(yǔ)句一般也是用于事先不知道循環(huán)次數(shù)的情況下,在循環(huán)執(zhí)行的過(guò)程中,根據(jù)條件來(lái)決定循環(huán)是否結(jié)束。(2)在循環(huán)體語(yǔ)句中可以是一條簡(jiǎn)單的語(yǔ)句,也可以是復(fù)合語(yǔ)句,若為復(fù)合語(yǔ)句則要用花括號(hào)括起來(lái)。(3)在循環(huán)體語(yǔ)句中,一定要有改變循環(huán)條件的語(yǔ)句,使循環(huán)能終止。如上例中的i=i+2;語(yǔ)句就是使循環(huán)變量i增加2,改變循環(huán)條件的語(yǔ)句,若沒(méi)有該語(yǔ)句,則i的值永遠(yuǎn)不會(huì)改變,循環(huán)就是一個(gè)死循環(huán)。(4)在while(表達(dá)式)的后面一定要有一個(gè)分號(hào),它用來(lái)表示do-while語(yǔ)句的結(jié)束。(5)do…while語(yǔ)句和while語(yǔ)句最大的差別就是do-while語(yǔ)句至少要執(zhí)行一次循環(huán)體語(yǔ)句,而while語(yǔ)句可以一次都不執(zhí)行。請(qǐng)看例3.25。【例3.25】while循環(huán)和do…while循環(huán)的比較。程序如下:

voidmain() voidmain(){{

int

m,n=1; int

m,n=1;

scanf("%d",&m);scanf("%d",&m);dowhile(m<=10){{n+=m;n+=m;m++;m++;}while(m<=10);}

printf(“n=%d,m=%d”,n,m);printf("n=%d,m=%d",n,m);}}程序運(yùn)行結(jié)果如下:程序運(yùn)行結(jié)果如下:5↙ 5↙n=46,m=11n=46,m=11再運(yùn)行一次:再運(yùn)行一次:11↙ 11↙n=12,m=12n=1,m=113.6.4for語(yǔ)句for語(yǔ)句的一般形式為:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體語(yǔ)句其執(zhí)行過(guò)程如下:(1)先求解表達(dá)式1;(2)求解表達(dá)式2,若為真(表達(dá)式2的值為非0),則執(zhí)行for語(yǔ)句中指定的內(nèi)嵌循環(huán)體語(yǔ)句,然后執(zhí)行第(3)步,若為假(表達(dá)式2的值為0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步;(3)求解表達(dá)式3;(4)返回第(2)步繼續(xù)執(zhí)行;(5)循環(huán)結(jié)束,執(zhí)行for語(yǔ)句后面的第一條語(yǔ)句。圖3-35for語(yǔ)句的執(zhí)行圖解for語(yǔ)句執(zhí)行過(guò)程的圖解形式如圖3-35所示。說(shuō)明:

(1)可以把for循環(huán)的格式

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體語(yǔ)句改寫為以下容易理解的形式

for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)循環(huán)體語(yǔ)句

(2)for語(yǔ)句中的表達(dá)式1可以省略,但其后面的分號(hào)不能省略,此時(shí)應(yīng)在執(zhí)行for語(yǔ)句之前,給循環(huán)變量賦初值,即

表達(dá)式1;

for(;表達(dá)式2;表達(dá)式3)循環(huán)體語(yǔ)句(3)表達(dá)式2也可省略,但其后的分號(hào)不能省略,即

for(表達(dá)式1;;表達(dá)式3)循環(huán)體語(yǔ)句此時(shí)等于沒(méi)有循環(huán)條件,執(zhí)行for語(yǔ)句時(shí),就不要判斷循環(huán)條件,也就認(rèn)為

表達(dá)式2始終為真。此時(shí)循環(huán)體中一定要有一條語(yǔ)句能夠跳出循環(huán),否則將是一個(gè)死循環(huán)。(4)表達(dá)式3也可以省略,但它前面的分號(hào)不能省略,即

for(表達(dá)式1;表達(dá)式2;)循環(huán)體語(yǔ)句此時(shí)應(yīng)在循環(huán)體中要有用于改變循環(huán)變量值的語(yǔ)句,否則循環(huán)也會(huì)變成死循環(huán);(5)表達(dá)式1、表達(dá)式2、表達(dá)式3可以省略一個(gè)或者兩個(gè),也可同時(shí)全部省略,但對(duì)應(yīng)的分號(hào)不能省略,譬如:

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

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

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

for(;;)循環(huán)體語(yǔ)句(6)表達(dá)式1、表達(dá)式2、表達(dá)式3可以是任何類型的表達(dá)式,包括逗號(hào)表達(dá)式。既可以是與循環(huán)變量有關(guān)的表達(dá)式,也可以是與循環(huán)變量無(wú)關(guān)的表達(dá)式?!纠?.26】求1000以內(nèi)的奇數(shù)和。程序清單如下#include<stdio.h>voidmain(){

inti;longintsum=0;

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

printf("\nsum=%ld\n",sum);}運(yùn)行結(jié)果如下:sum=250000【例3.27】從鍵盤接收字符并顯示字符的個(gè)數(shù)。#include<stdio.h>voidmain(){

inti;charc;

for(i=0;(c=getchar())!='\n';i++);

printf("Thesumis%d\n",i);}運(yùn)行結(jié)果如下:Iamachinese!{輸入的字符序列,最后以敲回車結(jié)束}Thesumis15

請(qǐng)注意:該例中循環(huán)體語(yǔ)句為空語(yǔ)句,即什么都不做,其實(shí)程序把循環(huán)體要執(zhí)行的工作,全部移到for后面的表達(dá)式了?!纠?.28】中國(guó)剩余定理:“有物不知幾何,三三數(shù)余一,五五數(shù)余二,七七數(shù)余三,問(wèn)物有幾何?”。編程求1000以內(nèi)的所有解。#include<stdio.h>voidmain(){int

m,count=0;

for(m=1;m<=1000;m++)if(m%3==1&&m%5==2&&m%7==3){printf(“%5d”,m);count++;if(count%5==0)printf(“\n”);}}程序運(yùn)行結(jié)果如下:

521572623674725776827878929973.6.5多重循環(huán)如果在循環(huán)結(jié)構(gòu)中又包含另外一個(gè)循環(huán)結(jié)構(gòu),稱為多重循環(huán),也叫循環(huán)的嵌套?!纠?.29】打印如圖3-36所示的“九-九”乘法表。

【例3.29】的程序清單。#include<stdio.h>voidmain(){

int

i,j;

for(i=1;i<=9;i++) /*外循環(huán),控制行*/{

for(j=1;j<=9;j++) /*內(nèi)循環(huán),控制列*/

printf("%d*%d=%d\t",i,j,i*j);

printf("\n");}}本例的N-S流程圖如圖3-37所示。

如果想打印出以下4種形狀的“九九”乘法表,請(qǐng)問(wèn)該如何編程?第1種圖形:

如果想打印出以下4種形狀的“九九”乘法表,請(qǐng)問(wèn)該如何編程?第2種圖形:

如果想打印出以下4種形狀的“九九”乘法表,請(qǐng)問(wèn)該如何編程?第3種圖形:

如果想打印出以下4種形狀的“九九”乘法表,請(qǐng)問(wèn)該如何編程?第4種圖形:【例3.30】

問(wèn)用1、2、3、4個(gè)這四個(gè)數(shù)字,能夠組成多少個(gè)互不相同且無(wú)重復(fù)數(shù)字的三位數(shù)?它們分別是多少?#include<stdio.h>voidmain(){

int

i,j,k,count=0;

for(i=1;i<5;i++)/*判斷百位數(shù)字i*/

for(j=1;j<5;j++)/*判斷十位數(shù)字j*/for(k=1;k<5;k++)/*判斷個(gè)位數(shù)字k*/{if(i!=k&&i!=j&&j!=k)/*確保i、j、k互不相同*/{count++;

printf("%d%d%d",i,j,k);if(count%5==0)printf("\n");}}

printf(“\ncount=%d\n”,count);}【例3.30】程序的運(yùn)行結(jié)果如下:123124132134142143213214231234241243312314321324341342412413421423431432count=24{輸出符合條件的總數(shù)}3.6.6循環(huán)結(jié)構(gòu)中的break語(yǔ)句break語(yǔ)句格式:

break;

break語(yǔ)句的作用是從最內(nèi)層的switch、for、while或do…while語(yǔ)句中跳出,終止這些語(yǔ)句的執(zhí)行,把控制流程轉(zhuǎn)移到被中斷的循環(huán)語(yǔ)句(或者switch語(yǔ)句)后去執(zhí)行。通過(guò)使用break語(yǔ)句,可以不必等到循環(huán)或switch語(yǔ)句執(zhí)行結(jié)束,而是根據(jù)情況,提前結(jié)束這些語(yǔ)句的執(zhí)行?!纠?.31】求當(dāng)半徑r為何值時(shí),圓的面積第一次開始大于100?#include<stdio.h>voidmain(){

intr;floatarea,pi=3.1415927;

for(r=1;;r++){area=pi*r*r;

if(area>100)break;{面積開始大于100了}

printf("%f\n",area);}

printf("r=%d\n",r);}【例3.31】程序運(yùn)行結(jié)果如下:3.14159312.56637128.27433450.26548478.539818r=6

本程序運(yùn)行后,for循環(huán)運(yùn)行了5次,當(dāng)運(yùn)行第6次(r=6)時(shí),area=113.097336>100,這時(shí)程序不輸出area的值,同時(shí)中斷了for循環(huán)語(yǔ)句的繼續(xù)運(yùn)行,轉(zhuǎn)到for循環(huán)的下一條語(yǔ)句輸出r的值。3.6.7continue語(yǔ)句continue語(yǔ)句的形式:continue;其作用是提前結(jié)束本次循環(huán),即跳過(guò)循環(huán)體中那些尚未執(zhí)行的語(yǔ)句,緊接著進(jìn)行下一次是否執(zhí)行循環(huán)的判斷?!纠?.32】從鍵盤輸入整數(shù),顯示出其中的正整數(shù),若輸入的是0,則退出。#include<stdio.h>voidmain(){

intx;do{scanf("%d",&x);

if(x<0)continue;

printf("%d\n",x);}

while(x!=0);}【例3.33】下面程序的作用是求連續(xù)的奇數(shù)和,當(dāng)奇數(shù)和剛好超過(guò)1000時(shí)停止計(jì)算,并按運(yùn)行結(jié)果輸出。程序中有兩空,請(qǐng)補(bǔ)充完整,使之能實(shí)現(xiàn)上述功能。#include<stdio.h>voidmain(){

int

i,sum=0;

for(i=1;;i++){if(i%2==0)continue;sum+=i;

if(sum>1000)break;}printf("1+3+5+…+%d=%d\n",i,sum);}【例3.33】程序分析:在程序中,第一空前面的條件表示i為偶數(shù)時(shí)要執(zhí)行的情況,由于本題偶數(shù)不符合題目累加的條件,故不應(yīng)執(zhí)行累加語(yǔ)句。因此,第一空應(yīng)填continue。第二個(gè)空前面的條件表示累加和大于1000,按題目要求應(yīng)退出循環(huán),因此,第二空應(yīng)填break。答案:(1)continue

(2)break

程序運(yùn)行結(jié)果:

1+3+5+…+63=10243.6.8循環(huán)程序設(shè)計(jì)舉例【例3.34】從鍵盤輸入一個(gè)整數(shù)n,判斷n是否為素?cái)?shù)。

素?cái)?shù)又叫質(zhì)數(shù),是指只能被1和它本身整除的自然數(shù)。在編程時(shí),可以根據(jù)素?cái)?shù)的定義來(lái)進(jìn)行判斷,不過(guò)循環(huán)次數(shù)太多,效率較低。這里介紹一種效率更高的求素?cái)?shù)的方法:引入一個(gè)整型變量k=。讓變量j位于區(qū)間[2,k]內(nèi),從j=2開始循環(huán),直至j=k結(jié)束,判斷變量n能否被變量j整除。如果在區(qū)間[2,k]內(nèi)有變量n能被變量j整除,則j值必然小于或等于k值,表明n不是素?cái)?shù),應(yīng)該提前結(jié)束循環(huán)。如果變量n不能被[2,k]之間的任何一個(gè)整數(shù)整除,則表明n是素?cái)?shù)?!纠?.34】的流程圖#include<stdio.h>#include<math.h>voidmain(){intn,j,k;

printf("\nInputanintegerton:");

scanf("%d",&n);k=sqrt(n);j=2;

while(j<=k){

if(n%j==0)break;j++;}

if(j>=k+1)printf(“\n%disaprimenumber!\n”,n);{是素?cái)?shù)}elseprintf(“\n%disnotaprimenumber!\n”,n);{不是素?cái)?shù)}

}【例3.34】的程序清單【例3.34】程序運(yùn)行結(jié)果如下:Inputanintegerton:235↙235isnotaprime!再運(yùn)行一次:Inputaintegerton:29↙29isaprime!【例3.35】某人想將手中一張100元的人民幣兌換成5元、1元和5角這三種面值的零鈔,同時(shí)要求所兌換的零鈔總數(shù)為100張,而且每種零鈔的數(shù)目不少于1張。問(wèn)有哪幾種兌換方法?假設(shè)兌換后5元面值的鈔票有i張,1元的鈔票有j張,5角的鈔票有k張,則有以下方程組成立:不過(guò)三個(gè)變量只能列出兩個(gè)方程式,這是一個(gè)不定方程組的求解。其實(shí)題目中還隱含了如下的條件:1<=i<20且1<=j<95且1<=k<=98

在i、j、k的取值范圍內(nèi)嘗試各種可能的情況,從中判斷哪種可能是符合要求的解,這就是窮舉法的思想?!纠?.35】的程序清單。#include<stdio.h>voidmain(){

int

i,j,k;

printf("\nijk\n");

for(i=1;i<20;i++){5元面值}

for(j=1;j<95;j++){1元面值}

for(k=1;k<=98;k++){5角面值} if((i+j+k==100)&&(10*i+2*j+k==200)) printf("%7d%7d%7d\n",i,j,k);}【例3.35】運(yùn)行結(jié)果如下(有11組解)

ijk191828216373

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論