程序的控制結構_第1頁
程序的控制結構_第2頁
程序的控制結構_第3頁
程序的控制結構_第4頁
程序的控制結構_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2023/9/11第4章程序的控制結構本章主要教學內(nèi)容

算法的描述方法基本控制結構及基本控制語句常用算法程序的基本版式結構化程序設計的基本思想程序測試與改錯2023/9/124.1算法的概念及其描述數(shù)據(jù)結構+算法=程序算法:為解決一個具體問題而采取的確定的有限的操作步驟。算法特性:有窮性確定性

有效性

沒有輸入或有多個輸入

有一個或多個輸出

2023/9/13算法的分類數(shù)值運算算法:解決的是求數(shù)值解的問題,例如用輾轉(zhuǎn)相除法求兩個數(shù)的最大公約數(shù)等非數(shù)值運算算法:主要用于解決需要用分析推理、邏輯推理才能解決的問題,例如人工智能中的許多問題,查找、分類等問題2023/9/14算法的描述方法自然語言表示傳統(tǒng)的流程圖表示N-S結構化流程圖表示

偽代碼表示2023/9/15構成程序的三種基本結構順序結構選擇結構(分支結構)循環(huán)結構已經(jīng)證明,任何程序均可只用這三種結構綜合描述只用這三種結構編制的程序,叫結構化程序程序必須符合結構化規(guī)則2023/9/16結構化程序設計的核心思想采用順序、選擇和循環(huán)三種基本結構作為程序設計的基本單元只有一個入口;只有一個出口;無死語句,即不存在永遠都執(zhí)行不到的語句;無死循環(huán),即不存在永遠都執(zhí)行不完的循環(huán)。采用“自頂向下、逐步求精”和模塊化的方法進行結構化程序設計2023/9/174.2順序結構BANS圖傳統(tǒng)流程圖BA2023/9/18順序結構——應用舉例(1)例:設半徑為1.5,求圓周長及面積。解:(1)問題分析:(算法)step1:給出圓的半徑r=1.5step2:求圓的周長及面積step3:輸出結果公式:圓周長=2*3.14*r圓面積=3.14*r*r2023/9/19開始r=1.5L=2*3.14*rs=3.14*r*r

輸出L,s結束(2)畫出流程圖2023/9/110#include<stdio.h>#definePI3.14main(){floatr,l,s;r=1.5;l=2*PI*r;s=PI*r*r;printf("\nl=%f,s=%f",l,s);}(3)根據(jù)流程圖編程2023/9/111順序結構——應用舉例(2)例4.1

設銀行存款利率rate為2.25%,存款期為n年,本金為captial元,編程計算n年后的本利之和deposit解:(1)問題分析:(算法)step2:給出年n、本金captial(鍵盤輸入)step3:n年后本利之和depositstep4:輸出結果公式:deposit=captial*(1+rate)nstep1:給出存款利率rate2023/9/112開始rate=0.0225輸入n和captialdepoist=captial*(1+rate)n

輸出depoist結束(2)畫出流程圖2023/9/113(3)根據(jù)流程圖編程#include<math.h>#include<stdio.h>main(){

intn;doublerate=0.0225;

doublecapital,deposit;

printf("pleaseenteryear,capital:");scanf("%d%lf",&n,&capital);deposit=capital*pow(1+rate,n);

printf("deposit=%lf\n",deposit);}2023/9/114以#開始的編譯預處理命令

main(){局部變量說明語句;

執(zhí)行語句;}簡單的C程序結構框架2023/9/115編譯預處理命令文件包含編譯預處理命令#include指示編譯系統(tǒng)將一個源文件嵌入到含有#include指令的源文件中該指令所在的位置處。使用形式:#include<頭文件名>/"頭文件名"注意:以#開頭;每條一行;不是C語句2023/9/116查詢情況編譯預處理命令(1)用<>將頭文件名括起,則在include子目錄中查詢(2)用"

"將頭文件名括起,則先在當前目錄中查找若無繼續(xù)搜索

C子目錄。2023/9/117常用函數(shù)對應的頭文件

函數(shù)頭文件名數(shù)學函數(shù)math.h字符串函數(shù)string.h輸入、輸出函數(shù)stdio.h動態(tài)存儲分配函數(shù)stdlib.h/malloc.h2023/9/1184.3選擇結構作用:根據(jù)條件控制程序流向。條件的組成:問題的提出:各種類型的常量、變量、表達式(常用:關系/邏輯表達式)注意各種表達式的用法2023/9/119簡單分支選擇(單分支)結構yesno語句A條件成立否條件表達式.T..F.語句格式:

if(表達式)語句/語句組;2023/9/120雙分支選擇結構yesno程序段A程序段B條件成立否條件表達式.T..F.語句1語句2格式:If(表達式)語句1/語句組1;else

語句2/語句組2;2023/9/121多分支選擇結構表達式語句1TF語句2表達式表達式語句3語句4TTFF表達式1語句1TF語句2表達式2表達式3語句3語句4TTFF2023/9/122多分支選擇結構

if(表達式)語句1;

elseif(表達式2)語句2;:

elseif(表達式m)語句m;

else語句n;一般形式:2023/9/123分支嵌套

if(表達式1)

if(表達式2)語句1;

else語句2;

else

if(表達式3)語句3;

else語句4;一般形式:2023/9/124使用if語句需注意事項(1)條件判斷表達式一定用圓括號括起。(2)復合語句必須用{}引起。(3)每一個else必須與一個if項匹配。(4)else總是與離它最近的if相匹配。2023/9/125體型判斷。按“體指數(shù)”對肥胖程度進行劃分:體指數(shù)t=體重w/(身高h)2(w單位為公斤,h單位為米)當t<18時,為低體重;當t介于18和25之間時,為正常體重;當t介于25和27之間時,為超重體重;當t>=27時,為肥胖。編程從鍵盤輸入你的身高h和體重w,根據(jù)給定公式計算體指數(shù)t,然后判斷你的體重屬于何種類型。用3種方法編程:算法1:用不帶else子句的if語句編程(ex45_1)算法2:用在if子句中嵌入if語句的形式編程(ex45_2)算法3:用在else子句中嵌入if語句的形式編程(ex45_3)

例4.52023/9/126例:計算并輸出下列分段函數(shù)值y=0x01x>0#include<stdio.h>main(){floatx,y;printf("inputx:");scanf("%f",&x);

y=0;if(x>0)y=1;printf("y=%f\n",y);}2023/9/127用switch語句構成的多分支結構多路選擇switch

(表達式)

{

case

常數(shù)1:

語句序列1;

case

常數(shù)2:

語句序列2;

…………

default:

語句序列3;

}default可以沒有,但最好不省略不要忘記break2023/9/128例4.8編程設計一個簡單的計算器程序。(ex48)要求根據(jù)用戶從鍵盤輸入的表達式:

操作數(shù)1運算符op操作數(shù)2計算表達式的值,指定的運算符為加(+)、減(-)、乘(*)、除(/)2023/9/129使用switch語句應注意(1)各常量表達式的值不可相同。(2)case后可有多個語句,不用{}括起。(3)常量表達式僅是一個語句標號。(4)各case及default子句的順序可隨意。(5)每個分支執(zhí)行后,利用break語句跳出。2023/9/1304.4循環(huán)結構引入循環(huán)的目的:簡化程序、提高編程效率三種循環(huán)方式當型循環(huán)直到型循環(huán)步長型循環(huán)2023/9/131循環(huán)結構的流程圖條件PA當型循環(huán)直到循環(huán)真假假條件PA假真假條件P條件PA假2023/9/132循環(huán)語句——while一般形式:

while(表達式)

{

語句;}只要表達式的值為非0,就重復執(zhí)行語句,直到表達式值為0時止先判斷,后執(zhí)行2023/9/133例:找出100以內(nèi)的奇數(shù)。

main(){int

I=1;

while(I<=100)

{printf("%d",I);

I+=2;}}注意:(1)while構成的是“當型”循環(huán)。(2)循環(huán)體中一定有對于循環(huán)控制變量的操作。2023/9/134循環(huán)語句——do-while一般形式:do

{

語句;

}while

(表達式);首先執(zhí)行語句,然后判斷表達式的值。如果表達式為0,繼續(xù)向下執(zhí)行,否則,再次執(zhí)行語句,再次判斷表達式的值語句會被至少執(zhí)行一次2023/9/135例:找出100以內(nèi)的奇數(shù)。

main(){int

I=1;

while(I<=100)

{printf("%d",I);

I+=2;}}

main(){int

I=1;

do

{printf("%d",I);

I+=2;}

while(I<=100);}2023/9/136循環(huán)語句——for一般形式:for(表達式1;表達式2;表達式3)

{

語句;}表達式2執(zhí)行循環(huán)體計算表達式1的值計算表達式3的值跳出循環(huán)TF工作過程:2023/9/137有關for的說明(1)

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

{

語句;}相當于:

表達式1;

while

(表達式2){

語句;

表達式3;

}2023/9/138在for和while語句之后一般沒有分號有分號表示循環(huán)體就是分號之前的內(nèi)容(空循環(huán)體)while(i<100);

i++;for(i=0;i<100;i++);

printf("%d",i);for通常有一個循環(huán)變量控制循環(huán)的次數(shù),不要在循環(huán)體內(nèi)改變這個變量有關for的說明(2)2023/9/139

for語句中的表達式1、表達式3可為逗號表達式。

如:for(i=0,j=1;j<n&&i<n;i++,j++)表達式1和表達式3可以沒有或者是用逗號分隔的多個表達式的組合。

如:for(;i<=5;)有關for的說明(3)2023/9/140main(){floatx,sum;while(x!=9999){if(x<0.0)sum+=x;printf("\nsum=%f",sum);scanf("%f",&x);}scanf("%f",&x);}例:給定一組數(shù)據(jù)如下,編程對負數(shù)求和。12,45,67.8,-12.5,-35.67,567.89方法1:用while2023/9/141例:給定一組數(shù)據(jù)如下,編程對負數(shù)求和。12,45,67.8,-12.5,-35.67,567.89方法2:用formain()floatx,sum=0;for(i=1;i<=6;i++)if(x<0.0)sum+=x;}{scanf("%f",&x);printf("\nsum=%f",sum);inti;}{2023/9/142選擇三種循環(huán)的一般原則如果循環(huán)次數(shù)已知,用for如果循環(huán)次數(shù)未知,用while如果循環(huán)體至少要執(zhí)行一次,用do-while這只是“一般”原則,不是“原則”2023/9/143

猜數(shù)游戲:先由計算機“想”一個數(shù)請人猜,如果人猜對了,則計算機給出提示:“Right!”,否則提示:“Wrong!”,并告訴人所猜的數(shù)是大還是小。(ex46)例4.6分析:Step1:計算機想一個數(shù);Step2:人猜一個數(shù);Step3:判斷三種情況并給出相應結果。2023/9/144猜數(shù)游戲用到的庫函數(shù)(1)隨機函數(shù)rand()#include<stdlib.h>RAND_MAX在stdlib.h中定義,不大于雙字節(jié)整數(shù)的最大值32767產(chǎn)生[0,RAND_MAX]之間的隨機數(shù)magic=rand();產(chǎn)生[0,b-1]之間的隨機數(shù)magic=rand()%b;產(chǎn)生[a,a+b-1]之間的隨機數(shù)magic=rand()%b+a;2023/9/145

猜數(shù)游戲:先由計算機“想”一個1到100之間的數(shù)請人猜,如果人猜對了,則結束游戲,否則計算機給出提示,告訴人所猜的數(shù)是太大還是太小,直到人猜對為止。計算機記錄人猜的次數(shù),以此來反映猜數(shù)者“猜”的水平。(ex49)例4.9運行程序發(fā)現(xiàn)問題每次運行程序,機器所想的數(shù)都是一樣的;用函數(shù)rand所產(chǎn)生的隨機數(shù)只是偽隨機數(shù)。2023/9/146猜數(shù)游戲用到的庫函數(shù)(2)隨機函數(shù)srand為函數(shù)rand()設置隨機數(shù)種子來實現(xiàn)對函數(shù)rand所產(chǎn)生的偽隨機數(shù)的

“隨機化”

通過鍵入隨機數(shù)種子,產(chǎn)生[0,100]之間的隨機數(shù)scanf("%u",&seed);srand(seed);magic=rand()%100+1;改進例4.9(ex49_1)2023/9/147猜數(shù)游戲用到的庫函數(shù)(3)隨機函數(shù)srand:為函數(shù)rand()設置隨機數(shù)種子來實現(xiàn)對其產(chǎn)生的偽隨機數(shù)的“隨機化”

使用計算機讀取其時鐘值并把該值自動設置為隨機數(shù)種子,產(chǎn)生[0,100]之間的隨機數(shù)函數(shù)time()返回以秒計算的當前時間值,該值被轉(zhuǎn)換為無符號整數(shù)并用作隨機數(shù)發(fā)生器的種子#include<time.h>srand(time(NULL));magic=rand()%100+1;再改進例4.9(ex49_2)2023/9/148永遠不會退出的循環(huán)為死循環(huán)for(;;){}while(1){}do

{}while(1);一般情況下,要極力避免死循環(huán)絕大多數(shù)程序不需要死循環(huán)。如果出現(xiàn),往往都是bug時間過長的循環(huán)會造成“假死”效果,也要考慮解決死循環(huán)2023/9/149例4.11國王的許諾相傳國際象棋是古印度舍罕王的宰相達依爾發(fā)明的。舍罕王十分喜歡象棋,決定讓宰相自己選擇何種賞賜。位聰明的宰相指著8×8共64格的象棋盤說:陛下,請您賞給我一些麥子吧,就在棋盤的第一個格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盤上的64個格子,我就感恩不盡了舍罕王讓人扛來一袋麥子,他要兌現(xiàn)他的許諾。

國王能兌現(xiàn)他的許諾嗎?試編程計算舍罕王共要多少麥子賞賜他的宰相,這些麥子合多少立方米?

(已知1立方米麥子約1.42e8粒)

總粒數(shù)為:sum=1+2+22+23+…+263

2023/9/150#defineCONST1.42e8#include<stdio.h>#include<math.h>main(){

int

n;

double

term,sum=0;

/*累加求和變量賦初值*/

for

(n=1;n<=64;n++)

{

term=

pow(2,n-1);

/*根據(jù)累加項的規(guī)律計算累加項

*/

sum=sum+term;

/*作累加運算*/

}

printf("sum=%e\n",sum);/*打印總麥粒數(shù)*/

printf("volum=%e\n",sum/CONST);/*打印折合的總麥粒體積數(shù)*/}方法12023/9/151方法2#defineCONST1.42e8/*定義符號常量CONST值為1.42e8*/#include<stdio.h>main(){

int

n;

double

term=1,sum=1;/*累乘求積、累加求和變量賦初值*/

for

(n=2;n<=64;n++)

{

term=term*2;/*根據(jù)后項總是前項的2倍計算累加項*/

sum=sum+term;

/*作累加運算*/

}

printf("sum=%e\n",sum);

/*打印總麥粒數(shù)*/

printf("volum=%e\n",sum/CONST);/*打印折合的總麥粒體積數(shù)*/}

2023/9/152循環(huán)嵌套結構形式for(){:while(){:do{:}while();}}2023/9/153使用嵌套的循環(huán)時,應注意的問題在嵌套的各層循環(huán)體中,使用復合語句(即用一對大花括號將循環(huán)體語句括起來)保證邏輯上的正確性

內(nèi)層和外層循環(huán)控制變量不應同名,以免造成混亂

嵌套的循環(huán)最好采用右縮進格式書寫,以保證層次的清晰性

循環(huán)嵌套不能交叉,即在一個循環(huán)體內(nèi)必須完整的包含著另一個循環(huán)

2023/9/154合法的嵌套循環(huán)2023/9/155例4.14編程輸出如下形式的九九表2023/9/156#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.142023/9/157例4.15將上例輸出格式改變成下三角格式打印2023/9/158#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.152023/9/159例4.16馬克思手稿中有一道趣味數(shù)學題:有30個人,其中有男人、女人和小孩,在一家飯館里吃飯共花了50先令,每個男人各花3先令,每個女人各花2先令,每個小孩各花1先令,問男人、女人和小孩各有幾人?

解方程組窮舉法2023/9/160方法1:窮舉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);}

2023/9/161方法2:改進算法#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);}}

2023/9/1624.5流程的轉(zhuǎn)移控制goto語句break語句continue語句return語句標準庫函數(shù)exit()

2023/9/163goto

語句一般形式

goto語句標號;

……

語句標號:……或語句標號:……

……goto語句標號;功能:無條件轉(zhuǎn)去執(zhí)行語句標號所指語句行。2023/9/164(1)語句標號用標識符表示。(2)語句標號一定為函數(shù)段中存在的。(3)該語句不可濫用。使用goto

語句要注意標號舉例error:goto舉例goto

error;不能用整數(shù)作語句標號2023/9/165使用之后,程序仍然是單入口,單出口不要使用一個以上的標號不要用goto往回跳,要向下跳不要讓goto制造出永遠不會被執(zhí)行的代碼使用goto

語句的原則2023/9/166break

與continue

語句

break語句的作用:循環(huán)中使用break語句可提前結束整個循環(huán)。

continue語句的作用:循環(huán)中使用continue語句可提前結束本次循環(huán)2023/9/167break

與continue

語句示意圖假假真真break表達式1表達式2循環(huán)語句的下一條語句循環(huán)語句的下一條語句假假真真contiue表達式1表達式2continue2023/9/168有關break

與continue的說明(1)break語句可用于switch結構,也可用于循環(huán)中;(2)continue語句僅用于循環(huán)中;(3)break與continue均只影響包含它的結構中;(4)break與continue少用為妙;2023/9/169#include<stdio.h>#definePI3.14main(){intr;floatarea;for(r=1;r<=10;r++){

area=PI*r*r;if(area>50.0)

break;printf("面積等于%f\n",area);

}printf("現(xiàn)在r=%d\n",r);}例2023/9/170例#include<stdio.h>#definePI3.14main(){intr;floatarea;for(r=1;r<=10;r++){area=PI*r*r;if(area<50.0)

continue;printf("面積等于%f\n",area);}}2023/9/171Exit()

函數(shù)exit(0)作用是終止整個程序的執(zhí)行,強制返回操作系統(tǒng)

調(diào)用該函數(shù)需要嵌入頭文件<stdlib.h>2023/9/172例4.19從鍵盤任意輸入一個正整數(shù),編程判斷它是否是素數(shù),若是素數(shù),輸出“Yes!”;否則,輸出“No!”問題分析:概念:素數(shù)是指除了能被1和它本身整除外,不能被其他任何整數(shù)整除的數(shù);判斷素數(shù)的方法:把m作為被除數(shù),把i=2~(m-1)依次做為除數(shù),若余數(shù)都不為0,則說明是素數(shù)。簡單判斷方法:只需用2~的數(shù)去除m,即可得到正確的判定結果。2023/9/173#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!方法1:用goto2023/9/174方法1:用goto#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:

5

Programisover!Yes!2023/9/175#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)

break;

}

if(i>k)

printf("Yes!\n");

else

printf("No!\n");

printf("Programisover!\n");}Pleaseenteranumber:

6

Programisover!No!方法2:用break2

溫馨提示

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

評論

0/150

提交評論