C語言程序設(shè)計(jì)實(shí)例教程課件:程序控制結(jié)構(gòu)_第1頁
C語言程序設(shè)計(jì)實(shí)例教程課件:程序控制結(jié)構(gòu)_第2頁
C語言程序設(shè)計(jì)實(shí)例教程課件:程序控制結(jié)構(gòu)_第3頁
C語言程序設(shè)計(jì)實(shí)例教程課件:程序控制結(jié)構(gòu)_第4頁
C語言程序設(shè)計(jì)實(shí)例教程課件:程序控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

程序控制結(jié)構(gòu)程序的基本結(jié)構(gòu)3.1語句3.2順序結(jié)構(gòu)3.3選擇結(jié)構(gòu)3.4循環(huán)結(jié)構(gòu)3.5結(jié)構(gòu)化程序設(shè)計(jì)方法3.63.1程序的基本結(jié)構(gòu)人們從程序設(shè)計(jì)實(shí)踐中總結(jié)出程序的三種基本結(jié)構(gòu),即順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。3.2語句程序的執(zhí)行部分是由語句構(gòu)成的。執(zhí)行語句的過程就是實(shí)現(xiàn)程序功能的過程。語句是C語言的基本執(zhí)行單位。C語言的語句主要有聲明語句、表達(dá)式語句、賦值語句、復(fù)合語句、控制語句、空語句等。3.2.1聲明語句聲明語句主要用來說明合法標(biāo)識(shí)符,以便能在程序中合法使用它們。在C語言程序設(shè)計(jì)中,任何用戶自定義的函數(shù)、變量和符號(hào)常量都必須遵循先聲明后使用的原則。聲明語句的語法格式如下:數(shù)據(jù)類型符用戶標(biāo)識(shí)符;3.2.2表達(dá)式語句由表達(dá)式組成的語句稱為表達(dá)式語句。表達(dá)式語句是最簡(jiǎn)單的可執(zhí)行語句,由一個(gè)表達(dá)式后面加上分號(hào)“;”構(gòu)成。表達(dá)式語句的語法格式如下:表達(dá)式;任何表達(dá)式都可以加上分號(hào)“;”構(gòu)成表達(dá)式語句,應(yīng)該注意分號(hào)是表達(dá)式語句中不可缺少的一部分。3.2.3復(fù)合語句復(fù)合語句是用一對(duì){}把多個(gè)語句組成在一起構(gòu)成的,又稱分程序或語句塊。復(fù)合語句的形式為:{語句1;

語句2; ...

語句n;}在語法上將復(fù)合語句看成是單條語句,即看作是一個(gè)語句。復(fù)合語句具有組合多個(gè)子語句的能力,使程序具有模塊化結(jié)構(gòu)。3.2.4控制語句控制語句是用于控制程序流程的語句,一般指那些可改變順序結(jié)構(gòu)的語句。C語言的流程控制語句可分為三類:條件判斷語句:if、switch循環(huán)執(zhí)行語句:while、do-while、for流程轉(zhuǎn)向語句:break、continue、return3.2.5空語句僅由一個(gè)分號(hào)“;”組成的語句稱為空語句??照Z句不執(zhí)行任何操作。空語句的作用如下:1.在循環(huán)語句中提供一個(gè)不執(zhí)行任何操作的空循環(huán)體。2.為有關(guān)語句提供標(biāo)號(hào),用以說明程序執(zhí)行的位置。3.3順序結(jié)構(gòu)順序結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計(jì)中最簡(jiǎn)單、最常見的一種程序結(jié)構(gòu)。在順序結(jié)構(gòu)中,從第一條語句到最后一條語句完全按先后次序順序執(zhí)行。

3.3順序結(jié)構(gòu)【例3.1】從鍵盤輸入圓半徑,輸出圓面積(圓周率3.14,計(jì)算結(jié)果保留小數(shù)點(diǎn)后兩位)。#include<stdio.h>voidmain(){doubler,area;//聲明實(shí)型變量r,areaprintf("Pleaseinputr\n");//提示輸入變量r的值scanf("%lf",&r);//通過鍵盤輸入r值area=3.14*r*r;//通過圓面積公式計(jì)算圓面積,//并將計(jì)算結(jié)果賦給變量areaprintf("area=%.2f\n",area);//輸出area的值}【例3.2】交換兩個(gè)數(shù)的值并輸出#include<stdio.h>voidmain(){inta,b,temp;//聲明整型變量a、b、tempprintf("Inputa=");//提示輸入變量a的值scanf("%d",&a);//輸入變量a的值printf("Inputb=");//提示輸入變量b的值scanf("%d",&b);//通過鍵盤輸入b值temp=a;//先把a(bǔ)的值放入temp中a=b;//把b的值放入a中b=temp;//把temp中的值放入b中printf("a=%d,b=%d\n",a,b);//輸出交換后a和b中的值}3.4選擇結(jié)構(gòu)3.4.1if語句if語句是用來判定所給定的條件是否滿足,根據(jù)對(duì)給定條件的判定結(jié)果(真或假)決定執(zhí)行給出某種操作。在C語言中if語句有三種形式:if形式、if-else形式和else-if形式。1.單分支結(jié)構(gòu)if語句單分支結(jié)構(gòu)的語法格式為:if(表達(dá)式){語句;}

【例3.3】將a,b的值從小到大輸出#include<stdio.h>voidmain(){inta,b,temp;//聲明整型變量a、b、tempprintf("Inputa=");//提示輸入變量a的值scanf("%d",&a);//輸入變量a的值printf("Inputb=");//提示輸入變量b的值scanf("%d",&b);//通過鍵盤輸入b的值if(a>b)//判斷條件是否成立{temp=a;//先把a(bǔ)的值放入temp中a=b;//把b的值放入a中b=temp;//把temp中的值放入b中}printf("%d,%d\n",a,b);//按值從小到大輸出}2.雙分支結(jié)構(gòu)if-else語句單分支結(jié)構(gòu)的語法格式為:if(表達(dá)式){語句(復(fù)合語句)1;}else{語句(復(fù)合語句)2;}【例3.4】輸出a,b中的最大值#include<stdio.h>voidmain(){inta,b;//聲明整型變量a、bprintf("Inputa=");//提示輸入變量a的值scanf("%d",&a);//輸入變量a的值printf("Inputb=");//提示輸入變量b的值scanf("%d",&b);//通過鍵盤輸入b值if(a>b)//判斷條件a>b條件是否成立printf("較大數(shù)是%d\n",a);//這里只有一條語句,可省略{}elseprintf("較大數(shù)是%d\n",b);//a>b條件不成立,輸出b的值}3.多分支結(jié)構(gòu)在現(xiàn)實(shí)中遇到的情況可能有多個(gè)分支,當(dāng)有多個(gè)分支時(shí),可以用elseif語句,其語法格式為:if(表達(dá)式1){語句(復(fù)合語句)1;}elseif(表達(dá)式2){語句(復(fù)合語句)2;}elseif(表達(dá)式3){語句(復(fù)合語句)3;}……elseif(表達(dá)式n){語句(復(fù)合語句)n;}else{語句(復(fù)合語句)n+1;}多分支結(jié)構(gòu)流程圖【例3.5】輸入百分制成績(jī),輸出對(duì)應(yīng)成績(jī)等級(jí)#include<stdio.h>voidmain(){intscore;//聲明整型變量scoreprintf("Pleaseinputscore:");//提示輸入分?jǐn)?shù)成績(jī)scanf("%d",&score);//從鍵盤輸入變量score的值if(score>=90)//判斷score是否屬于等級(jí)Aprintf("A\n");//只有一條語句,可省略{}elseif(score>=80)//判斷score是否屬于等級(jí)Bprintf("B\n");elseif(score>=70)//判斷score是否屬于等級(jí)Cprintf("C\n");elseif(score>=60)//判斷score是否屬于等級(jí)Dprintf("D\n");else//以上所有表達(dá)式的值均為假printf("E\n");//輸出E}4.if語句的嵌套在if語句中又包含一個(gè)或多個(gè)if語句稱為if語句的嵌套。if語句嵌套的目的是解決多路分支問題。if嵌套語句的一般形式如下:if(表達(dá)式1){if(表達(dá)式2)

語句1;else

語句2;}else{if(表達(dá)式3)

語句3;else

語句4;}if語句的嵌套流程圖【例3.6】輸入3個(gè)數(shù),輸出最大值#include<stdio.h>voidmain(){inta,b,c,max;//聲明整型變量

printf("Pleaseinput3integernumber:");//提示輸入3整數(shù)個(gè)數(shù)

scanf("%d%d%d",&a,&b,&c);//從鍵盤輸入3個(gè)數(shù)

if(b>a){if(c>b)//不同層次的if要有縮進(jìn)

max=c;else//else要與相匹配對(duì)應(yīng)的if縮進(jìn)對(duì)齊

max=b;}//“}”與對(duì)應(yīng)的“{”對(duì)齊

else//else與相匹配對(duì)應(yīng)的if對(duì)齊

{//復(fù)合語句,大括號(hào)不能省略

if(c>a) max=c; else max=a;}//“}”與對(duì)應(yīng)的“{”對(duì)齊

printf("max=%d\n",max);//輸出最大的數(shù)}3.4.2switch語句if嵌套語句也可以實(shí)現(xiàn)多分支的選擇問題,但如果分支較多,程序代碼行數(shù)也隨之曾多,從而降低了程序的可讀性,造成程序容易產(chǎn)生錯(cuò)誤。C語言提供了switch語句可以解決這一問題,switch語句直接處理多分支選擇,而且可讀性較好。它的一般形式如下:switch(表達(dá)式){case常量表達(dá)式1:語句1;break;

case常量表達(dá)式2:語句2;break;

…case常量表達(dá)式n:語句n;break;

default:語句n+1;}switch語句的流程圖【例3.7】輸入百分制成績(jī),輸出對(duì)應(yīng)成績(jī)等級(jí)#include<stdio.h>voidmain(){intscore;//聲明整型變量scoreprintf("Pleaseinputscore:");//提示輸入分?jǐn)?shù)成績(jī)scanf("%d",&score);//從鍵盤輸入變量score的值switch(score/10)//表達(dá)式score/10結(jié)果為整數(shù)類型{case10:printf("A\n");break;//輸出對(duì)應(yīng)等級(jí)后,退出switchcase9:printf("A\n");break;case8:printf("B\n");break;case7:printf("C\n");break;case6:printf("D\n");break;default:printf("E\n");//表達(dá)式與前面case值都不等//則執(zhí)行default后語句,輸出E等}}【例3.8】鍵盤輸入年份和月份,輸出該月的天數(shù)。分析:(1)根據(jù)公歷,每年的1、3、5、7、8、10和12月份每月都有31天;4、6、9和11月份每月都有30天。2月平年有28天,閏年有29天??梢钥闯鲞@是一個(gè)多分支選擇問題,可以利用switch語句來解決。(2)可以設(shè)置變量year,month,days來分別表示年、月、當(dāng)月天數(shù)。還可以設(shè)置一個(gè)標(biāo)記flag,判斷當(dāng)年是否閏年。(3)先判斷年份是否為閏年,再利用swtich語句,進(jìn)入多分支選擇。3.4.3程序應(yīng)用舉例例3.9某城市為鼓勵(lì)節(jié)約用水,對(duì)居民用水量作如下規(guī)定:若一戶居民每月用水量不超過30噸(含30噸),則按每噸0.6元收費(fèi);若大于30噸但不超過50噸(含50噸),則其中30噸按0.6元收費(fèi),剩余部分按每噸0.9元收費(fèi);若超過50噸,則不超過50噸的部分按前面方法收費(fèi),剩余部分按每噸1.5元收費(fèi)。程序?qū)崿F(xiàn)輸入一戶居民的月用水量,輸出應(yīng)繳納的水費(fèi)。分析:(1)聲明實(shí)型變量d,用于存放用水量;聲明實(shí)型變量m,用于計(jì)算水費(fèi)。(2)根據(jù)不同的用水量,確定出不同的水費(fèi)計(jì)算公式。(3)對(duì)實(shí)際用水量d,選擇相應(yīng)的計(jì)算公式,計(jì)算出相對(duì)應(yīng)的水費(fèi)。3.4.3程序應(yīng)用舉例例3.10某銷售公司員工月收入為底薪加當(dāng)月銷售業(yè)績(jī)(設(shè)為整數(shù)元)提成。底薪900元,具體提成如下表:銷售業(yè)績(jī)(元)提成比例<500005000~999910%10000~1999913%20000~3999915%>=4000018%3.5循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)在給定條件成立時(shí),反復(fù)執(zhí)行某段程序,直到條件不成立為止。所給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。在C語言中實(shí)現(xiàn)循環(huán)結(jié)構(gòu)有三種控制語句,即while語句、do-while語句、for語句。3.5.1while語句while語句一般形式如下:while(表達(dá)式){

循環(huán)體;}【例3.11】用while語句實(shí)現(xiàn)求1+2+…+100的和

#include<stdio.h>voidmain(){inti,sum;//聲明整型變量i和sumi=1;//數(shù)列第一項(xiàng)為1sum=0;//使數(shù)列初始化和為0while(i<=100)//當(dāng)表達(dá)式成立則執(zhí)行循環(huán)體{ sum=sum+i;//累計(jì)求和 i++;//循環(huán)變量增1,使循環(huán)趨于結(jié)束}printf("sum=%d\n",sum);//輸出數(shù)列求和結(jié)果}【例3.12】輸入兩個(gè)正整數(shù)a、b,求它們的最大公約數(shù)。方法一:最大公約數(shù)定義法。分析:根據(jù)最大公約數(shù)的定義,a、b兩個(gè)數(shù)的最大公約數(shù)s一定是介于1到a之間的一個(gè)數(shù),不會(huì)大于a且能同時(shí)被a和b整除。方法二:輾轉(zhuǎn)相除法。分析:當(dāng)b不等于0時(shí),求a和b的最大公約數(shù)等價(jià)于求b和a%b的最大公約數(shù),即重復(fù)執(zhí)行運(yùn)算(c=a%b,a=b,b=c),消除相同的因子,直到b為0時(shí),a即為所求的解。3.5.2do-while語句do-while循環(huán)語句的特點(diǎn)是先執(zhí)行循環(huán)體一次,然后再判斷循環(huán)條件是否成立。do-while語句一般形式如下:do{

循環(huán)體;}while(表達(dá)式);

【例3.13】用do-while語句實(shí)現(xiàn)求1+2+…+100的和#include<stdio.h>voidmain(){inti,sum;//聲明整型變量i和sumi=1;//數(shù)列第一項(xiàng)為1sum=0;//使數(shù)列初始化和為0do{ sum=sum+i;//累計(jì)求和 i++;//循環(huán)變量增1}while(i<=100);//當(dāng)表達(dá)式成立則執(zhí)行循環(huán)體printf("sum=%d\n",sum);//輸出數(shù)列求和結(jié)果}

while語句和do-while語句的區(qū)別【例3.14】下面兩段程序分別用while和dowhile實(shí)現(xiàn)求n(鍵盤輸入)到10的和:用while語句實(shí)現(xiàn)的源程序:#include<stdio.h>voidmain(){intn,sum=0;//聲明整型變量n和sumprintf("n=");//提示輸入n的值scanf("%d",&n);while(n<=10)//當(dāng)表達(dá)式成立執(zhí)行循環(huán)體{sum=sum+n;//累計(jì)求和n++;//循環(huán)變量增1}printf("sum=%d\n",sum);}用dowhile語句實(shí)現(xiàn)的源程序:#include<stdio.h>voidmain(){intn,sum=0;//聲明整型變量n和sumprintf("n=");//提示輸入n的值scanf("%d",&n);do{sum=sum+n;//累計(jì)求和n++;//循環(huán)變量增1}while(n<=10);//當(dāng)表達(dá)式成立執(zhí)行循環(huán)體printf("sum=%d\n",sum);//輸出數(shù)列求和結(jié)果}當(dāng)輸入n=1時(shí),兩段程序的運(yùn)行結(jié)果部為sum=55。而當(dāng)輸入n=11時(shí),第一段程序的結(jié)果為sum=0,第二段程序的結(jié)果為sum=11。結(jié)論:當(dāng)while后面表達(dá)式的第一次值為“真”時(shí),兩種循環(huán)得到的結(jié)果相同;當(dāng)while后面表達(dá)式的第一次值為“假”時(shí),兩種循環(huán)結(jié)果是不同的。所以do-while循環(huán)與while循環(huán)盡管十分相似,但它們的主要區(qū)別是:while循環(huán)先判斷循環(huán)條件再執(zhí)行循環(huán)體,循環(huán)體可能一次也不執(zhí)行。do-while循環(huán)先執(zhí)行循環(huán)體,再判斷循環(huán)條件,循環(huán)體至少執(zhí)行一次。3.5.3for語句for循環(huán)語句是C語言中使用最為靈活的循環(huán)語句。for循環(huán)語句一般形式如下:for([表達(dá)式1];[表達(dá)式2];[表達(dá)式3]){

循環(huán)體;}

【例3.15】用for語句實(shí)現(xiàn)求1+2+…+100的和#include<stdio.h>voidmain(){inti,sum;//聲明整型變量i和sumsum=0;//使數(shù)列初始化和為0for(i=1;i<=100;i++){ sum=sum+i;//累計(jì)求和}printf("sum=%d\n",sum);//輸出數(shù)列求和結(jié)果}3.5.4幾種循環(huán)的比較for語句的一般形式中的“表達(dá)式1”可以省略,但此時(shí)一般應(yīng)在for語句之前給循環(huán)變量賦初值。for語句的一般形式中“表達(dá)式3”也可以省略,但此時(shí)要設(shè)法保證循環(huán)能正常結(jié)束。在用while和do-while循環(huán)之前,一般要先對(duì)循環(huán)變量先賦初值。也就是說,循環(huán)變量的初始化操作一般是在while和do-while語句之前完成;而for循環(huán)的循環(huán)變量初始化一般是用表達(dá)式1實(shí)現(xiàn)。while和for屬于“當(dāng)型”循環(huán),即先判斷循環(huán)條件,后執(zhí)行循環(huán)體;do-while屬于“直到型”循環(huán),即先執(zhí)行循環(huán)體一次,再判斷循環(huán)條件。1.break語句使用break語句的一般形式為:break;注意:break語句只能用于循環(huán)語句和switch語句之中。3.5.5改變循環(huán)執(zhí)行的狀態(tài)

【例3.16】輸入一個(gè)大于2的正整數(shù)n,判斷這個(gè)正整數(shù)是否為素?cái)?shù)。3.5.5改變循環(huán)執(zhí)行的狀態(tài)

3.5.5改變循環(huán)執(zhí)行的狀態(tài)2.continue語句使用continue語句的一般形式為:continue;注意:continue作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。

【例3.17】分析下面程序段的運(yùn)行結(jié)果:3.5.5改變循環(huán)執(zhí)行的狀態(tài)#include<stdio.h>voidmain(){intcount=0,i;charch;for(i=0;i<30;i++){ch=getchar();if(ch<'0'||ch>'9')continue;count++;}printf("count=%d\n",count);}循環(huán)執(zhí)行30次,每次循環(huán)都從鍵盤輸入一個(gè)字符,當(dāng)該字符不是數(shù)字字符時(shí),ch<'0'||ch>'9'表達(dá)式成立,執(zhí)行continue語句,這時(shí)程序流程直接轉(zhuǎn)移到執(zhí)行表達(dá)式3“i++”進(jìn)入下一次循環(huán),而當(dāng)輸入的字符是數(shù)字字符時(shí),ch<'0'||ch>'9'表達(dá)式不成立,執(zhí)行if語句其后的語句count++,數(shù)字字符個(gè)數(shù)增1,程序流程再轉(zhuǎn)移到執(zhí)行表達(dá)式3“i++”進(jìn)入下一次循環(huán),直到i等于30,表達(dá)式2“i<30”不成立,循環(huán)結(jié)束,輸出count的值。所以本程序的功能是從鍵盤輸入30個(gè)字符,統(tǒng)計(jì)其中數(shù)字字符的個(gè)數(shù)并輸出。3.5.5改變循環(huán)執(zhí)行的狀態(tài)continue語句和break語句都可以中斷某層循環(huán)的正常執(zhí)行次序,兩者的區(qū)別在于:continue語句只結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行;而break語句則是結(jié)束整個(gè)循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立,而直接跳出本層循環(huán)結(jié)構(gòu)。3.5.6循環(huán)的嵌套在一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。其一般形式如下:循環(huán)結(jié)構(gòu)語句1/*外循環(huán)*/{

循環(huán)結(jié)構(gòu)語句2/*內(nèi)循環(huán)*/}循環(huán)嵌套舉例輸出5行,每行都輸出1,2,3,4,5五個(gè)數(shù)字。#include<stdio.h>voidmain(){inti,j;//i,j用作循環(huán)變量

for(i=1;i<=5;i++)//外循環(huán)開始

{ for(j=1;j<=5;j++)//內(nèi)循環(huán)開始

{printf("%d",j);//輸出數(shù)字

}//內(nèi)循環(huán)結(jié)束

printf("\n");//每輸出完5個(gè)數(shù)后換一行

}//外循環(huán)結(jié)束}3.5.7程序應(yīng)用舉例【例3.19】輸出所有的“水仙花數(shù)”。分析:所謂“水仙花數(shù)”是指一個(gè)3位數(shù),其各位數(shù)字的立方和等于該數(shù)本身。例如153是個(gè)水仙花數(shù),因?yàn)?53=13+53+33。根據(jù)水仙花數(shù)的含義,可以采用數(shù)學(xué)中的窮舉法來處理。這里對(duì)所有的3位數(shù)進(jìn)行判斷,是否滿足“其各位數(shù)字的立方和等于該數(shù)”這個(gè)條件。因此,循環(huán)變量(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論