C語言教程第4章程序的控制結構課件_第1頁
C語言教程第4章程序的控制結構課件_第2頁
C語言教程第4章程序的控制結構課件_第3頁
C語言教程第4章程序的控制結構課件_第4頁
C語言教程第4章程序的控制結構課件_第5頁
已閱讀5頁,還剩77頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第4章

程序的控制結構6/4/20231第4章程序的控制結構本章主要教學內容

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

有效性

沒有輸入或有多個輸入

有一個或多個輸出

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

偽代碼表示6/4/20235構成程序的三種基本結構順序結構選擇結構(分支結構)循環結構已經證明,任何程序均可只用這三種結構綜合描述只用這三種結構編制的程序,叫結構化程序程序必須符合結構化規則6/4/20236結構化程序設計的核心思想采用順序、選擇和循環三種基本結構作為程序設計的基本單元只有一個入口;只有一個出口;無死語句,即不存在永遠都執行不到的語句;無死循環,即不存在永遠都執行不完的循環。采用“自頂向下、逐步求精”和模塊化的方法進行結構化程序設計6/4/202374.2順序結構BANS圖傳統流程圖BA6/4/20238順序結構——應用舉例(1)例:設半徑為1.5,求圓周長及面積。解:(1)問題分析:(算法)

step1:給出圓的半徑r=1.5step2:求圓的周長及面積step3:輸出結果公式:圓周長=2*3.14*r圓面積=3.14*r*r6/4/20239開始r=1.5L=2*3.14*rs=3.14*r*r

輸出L,s結束(2)畫出流程圖6/4/202310#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)根據流程圖編程6/4/202311順序結構——應用舉例(2)例4.1

設銀行存款利率rate為2.25%,存款期為n年,本金為captial元,編程計算n年后的本利之和deposit解:(1)問題分析:(算法)

step2:給出年n、本金captial(鍵盤輸入)step3:n年后本利之和depositstep4:輸出結果公式:deposit=captial*(1+rate)n

step1:給出存款利率rate6/4/202312開始rate=0.0225輸入n和captialdepoist=captial*(1+rate)n

輸出depoist結束(2)畫出流程圖6/4/202313(3)根據流程圖編程#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);}6/4/202314以#開始的編譯預處理命令

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

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

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

C子目錄。6/4/202317常用函數對應的頭文件函數頭文件名數學函數math.h字符串函數string.h輸入、輸出函數stdio.h動態存儲分配函數stdlib.h/malloc.h6/4/2023184.3選擇結構作用:根據條件控制程序流向。條件的組成:問題的提出:各種類型的常量、變量、表達式(常用:關系/邏輯表達式)注意各種表達式的用法6/4/202319簡單分支選擇(單分支)結構yesno語句A條件成立否條件表達式.T..F.語句格式:

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

語句2/語句組2;6/4/202321多分支選擇結構表達式語句1TF語句2表達式表達式語句3語句4TTFF表達式1語句1TF語句2表達式2表達式3語句3語句4TTFF6/4/202322多分支選擇結構

if(表達式)語句1;

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

elseif(表達式m)語句m;

else語句n;一般形式:6/4/202323分支嵌套

if(表達式1)

if(表達式2)語句1;

else語句2;

else

if(表達式3)語句3;

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

例4.56/4/202326例:計算并輸出下列分段函數值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);}6/4/202327用switch語句構成的多分支結構多路選擇switch

(表達式)

{

case

常數1:

語句序列1;

case

常數2:

語句序列2;

…………

default:

語句序列3;

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

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

while(表達式)

{

語句;}只要表達式的值為非0,就重復執行語句,直到表達式值為0時止先判斷,后執行6/4/202333例:找出100以內的奇數。

main(){

int

I=1;

while(I<=100)

{printf("%d",I);

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

{

語句;

}while

(表達式);首先執行語句,然后判斷表達式的值。如果表達式為0,繼續向下執行,否則,再次執行語句,再次判斷表達式的值語句會被至少執行一次6/4/202335例:找出100以內的奇數。

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);}6/4/202336循環語句——for一般形式:for(表達式1;表達式2;表達式3)

{

語句;}表達式2執行循環體計算表達式1的值計算表達式3的值跳出循環TF工作過程:6/4/202337有關for的說明(1)

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

{

語句;}相當于:

表達式1;

while

(表達式2){

語句;

表達式3;

}6/4/202338在for和while語句之后一般沒有分號有分號表示循環體就是分號之前的內容(空循環體)while(i<100);

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

printf("%d",i);for通常有一個循環變量控制循環的次數,不要在循環體內改變這個變量有關for的說明(2)6/4/202339

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

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

如:for(;i<=5;)有關for的說明(3)6/4/202340main(){floatx,sum;while(x!=9999){if(x<0.0)sum+=x;

printf("\nsum=%f",sum);

scanf("%f",&x);}scanf("%f",&x);}例:給定一組數據如下,編程對負數求和。12,45,67.8,-12.5,-35.67,567.89方法1:用while6/4/202341例:給定一組數據如下,編程對負數求和。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;}{6/4/202342選擇三種循環的一般原則如果循環次數已知,用for如果循環次數未知,用while如果循環體至少要執行一次,用do-while這只是“一般”原則,不是“原則”6/4/202343

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

猜數游戲:先由計算機“想”一個1到100之間的數請人猜,如果人猜對了,則結束游戲,否則計算機給出提示,告訴人所猜的數是太大還是太小,直到人猜對為止。計算機記錄人猜的次數,以此來反映猜數者“猜”的水平。(ex49)例4.9運行程序發現問題每次運行程序,機器所想的數都是一樣的;用函數rand所產生的隨機數只是偽隨機數。6/4/202346猜數游戲用到的庫函數(2)隨機函數srand為函數rand()設置隨機數種子來實現對函數rand所產生的偽隨機數的“隨機化”通過鍵入隨機數種子,產生[0,100]之間的隨機數scanf("%u",&seed);srand(seed);magic=rand()%100+1;改進例4.9(ex49_1)6/4/202347猜數游戲用到的庫函數(3)隨機函數srand:為函數rand()設置隨機數種子來實現對其產生的偽隨機數的“隨機化”使用計算機讀取其時鐘值并把該值自動設置為隨機數種子,產生[0,100]之間的隨機數函數time()返回以秒計算的當前時間值,該值被轉換為無符號整數并用作隨機數發生器的種子#include<time.h>srand(time(NULL));magic=rand()%100+1;再改進例4.9(ex49_2)6/4/202348永遠不會退出的循環為死循環for(;;){}while(1){}do

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

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

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

總粒數為:sum=1+2+22+23+…+263

6/4/202350#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);

/*根據累加項的規律計算累加項

*/

sum=sum+term;

/*作累加運算*/

}

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

printf("volum=%e\n",sum/CONST);/*打印折合的總麥粒體積數*/}方法16/4/202351方法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;/*根據后項總是前項的2倍計算累加項*/

sum=sum+term;

/*作累加運算*/

}

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

/*打印總麥粒數*/

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

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

內層和外層循環控制變量不應同名,以免造成混亂

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

循環嵌套不能交叉,即在一個循環體內必須完整的包含著另一個循環

6/4/202354合法的嵌套循環6/4/202355例4.14編程輸出如下形式的九九表6/4/202356#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.146/4/202357例4.15將上例輸出格式改變成下三角格式打印6/4/202358#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.156/4/202359例4.16馬克思手稿中有一道趣味數學題:有30個人,其中有男人、女人和小孩,在一家飯館里吃飯共花了50先令,每個男人各花3先令,每個女人各花2先令,每個小孩各花1先令,問男人、女人和小孩各有幾人?

解方程組窮舉法6/4/202360方法1:窮舉x,y,z的所有組合#include<stdio.h>main(){

int

x,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);}

6/4/202361方法2:改進算法#include<stdio.h>

main(){

int

x,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);}}

6/4/2023624.5流程的轉移控制goto語句break語句continue語句return語句標準庫函數exit()

6/4/202363goto

語句一般形式

goto

語句標號;……

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

goto

語句標號;功能:無條件轉去執行語句標號所指語句行。6/4/202364(1)語句標號用標識符表示。(2)語句標號一定為函數段中存在的。(3)該語句不可濫用。使用goto

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

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

語句的原則6/4/202366break

與continue

語句

break語句的作用:循環中使用break語句可提前結束整個循環。

continue語句的作用:循環中使用continue語句可提前結束本次循環6/4/202367break

與continue

語句示意圖假假真真break表達式1表達式2循環語句的下一條語句循環語句的下一條語句假假真真

contiue表達式1表達式2continue6/4/202368有關break

與continue的說明(1)break語句可用于switch結構,也可用于循環中;(2)continue語句僅用于循環中;(3)break與continue均只影響包含它的結構中;(4)break與continue少用為妙;6/4/202369#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("現在r=%d\n",r);}例6/4/202370例#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);}}6/4/202371Exit()

函數exit(0)作用是終止整個程序的執行,強制返回操作系統

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

溫馨提示

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

評論

0/150

提交評論