第3章控制結構_第1頁
第3章控制結構_第2頁
第3章控制結構_第3頁
第3章控制結構_第4頁
第3章控制結構_第5頁
已閱讀5頁,還剩74頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第3章控制結構3.1算法的基本知識3.2順序結構程序設計3.3選擇結構程序設計3.4循環結構程序設計3.5轉移控制語句3.6綜合實例學習目標理解算法的特性和要素掌握常用的算法描述方法3.1算法的基本知識廣義上講,算法是解決某一問題的方法和步驟。狹義上,算法指的是計算機算法,即對特定問題求解步驟的一種描述,它是計算機指令的有限序列,其中每一條指令表示計算機可以進行的一個或多個操作。算法的概念3.1算法的基本知識算法的特性3.1.1算法的特性和要素(1)有窮性(2)確定性(3)可行性(4)有零個或多個輸入(5)有一個或多個輸出算法的要素3.1.1算法的特性和要素一個計算機所能執行的算法必須具備以下兩個要素:

(1)基本操作即構成算法的操作取自哪個操作集。計算機操作主要包括:算術運算、關系運算、邏輯運算、函數運算、位運算及I/O操作等。由于不同的計算機語言所對應的操作集略有不同,所以在設計算法前,應先確定編程語言。

(2)控制結構每個算法都是由一系列的操作組成。同一操作序列,按不同的順序執行,就會得到不同的結果。控制結構即如何控制組成算法的各操作的執行順序。一個算法只能由3種結構組成,即順序結構、選擇結構、循環結構。3.1.2算法的描述算法的描述方法有很多種,最常用的有自然語言、偽代碼、流程圖、N-S圖、PAD圖和計算機語言等。自然語言3.1.2算法的描述自然語言是人們在日常生活、工作、學習中通用的語言,一般不需要專門學習和訓練就能理解用這種語言所表達的意思。但用自然語言描述程序(或算法)的流程時,一般要求直接而簡練,盡量減少語言上的修飾。實例分析3.1.2算法的描述

用自然語言描述sum=1+2+3+…+99+100的算法。①定義變量sum,并置初始值為0。②計算1+2+3+…+99+100的和,并將結果賦給sum。③輸出變量sum的值。

流程圖3.1.2算法的描述流程圖是一種傳統的算法表示方法,用一些圖框表示各種操作,用流程線表示操作的執行順序。用圖形表示算法,直觀形象、易于理解。ANSI(AmericanNationalStandardInstitute)規定了一些常用流程圖符號。實例分析3.1.2算法的描述用流圖描述sum=1+2+3+…+99+100的算法

N-S圖3.1.2算法的描述

N-S圖是由I.Nassi和B.Shneiderman于1973年共同提出的一種結構化描述方法。在這種流圖圖中,去掉了所有的流程線,算法寫在一個矩形框內,在該矩形框內還可以包括其他的矩形框。N-S流程圖用以下的流程圖符號。N-S圖3.1.2算法的描述實例分析3.1.2算法的描述用N-S圖描述sum=1+2+3+…+99+100的算法

程序設計語言3.1.2算法的描述對于采用自然語言、流程圖和N-S圖描述的算法,計算機是不能執行的。要讓計算機執行一個算法,必須把該算法轉換成計算機語言。用計算機語言表示算法必須嚴格遵循所使用語言的語法規則。實例分析3.1.2算法的描述【例3-1】編程求1+2+3+…+99+100的累加和。//FileName:chap3_1.c#include<stdio.h>intmain(){ inti,sum; i=1;sum=0; while(i<=100) {

sum=sum+i;

i++; } printf("Thesumis%d\n",sum); return0;}程序運行結果如下:Thesumis5050學習目標熟練掌握C語言中的基本語句掌握格式化輸入輸出函數的基本用法3.2順序結構程序設計語句構成3.2.1表達式語句表達式語句是由表達式加上分號(;)組成。其一般形式如下:

表達式;這里的表達式是指C語言中任何合法的C表達式。例如:x=y+z;//賦值表達式語句y+z;

//加法運算語句,但計算結果不能保留,無實際意義i++;

//自增1語句,即i的值增1

注意事項3.2.1表達式語句使用賦值語句時需要注意以下幾點。

(1)在賦值符“=”右邊的表達式也可以是一個賦值表達式。例如:

a=b=c=5;

(2)注意賦值表達式和賦值語句的區別。 賦值表達式是一種表達式,它可以出現在任何允許表達式出現的地方,而賦值語句則不能。語句構成3.2.2函數調用語句函數是C程序的基本組成單位,一個函數的執行是通過在程序中調用這個函數來實現的,調用函數的操作由C語句來完成,通常稱為函數調用語句。其一般形式如下:

函數名(參數表);例如,“printf("hello!");”就是一個函數調用語句。

注意事項3.2.2函數調用語句一個完整的計算機程序應具備輸入輸出功能,C語言本身并不提供數據的輸入輸出語句,有關的輸入輸出操作都是通過調用C標準庫函數來實現的。C語言提供的輸入輸出標準庫函數有getchar()、putchar()、scanf()和printf()等。引用C語言標準庫函數時,必須用編譯預處理命令“#include”將頭文件“stdio.h”包含到用戶源程序中,即在程序的開始寫一行命令#include<stdio.h>或者#include”stdio.h”。

getchar()3.2.2函數調用語句字符輸入函數的一般形式如下:

intgetchar()功能:接收從終端輸入的一個字符,并返回其ASCII碼值。例如:

intch=getchar();//從輸入終端(如鍵盤)接收一個字符并把它賦給ch變量。

putchar()3.2.2函數調用語句字符輸出函數的一般形式如下:

intputchar(charch)

功能:向終端輸出一個字符,并返回該字符的ASCII碼值。

實例分析3.2.2函數調用語句//FileName:chap3_2.c#include<stdio.h>intmain(){

charch1,ch2,ch3,ch4;

ch1=getchar();

ch2=getchar();

ch3=getchar();

ch4=getchar();

putchar(ch1); putchar('\n');

putchar(ch2); putchar('\n');

putchar(ch3); putchar('\n');

putchar(ch4);

return0;}程序運行結果如下:C++↙C++printf()3.2.2函數調用語句格式化輸出函數的一般形式如下:

intprintf(char*format[,argument,...]);

功能:函數printf將一組參數,按format給定的格式,把數據格式化并且輸出到標準輸出設備。若出錯,則返回負數。向終端輸出一個字符,并返回該字符的ASCII碼值。函數調用的一般形式為:

printf("格式控制字符串",輸出項列表);

3.2.2函數調用語句%[標識][寬度][.精度]格式字符printf()方括號表示該項可有可無◆-:左對齊輸出,缺省為右對齊輸出◆+:正數輸出加號(+),負數輸出減號(-)◆空格:正數輸出空格代替加號(+),負數輸出減號(-)。十進制整數,指定輸出寬度。▼指定寬度>實際寬度,補空格。▼指定寬度≤實際寬度,按實際輸出。▼不指定寬度,按實際輸出。輸出精度指示符。◆對整數,表示至少要輸出的數字個數,不足補0,多則原樣輸出。◆對實數,表示小數點后至多輸出的數字個數,不足補0,多則舍入處理。◆對字符串,表示最多輸出的字符個數,不足補空格,多則丟棄。整型數據d/i以有符號十進制形式輸出整型數o以無符號八進制形式輸出整型數x/X以無符號十六進制形式輸出整型數u以無符號十進制形式輸出整型數實型數據f以小數形式輸出實型數e/E以指數形式輸出實型數g/G按數值寬度最小的形式輸出實型數字符型數據c輸出一個字符s輸出字符串其他%輸出字符%本身scanf()3.2.2函數調用語句格式化輸入函數的一般形式如下:

intscanf(格式控制字符串,地址列表)功能:按照格式控制的要求,將從終端輸入的數據賦值給地址列表中的各個變量。格式控制字符串的含義和函數printf()中的格式控制字符串類似,地址列表列出了各變量的地址,由取地址運算符“&”后跟變量名組成。函數調用的一般形式為:

scanf("格式控制字符串",地址列表);3.2.2函數調用語句scanf()%[*][寬度

]格式字符輸入賦值抑制字符:該格式要求輸入數據,但不賦值,即在地址列表中沒有對應有地址項。寬度指示符:該輸入項最多可輸入的字符個數。如遇空格或不可轉換的字符,讀入的字符將減少。g/G輸入指數形式的單精度實型數輸入一個字符串s輸入單個字符c字符型數據輸入指數形式的單精度實型數e輸入小數形式的單精度實型數f實型數據輸入無符號十六進制整型數x/X輸入無符號八進制整型數o/O輸入無符號的十進制整型數u/U輸入十進制整型數d/D整型數據//FileName:chap3_7.c#include<stdio.h>intmain(){

inta,b,temp;

printf("Pleaseinputab:\n");

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

temp=b;

b=a;

a=temp;

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

return0;}實例分析3.2.2函數調用語句運行結果如下:Pleaseinputab:23↙a=3,b=2語句構成3.2.3空語句僅由分號“;”組成的語句稱為空語句。空語句是不執行任何操作的語句。例如,

while(getchar()!='\n')

{

;//循環體為空語句

}空語句通常起到占位的作用,在程序沒有完全開發完成前,可用空語句占位,以便后續開發填充代碼。

語句構成3.2.4復合語句把多個語句用大括號括起來組成的語句稱為復合語句。在語法上,復合語句相當于單條語句,而不是多條語句。其一般形式為:

{

語句1

……

語句n

}復合語句可以放在能夠使用語句的任何地方,它建立一個新的作用域或塊。復合語句是C語言中唯一不用分號“;”結尾的語句。

輸入攝氏溫度c的值,計算華氏溫度f的值。(計算公式為:f=9*c/5+32)//FileName:chap3_8.c#include<stdio.h>intmain(){

floatc,f;

printf("Pleaseinputc:");

scanf("%f",&c);

f=9*c/5+32;

printf("f=%6.2f\n",f);

return0;}實例分析運行結果如下:Pleaseinputc:28↙f=82.403.2順序結構程序設計學習目標熟練掌握if語句的各種用法掌握switch語句的用法3.3選擇結構程序設計能夠編寫簡單的選擇結構程序3.3.1

if語句

if語句是實現選擇結構最常用的語句,其作用是根據給定的條件,判斷執行哪些語句,要執行的語句可能有一條或多條。if語句包括基本if語句、雙分支if語句、多分支if語句和嵌套if語句四種形式。

3.3.1

if語句基本if語句該語句的一般形式如下:

if(表達式)

語句功能:如果表達式的值為真,則執行其后面的語句,否則不執行該語句。

3.3.1

if語句雙分支if語句這是if語句比較完整的形式,包含一條if子句和一條else子句。該語句的一般形式如下:

if(表達式)語句1

else語句2功能:如果表達式的值為真,則執行語句1,否則執行語句2。

3.3.1

if語句多分支if語句該語句的一般形式如下:

if(表達式1)語句1

elseif(表達式2)

語句2

...

elseif(表達式n)

語句n

else語句n+1功能:依次判斷表達式的值,當出現某個表達式的值為真時,則執行其對應的語句,然后跳轉到整個if語句之后繼續執行程序;如果所有的表達式均為假,則執行else后的語句,即語句n+1。

3.3.1

if語句多分支if語句3.3.1

if語句嵌套的if語句當if語句的操作語句中包含其他if語句時,稱為嵌套的if語句。該語句的基本形式如下:

功能:如果表達式1的值為真(非0),執行if子句的內嵌if語句,否則執行else子句的內嵌if語句。內嵌if語句就是if子句和else子句的操作語句,可以是上述if語句3種形式中的任何一種。說明:在嵌套的if語句結構中,一定要注意else與if之間的對應關系。在C語言中規定的對應原則是:

else總是與它前面最近的一個尚未匹配的if相匹配。

嵌套的if語句3.3.1

if語句3.3.1

if語句實例分析編寫程序,輸入一個x的值,按以下函數計算并輸出y的值。

-1(x<0)y=0(x=0)

1(x>0)

3.3.1

if語句實例分析3.3.1

if語句實例分析//FileName:chap3_15.c#include<stdio.h>intmain(){

intx,y;

scanf("%d",&x);

if(x<0)

y=-1;

else

if(x==0)

y=0;

else

y=1;

printf("y=%d\n",y);

return0;}3.3.1

if語句實例分析求一個任意的一元二次議程ax2+bx+c=0的解。3.3.1

if語句實例分析//FileName:chap3_16.c#include<stdio.h>#include<math.h>intmain(){

floata,b,c,d,x1,x2,p,q;

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

if(a==0)

printf("Inputerror!");

else

{

d=b*b-4*a*c;

if(d==0)

printf("x=%f\n",-b/(2*a));

elseif(d>0) {

x1=(-b+sqrt(d))/(2*a);

x2=(-b-sqrt(d))/(2*a);

printf("x1=%.2f,x2=%.2f\n",x1,x2);

} else {

p=-b/(2*a);

q=sqrt(-d/(2*a));

printf("x1=%.2f+%.2fi\n",p,q);

printf("x2=%.2f-%.2fi\n",p,q);

}

}

}3.3.2

switch語句

C語言提供了一種switch語句專門處理多分支的情形,使程序變得簡潔易懂。switch語句的一般形式如下:

switch(表達式)

{

case常量表達式1:語句塊1

case常量表達式2:語句塊2…

case常量表達式n:語句塊n

default:語句塊n+1

}功能:首先計算switch后面括號內的“表達式”,然后依次與各個case后面的“常量表達式”的值進行比較,當“表達式”的值與某一個case后面的“常量表達式”的值相等時,就選擇這個標號作為入口,執行該case子句后面的語句塊,并繼續執行其后的所有case子句直到程序結束。如果“表達式”的值與所有case后面的“常量表達式”的值都不相等,則執行default后面的語句。

3.3.2

switch語句實例分析輸入一個百分制成績,要求輸出對應的成績等級。//FileName:chap3_18.c#include<stdio.h>intmain(){floatscore;inttemp;chargrade;printf("Pleaseinputthescore:");scanf("%f",&score);temp=(int)score/10;

switch(temp) {

case10:

case9:grade='A';break;

case8:grade='B';break;

case7:grade='C';break;

case6:grade='D';break;

default:grade='E';

} printf("scoreis%.2f,gradeis%c\n",score,grade); return0;}學習目標熟練三種基本的循環控制語句掌握循環的嵌套3.4循環結構程序設計能夠應用基本的循環語句編寫復雜的程序3.4.1

while語句基本形式一般為關系表達式或邏輯表達式,也可以是C語言其他類型的合法表達式

用來控制循環體是否執行稱為內嵌語句,可以是基本語句、控制語句,也可以是復合語句是循環重復執行的部分while(表達式)語句

3.4.1

while語句語句流程3.4.1

while語句實例分析用while循環求1~100的累加和。

3.4.1

while語句實例分析//FileName:chap3_21.c#include<stdio.h>intmain(){intsum=0,i=1;while(i<=100){sum=sum+i;i++;

}printf("sum=%d\n",sum);return0;}運行結果如下:sum=5050注意事項3.4.1

while語句如果while的(表達式)值為0,則循環體一次也不執行(例如當i的初值=101)。在循環體中必須有使循環趨向結束的操作,否則循環將無限進行(死循環)。在循環體中,語句的先后位置必須符合邏輯,否則會影響運算結果。

3.4.2

do-while語句基本形式do

語句

while(表達式);語句流程3.4.2

do-while語句實例分析用do…while循環求n!。3.4.2

do-while語句算法描述:(1)定義變量n,接受用戶的輸入;(2)定義累乘器變量multi,multi←1;(3)定義變量i,i←1;(4)如果n<0,則給出相應的提示信息;否則,如果n=0,則直接輸出變量multi的值1;

否則,執行第5~6步。(5)如果i<=n,則循環執行以下語句multi←multi*i,實現累加功能;i++;(6)輸出multi的值。實例分析3.4.2

do-while語句//FileName:chap3_24.c#include<stdio.h>intmain(){intn,i=1;longintmulti=1;

printf("pleaseinputn(n>=0):");

scanf("%d",&n);

if(n<0)

printf("invalidinput!");

elseif(n==0)

printf("%d!=%ld\n",n,multi);else

{

do

{

multi=multi*i;

i++;

}while(i<=n);

}

printf("%d!=%ld\n",n,multi);

return0;}3.4.3

for語句基本形式for(表達式1;表達式2;表達式3)

語句循環初始條件循環控制條件循環體語句流程3.4.3

for語句實例分析輸出Fibonacci數列1、1、2、3、5、8、13…的前20項,要求每輸出5項后換行。3.4.3

for語句實例分析3.4.3

for語句實例分析3.4.3

for語句//FileName:chap3_29.c#include<stdio.h>intmain(){ intf1,f2,f,i; f1=f2=1; printf("%10d%10d",f1,f2);//前2項先輸出

for(i=3;i<=20;i++)//迭代從第3項開始

{

f=f1+f2;f1=f2;f2=f;

printf("%10d",f);//一行輸出夠五個,就換行

if(i%5==0)

printf("\n"); } return0;}3.4.3

for語句省略表達式1、2、3,即:

for(;;)就等同于:while(1),會無限循環(死循環)省略表達式1和表達式3,即:

for(;表達式2;)就等同于:while(表達式2)省略表達式2,即:

for(表達式1;;表達式3)就等同于:表達式1;while(1){…表達式3;}注意事項3.4.4循環的嵌套如果將一個循環語句放在另一個循環語句的循環體中,就構成了循環的嵌套。內嵌的循環結構內還可嵌套循環結構,構成多層嵌套。3種循環語句都可以在循環嵌套中使用。

3.4.4循環的嵌套實例分析輸入n的值,計算并輸出1~n的階乘之和。3.4.4循環的嵌套實例分析3.4.4循環的嵌套實例分析//FileName:chap3_30.c#include<stdio.h>intmain(){

intn,s,i,j,t;

scanf("%d",&n);

s=0;

i=1;

while(i<=n)

{

t=1;

for(j=1;j<=i;j++)

t=t*j;

s=s+t;

i++;

}

printf("Theresultis%d\n",s);

return0;}學習目標熟練break和continue語句的用法3.5轉移控制語句能夠應用break和continue語句解決實際問題3.5.1

break語句基本形式

break語句除用于退出switch結構外,還可用于由while、do…while和for構成的循環結構中。當執行循環體遇到break語句時,break所在循環將立即終,從循環語句后的第一條語句開始繼續往下執行。

break語句的一般形式如下:

break;3.5.1

break語句語句流程3.5.1

break語句實例分析算法描述:(1)接收用戶輸入的m的值;(2)循環變量賦初值i←2,循環條件i<=m-1,循環變量i++,循環執行以下語句:如果m能被i整除,則結束循環。(3)循環結束后判斷m與i的關系,如果m等于i,則輸出m是素數。否則輸出m不是素數。判斷任意一個數是否為素數。3.5.1

break語句實例分析//FileName:chap3_34.c#include<stdio.h>intmain(){

intm,i;

scanf

溫馨提示

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

評論

0/150

提交評論