版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C語言程序設(shè)計第1章C語言概述本章主要介紹C語言程序的結(jié)構(gòu)和書寫規(guī)則,以及TurboCV2.0的基本操作。1.1C語言出現(xiàn)的歷史背景1.2C語言的特點1.3簡單的C程序的介紹1.4C程序的上機步驟1.1C語言出現(xiàn)的歷史背景1.C語言的誕生與發(fā)展(1)在C語言誕生以前,系統(tǒng)軟件主要是用匯編語言編寫的。由于匯編語言程序依賴于計算機硬件,其可讀性和可移植性都很差;但一般的高級語言又難以實現(xiàn)對計算機硬件的直接操作(這正是匯編語言的優(yōu)勢),于是人們盼望有一種兼有匯編語言和高級語言特性的新語言。(2)C語言是貝爾實驗室于70年代初研制出來的,后來又被多次改進,并出現(xiàn)了多種版本。80年代初,美國國家標準化協(xié)會(ANSI),根據(jù)C語言問世以來各種版本對C語言的發(fā)展和擴充,制定了ANSIC標準(1989年再次做了修訂)。(本書選定的上機環(huán)境是TCV2.0(DOS操作系統(tǒng))。1.2C語言的特點C語言同時具有匯編語言和高級語言的優(yōu)勢。(1)語言簡潔、緊湊,使用方便、靈活。(2)運算符極其豐富。(3)生成的目標代碼質(zhì)量高,程序執(zhí)行效率高。(4)可移植性好(較之匯編語言)。(5)可以直接操縱硬件。
(6)在C語言中,除實現(xiàn)順序、選擇和循環(huán)三種基本結(jié)構(gòu)等的9條控制語句外,輸入輸出操作均由標準庫函數(shù)來實現(xiàn)。所以學(xué)習(xí)C語言,不僅要學(xué)習(xí)這9條控制語句和各種運算符,而且要學(xué)習(xí)并掌握常用標準庫函數(shù)的使用。例1:
main(){;}1.3簡單的C程序介紹1.main代表主函數(shù).每個c程序有且只有一個主函數(shù).2.函數(shù)體是由{}括起來的.3.C語言規(guī)定分號為語句的結(jié)束符,每條語句都用分號結(jié)束.4.對于單獨一個分號來說也是一條語句,只不過語句部分為空,即空語句,所以例1是包括空語句的C程序.1.printf是C語言中的輸出函數(shù),功能:將雙引號內(nèi)的字符串原樣輸出.我們注意這條語句結(jié)束后有一個分號.2.\n在C語言中表示換行符,是一個控制字符,表示在輸出這條語句后回車換行./**/間的內(nèi)容作為注釋部分,只起到說明的作用,不影響程序的運行.它只是給人看的,可以提高程序的可讀性,對編譯和運行不起作用,因此注釋可以加在程序中的任何位置.運行結(jié)果:It’sabook!(在用戶屏上輸出該語句,并且因為有\(zhòng)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是輸入輸出“格式字符串”,用來指定數(shù)據(jù)的類型.%d表示以十進制整數(shù)類型輸出,在執(zhí)行輸出時,此位置上代以一個十進制整數(shù)數(shù)值.(其他的格式字符串:%c,%s,%f…).5.第一個sum原樣輸出.第二個sum表示要輸出的變量,它的值就是a+b的值(579),而且這個值就會替代%d的位置.6.執(zhí)行結(jié)果:sumis579例4求兩數(shù)中的大者。
main()/*主函數(shù)*/{inta,b,c;/*定義變量*/
scanf(″%d,%d″,&a,&b);
c=max(a,b);/*調(diào)用函數(shù)*/
printf(″max=%d\n″,c);}
intmax(intx,inty)
{intz;/*定義局部變量*/
if(x>y)z=x;elsez=y;return(z);}1.本程序包括兩個函數(shù):主函數(shù)main和被調(diào)用函數(shù)max,max函數(shù)的作用是將x和y中較大者賦值給變量z.2.C程序執(zhí)行是從main函數(shù)中的第一條語句逐條執(zhí)行的.3.“scanf”是輸入函數(shù),和printf是一對,它們是C系統(tǒng)提供的標準輸入輸出函數(shù).這兩個%d和前面含義相同.‘&’表示取地址.scanf函數(shù)的作用是將鍵盤輸入的值存放到變量a,b所對應(yīng)的存儲單元中,也就是輸入給變量a,b.4.return是將z的值返回給主函數(shù)main.返回值通過函數(shù)名max帶回到函數(shù)的調(diào)用處.經(jīng)過執(zhí)行max函數(shù)得到一個返回值(即max函數(shù)中變量z的值)把這個值賦給c,然后輸出c的值.5.程序運行情況如下:8,5(通過鍵盤輸入8和5給a和b)max=8(輸出c的值即a和b的最大值)例4求兩數(shù)中的大者。
main()/*主函數(shù)*/{inta,b,c;/*定義變量*/
scanf(″%d,%d″,&a,&b);
c=max(a,b);/*調(diào)用函數(shù)*/
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()/*主函數(shù)*/{
floatr,s;r=1.0;/*變量r賦初值*/
s=PI*pow(r,2);/*計算圓面積s*/printf(“R=%f,S=%f\n”,r,s);}1.編譯預(yù)處理:程序執(zhí)行前自動進行的特殊處理.特點:以#開頭,結(jié)束處無分號.2.#define---宏定義命令.P39P187PI---符號常量(宏名最好用大寫區(qū)別一般變量)3.14159---宏體宏定義作用:用簡單符號代表宏體部分內(nèi)容(編譯時自動替換)5.
pow(x,y)求x的y次方,是math.h中的標準數(shù)學(xué)函數(shù).
6.%f表示以小數(shù)形式輸出,是“格式字符串”
7.運行結(jié)果:R=1.0,S=3.1415903.#include命令用來實現(xiàn)“文件包含”的操作.“math.h”或<math.h>是“頭文件”標準前導(dǎo)文件.4.
float表示實型,定義變量r,s為實型變量.例6:/*給定半徑,求圓的面積*/#definePI3.14159#include<math.h>main()/*主函數(shù)*/{
floatr,s;r=1.0;/*變量r賦初值*/
s=PI*pow(r,2);/*計算圓面積s*/printf(“R=%f,S=%f\n”,r,s);}總結(jié):一.一個c程序的組成:
編譯預(yù)處理部分(可選)
main(){
說明部分/*變量定義等*/執(zhí)行部分/*輸入輸出計算等*/}其他函數(shù)(可選,位置任意)二.C語言程序的基本特點C語言是一種函數(shù)式語言,其程序基本組成(單位)是函數(shù)每個C程序必須有一個、也只能有一個主函數(shù)main不管主函數(shù)在程序中的位置如何,程序執(zhí)行總是從主函數(shù)開始所有變量必須先定義(規(guī)定數(shù)據(jù)類型)后使用每個語句必須用分號“;”結(jié)束(注意是“每個語句”而不“每行語句”)編譯預(yù)處理命令不是語句(行末不能用分號結(jié)束)C語言本身沒有輸入/輸出語句,其輸入/輸出功能須通過調(diào)用標準函數(shù)來實現(xiàn)使用系統(tǒng)提供的標準庫函數(shù)或其他文件提供的現(xiàn)成函數(shù)時,必須使用“文件包含”(除了printf和scanf語句)主函數(shù)可以調(diào)用其他各種函數(shù),但其他函數(shù)不能調(diào)用主函數(shù).1.4C語言程序上機步驟P7C語言是一種通過編譯程序處理的高級程序設(shè)計語言。所以其上機的處理流程可用以下示意圖表示:在微機上,通常用來編寫、編譯、連接、調(diào)試和執(zhí)行C語言程序的是Borland公司開發(fā)的集成化軟件TurboC。
源程序(.c)———目標程序(.obj)———可執(zhí)行程序(.exe)編譯連接一.具體上機步驟如下:啟動機器,稍候后出現(xiàn):
login(入網(wǎng)注冊命令)
Enteryourloginname:user01(輸入用戶名)
password:*****(輸入用戶密碼)……(顯示網(wǎng)絡(luò)有關(guān)信息)
C>tc(調(diào)用TurboC軟件)此時便出現(xiàn)TurboC初始屏幕(第8頁圖1.2所示)。
用戶名:計教021班5號jj02105(初始密碼:jj021)
計應(yīng)022班11號jy02211(初始密碼:jy022)密碼修改:
setpass——輸入原密碼——輸入新密碼——再輸入新密碼退出:先退出tc,再輸入logout退出網(wǎng)絡(luò).二.TC的菜單(通過F10鍵和Esc鍵切換):FileEditRunCompileProjectOptionsDebugBreak/Watch文件操作編輯編譯運行項目文件選項調(diào)試中斷\觀察1.File:Load(打開已有的C程序文件)New(新建C程序文件)
Save(保存,文件名以.c為擴展名,如abc.c)Quit(退出TC)2.編輯源文件:在Edit(編輯)狀態(tài)下輸入.3.編譯源文件:選擇并執(zhí)行Compile/MakeEXEFile項(快捷鍵:F9),則TC將自動完成對當前正在編輯的源程序文件的編譯、連接,并生成可執(zhí)行文件。4.運行與查看結(jié)果(1)運行當前正在編輯的源程序文件選擇并執(zhí)行Run/Run項(快捷鍵:Ctrl+F9),程序運行結(jié)束后,仍返回到編輯窗口。(2)查看運行結(jié)果選擇并執(zhí)行Run/UserScreen項(快捷鍵:Alt+F5)。查看完畢后,按任一鍵返回編輯窗口。5.編輯下一個新的源程序選擇并執(zhí)行File/New項即可。如果屏幕提示如下確認信息:
NONAME.Cnotsaved.Save?(Y/N)
如果不需要保存當前正在編輯的源程序,則鍵入“N”如果需要保存當前正在編輯的源程序,則鍵入“Y”進入下一步操作。系統(tǒng)提示換名:<F:><path>\NONAME.C直接輸入你給源程序文件起的名字再按回車即可。6.退出TC返回DOS:File/Quit(快捷鍵:Alt+X鍵)
一、程序設(shè)計方法簡述
1、計算機處理問題的過程【例一】讓某學(xué)生解方程
ax2+bx+c=0
求解過程:①分析問題
這是一個一元二次方程(代數(shù)問題,須中學(xué)代數(shù)知識)②確定處理方案用求根公式③確定解題步驟
確定a、b、c的值求出b2-4ac的值如果b2-4ac>0(雙實根)
X1=……X2=……
如果b2-4ac=0(單實根)
X1=X2=……
如果b2-4ac<0(雙復(fù)根)
X1=……X2=……④根據(jù)上述步驟計算⑤寫出答案,一、程序設(shè)計方法簡述
2、程序測試目的發(fā)現(xiàn)程序中的錯誤(Bug)程序錯誤
◆語法錯誤(編譯系統(tǒng)檢查)
◆邏輯錯誤(編程人員檢查)
二、算法與流程圖
1、算法(algorithm)
P14
算法:解題思路(解題步驟等)算法有表示方式:偽碼(pseudocode)用人類語言的形式(通常是英語)表示算法。偽碼不在計算機上執(zhí)行,僅供程序員縮寫程序之前構(gòu)思時用(*注意偽碼程序只包含執(zhí)行語句,沒有聲明語句,后者僅僅是給編譯器提供的信息)流程圖(flowchart)用圖示方式表示算法編程依據(jù)(便于檢查)編程時用使用流程圖的優(yōu)點:不易出錯/便于編程/便于別人閱讀和檢查程序。通常編程的技術(shù)路線是:用偽碼和自頂向下、逐步求精的方法來制定算法,然后再編寫相應(yīng)的C語言程序。復(fù)雜程序處理部分宜用流程圖表示程序處理的過程。二、算法與流程圖
1、算法(algorithm)
示例:根據(jù)學(xué)生成績輸出評定結(jié)果。偽碼語句示例之一
ifstudent’sgradesgreaterthanorequalto60display”Passed”elsedisplay”Failed”偽碼語句示例之二
如果學(xué)生成績大于或等于60
顯示”及格”否則顯示”不及格”C語言源程序段示例if(grade>=60)printf(“Passed!”);elseprintf(“Failed”);二、算法與流程圖
2、傳統(tǒng)流程圖P19特點:直觀形象;使用流線。缺點:占面積大,使用流線任意轉(zhuǎn)移,易出現(xiàn)“亂麻”現(xiàn)象,造成編程與閱讀程序困難。二、算法與流程圖
3、N-S結(jié)構(gòu)化流程圖P26-27
77年美學(xué)者I.Nassi和B.Scheiderman提出。特點
①取消流線
②不允許流程任意轉(zhuǎn)移,只能從上而下順序執(zhí)行
③規(guī)定三種基本結(jié)構(gòu)的流程圖單元,由這些基本結(jié)構(gòu)象搭積木似的組成各種算法(結(jié)構(gòu)化設(shè)計)。優(yōu)點算法清晰,流程不會無規(guī)律亂轉(zhuǎn)移。二、算法與流程圖
4、三種基本結(jié)構(gòu)
P23-26通常情況下,程序中的語句是以所編寫的順序一句接一句地執(zhí)行,這種執(zhí)行方法稱為“順序執(zhí)行”。許多C語句能夠讓程序員指定不按編寫順序執(zhí)行下一條執(zhí)行語句,這種執(zhí)行方法稱為“控制轉(zhuǎn)移”。Bohm和Jacopini的研究證實,所有的程序都能夠只用三種控制結(jié)構(gòu)編寫,即
◆順序結(jié)構(gòu)
◆選擇結(jié)構(gòu)(selectionstructure)
◆循環(huán)結(jié)構(gòu)(repetitionstructure)順序結(jié)構(gòu)是C語言的基本結(jié)構(gòu),除非指示轉(zhuǎn)移,否則計算機自動以語句編寫的順序一句一句地執(zhí)行C語句。任何C語言程序都是由七種控制結(jié)構(gòu)(順序結(jié)構(gòu)、三種選擇結(jié)構(gòu)和三種循環(huán)結(jié)構(gòu))構(gòu)成的。二、算法與流程圖
4、三種基本結(jié)構(gòu)
P23-26順序結(jié)構(gòu)
A塊、B塊順序執(zhí)行(每塊代表一個或一組操作)二、算法與流程圖
4、三種基本結(jié)構(gòu)
P23-26選擇結(jié)構(gòu)
條件p成立時執(zhí)行a塊(否則執(zhí)行b塊)if選擇結(jié)構(gòu)條件為真時執(zhí)行某個指定的操作,條件為假時跳過該操作(單路選擇)if…else選擇結(jié)構(gòu)條件為真時執(zhí)行某個指定的操作,為假時執(zhí)行另一個指定的操作(雙路選擇)switch選擇結(jié)構(gòu)根據(jù)表達式的值執(zhí)行眾多不同操作中的某個指定的操作(多路選擇)二、算法與流程圖
4、三種基本結(jié)構(gòu)
P23-26循環(huán)結(jié)構(gòu)
分當型和直到型兩類。
當型先判斷,只要條件為真就反復(fù)執(zhí)行A塊,為假則結(jié)束循環(huán)。
直到型先執(zhí)行A塊,再判斷條件是否為真,為真則繼續(xù)執(zhí)行循環(huán)體,為假則結(jié)束循環(huán)。C語言提供了三種循環(huán)結(jié)構(gòu),即while循環(huán)結(jié)構(gòu),do…while循環(huán)結(jié)構(gòu)和for循環(huán)結(jié)構(gòu)。
三、選擇結(jié)構(gòu)程序設(shè)計
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
語句在特定情況下的變體。注意:
表達式外必須加括號,且括號外無分號,語句結(jié)束后要加分號.三、選擇結(jié)構(gòu)程序設(shè)計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);三、選擇結(jié)構(gòu)程序設(shè)計
1、if語句
示例【例一】以下程序的作用是什么?
main(){charc;
printf(“Input:”);scanf(“%c”,&c);
if(c>=’a’&&c<=’z’)c=c-32;elsec=c;
printf(“%c”,c);}/*將小寫字母轉(zhuǎn)換為大寫字母*/三、選擇結(jié)構(gòu)程序設(shè)計
1、if語句
if語句的嵌套P99一般形式:if()if()語句1;else語句2;elseif()語句1;else語句2;內(nèi)嵌if內(nèi)嵌if三、選擇結(jié)構(gòu)程序設(shè)計
1、if語句
if與else的配對關(guān)系:else總是與它上面的最近的未配對的if配對.即就近配對原則.if()if()語句1;elseif()語句2;else語句3;
第一個else雖然與第一個if在同一列上,但實際上它是與第二個if配對,因為它們相距最近.如果想讓第一個else與第一個if配對可寫成:if(){if()語句;}內(nèi)嵌ifelseif()語句;else語句;內(nèi)嵌if內(nèi)嵌if三、選擇結(jié)構(gòu)程序設(shè)計
1、if語句
示例【例二】以下程序的執(zhí)行結(jié)果是什么?
main(){intx=2,y=-1,z=2;
if(x<y)if(y<0)z=0;elsez+=1;printf(“%d\n”,z);}/*結(jié)果是2*/哦,原來是因為else總是與靠近它的if配套…
常見錯誤:if(x>0);if(x=2)if(1<=x<=10)y=3x+2;printf(“y>0”);y=x-1;三、選擇結(jié)構(gòu)程序設(shè)計
2、switch語句
P98switch語句的一般形式:switch(e){
casec1:語句組1;
case
c2:語句組2;
……case
cn:語句組n;
default:語句組n+1;/*可缺省*/}/*e–表達式(整型、字符型或枚舉型)*/c1~cn
常量(整數(shù)、字符、常量表達式如3+4,不含變量或函數(shù))default–不是c1~cn的情況(位置不一定在最后)。switch語句的執(zhí)行過程:
switch語句先計算表達式的值,然后同多個case語句后的常量比較,找到相等的case常量則執(zhí)行該常量冒號后的語句段,并從這個入口一直執(zhí)行下面所有冒號后的語句,直到switch語句結(jié)束。如果執(zhí)行一個或幾個冒號后的語句就要跳出switch語句,則可以在跳出處使用break語句。如果switch語句后表達式的值找不到匹配的case常量,就執(zhí)行default后面的語句段直到結(jié)束。default是任選項,如果沒有該語句,則在所有配對都失敗時,什么也不執(zhí)行。三、選擇結(jié)構(gòu)程序設(shè)計
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,求輸出結(jié)果。
結(jié)果:
60~69<60
錯誤輸入
?!三、選擇結(jié)構(gòu)程序設(shè)計
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級!我的成績應(yīng)該是60~69!什么!“<60”?“錯誤輸入”?怎么會這樣?!
運行結(jié)果:
60~69<60
錯誤輸入
三、選擇結(jié)構(gòu)程序設(shè)計
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!
運行結(jié)果:
60~69三、選擇結(jié)構(gòu)程序設(shè)計
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實際上并非真正的條件選擇,而只是一種跳轉(zhuǎn)指示(與if語句不同),表示下面應(yīng)該跳轉(zhuǎn)到什么位置繼續(xù)執(zhí)行。而各case實際上只是一個跳轉(zhuǎn)處的標記。當程序跳轉(zhuǎn)到某個case處時,并非只執(zhí)行此case行的程序組,而是從此處開始一直向下執(zhí)行各條語句,直到整個switch開關(guān)體結(jié)束(“}”)。如果要使每個case處相當于一種if(s)else的效果,必須在其語句組最后加上break語句。switch語句的執(zhí)行過程:
switch語句先計算表達式的值,然后同多個case語句后的常量比較,找到相等的case常量則執(zhí)行該常量冒號后的語句段,并從這個入口一直執(zhí)行下面所有冒號后的語句,直到switch語句結(jié)束。如果執(zhí)行一個或幾個冒號后的語句就要跳出switch語句,則可以在跳出處使用break語句。如果switch語句后表達式的值找不到匹配的case常量,就執(zhí)行default后面的語句段直到結(jié)束。default是任選項,如果沒有該語句,則在所有配對都失敗時,什么也不執(zhí)行。三、選擇結(jié)構(gòu)程序設(shè)計
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);}求程序運行結(jié)果。結(jié)果:a=2,b=1。如果x=2?
結(jié)果:a=1,b=1
如果x=3?結(jié)果:a=1,b=1
說明:1、每個case常量表達式的值必須互不相同,否則會出現(xiàn)互相矛盾的結(jié)果。
2、允許多個case共用一個執(zhí)行語句。例一:main(){chars;scanf(“%c”,&s);switch(s){case‘A’:printf(“優(yōu)\n”);case‘B’:printf(“良\n”);case‘C’:printf(“中\(zhòng)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位的正整數(shù),要求分別打印出每一位數(shù)字,按逆序打印出各位數(shù)字.main(){intnum;intidiv,ten,hundred,thousand,ten_thousand;printf(“請輸入一個小于五位的整數(shù):”);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(“每位數(shù)字:%d%d%d%d%d”,ten_thousand,thousand,hundred,ten,idiv);}elseif(thousand!=0){printf(“逆序為:%d%d%d%d”,idiv,ten,hundred,thousand);printf(“每位數(shù)字:%d%d%d%d”,thousand,hundred,ten,idiv);}elseif(hundred!=0){printf(“逆序為:%d%d%d”,idiv,ten,hundred);printf(“每位數(shù)字:%d%d%d”,hundred,ten,idiv);}elseif(ten!=0){printf(“逆序為:%d%d”,idiv,ten);printf(“每位數(shù)字:%d%d”,ten,idiv);}else{printf(“逆序為:%d”,idiv);printf(“每位數(shù)字為:%d”,idiv);}}例:輸入三個數(shù),按由大到小順序輸出。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);}例:輸入一個實數(shù)判斷它在平面直角坐標系中所在的象限。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(“請輸入學(xué)生的成績:”);
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,相應(yīng)的等級是%c.\n”,score,grade);}運行結(jié)果:請輸入學(xué)生的成績:95.2成績是95.2,相應(yīng)的等級是A。
第六章循環(huán)控制
一、循環(huán)結(jié)構(gòu)程序設(shè)計
循環(huán)是在循環(huán)條件為真時計算機反復(fù)執(zhí)行的一組指令(循環(huán)體)。循環(huán)控制通常有兩種方式:◆計數(shù)控制事先能夠準確知道循環(huán)次數(shù)時用之用專門的循環(huán)變量來計算循環(huán)的次數(shù),循環(huán)變量的值在每次執(zhí)行完循環(huán)體各語句后遞增,達到預(yù)定循環(huán)次數(shù)時則終止循環(huán),繼續(xù)執(zhí)行循環(huán)結(jié)構(gòu)后的語句。◆標記控制事先不知道準確的循環(huán)次數(shù)時用之由專門的標記變量控制循環(huán)是否繼續(xù)進行。當標記變量的值達到指定的標記值時,循環(huán)終止,繼續(xù)執(zhí)行循環(huán)結(jié)構(gòu)后的語句。
二、循環(huán)結(jié)構(gòu)程序設(shè)計在C語言中可用以下語句構(gòu)成循環(huán):
if…gotowhiledo…whilefor
其中if…goto是通過編程技巧(if語句和goto語句組合)構(gòu)成循環(huán)功能。而且goto語句將影響程序流程的模塊化,使程序可讀性變差,所以結(jié)構(gòu)化程序設(shè)計主張限制goto語句的使用。其他三種語句是C語言提供的循環(huán)結(jié)構(gòu)專用語句。
二、循環(huán)結(jié)構(gòu)程序設(shè)計
循環(huán)結(jié)構(gòu)兩大要素:循環(huán)條件
p
結(jié)束循環(huán)的條件表達式循環(huán)體A
循環(huán)執(zhí)行的語句或語句組設(shè)置循環(huán)條件要特別注意確定:循環(huán)變量的初值循環(huán)變量的終值循環(huán)變量的變化規(guī)律名詞解釋無限循環(huán)死循環(huán)名詞解釋空循環(huán)二、循環(huán)結(jié)構(gòu)程序設(shè)計
1、if…goto語句循環(huán)結(jié)構(gòu)
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);}直到型當型二、循環(huán)結(jié)構(gòu)程序設(shè)計
2、while語句循環(huán)結(jié)構(gòu)
P114【例三】main(){intn=0,sum=0;while(sum<=10000)
{
sum+=n;++n;}printf(“n=%d\n”,n);}當型一般形式
while(條件表達式)
循環(huán)體;用于構(gòu)成當型循環(huán):先判斷后執(zhí)行/條件為真繼續(xù)循環(huán),直到條件為假時結(jié)束循環(huán)。
2、while語句循環(huán)結(jié)構(gòu)
注意:
1.循環(huán)體如果包含一個以上的語句,應(yīng)該用花括號括起來,以復(fù)合語句形式出現(xiàn).如果不加花括號,則while語句的范圍只到while后面的第一個分號處.
2.條件表達式或循環(huán)體內(nèi)應(yīng)有改變條件使循環(huán)結(jié)束的語句,否則可能陷入“死循環(huán)”。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);}二、循環(huán)結(jié)構(gòu)程序設(shè)計
3、do…while語句循環(huán)結(jié)構(gòu)
P108【例四】main(){intn=0,sum=0;do{
sum+=n;++n;}while
(sum<=10000);printf(“n=%d\n”,n);}一般形式
do{
循環(huán)語句(組)
}while(條件表達式);
用于構(gòu)成直到型循環(huán):先執(zhí)行后判斷/條件為真繼續(xù)循環(huán),直到條件為假時結(jié)束循環(huán)?!咀⒁狻織l件表達式或循環(huán)體內(nèi)同樣應(yīng)有改變條件使循環(huán)結(jié)束的語句,否則可能陷入“死循環(huán)”。直到型直到sum超過10000為止二、循環(huán)結(jié)構(gòu)程序設(shè)計
3、do…while語句循環(huán)結(jié)構(gòu)
示例
【例五】從鍵盤輸入一個整數(shù)12456,分析以下程序運行結(jié)果。main(){intnum,c;
printf(“請輸入一個整數(shù):“);
scanf(“%d”,&num);
do{c=num%10;printf(“%d”,c);}while((num/=10)>0);
printf(“\n”);}
/*取得num的個位數(shù)*/
/*輸出num的個位數(shù)*/
/*直到num/10為0*/
結(jié)果:
65421將各位數(shù)字反序顯示出來3、do…while語句循環(huán)結(jié)構(gòu)
while和do-while循環(huán)的比較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二、循環(huán)結(jié)構(gòu)程序設(shè)計
4、for語句循環(huán)結(jié)構(gòu)
P118一般形式
for(表達式1;條件表達式;表達式3)
循環(huán)語句(組);
用于構(gòu)成計數(shù)型當型循環(huán):先判斷后執(zhí)行/條件為真繼續(xù)循環(huán),直到條件為假時結(jié)束循環(huán)。表達式1:整個循環(huán)中只執(zhí)行1次,常用來對循環(huán)變量設(shè)置初值條件表達式(表達式2):其值為真(非0)時繼續(xù)執(zhí)行循環(huán)語句(組),否則結(jié)束循環(huán)表達式3:常用于循環(huán)變量值的更新(循環(huán)體的一部分每次循環(huán)語句組執(zhí)行完后執(zhí)行一次)簡單形式:
for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)
循環(huán)語句(組);【例六】求∑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語句循環(huán)結(jié)構(gòu)
P118說明:1.for語句中“表達式1”可省,此時應(yīng)在for語句之前給循環(huán)變量賦初值.注意省略表達式1時,其后的分號不能省.如:for(;i<=100;i++)2.如果表達式2省略,即不判斷循環(huán)條件,循環(huán)無終止的進行下去.也就是認為表達式2始終為真.
如:for(i=1;;i++)sum=sum+i;
相當于:i=1;while(1){sum=sum+1;i++;}4、for語句循環(huán)結(jié)構(gòu)
3.表達式3也可省略,但此時程序應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束.如:for(i=1;i<=100;){sum=sum+1;i++;}4.可以省略表達式1和表達式3,只有表達式2,即只給循環(huán)條件.如:for(;i<=100;)while(i<=100){sum=sum+i;相當于{sum=sum+i;i++;}i++;}二、循環(huán)結(jié)構(gòu)程序設(shè)計
5、其他循環(huán)控制結(jié)構(gòu)
P122break
結(jié)束循環(huán)
在switch中退出switch結(jié)構(gòu);在循環(huán)中結(jié)束循環(huán)。
continue
結(jié)束本次循環(huán)循環(huán)“短路”(跳過循環(huán)體后面的語句,開始下一輪循環(huán)
)。goto
跳轉(zhuǎn)跳到循環(huán)體外指定標號處?!咀⒁狻?/p>
goto語句只能從循環(huán)內(nèi)向外跳轉(zhuǎn),反之不可!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);}結(jié)果:a=16,y=60
變量跟蹤ay10012 1214+216+12=2814+216+28=4414+216+44=60變量跟蹤分析法二、循環(huán)結(jié)構(gòu)程序設(shè)計
5、其他循環(huán)控制結(jié)構(gòu)
break
結(jié)束循環(huán)
在switch中退出switch結(jié)構(gòu);在循環(huán)中結(jié)束循環(huán)。
continue
結(jié)束本次循環(huán)循環(huán)“短路”(跳過循環(huán)體后面的語句,開始下一輪循環(huán)
)。goto
跳轉(zhuǎn)跳到循環(huán)體外指定標號處。【注意】
goto語句只能從循環(huán)內(nèi)向外跳轉(zhuǎn),反之不可!求以下程序段執(zhí)行后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;}結(jié)果:x的值為10,i的值為6
變量跟蹤ix
11→626→333→848→555→106二、循環(huán)結(jié)構(gòu)程序設(shè)計
5、其他循環(huán)控制結(jié)構(gòu)
break
結(jié)束循環(huán)
在switch中退出switch結(jié)構(gòu);在循環(huán)中結(jié)束循環(huán)。
continue
結(jié)束本次循環(huán)循環(huán)“短路”(跳過循環(huán)體后面的語句,開始下一輪循環(huán)
)。goto
跳轉(zhuǎn)跳到循環(huán)體外指定標號處?!咀⒁狻?/p>
goto語句只能從循環(huán)內(nèi)向外跳轉(zhuǎn),反之不可!main(){inti=1;
while(i<=15)if(++i%3!=2)
continue;elseprintf("%d",i);printf("\n");}結(jié)果:2581114
變量跟蹤
i++i%3輸出i
1→2222→303→414→5255→60
……二、循環(huán)結(jié)構(gòu)程序設(shè)計
5、其他循環(huán)控制結(jié)構(gòu)
break
結(jié)束循環(huán)
在switch中退出switch結(jié)構(gòu);在循環(huán)中結(jié)束循環(huán)。
continue
結(jié)束本次循環(huán)循環(huán)“短路”(跳過循環(huán)體后面的語句,開始下一輪循環(huán)
)。goto
跳轉(zhuǎn)跳到循環(huán)體外指定標號處。【注意】
goto語句只能從循環(huán)內(nèi)向外跳轉(zhuǎn),反之不可!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);}結(jié)果:2,3
三、常用算法1、枚舉法(窮舉法)
“笨人之法”:
把所有可能的情況一一測試,篩選出符合條件的各種結(jié)果進行輸出。
【例一】雨水淋濕了算術(shù)書的一道題,8個數(shù)字只能看清3個,第一個數(shù)字雖然看不清,但可看出不是1。編程求其余數(shù)字是什么?
[□×(□3+□)]2=8□□9分析設(shè)分別用A、B、C、D、E五個變量表示自左到右五個未知的數(shù)字。其中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);}結(jié)果:32864
【例一】雨水淋濕了算術(shù)書的一道題,8個數(shù)字只能看清3個,第一個數(shù)字雖然看不清,但可看出不是1。編程求其余數(shù)字是什么?
[□×(□3+□)]2=8□□9【例二】
求100~200之間不能被3整除也不能被7整除的數(shù)。
分析:求某區(qū)間內(nèi)符合某一要求的數(shù),可用一個變量“窮舉”。所以可用一個獨立變量x,取值范圍100~200。for(x=100;x<=200;x++) if(x%3!=0&&x%7!=0)printf(“x=%d\n”,x);如果是求指定條件的奇數(shù)呢?
如果是求指定條件的偶數(shù)呢?
x=101;x<=200;x=x+2
x=100;x<=200;x=x+2
2、歸納法(遞推法)
“智人之法”
:通過分析歸納,找出從變量舊值出發(fā)求新值的規(guī)律。三、常用算法【例一】編程求∑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);}運行結(jié)果:n=100Sum=5050如果是∑i=1+1/2+1/3+…+1/n呢?算法類型小結(jié):累加型【累加型】類型諸如
□+□+□+□+……+□+□
求其前n項之和的編程題。累加型算法若設(shè)i為循環(huán)變量,s為前n項累加之和,則程序的基本結(jié)構(gòu)為:
s=0;for(i=1;i<=n;i++)s=s+□;【例二】
編程求1-1/2+1/3-1/4+1/5-…+1/99-1/100分母為奇數(shù)時,相加分母為偶數(shù)時,相減法1:從變化規(guī)律分析……程序: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);}運行結(jié)果: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);}累加型算法程序基本結(jié)構(gòu)為:
s=0;for(i=1;i<=n;i++)s=s+□;錯在哪里?(如何檢查程序錯誤?)運行結(jié)果:Sum=0.688172運行結(jié)果: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);}運行結(jié)果:n=5Sum=120運行結(jié)果:n=8Sum=-25216Why?算法類型小結(jié):階乘型【階乘型】類型諸如
□×□×□×□×……×□×□
求其前n項之積的編程題。階乘型算法若設(shè)i為循環(huán)變量,s為前n項相乘之積,則程序的基本結(jié)構(gòu)為:
s=1;for(i=1;i<=n;i++)s=s*□;【例四】
編程求∑i!=1!+2!+3!…+n!(n由鍵盤輸入)外循環(huán)為累加型內(nèi)循環(huán)為階乘型法1:從變化規(guī)律分析……程序: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);}運行結(jié)果:n=5Sum=153/*如果n值較大,可改為printf(“Sum=%e\n”,s);*/
【例四】
編程求∑n!=1!+2!+3!…+n!(n由鍵盤輸入)在同一個循環(huán)中先階乘,后累加法2:通過單循環(huán)實現(xiàn)……程序: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);}運行結(jié)果:n=5Sum=153除了以上例題,要求根據(jù)教材掌握:1、求按指定精度近似值問題(例6.6)2、判斷一個數(shù)是否素數(shù)問題(例6.8)3、密碼問題(例6.10)判斷一個數(shù)是否素數(shù)問題(例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)是停止函數(shù),作用:使程序正常停止,返回操作系統(tǒng)狀態(tài).作業(yè)一、編程題1.有一函數(shù):x(x<1)y=2x+3(1=<x<=10)3x-2(x>10)寫一程序,輸入x,輸出y值.2、設(shè)有一四位數(shù)abcd=(ab+cd)2,編寫一個程序,求a、b、c、d。3、編寫一個程序,計算給定n時符合下式要求S的值。n由鍵盤輸入(n為不大于10的整數(shù))。
S=(n…(…+(6×(5+(4×(3+(1×2)))作業(yè)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=40.955;x=6.6
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年重型機械焊接安裝服務(wù)協(xié)議3篇
- 2025年度二手房交易首付分期及風(fēng)險控制協(xié)議4篇
- 2025年度防火門檢測維修服務(wù)合同4篇
- 2025版協(xié)議離婚實操教程與全程輔導(dǎo)合同3篇
- 2025年個人房產(chǎn)測繪與房地產(chǎn)市場調(diào)研合同4篇
- 2025版臨時演出場地租賃協(xié)議書3篇
- 2025年度綠色環(huán)保項目臨時工勞動合同范本8篇
- 個人家政服務(wù)合同2024年度專用3篇
- 2025年度智慧城市基礎(chǔ)設(shè)施場外工程承包合同4篇
- 2025年度物業(yè)設(shè)施設(shè)備智能化升級合同3篇
- 2025年生產(chǎn)主管年度工作計劃
- 2024-2025學(xué)年山東省聊城市高一上學(xué)期期末數(shù)學(xué)教學(xué)質(zhì)量檢測試題(附解析)
- 西方史學(xué)史課件3教學(xué)
- 2024年中國醫(yī)藥研發(fā)藍皮書
- 廣東省佛山市 2023-2024學(xué)年五年級(上)期末數(shù)學(xué)試卷
- 臺兒莊介紹課件
- 人工智能算法與實踐-第16章 LSTM神經(jīng)網(wǎng)絡(luò)
- 17個崗位安全操作規(guī)程手冊
- 2025年山東省濟南市第一中學(xué)高三下學(xué)期期末統(tǒng)一考試物理試題含解析
- 中學(xué)安全辦2024-2025學(xué)年工作計劃
- 網(wǎng)絡(luò)安全保障服務(wù)方案(網(wǎng)絡(luò)安全運維、重保服務(wù))
評論
0/150
提交評論