版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章程序的控制結(jié)構(gòu)C程序設(shè)計(jì)語(yǔ)言1內(nèi)容提要算法的描述方法基本控制結(jié)構(gòu)基本控制語(yǔ)句常用算法,如累加、累乘、統(tǒng)計(jì)、遞推、迭代、窮舉等結(jié)構(gòu)化程序設(shè)計(jì)的基本思想C程序結(jié)構(gòu)C程序源程序文件1源程序文件2源程序文件3編譯預(yù)處理命令全局變量聲明函數(shù)1函數(shù)n…函數(shù)首部函數(shù)體局部變量聲明執(zhí)行語(yǔ)句什么是結(jié)構(gòu)化程序設(shè)計(jì)?StructuredProgramming,簡(jiǎn)稱SP1965年,最早由E.W.Dijkstra在一次國(guó)際會(huì)議上提出1966年,C.Bohm和G.Jacopini首先證明了:只用順序、選擇、循環(huán)三種基本的控制結(jié)構(gòu)就能實(shí)現(xiàn)任何單入口、單出口的程序給結(jié)構(gòu)化程序設(shè)計(jì)奠定了基礎(chǔ)1971年,IBM公司的Mills提出:程序應(yīng)該只有一個(gè)入口和一個(gè)出口進(jìn)一步補(bǔ)充了結(jié)構(gòu)化程序的規(guī)則什么是結(jié)構(gòu)化程序設(shè)計(jì)?目前,還沒(méi)有一個(gè)嚴(yán)格的定義1974年,D.Gries教授將已有的對(duì)結(jié)構(gòu)化程序設(shè)計(jì)的不同解釋歸納為13種。一個(gè)比較流行的定義是:結(jié)構(gòu)化程序設(shè)計(jì)是一種進(jìn)行程序設(shè)計(jì)的原則和方法,它避免使用goto語(yǔ)句,采用“自頂向下、逐步求精”方法進(jìn)行程序設(shè)計(jì),按照這種原則和方法設(shè)計(jì)出的程序的特點(diǎn)為:結(jié)構(gòu)清晰容易閱讀容易修改容易驗(yàn)證糟糕的gotoSTART_LOOP:if(fStatusOk){
if(fDataAvaiable)
{i=10;
gotoMID_LOOP;}
else
{
gotoEND_LOOP;}}else
{
for(i=0;i<100;i++)
{MID_LOOP://lotsofcodehere
}
gotoSTART_LOOP;}END_LOOP:什么是結(jié)構(gòu)化程序設(shè)計(jì)?不能簡(jiǎn)單的認(rèn)為避免使用goto語(yǔ)句的程序設(shè)計(jì)方法就是結(jié)構(gòu)化程序設(shè)計(jì)方法用goto跳向共同的出口位置`voidInit(void){
char*p1=NULL;
char*p2=NULL;
char*p3=NULL; p1=(char*)malloc(256);
if(p1==NULL)
goto
Exit;
p2=(char*)malloc(256);
if(p2==NULL)
goto
Exit;
p3=(char*)malloc(256);
if(p3==NULL)
goto
Exit;
/*正常處理的代碼*/Exit:
if(p1!=NULL)
free(p1);
if(p2!=NULL)free(p2);if(p3!=NULL)
free(p3);
return;}結(jié)構(gòu)化程序設(shè)計(jì)關(guān)注的焦點(diǎn)結(jié)構(gòu)化程序設(shè)計(jì)關(guān)注的焦點(diǎn)程序結(jié)構(gòu)的好壞有無(wú)goto,并不是程序結(jié)構(gòu)好壞的標(biāo)志限制和避免使用goto,只是得到結(jié)構(gòu)化程序的一個(gè)手段,而不是我們的目的結(jié)構(gòu)化程序設(shè)計(jì)的核心思想采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)作為程序設(shè)計(jì)的基本單元只有一個(gè)入口;只有一個(gè)出口;無(wú)死語(yǔ)句,即不存在永遠(yuǎn)都執(zhí)行不到的語(yǔ)句;無(wú)死循環(huán),即不存在永遠(yuǎn)都執(zhí)行不完的循環(huán)。采用“自頂向下、逐步求精”和模塊化的方法進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)什么是結(jié)構(gòu)化程序設(shè)計(jì)?結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言按照結(jié)構(gòu)化程序設(shè)計(jì)的要求設(shè)計(jì)出的語(yǔ)言結(jié)構(gòu)化程序利用結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言或按照結(jié)構(gòu)化程序設(shè)計(jì)思想編制出的程序如何設(shè)計(jì)結(jié)構(gòu)化的程序?Top-down,Stepwiserefinement自頂向下、逐步求精1971年,wirth提出的結(jié)構(gòu)化程序設(shè)計(jì)方法先全局后局部先整體后細(xì)節(jié)先抽象后具體自頂向下、逐步求精的
結(jié)構(gòu)化程序設(shè)計(jì)方法BAA2A1B2B1A12A11A22A21B12B11B22B21算法的概念
數(shù)據(jù)結(jié)構(gòu)+算法=程序只對(duì)面向過(guò)程的語(yǔ)言(C)成立面向?qū)ο蟪绦?對(duì)象+消息算法:為解決一個(gè)具體問(wèn)題而采取的確定的有限的操作步驟,僅指計(jì)算機(jī)能執(zhí)行的算法算法的特性
有窮性在合理的時(shí)間內(nèi)完成確定性,無(wú)歧義
如果x≥0,則輸出Yes;如果x≤0,則輸出No;有效性
能有效執(zhí)行負(fù)數(shù)開(kāi)平方?jīng)]有輸入或有多個(gè)輸入
有一個(gè)或多個(gè)輸出
算法的分類
數(shù)值運(yùn)算算法:解決求數(shù)值解問(wèn)題非數(shù)值運(yùn)算算法:需要用分析推理、邏輯推理才能解決的問(wèn)題例如人工智能中的許多問(wèn)題,查找、分類等算法的表示方法自然語(yǔ)言表示傳統(tǒng)的流程圖表示在1966年,Bohra與Jacopini提出N-S結(jié)構(gòu)化流程圖表示1973年,美國(guó)學(xué)者I.Nassi和B.Shneiderman提出偽代碼表示起止框輸入框判斷框處理框流程線連接點(diǎn)注釋框BANS圖傳統(tǒng)流程圖順序結(jié)構(gòu)BABN如果
成績(jī)<60
那么
通知補(bǔ)考否則
告知你考試成績(jī)AY條件PABNY條件P分支結(jié)構(gòu)(選擇結(jié)構(gòu))當(dāng)型循環(huán)A真假假條件P循環(huán)結(jié)構(gòu)A當(dāng)P成立直到型循環(huán)條件PA假真循環(huán)結(jié)構(gòu)A直到P為假A條件PA當(dāng)型循環(huán)直到型循環(huán)真假假條件P假真循環(huán)結(jié)構(gòu)復(fù)合語(yǔ)句{}括住的若干條語(yǔ)句構(gòu)成一個(gè)語(yǔ)句塊,稱為復(fù)合語(yǔ)句語(yǔ)句塊內(nèi)可以定義變量變量?jī)H在定義它的復(fù)合語(yǔ)句內(nèi)有效變量必須在復(fù)合語(yǔ)句的開(kāi)頭定義復(fù)合語(yǔ)句可以用在任何可以使用語(yǔ)句的地方if-else選擇結(jié)構(gòu)的一種最常用形式if(表達(dá)式)
{
語(yǔ)句1;
} else
{
語(yǔ)句2;
}語(yǔ)句3表達(dá)式值非0時(shí),執(zhí)行語(yǔ)句1,然后語(yǔ)句3;表達(dá)式值為0時(shí),執(zhí)行語(yǔ)句2,然后語(yǔ)句3{
語(yǔ)句1;
}
{
語(yǔ)句2;
}
if-elseelse部分可以沒(méi)有if(表達(dá)式)
{
語(yǔ)句1;
} 語(yǔ)句3if-else嵌套使用時(shí),注意else和誰(shuí)配對(duì)的問(wèn)題當(dāng)表達(dá)式值為0時(shí),直接執(zhí)行語(yǔ)句3{
語(yǔ)句1;
}
例4.4:年齡判斷#include<stdio.h>main(){
intyourAge,hisAge; printf("Pleaseenteryourage:"); scanf("%d",&yourAge);/*輸入你的年齡yourAge*/ printf("Pleaseenteryourfriend'sage:"); scanf("%d",&hisAge);/*輸入你朋友的年齡hisAge*/
if(yourAge>=hisAge) { printf("Youareolder!Yourageis=%d\n",yourAge); }
else
{ printf("Yourfriendisolder!Hisageis=%d\n",hisAge); }}條件表達(dá)式含義:如果表達(dá)式1的值非0(為真),則該條件表達(dá)式的結(jié)果就是表達(dá)式2的值否則,是表達(dá)式3的值
表達(dá)式3N表達(dá)式2Y表達(dá)式1表達(dá)式1?表達(dá)式2:表達(dá)式3例4.4:年齡判斷#include<stdio.h>main(){
intyourAge,hisAge; printf("Pleaseenteryourage:"); scanf("%d",&yourAge);/*輸入你的年齡yourAge*/ printf("Pleaseenteryourfriend'sage:"); scanf("%d",&hisAge);/*輸入你朋友的年齡hisAge*/
max=(yourAge>=hisAge)?yourAge:hisAge;
printf("Theolderageis=%d\n",max);}else-ifif的一種擴(kuò)展形式——相當(dāng)于else分支嵌套if(表達(dá)式1)
語(yǔ)句1;
elseif(表達(dá)式2)
語(yǔ)句2;
elseif(表達(dá)式3)
語(yǔ)句3;
…………
else
語(yǔ)句4;
語(yǔ)句5;表達(dá)式1
語(yǔ)句1語(yǔ)句2語(yǔ)句3語(yǔ)句4表達(dá)式2表達(dá)式3
圖4-9多分支選擇結(jié)構(gòu)語(yǔ)句1;語(yǔ)句2;語(yǔ)句3;語(yǔ)句4;例4.5:體型判斷按“體指數(shù)”對(duì)肥胖程度進(jìn)行劃分:
體指數(shù)t=w/h2
(體重w單位為公斤,身高h(yuǎn)單位為米)當(dāng)t<18時(shí),為低體重;當(dāng)18≤t<25時(shí),為正常體重;當(dāng)25<t<27時(shí),為超重體重;當(dāng)t≥27時(shí),為肥胖。編程從鍵盤(pán)輸入你的身高h(yuǎn)和體重w,根據(jù)給定公式計(jì)算體指數(shù)t,然后判斷你的體重屬于何種類型。用3種方法編程:算法1:用不帶else子句的if語(yǔ)句編程算法2:用在if子句中嵌入if語(yǔ)句的形式編程算法3:用在else子句中嵌入if語(yǔ)句的形式編程例4.5用不帶else子句的if語(yǔ)句編程#include<stdio.h>main(){
floath,w,t; printf("Pleaseenterh,w:"); scanf("%f,%f",&h,&w); t=w/(h*h);
if(t<18) { printf("t=%f\tLowerweight!\n",t); }
if(t>=18&&t<25) { printf("t=%f\tStandardweight!\n",t); }
if(t>=25&&t<27) { printf("t=%f\tHigherweight!\n",t); }
if(t>=27) { printf("t=%f\tToofat!\n",t); }}當(dāng)t<18時(shí),為低體重;當(dāng)18≤t<25時(shí),為正常體重;當(dāng)25<t<27時(shí),為超重體重;當(dāng)t≥27時(shí),為肥胖。例4.5用在if子句中嵌入if語(yǔ)句的形式編程
#include<stdio.h>main(){
floath,w,t; printf("Pleaseenterh,w:"); scanf("%f,%f",&h,&w); t=w/(h*h);
if(t<27) {
if(t<25) {
if(t<18)printf("t=%f\tLowerweight!\n",t);
elseprintf("t=%f\tStandardweight!\n",t); }
elseprintf("t=%f\tHigherweight!\n",t); }
elseprintf("t=%f\tToofat!\n",t);}182527當(dāng)t<18時(shí),為低體重;當(dāng)18≤t<25時(shí),為正常體重;當(dāng)25<t<27時(shí),為超重體重;當(dāng)t≥27時(shí),為肥胖。例4.5用在else子句中嵌入if語(yǔ)句的形式編程
#include<stdio.h>main(){
floath,w,t; printf("Pleaseenterh,w:"); scanf("%f,%f",&h,&w); t=w/(h*h);
if(t<18)
printf("t=%f\tLowerweight!\n",t);
elseif(t<25) printf("t=%f\tStandardweight!\n",t);
elseif(t<27) printf("t=%f\tHigherweight!\n",t);
else printf("t=%f\tToofat!\n",t);}當(dāng)t<18時(shí),為低體重;當(dāng)18≤t<25時(shí),為正常體重;當(dāng)25<t<27時(shí),為超重體重;當(dāng)t≥27時(shí),為肥胖。182527switch多路選擇switch(表達(dá)式){
case
常數(shù)1:
語(yǔ)句序列1;
case
常數(shù)2:
語(yǔ)句序列2;
…………
default:
語(yǔ)句序列3;
}default可以沒(méi)有,但最好不省略不要忘記break語(yǔ)句序列1;語(yǔ)句序列2;語(yǔ)句序列n;例4.8:計(jì)算器程序編程設(shè)計(jì)一個(gè)簡(jiǎn)單的計(jì)算器程序,要求根據(jù)用戶從鍵盤(pán)輸入如下形式的表達(dá)式:操作數(shù)1運(yùn)算符op操作數(shù)2
然后,計(jì)算并輸出表達(dá)式的值指定的運(yùn)算符為加(+)減(-)乘(*)除(/)main(){
intdata1,data2;/*定義兩個(gè)操作符*/
charop;/*定義運(yùn)算符*/ printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*輸入運(yùn)算表達(dá)式*/
switch(op) {
case'+':/*處理加法*/ printf("%d+%d=%d\n",data1,data2,data1+data2);
break;
case'-':/*處理減法*/ printf("%d-%d=%d\n",data1,data2,data1-data2);
break;
case'*':/*處理乘法*/ printf("%d*%d=%d\n",data1,data2,data1*data2);
break;
case'/':/*處理除法*/
if(0==data2) printf("Divisionbyzero!\n");
else
printf("%d/%d=%d\n",data1,data2,data1/data2);
break;
default: printf("Unknownoperator!\n"); }}例4.8思考題語(yǔ)句if(0==data2)的必要性1998年11月《科學(xué)美國(guó)人》雜志,描述了美國(guó)導(dǎo)彈巡洋艦約克敦號(hào)上的一起事故,除零錯(cuò)導(dǎo)致軍艦推進(jìn)系統(tǒng)的關(guān)閉如果要求程序能進(jìn)行浮點(diǎn)數(shù)的算術(shù)運(yùn)算,語(yǔ)句if(0==data2)還能用于比較實(shí)型變量data2和常數(shù)0的大小嗎?if(fabs(data2)<=1e-7)如果要求輸入的算術(shù)表達(dá)式中的操作數(shù)和運(yùn)算符之間可以加入任意多個(gè)空格符,那么程序如何修改?scanf("%d%c%d",&data1,&op,&data2);scanf("%d%1s%d",&data1,&op,&data2);取絕對(duì)值函數(shù)作業(yè)P143~152習(xí)題4.7,4.9循環(huán)——while語(yǔ)句,for語(yǔ)句while(表達(dá)式)
{
語(yǔ)句;}for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
{
語(yǔ)句;}語(yǔ)句;語(yǔ)句;while語(yǔ)句while(表達(dá)式)
{
語(yǔ)句;}只要表達(dá)式的值為非0,就重復(fù)執(zhí)行語(yǔ)句,直到表達(dá)式值為0時(shí)止語(yǔ)句真假假表達(dá)式語(yǔ)句;for語(yǔ)句for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
{
語(yǔ)句;}首先執(zhí)行表達(dá)式1。如果表達(dá)式2的值為非0,就重復(fù)執(zhí)行語(yǔ)句和表達(dá)式3,直到表達(dá)式2的值為0時(shí)止語(yǔ)句;循環(huán)起始條件循環(huán)結(jié)束條件循環(huán)增量for語(yǔ)句for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
{
語(yǔ)句;}相當(dāng)于:
表達(dá)式1和表達(dá)式3可以沒(méi)有或者是用逗號(hào)分隔的多個(gè)表達(dá)式的組合。但最好不要有太多的表達(dá)式組合語(yǔ)句;
表達(dá)式1;
while(表達(dá)式2){
語(yǔ)句;
表達(dá)式3;
}do-while語(yǔ)句do
{
語(yǔ)句;
}while(表達(dá)式);首先執(zhí)行語(yǔ)句,然后判斷表達(dá)式的值。如果表達(dá)式為0,繼續(xù)向下執(zhí)行,否則,再次執(zhí)行語(yǔ)句,再次判斷表達(dá)式的值語(yǔ)句會(huì)被至少執(zhí)行一次表達(dá)式語(yǔ)句假真語(yǔ)句;條件PA當(dāng)型循環(huán)直到循環(huán)真假假條件PA假真假條件P條件PA假當(dāng)循環(huán)條件第一次就為假時(shí)選擇三種循環(huán)的一般原則如果循環(huán)次數(shù)已知,用for如果循環(huán)次數(shù)未知,用while如果循環(huán)體至少要執(zhí)行一次,用do-while這只是“一般”原則,不是“原則”注意在for和while語(yǔ)句之后一般沒(méi)有分號(hào)有分號(hào)表示循環(huán)體就是分號(hào)之前的內(nèi)容(空循環(huán)體)while(i<100);
i++;for(i=0;i<100;i++);
printf("%d",i);for通常有一個(gè)循環(huán)變量控制循環(huán)的次數(shù),不要在循環(huán)體內(nèi)改變這個(gè)變量現(xiàn)場(chǎng)編程計(jì)算1+2+…+100=?分別用如下語(yǔ)句編程forwhiledo-while循序漸進(jìn)式編程
——例4.6:猜數(shù)游戲想一個(gè)1~100之間的數(shù)猜對(duì):right猜錯(cuò):wrong并提示大小只猜1次直到猜對(duì)為止最多猜10次猜多個(gè)數(shù)10次猜不對(duì)就猜下一個(gè)數(shù)循序漸進(jìn)式編程
——例4.6:猜數(shù)游戲猜數(shù)游戲用到的庫(kù)函數(shù)怎樣模擬計(jì)算機(jī)“想”一個(gè)數(shù)呢?隨機(jī)函數(shù)rand()產(chǎn)生[0,RAND_MAX]
之間的隨機(jī)數(shù)magic=rand();#include<stdlib.h>RAND_MAX在stdlib.h中定義,不大于雙字節(jié)整數(shù)的最大值32767產(chǎn)生[0,b-1]之間的隨機(jī)數(shù)magic=rand()%b;產(chǎn)生[a,a+b-1]之間的隨機(jī)數(shù)magic=rand()%b+a;#include<stdlib.h>#include<stdio.h>
main(){
intmagic;/*計(jì)算機(jī)"想"的數(shù)*/
intguess;/*人猜的數(shù)*/
magic=rand()%100+1;/*“想”一個(gè)[1,100]之間的數(shù)magic*/ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess);
if(guess>magic) {printf("Wrong!Toohigh!\n"); }
elseif(guess<magic) {printf("Wrong!Toolow!\n"); }
else
{ printf("Right!\n"); printf("Thenumberis:%d\n",magic); }}只猜1次#include<stdlib.h>#include<stdio.h>main(){
intmagic;
intguess;
intcounter;/*記錄人猜次數(shù)的計(jì)數(shù)器變量*/ magic=rand()%100+1;
counter=0;/*計(jì)數(shù)器變量count初始化為0*/
do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess);
counter++;/*計(jì)數(shù)器變量count加1*/
if(guess>magic) printf("Wrong!Toohigh!\n");
elseif(guess<magic) printf("Wrong!Toolow!\n");
}while(guess!=magic);
printf("Right!\n"); printf("counter=%d\n",counter);}直到猜對(duì)為止#include<stdlib.h>#include<stdio.h>main(){
intmagic;
intguess;
intcounter;
magic=rand()%100+1; counter=0;
do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;
if(guess>magic) printf("Wrong!Toohigh!\n");
elseif(guess<magic) printf("Wrong!Toolow!\n"); }while((guess!=magic)&&(counter<10));
printf("Right!\n"); printf("counter=%d\n",counter);}最多猜10次例4.11:國(guó)王的許諾相傳國(guó)際象棋是古印度舍罕王的宰相達(dá)依爾發(fā)明的。舍罕王十分喜歡象棋,決定讓宰相自己選擇何種賞賜。這位聰明的宰相指著8×8共64格的象棋盤(pán)說(shuō):陛下,請(qǐng)您賞給我一些麥子吧,就在棋盤(pán)的第一個(gè)格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盤(pán)上的64個(gè)格子,我就感恩不盡了。舍罕王讓人扛來(lái)一袋麥子,他要兌現(xiàn)他的許諾。
國(guó)王能兌現(xiàn)他的許諾嗎?試編程計(jì)算舍罕王共要多少麥子賞賜他的宰相,這些麥子合多少立方米?(已知1立方米麥子約1.42e8粒)
總粒數(shù)為:sum=1+2+22+23+…+263
例4.11方法1#defineCONST1.42e8#include<stdio.h>#include<math.h>main(){
intn;
doubleterm,sum=0;/*累加求和變量賦初值*/
for(n=1;n<=64;n++){
term=pow(2,n-1);
/*根據(jù)累加項(xiàng)的規(guī)律計(jì)算累加項(xiàng)
*/sum=sum+term;/*作累加運(yùn)算*/}
printf("sum=%e\n",sum);/*打印總麥粒數(shù)*/
printf("volum=%e\n",sum/CONST);/*折合總麥粒體積數(shù)*/}
例4.11方法2#defineCONST1.42e8#include<stdio.h>main(){
intn;
doubleterm=1,sum=1;/*累乘求積累加求和變量賦初值*/
for(n=2;n<=64;n++){
term=term*2;/*根據(jù)后項(xiàng)總是前項(xiàng)的2倍計(jì)算累加項(xiàng)*/sum=sum+term;/*作累加運(yùn)算*/}
printf("sum=%e\n",sum);/*打印總麥粒數(shù)*/
printf("volum=%e\n",sum/CONST);/*折合總麥粒體積數(shù)*/}
作業(yè)P143~152習(xí)題4.12,4.16,4.18嵌套循環(huán)使用嵌套的循環(huán)體時(shí),應(yīng)注意以下問(wèn)題
在嵌套的各層循環(huán)體中,使用復(fù)合語(yǔ)句(即用一對(duì)大花括號(hào)將循環(huán)體語(yǔ)句括起來(lái))保證邏輯上的正確性
內(nèi)層和外層循環(huán)控制變量不應(yīng)同名,以免造成混亂
嵌套的循環(huán)最好采用右縮進(jìn)格式書(shū)寫(xiě),以保證層次的清晰性
自己閱讀P278-283,代碼風(fēng)格問(wèn)題,網(wǎng)站上代碼規(guī)范的ppt循環(huán)嵌套不能交叉,即在一個(gè)循環(huán)體內(nèi)必須完整的包含著另一個(gè)循環(huán)
例4.14:打印乘法九九表
例4.14#include<stdio.h>main(){
intm,n;
for(m=1;m<10;m++) printf("%4d",m);/*打印表頭*/ printf("\n");
for(m=1;m<10;m++) printf("-"); printf("\n");
for
(m=1;m<10;m++)
{
for
(n=1;n<10;n++) { printf("%4d",m*n); } printf("\n"); }}例4.15:打印下三角乘法九九表
#include<stdio.h>main(){
intm,n;
for(m=1;m<10;m++) printf("%4d",m);/*打印表頭*/ printf("\n");
for(m=1;m<10;m++) printf("-"); printf("\n");
for
(m=1;m<10;m++)
{
for
(n=1;
n<=m;n++) { printf("%4d",m*n); } printf("\n"); }}例4.15例4.16:馬克思手稿中的趣味數(shù)學(xué)題有30個(gè)人,其中有男人、女人和小孩,在一家飯館里吃飯共花了50先令,每個(gè)男人各花3先令,每個(gè)女人各花2先令,每個(gè)小孩各花1先令,問(wèn)男人、女人和小孩各有幾人?
解方程組窮舉法例4.16方法1:
采用三重循環(huán)窮舉x,y,z的全部可能的組合
#include<stdio.h>main(){
intx,y,z;
printf("Man\tWomen\tChildern\n");
for(x=0;x<=30;x++)
for(y=0;y<=30;y++)
for(z=0;z<=30;z++)
if(x+y+z==30&&3*x+2*y+z==50)
printf("%3d\t%5d\t%8d\n",x,y,z);}
例4.16方法2:改進(jìn)算法
#include<stdio.h>
main(){
intx,y,z;
printf("Man\tWomen\tChildern\n");
for(x=0;x<=16;x++)
for(y=0;y<=25;y++){
z=30–x-y;
if(3*x+2*y+z==50)
printf("%3d\t%5d\t%8d\n",x,y,z);}}
作業(yè)P143~152習(xí)題4.20,4.21,4.22,4.25,4.27,4.28流程的轉(zhuǎn)移控制break語(yǔ)句continue語(yǔ)句goto語(yǔ)句break和continue對(duì)for、while、do-while循環(huán)進(jìn)行內(nèi)部手術(shù)break,退出一層循環(huán)或者switchcontinue,中斷此次循環(huán)體的執(zhí)行,開(kāi)始下一次break和continue少用為妙break和continue假假真真break表達(dá)式1表達(dá)式2循環(huán)語(yǔ)句的下一條語(yǔ)句循環(huán)語(yǔ)句的下一條語(yǔ)句假假真真
表達(dá)式1表達(dá)式2continue例4.17:?jiǎn)尾竭\(yùn)行演示break語(yǔ)句和continue語(yǔ)句的用法區(qū)別#include<stdio.h>main(){
inti,n;
for(i=1;i<=5;i++) { printf("Pleaseentern:"); scanf("%d",&n);
if(n<0)
break; printf("n=%d\n",n); } printf("Programisover!\n");}Pleaseentern:10↙n=10Pleaseentern:-10↙Programisover!例4.17:?jiǎn)尾竭\(yùn)行演示break語(yǔ)句和continue語(yǔ)句的用法區(qū)別#include<stdio.h>main(){
inti,n;
for(i=1;i<=5;i++) { printf("Pleaseentern:"); scanf("%d",&n);
if(n<0)
continue; printf("n=%d\n",n); } printf("Programisover!\n");}Pleaseentern:10↙n=10Pleaseentern:-10↙Pleaseentern:20↙n=20Pleaseentern:-20↙Pleaseentern:30↙n=30Programisover!標(biāo)號(hào)舉例error:goto舉例gotoerror;一般形式
goto語(yǔ)句標(biāo)號(hào);……
語(yǔ)句標(biāo)號(hào):……或語(yǔ)句標(biāo)號(hào):…………goto語(yǔ)句標(biāo)號(hào);goto與標(biāo)號(hào)(label)是goto的過(guò)錯(cuò)?還是程序員的過(guò)錯(cuò)?破壞了結(jié)構(gòu)化設(shè)計(jì)風(fēng)格容易帶來(lái)錯(cuò)誤隱患
gotonext;
intsum=0;/*被goto跳過(guò)*/…next:Evilgoto’s?MaybeNot…
凌波微步,未必摔跤現(xiàn)代觀點(diǎn)認(rèn)為:混亂根源不在goto,而在標(biāo)號(hào)任何程序都可以不用goto就實(shí)現(xiàn)其功能但在某些情況下,使用goto可以讓程序更清晰兩種適合使用goto的情況跳向共同的出口位置,進(jìn)行退出前的處理工作跳出多重循環(huán)的一條捷徑{…{…{…gotoerror;}}}使用goto的原則主張少用、慎用,而不是禁用保證使用之后,程序仍然是單入口,單出口不要使用一個(gè)以上的標(biāo)號(hào)不要用goto往回跳,要向下跳不要讓goto制造出永遠(yuǎn)不會(huì)被執(zhí)行的代碼其他流程轉(zhuǎn)移控制return語(yǔ)句將在第5章講解標(biāo)準(zhǔn)庫(kù)函數(shù)exit()
作用是終止整個(gè)程序的執(zhí)行,強(qiáng)制返回操作系統(tǒng)調(diào)用該函數(shù)需要嵌入頭文件<stdlib.h>例4.19:輸入一個(gè)整數(shù),判斷它是否是素?cái)?shù)
goto語(yǔ)句例4.19:方法1#include<math.h>main(){
intm,i,k;
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k;i++) {
if(m%i==0) {
printf("No!\n");
gotoend; } }
printf("Yes!\n");end:
printf("Programisover!\n");}Pleaseenteranumber:
6
Programisover!No!#include<math.h>main(){
intm,i,k;
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k;i++) {
if(m%i==0) {
printf("No!\n");
gotoend; } }
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)老院老人康復(fù)理療師福利待遇制度
- 體積單位間的進(jìn)率課件
- 《人力資源招聘測(cè)試》課件
- 2024年桶裝水配送與水質(zhì)檢測(cè)服務(wù)合同書(shū)3篇
- 房屋贈(zèng)與合同
- 2024年新型城鎮(zhèn)化項(xiàng)目施工工傷賠償與責(zé)任共擔(dān)合同2篇
- 2024年生豬銷售與養(yǎng)殖場(chǎng)市場(chǎng)營(yíng)銷策略合同3篇
- 2025年黔南駕校考試貨運(yùn)從業(yè)資格證考試
- 2025年沈陽(yáng)貨運(yùn)資格證考試答題20
- 2025年朝陽(yáng)從業(yè)資格證貨運(yùn)考試答案
- 中建基礎(chǔ)設(shè)施類物資驗(yàn)收作業(yè)指導(dǎo)手冊(cè)
- 2025屆高考語(yǔ)文復(fù)習(xí)之變換句式
- 期末復(fù)習(xí)(試題)-2024-2025學(xué)年人教PEP版英語(yǔ)六年級(jí)上冊(cè)
- 動(dòng)靜脈內(nèi)瘺狹窄
- 大數(shù)據(jù)分析師招聘面試題與參考回答(某大型國(guó)企)
- 數(shù)學(xué)四年級(jí)上冊(cè)《角的分類》同步練習(xí)題(含答案)
- 山東省淄博市2023-2024學(xué)年七年級(jí)上學(xué)期期末數(shù)學(xué)試題(含答案)
- 2024中國(guó)雄安集團(tuán)限公司招聘45人高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 天翼云從業(yè)者認(rèn)證考試題庫(kù)及答案
- 四年級(jí)數(shù)學(xué)(除數(shù)是兩位數(shù))計(jì)算題專項(xiàng)練習(xí)及答案
- 健身數(shù)據(jù)隱私和安全
評(píng)論
0/150
提交評(píng)論