C语言程序设计课件_第1页
C语言程序设计课件_第2页
C语言程序设计课件_第3页
C语言程序设计课件_第4页
C语言程序设计课件_第5页
已阅读5页,还剩212页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C語言程式設計第1章C語言概述本章主要介紹C語言程式的結構和書寫規則,以及TurboCV2.0的基本操作。1.1C語言出現的歷史背景1.2C語言的特點1.3簡單的C程式的介紹1.4C程式的上機步驟1.1C語言出現的歷史背景1.C語言的誕生與發展(1)在C語言誕生以前,系統軟體主要是用組合語言編寫的。由於組合語言程式依賴於電腦硬體,其可讀性和可移植性都很差;但一般的高級語言又難以實現對電腦硬體的直接操作(這正是組合語言的優勢),於是人們盼望有一種兼有組合語言和高級語言特性的新語言。(2)C語言是貝爾實驗室於70年代初研製出來的,後來又被多次改進,並出現了多種版本。80年代初,美國國家標準化協會(ANSI),根據C語言問世以來各種版本對C語言的發展和擴充,制定了ANSIC標準(1989年再次做了修訂)。(本書選定的上機環境是TCV2.0(DOS操作系統)。1.2C語言的特點C語言同時具有組合語言和高級語言的優勢。(1)語言簡潔、緊湊,使用方便、靈活。(2)運算符極其豐富。(3)生成的目標代碼品質高,程式執行效率高。(4)可移植性好(較之組合語言)。(5)可以直接操縱硬體。

(6)在C語言中,除實現順序、選擇和迴圈三種基本結構等的9條控制語句外,輸入輸出操作均由標準庫函數來實現。所以學習C語言,不僅要學習這9條控制語句和各種運算符,而且要學習並掌握常用標準庫函數的使用。例1:

main(){;}1.3簡單的C程式介紹1.main代表主函數.每個c程式有且只有一個主函數.2.函數體是由{}括起來的.3.C語言規定分號為語句的結束符,每條語句都用分號結束.4.對於單獨一個分號來說也是一條語句,只不過語句部分為空,即空語句,所以例1是包括空語句的C程式.1.printf是C語言中的輸出函數,功能:將雙引號內的字串原樣輸出.我們注意這條語句結束後有一個分號.2.\n在C語言中表示換行符,是一個控制字元,表示在輸出這條語句後回車換行./**/間的內容作為注釋部分,只起到說明的作用,不影響程式的運行.它只是給人看的,可以提高程式的可讀性,對編譯和運行不起作用,因此注釋可以加在程式中的任何位置.運行結果:It’sabook!(在用戶屏上輸出該語句,並且因為有\n這個換行符,游標會移到下一行開頭處.)例2:main(){printf(“It’sabook!\n”);/*輸出語句*/}1.int表示整型,這一行是聲明部分,定義變數a,b,sum為整型變數,這條語句相當於inta;intb;intsum;2.兩個賦值語句(把123賦值給a,把456賦值給b)這樣a就等於123,b就等於456.例3:main(){inta,b,sum;a=123;b=456;sum=a+b;printf(“sumis%d\n”,sum);}3.賦值計算(把a和b的和賦值給sum)這樣sum就等於a,b之和了.(sum=123+456=579).4.%d是輸入輸出“格式字串”,用來指定數據的類型.%d表示以十進位整數類型輸出,在執行輸出時,此位置上代以一個十進位整數數值.(其他的格式字串:%c,%s,%f…).5.第一個sum原樣輸出.第二個sum表示要輸出的變數,它的值就是a+b的值(579),而且這個值就會替代%d的位置.6.執行結果:sumis579例4求兩數中的大者。

main()/*主函數*/{inta,b,c;/*定義變數*/

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

c=max(a,b);/*調用函數*/

printf(″max=%d\n″,c);}

intmax(intx,inty)

{intz;/*定義局部變數*/

if(x>y)z=x;elsez=y;return(z);}1.本程式包括兩個函數:主函數main和被調用函數max,max函數的作用是將x和y中較大者賦值給變數z.2.C程式執行是從main函數中的第一條語句逐條執行的.3.“scanf”是輸入函數,和printf是一對,它們是C系統提供的標準輸入輸出函數.這兩個%d和前面含義相同.‘&’表示取地址.scanf函數的作用是將鍵盤輸入的值存放到變數a,b所對應的存儲單元中,也就是輸入給變數a,b.4.return是將z的值返回給主函數main.返回值通過函數名max帶回到函數的調用處.經過執行max函數得到一個返回值(即max函數中變數z的值)把這個值賦給c,然後輸出c的值.5.程式運行情況如下:8,5(通過鍵盤輸入8和5給a和b)max=8(輸出c的值即a和b的最大值)例4求兩數中的大者。

main()/*主函數*/{inta,b,c;/*定義變數*/

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

c=max(a,b);/*調用函數*/

printf(″max=%d\n″,c);}

intmax(intx,inty)

{intz;/*定義局部變數*/

if(x>y)z=x;elsez=y;return(z);}例6:/*給定半徑,求圓的面積*/#definePI3.14159#include<math.h>main()/*主函數*/{

floatr,s;r=1.0;/*變數r賦初值*/

s=PI*pow(r,2);/*計算圓面積s*/printf(“R=%f,S=%f\n”,r,s);}1.編譯預處理:程式執行前自動進行的特殊處理.特點:以#開頭,結束處無分號.2.#define---宏定義命令.P39P187PI---符號常量(宏名最好用大寫區別一般變數)3.14159---宏體宏定義作用:用簡單符號代表宏體部分內容(編譯時自動替換)5.

pow(x,y)求x的y次方,是math.h中的標準數學函數.

6.%f表示以小數形式輸出,是“格式字串”

7.運行結果:R=1.0,S=3.1415903.#include命令用來實現“檔包含”的操作.“math.h”或<math.h>是“頭檔”標準前導檔.4.

float表示實型,定義變數r,s為實型變數.例6:/*給定半徑,求圓的面積*/#definePI3.14159#include<math.h>main()/*主函數*/{

floatr,s;r=1.0;/*變數r賦初值*/

s=PI*pow(r,2);/*計算圓面積s*/printf(“R=%f,S=%f\n”,r,s);}總結:一.一個c程式的組成:

編譯預處理部分(可選)

main(){

說明部分/*變數定義等*/執行部分/*輸入輸出計算等*/}其他函數(可選,位置任意)二.C語言程式的基本特點C語言是一種函數式語言,其程式基本組成(單位)是函數每個C程式必須有一個、也只能有一個主函數main不管主函數在程式中的位置如何,程式執行總是從主函數開始所有變數必須先定義(規定數據類型)後使用每個語句必須用分號“;”結束(注意是“每個語句”而不“每行語句”)編譯預處理命令不是語句(行末不能用分號結束)C語言本身沒有輸入/輸出語句,其輸入/輸出功能須通過調用標準函數來實現使用系統提供的標準庫函數或其他檔提供的現成函數時,必須使用“檔包含”(除了printf和scanf語句)主函數可以調用其他各種函數,但其他函數不能調用主函數.1.4C語言程式上機步驟P7C語言是一種通過編譯程序處理的高級程式設計語言。所以其上機的處理流程可用以下示意圖表示:在微機上,通常用來編寫、編譯、連接、調試和執行C語言程式的是Borland公司開發的集成化軟體TurboC。

根源程式(.c)———目標程式(.obj)———可執行程式(.exe)編譯連接一.具體上機步驟如下:啟動機器,稍候後出現:

login(入網註冊命令)

Enteryourloginname:user01(輸入用戶名)

password:*****(輸入用戶密碼)……(顯示網路有關資訊)

C>tc(調用TurboC軟體)此時便出現TurboC初始螢幕(第8頁圖1.2所示)。

用戶名:計教021班5號jj02105(初始密碼:jj021)

計應022班11號jy02211(初始密碼:jy022)密碼修改:

setpass——輸入原密碼——輸入新密碼——再輸入新密碼退出:先退出tc,再輸入logout退出網路.二.TC的菜單(通過F10鍵和Esc鍵切換):FileEditRunCompileProjectOptionsDebugBreak/Watch檔操作編輯編譯運行專案檔選項調試中斷\觀察1.File:Load(打開已有的C程式檔)New(新建C程式檔)

Save(保存,檔案名以.c為擴展名,如abc.c)Quit(退出TC)2.編輯原始檔案:在Edit(編輯)狀態下輸入.3.編譯原始檔案:選擇並執行Compile/MakeEXEFile項(快捷鍵:F9),則TC將自動完成對當前正在編輯的根源程式檔的編譯、連接,並生成可執行檔。4.運行與查看結果(1)運行當前正在編輯的根源程式檔選擇並執行Run/Run項(快捷鍵:Ctrl+F9),程式運行結束後,仍返回到編輯窗口。(2)查看運行結果選擇並執行Run/UserScreen項(快捷鍵:Alt+F5)。查看完畢後,按任一鍵返回編輯窗口。5.編輯下一個新的根源程式選擇並執行File/New項即可。如果螢幕提示如下確認資訊:

NONAME.Cnotsaved.Save?(Y/N)

如果不需要保存當前正在編輯的根源程式,則鍵入“N”如果需要保存當前正在編輯的根源程式,則鍵入“Y”進入下一步操作。系統提示換名:<F:><path>\NONAME.C直接輸入你給根源程式檔起的名字再按回車即可。6.退出TC返回DOS:File/Quit(快捷鍵:Alt+X鍵)

一、程式設計方法簡述

1、電腦處理問題的過程【例一】讓某學生解方程

ax2+bx+c=0

求解過程:①分析問題

這是一個一元二次方程(代數問題,須中學代數知識)②確定處理方案用求根公式③確定解題步驟

確定a、b、c的值求出b2-4ac的值如果b2-4ac>0(雙實根)

X1=……X2=……

如果b2-4ac=0(單實根)

X1=X2=……

如果b2-4ac<0(雙複根)

X1=……X2=……④根據上述步驟計算⑤寫出答案,一、程式設計方法簡述

2、程式測試目的發現程式中的錯誤(Bug)程式錯誤

◆語法錯誤(編譯系統檢查)

◆邏輯錯誤(編程人員檢查)

二、演算法與流程圖

1、演算法(algorithm)

P14

演算法:解題思路(解題步驟等)演算法有表示方式:偽碼(pseudocode)用人類語言的形式(通常是英語)表示演算法。偽碼不在電腦上執行,僅供程式員縮寫程式之前構思時用(*注意偽碼程式只包含執行語句,沒有聲明語句,後者僅僅是給編譯器提供的資訊)流程圖(flowchart)用圖示方式表示演算法編程依據(便於檢查)編程時用使用流程圖的優點:不易出錯/便於編程/便於別人閱讀和檢查程式。通常編程的技術路線是:用偽碼和自頂向下、逐步求精的方法來制定演算法,然後再編寫相應的C語言程式。複雜程式處理部分宜用流程圖表示程式處理的過程。二、演算法與流程圖

1、演算法(algorithm)

示例:根據學生成績輸出評定結果。偽碼語句示例之一

ifstudent’sgradesgreaterthanorequalto60display”Passed”elsedisplay”Failed”偽碼語句示例之二

如果學生成績大於或等於60

顯示”及格”否則顯示”不及格”C語言根源程式段示例if(grade>=60)printf(“Passed!”);elseprintf(“Failed”);二、演算法與流程圖

2、傳統流程圖P19特點:直觀形象;使用流線。缺點:占面積大,使用流線任意轉移,易出現“亂麻”現象,造成編程與閱讀程式困難。二、演算法與流程圖

3、N-S結構化流程圖P26-27

77年美學者I.Nassi和B.Scheiderman提出。特點

①取消流線

②不允許流程任意轉移,只能從上而下順序執行

③規定三種基本結構的流程圖單元,由這些基本結構象搭積木似的組成各種演算法(結構化設計)。優點演算法清晰,流程不會無規律亂轉移。二、演算法與流程圖

4、三種基本結構

P23-26通常情況下,程式中的語句是以所編寫的順序一句接一句地執行,這種執行方法稱為“順序執行”。許多C語句能夠讓程式員指定不按編寫順序執行下一條執行語句,這種執行方法稱為“控制轉移”。Bohm和Jacopini的研究證實,所有的程式都能夠只用三種控制結構編寫,即

◆順序結構

◆選擇結構(selectionstructure)

◆迴圈結構(repetitionstructure)順序結構是C語言的基本結構,除非指示轉移,否則電腦自動以語句編寫的順序一句一句地執行C語句。任何C語言程式都是由七種控制結構(順序結構、三種選擇結構和三種迴圈結構)構成的。二、演算法與流程圖

4、三種基本結構

P23-26順序結構

A塊、B塊順序執行(每塊代表一個或一組操作)二、演算法與流程圖

4、三種基本結構

P23-26選擇結構

條件p成立時執行a塊(否則執行b塊)if選擇結構條件為真時執行某個指定的操作,條件為假時跳過該操作(單路選擇)if…else選擇結構條件為真時執行某個指定的操作,為假時執行另一個指定的操作(雙路選擇)switch選擇結構根據運算式的值執行眾多不同操作中的某個指定的操作(多路選擇)二、演算法與流程圖

4、三種基本結構

P23-26迴圈結構

分當型和直到型兩類。

當型先判斷,只要條件為真就反復執行A塊,為假則結束迴圈。

直到型先執行A塊,再判斷條件是否為真,為真則繼續執行循環體,為假則結束迴圈。C語言提供了三種迴圈結構,即while迴圈結構,do…while迴圈結構和for迴圈結構。

三、選擇結構程式設計

1、if語句

P95

三種形式:if(運算式)語句;(圖5.5a)if(運算式)語句1;

else

語句2;(圖5.5b)if(運算式1)語句1;(圖5.6)

elseif(運算式2)語句2;

……

elseif(運算式n)語句n;

else

語句n+1;◆e1?e2:e3

是if…else

語句在特定情況下的變體。注意:

運算式外必須加括弧,且括弧外無分號,語句結束後要加分號.三、選擇結構程式設計1.if(天氣晴朗)

我就上街;

例:if(x>y)printf(“%d”,x);2.if(天氣晴朗)

我就上街;else

在家玩;

例:if(x>y)printf(“%d”,x);elseprintf(“%d”,y);

3.if(天氣晴朗)

我就上街;elseif(天氣陰)

我就去圖書館;else

在家玩;

例:if(x>y)printf(“%d”,x);elseif(x<y)printf(“%d”,y);elseprintf(“x=y=%d”,x);4.天氣晴朗?上街:在家玩例:printf(“%d”,x>y?x:y);三、選擇結構程式設計

1、if語句

示例【例一】以下程式的作用是什麼?

main(){charc;

printf(“Input:”);scanf(“%c”,&c);

if(c>=’a’&&c<=’z’)c=c-32;elsec=c;

printf(“%c”,c);}/*將小寫字母轉換為大寫字母*/三、選擇結構程式設計

1、if語句

if語句的嵌套P99一般形式:if()if()語句1;else語句2;elseif()語句1;else語句2;內嵌if內嵌if三、選擇結構程式設計

1、if語句

if與else的配對關係:else总是与它上面的最近的未配对的if配對.即就近配對原則.if()if()語句1;elseif()語句2;else語句3;

第一個else雖然與第一個if在同一列上,但實際上它是與第二個if配對,因為它們相距最近.如果想讓第一個else與第一個if配對可寫成:if(){if()語句;}內嵌ifelseif()語句;else語句;內嵌if內嵌if三、選擇結構程式設計

1、if語句

示例【例二】以下程式的執行結果是什麼?

main(){intx=2,y=-1,z=2;

if(x<y)if(y<0)z=0;elsez+=1;printf(“%d\n”,z);}/*結果是2*/哦,原來是因為else總是與靠近它的if配套…

常見錯誤:if(x>0);if(x=2)if(1<=x<=10)y=3x+2;printf(“y>0”);y=x-1;三、選擇結構程式設計

2、switch語句

P98switch語句的一般形式:switch(e){

casec1:語句組1;

case

c2:語句組2;

……case

cn:語句組n;

default:語句組n+1;/*可缺省*/}/*e–運算式(整型、字元型或枚舉型)*/c1~cn

常量(整數、字元、常量運算式如3+4,不含變數或函數)default–不是c1~cn的情況(位置不一定在最後)。switch語句的執行過程:

switch語句先計算運算式的值,然後同多個case語句後的常量比較,找到相等的case常量則執行該常量冒號後的語句段,並從這個入口一直執行下麵所有冒號後的語句,直到switch語句結束。如果執行一個或幾個冒號後的語句就要跳出switch語句,則可以在跳出處使用break語句。如果switch語句後運算式的值找不到匹配的case常量,就執行default後面的語句段直到結束。default是任選項,如果沒有該語句,則在所有配對都失敗時,什麼也不執行。三、選擇結構程式設計

2、switch語句

示例main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“85~100\n”);case‘B’:printf(“70~84\n”);case‘C’:printf(“60~69\n”);case‘D’:printf(“<60\n”);default:printf(“錯誤輸入\n”);}}輸入c,求輸出結果。

結果:

60~69<60

錯誤輸入

?!三、選擇結構程式設計

2、switch語句

示例main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“85~100\n”);case‘B’:printf(“70~84\n”);case‘C’:printf(“60~69\n”);case‘D’:printf(“<60\n”);default:printf(“錯誤輸入\n”);}}不好意思,我屬於C級!我的成績應該是60~69!什麼!“<60”?“錯誤輸入”?怎麼會這樣?!

運行結果:

60~69<60

錯誤輸入

三、選擇結構程式設計

2、switch語句

示例解決方法——break語句:main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“85~100\n”);break;case‘B’:printf(“70~84\n”);break;case‘C’:printf(“60~69\n”);break;case‘D’:printf(“<60\n”);break;default:printf(“錯誤輸入\n”);}}這才差不多!break!

運行結果:

60~69三、選擇結構程式設計

2、switch語句

示例解決方法——break語句:main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“85~100\n”);break;case‘B’:printf(“70~84\n”);break;case‘C’:printf(“60~69\n”);break;case‘D’:printf(“<60\n”);break;default:printf(“錯誤輸入\n”);}}討論switch(s)語句中的s實際上並非真正的條件選擇,而只是一種跳轉指示(與if語句不同),表示下麵應該跳轉到什麼位置繼續執行。而各case實際上只是一個跳轉處的標記。當程式跳轉到某個case處時,並非只執行此case行的程式組,而是從此處開始一直向下執行各條語句,直到整個switch開關體結束(“}”)。如果要使每個case處相當於一種if(s)else的效果,必須在其語句組最後加上break語句。switch語句的執行過程:

switch語句先計算運算式的值,然後同多個case語句後的常量比較,找到相等的case常量則執行該常量冒號後的語句段,並從這個入口一直執行下麵所有冒號後的語句,直到switch語句結束。如果執行一個或幾個冒號後的語句就要跳出switch語句,則可以在跳出處使用break語句。如果switch語句後運算式的值找不到匹配的case常量,就執行default後面的語句段直到結束。default是任選項,如果沒有該語句,則在所有配對都失敗時,什麼也不執行。三、選擇結構程式設計

2、switch語句

示例main(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}printf(“a=%d,b=%d\n”,a,b);}求程式運行結果。結果:a=2,b=1。如果x=2?

結果:a=1,b=1

如果x=3?結果:a=1,b=1

說明:1、每個case常量運算式的值必須互不相同,否則會出現互相矛盾的結果。

2、允許多個case共用一個執行語句。例一:main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“優\n”);case‘B’:printf(“良\n”);case‘C’:printf(“中\n”);case‘C’:printf(“差\n”);default:printf(“錯誤輸入\n”);}}例二:main(){chars;scanf(“%c”,&s);switch(s){case‘A’:case‘B’:printf(“好\n”);case‘C’:case‘D’:printf(“差\n”);default:printf(“錯誤輸入\n”);}}例:給定一個不多於5位的正整數,要求分別列印出每一位數字,按逆序列印出各位數字.main(){intnum;intidiv,ten,hundred,thousand,ten_thousand;printf(“請輸入一個小於五位的整數:”);scanf(“%d”,&num);ten_thousand=num/10000;num=num%10000;thousand=num/1000;num=num%1000;hundred=num/100;num=num%100;ten=num/10;idiv=num%10;

if(ten_thousand!=0){printf(“逆:%d%d%d%d%d”,idiv,ten,hundred,thousand,ten_thousand);printf(“每位數字:%d%d%d%d%d”,ten_thousand,thousand,hundred,ten,idiv);}elseif(thousand!=0){printf(“逆序為:%d%d%d%d”,idiv,ten,hundred,thousand);printf(“每位數字:%d%d%d%d”,thousand,hundred,ten,idiv);}elseif(hundred!=0){printf(“逆序為:%d%d%d”,idiv,ten,hundred);printf(“每位數字:%d%d%d”,hundred,ten,idiv);}elseif(ten!=0){printf(“逆序為:%d%d”,idiv,ten);printf(“每位數字:%d%d”,ten,idiv);}else{printf(“逆序為:%d”,idiv);printf(“每位數字為:%d”,idiv);}}例:輸入三個數,按由大到小順序輸出。main(){inta,b,c,t;scanf(“%d,%d,%d”,&a,&b,&c);if(b>a){t=a;a=b;b=t;}if(c>a){t=a;a=c;c=t;}if(c>b){t=b;b=c;c=t;}printf(“a=%d,b=%d,c=%d”,a,b,c);}例:輸入一個實數判斷它在平面直角坐標系中所在的象限。main(){floatx,y;scanf(“%f,%f”,&x,&y);if(x>0)if(y>0)printf(“x和y在第一象限”);

elseprintf(“x和y在第四象限”);

elseif(y>0)printf(“x和y在第二象限”);

elseprintf(“x和y在第三象限”);}例:給出一百分制成績,要求輸出成績等級‘A’,’B’,’C’,’D’,’E’。90分以上為‘A’,80~90分為‘B’,70~79分為‘C’,60~69分為‘D’,60分以下為‘E’。程式:main(){floatscore;chargrade;intx;printf(“请输入学生的成绩:”);

scanf(“%f”,&score);x=(int)(score)/10;switch(x){case10:case9:grade=‘A’;break;case8:grade=‘B’;break;

case7:grade=‘C’;break;case6:grade=‘D’;break;case5:case4:case3:case2:case1:case0:grade=‘E’;}printf(“成績是%f,相應的等級是%c.\n”,score,grade);}運行結果:請輸入學生的成績:95.2成績是95.2,相應的等級是A。

第六章迴圈控制

一、迴圈結構程式設計

迴圈是在迴圈條件為真時電腦反復執行的一組指令(循環體)。迴圈控制通常有兩種方式:◆計數控制事先能夠準確知道迴圈次數時用之用專門的迴圈變數來計算迴圈的次數,迴圈變數的值在每次執行完循環體各語句後遞增,達到預定迴圈次數時則終止迴圈,繼續執行迴圈結構後的語句。◆標記控制事先不知道準確的迴圈次數時用之由專門的標記變數控制迴圈是否繼續進行。當標記變數的值達到指定的標記值時,迴圈終止,繼續執行迴圈結構後的語句。

二、迴圈結構程式設計在C語言中可用以下語句構成迴圈:

if…gotowhiledo…whilefor

其中if…goto是通過編程技巧(if語句和goto語句組合)構成迴圈功能。而且goto語句將影響程式流程的模組化,使程式可讀性變差,所以結構化程式設計主張限制goto語句的使用。其他三種語句是C語言提供的迴圈結構專用語句。

二、迴圈結構程式設計

迴圈結構兩大要素:迴圈條件

p

結束迴圈的條件運算式循環體A

迴圈執行的語句或語句組設置迴圈條件要特別注意確定:迴圈變數的初值迴圈變數的終值迴圈變數的變化規律名詞解釋無限迴圈死迴圈名詞解釋空迴圈二、迴圈結構程式設計

1、if…goto語句迴圈結構

P113【例一】main(){intn=0,sum=0;loop:sum+=n;++n;if(sum<=10000)

gotoloop;printf(“n=%d\n”,n);}【例二】main(){intn=0,sum=0;loop:if(sum>=10000)

gotoend;sum+=n;++n;

gotoloop;end:printf(“n=%d\n”,n);}直到型當型二、迴圈結構程式設計

2、while語句迴圈結構

P114【例三】main(){intn=0,sum=0;while(sum<=10000)

{

sum+=n;++n;}printf(“n=%d\n”,n);}當型一般形式

while(條件運算式)

循環體;用於構成當型迴圈:先判斷後執行/條件為真繼續迴圈,直到條件為假時結束迴圈。

2、while語句迴圈結構

注意:

1.循環體如果包含一個以上的語句,應該用花括弧括起來,以複合語句形式出現.如果不加花括弧,則while語句的範圍只到while後面的第一個分號處.

2.條件運算式或循環體內應有改變條件使迴圈結束的語句,否則可能陷入“死迴圈”。main(){intn=0,sum=0;while

(sum<=10000)

{

sum+=n;++n;}printf(“n=%d\n”,n);}main(){intn=0,sum=0;while

(sum<=10000)

sum+=n;

++n;

printf(“n=%d\n”,n);}二、迴圈結構程式設計

3、do…while語句迴圈結構

P108【例四】main(){intn=0,sum=0;do{

sum+=n;++n;}while

(sum<=10000);printf(“n=%d\n”,n);}一般形式

do{

迴圈語句(組)

}while(條件運算式);

用於構成直到型迴圈:先執行後判斷/條件為真繼續迴圈,直到條件為假時結束迴圈。【注意】條件運算式或循環體內同樣應有改變條件使迴圈結束的語句,否則可能陷入“死迴圈”。直到型直到sum超過10000為止二、迴圈結構程式設計

3、do…while語句迴圈結構

示例

【例五】從鍵盤輸入一個整數12456,分析以下程式運行結果。main(){intnum,c;

printf(“請輸入一個整數:“);

scanf(“%d”,&num);

do{c=num%10;printf(“%d”,c);}while((num/=10)>0);

printf(“\n”);}

/*取得num的個位數*/

/*輸出num的個位數*/

/*直到num/10為0*/

結果:

65421將各位數字反序顯示出來3、do…while語句迴圈結構

while和do-while迴圈的比較main(){intsum=0,i;scanf(“%d”,&i);while(i<=10){sum=sum+i;i++;}printf(“sum=%d\n”,sum);}main(){intsum=0,i;scanf(“%d”,&i);do{sum=sum+i;i++;}while(i<=10);printf(“sum=%d\n”,sum);}當輸入:1(即i=1)

sum=55當輸入:1(即i=1)

sum=55當輸入:11(即i=11)

sum=0當輸入:11(即i=11)

sum=11二、迴圈結構程式設計

4、for語句迴圈結構

P118一般形式

for(運算式1;條件運算式;運算式3)

迴圈語句(組);

用於構成計數型當型迴圈:先判斷後執行/條件為真繼續迴圈,直到條件為假時結束迴圈。運算式1:整個迴圈中只執行1次,常用來對迴圈變數設置初值條件運算式(運算式2):其值為真(非0)時繼續執行迴圈語句(組),否則結束迴圈運算式3:常用於迴圈變數值的更新(循環體的一部分每次迴圈語句組執行完後執行一次)簡單形式:

for(迴圈變數賦初值;迴圈條件;迴圈變數增值)

迴圈語句(組);【例六】求∑i=1+2+3+4…+99+100(i=1~100)main(){inti,s=0;

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

s=s+i;printf(“Sum=%d\n”,s);}4、for語句迴圈結構

P118說明:1.for語句中“運算式1”可省,此時應在for語句之前給迴圈變數賦初值.注意省略運算式1時,其後的分號不能省.如:for(;i<=100;i++)2.如果運算式2省略,即不判斷迴圈條件,迴圈無終止的進行下去.也就是認為運算式2始終為真.

如:for(i=1;;i++)sum=sum+i;

相當於:i=1;while(1){sum=sum+1;i++;}4、for語句迴圈結構

3.運算式3也可省略,但此時程式應另外設法保證迴圈能正常結束.如:for(i=1;i<=100;){sum=sum+1;i++;}4.可以省略運算式1和運算式3,只有運算式2,即只給迴圈條件.如:for(;i<=100;)while(i<=100){sum=sum+i;相當於{sum=sum+i;i++;}i++;}二、迴圈結構程式設計

5、其他迴圈控制結構

P122break

結束迴圈

在switch中退出switch結構;在迴圈中結束迴圈。

continue

結束本次迴圈迴圈“短路”(跳過循環體後面的語句,開始下一輪迴圈

)。goto

跳轉跳到循環體外指定標號處。【注意】

goto語句只能從迴圈內向外跳轉,反之不可!main(){inta,y;a=10,y=0;

do{

a+=2;y+=a;if(y>50)break;

}while(a=14);printf("a=%d,y=%d\n",a,y);}結果:a=16,y=60

變數跟蹤ay10012 1214+216+12=2814+216+28=4414+216+44=60變數跟蹤分析法二、迴圈結構程式設計

5、其他迴圈控制結構

break

結束迴圈

在switch中退出switch結構;在迴圈中結束迴圈。

continue

結束本次迴圈迴圈“短路”(跳過循環體後面的語句,開始下一輪迴圈

)。goto

跳轉跳到循環體外指定標號處。【注意】

goto語句只能從迴圈內向外跳轉,反之不可!求以下程式段執行後x和i的值。inti,x;for(i=1,x=1;i<=50;i++){if(x>=10)break;if(x%2==1){x+=5;

continue;}x-=3;}結果:x的值為10,i的值為6

變數跟蹤ix

11→626→333→848→555→106二、迴圈結構程式設計

5、其他迴圈控制結構

break

結束迴圈

在switch中退出switch結構;在迴圈中結束迴圈。

continue

結束本次迴圈迴圈“短路”(跳過循環體後面的語句,開始下一輪迴圈

)。goto

跳轉跳到循環體外指定標號處。【注意】

goto語句只能從迴圈內向外跳轉,反之不可!main(){inti=1;

while(i<=15)if(++i%3!=2)

continue;elseprintf("%d",i);printf("\n");}結果:2581114

變數跟蹤

i++i%3輸出i

1→2222→303→414→5255→60

……二、迴圈結構程式設計

5、其他迴圈控制結構

break

結束迴圈

在switch中退出switch結構;在迴圈中結束迴圈。

continue

結束本次迴圈迴圈“短路”(跳過循環體後面的語句,開始下一輪迴圈

)。goto

跳轉跳到循環體外指定標號處。【注意】

goto語句只能從迴圈內向外跳轉,反之不可!main(){inti,k=0;for(i=1;;i++){k++;

while(k<i*i){k++;if(k%3==0)

goto

loop;

}}

loop:printf("%d,%d",i,k);}結果:2,3

三、常用演算法1、枚舉法(窮舉法)

“笨人之法”:

把所有可能的情況一一測試,篩選出符合條件的各種結果進行輸出。

【例一】雨水淋濕了算術書的一道題,8個數字只能看清3個,第一個數字雖然看不清,但可看出不是1。編程求其餘數字是什麼?

[□×(□3+□)]2=8□□9分析設分別用A、B、C、D、E五個變數表示自左到右五個未知的數字。其中A的取值範圍為2~9,其餘取值範圍為0~9。條件運算式即為給定算式。main(){intA,B,C,D,E;for(A=2;A<=9;A++)for(B=0;B<=9;B++)for(C=0;C<=9;C++)for(D=0;D<=9;D++)for(E=0;E<=9;E++)if(A*(B*10+3+C)*A*(B*10+3+C)==8009+D*100+E*10)printf(“%2d%2d%2d%2d%2d\n”,A,B,C,D,E);}結果:32864

【例一】雨水淋濕了算術書的一道題,8個數字只能看清3個,第一個數字雖然看不清,但可看出不是1。編程求其餘數字是什麼?

[□×(□3+□)]2=8□□9【例二】

求100~200之間不能被3整除也不能被7整除的數。

分析:求某區間內符合某一要求的數,可用一個變數“窮舉”。所以可用一個獨立變數x,取值範圍100~200。for(x=100;x<=200;x++) if(x%3!=0&&x%7!=0)printf(“x=%d\n”,x);如果是求指定條件的奇數呢?

如果是求指定條件的偶數呢?

x=101;x<=200;x=x+2

x=100;x<=200;x=x+2

2、歸納法(遞推法)

“智人之法”

:通過分析歸納,找出從變數舊值出發求新值的規律。三、常用演算法【例一】編程求∑i=1+2+3+4…+99+100(i=0~100)分析

i=0

S0=0(初值)

i=1

S1=0+1=S0+1i=2

S2=1+2=S1+2i=3

S3=1+2+3=S2+3i=4

S4=1+2+3+4=S3+4

………i=nSn=1+2+3+4+…+n=Sn-1+n【例一】編程求∑i=1+2+3+4…+n(n≤100)程式:main(){inti,n,s=0;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s+i;printf("Sum=%d\n",s);}運行結果:n=100Sum=5050如果是∑i=1+1/2+1/3+…+1/n呢?演算法類型小結:累加型【累加型】類型諸如

□+□+□+□+……+□+□

求其前n項之和的編程題。累加型演算法若設i為迴圈變數,s為前n項累加之和,則程式的基本結構為:

s=0;for(i=1;i<=n;i++)s=s+□;【例二】

編程求1-1/2+1/3-1/4+1/5-…+1/99-1/100分母為奇數時,相加分母為偶數時,相減法1:從變化規律分析……程式:main(){inti;floats=0;for(i=1;i<=100;i++)if(i%2)s=s+1/i;elses=s-1/i;printf("Sum=%f\n",s);}運行結果:Sum=1.000000錯在哪里?【例二】

編程求1-1/2+1/3-1/4+1/5-…+1/99-1/100法2:這是個累加型演算法的編程題……程式:#include<math.h>main();{inti;floats=0;for(i=1;i<=100;i++)s=s+pow(-1,i+1)/i;printf("Sum=%f\n",s);}

程式:#include<math.h>main(){inti,k=1;floats=0;for(i=1;i<=100;i++){s=s+

k/i;k=-k;}printf("Sum=%f\n",s);}累加型演算法程式基本結構為:

s=0;for(i=1;i<=n;i++)s=s+□;錯在哪里?(如何檢查程式錯誤?)運行結果:Sum=0.688172運行結果:Sum=1.000000【例三】編程求n!(n由鍵盤輸入)

分析

i=0

S0=

1=S0(初值)

i=1

S1=1×1=S0×1i=2

S2=1×2=S1×2i=3

S3=1×2×3=S2×3i=4

S4=1×2×3×4=S3×4

………i=nSn=1×2×3×4×…×n=Sn-1×n【例三】編程求n!(n由鍵盤輸入)

程式:main(){inti,n,s=1;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s*i;printf("Sum=%d\n",s);}運行結果:n=5Sum=120運行結果:n=8Sum=-25216Why?演算法類型小結:階乘型【階乘型】類型諸如

□×□×□×□×……×□×□

求其前n項之積的編程題。階乘型演算法若設i為迴圈變數,s為前n項相乘之積,則程式的基本結構為:

s=1;for(i=1;i<=n;i++)s=s*□;【例四】

編程求∑i!=1!+2!+3!…+n!(n由鍵盤輸入)外迴圈為累加型內迴圈為階乘型法1:從變化規律分析……程式:main(){inti,j,n;floats,s1;

printf("請輸入n=");scanf("%d",&n);

s=0;for(i=1;i<=n;i++){

s1=1;

for(j=1;j<=i;j++)s1=s1*j;s=s+s1;}

printf("Sum=%.0f\n",s);}運行結果:n=5Sum=153/*如果n值較大,可改為printf(“Sum=%e\n”,s);*/

【例四】

編程求∑n!=1!+2!+3!…+n!(n由鍵盤輸入)在同一個迴圈中先階乘,後累加法2:通過單迴圈實現……程式:main(){inti,n;floats,s1;

printf("請輸入n=");scanf("%d",&n);s=0,s1=1;for(i=1;i<=n;i++){s1=s1*i;s=s+s1;}printf("Sum=%.0f\n",s);}運行結果:n=5Sum=153除了以上例題,要求根據教材掌握:1、求按指定精度近似值問題(例6.6)2、判斷一個數是否素數問題(例6.8)3、密碼問題(例6.10)判斷一個數是否素數問題(例6.8另一種解法)

#include<math.h>main(){intm,k,i;clrscr();printf("x=");scanf("%d",&m);for(i=2;i<m-1;i++)if(m%i==0){printf("%disnotaprimenumber\n",m);exit(0);}printf("i=%d,%disaprimenumber\n",i,m);}exit(0)是停止函數,作用:使程式正常停止,返回操作系統狀態.作業一、編程題1.有一函數:x(x<1)y=2x+3(1=<x<=10)3x-2(x>10)寫一程式,輸入x,輸出y值.2、設有一四位數abcd=(ab+cd)2,編寫一個程式,求a、b、c、d。3、編寫一個程式,計算給定n時符合下式要求S的值。n由鍵盤輸入(n為不大於10的整數)。

S=(n…(…+(6×(5+(4×(3+(1×2)))作業4、編寫一個程式,求S值(n由鍵盤輸入):(程式檢驗參考:

x=6.66,n=8時,s=413147.468750;x=6.66,n=3時,s=-82.951630)5、編寫一個程式,求前n項之和S值,其中n≥1,x≠0。(n由鍵盤輸入):

12x35x813xS=──-──+──-──+──-──+...2x35x813x21(程式檢驗參考:x=6.66,n=8時,s=-16.492;x=6.66,x=15時,s=-28.469)6、編寫一個程式,求S值(n由鍵盤輸入):(程式檢驗參考:

x=6.66,n=8時,s=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论