C語言全程學習_第1頁
C語言全程學習_第2頁
C語言全程學習_第3頁
C語言全程學習_第4頁
C語言全程學習_第5頁
已閱讀5頁,還剩200頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C語言程序設計基礎(chǔ) 前 言本電子講稿是在近幾年作者為計算機專業(yè)、計算機第二專業(yè)授課講稿的基礎(chǔ)上,為2000級計算機科學與技術(shù)(本科)(80學時)、計算機應用與維護及計算機網(wǎng)絡專業(yè)(60學時)授課而開發(fā)的。在開發(fā)中借鑒了作者以前開發(fā)的QUICK BASIC 程序設計及計算機應用基礎(chǔ)電子講稿的經(jīng)驗。在2000級授課完成后,對講稿進行了修改。為使該講稿適合99信息試點班(100學時)的教學,又根據(jù)教學要求,對講稿的內(nèi)容進行了一次較大規(guī)模的增加。此次用該講稿給2001級計算機科學與技術(shù)班(80學時)授課時,又結(jié)合本人主持的教育部教學科研課題,按照現(xiàn)代新的認知教學理論建構(gòu)主義的教學理論,對講稿進行了第三

2、次大規(guī)模的修改。本次修改,主要特色如下:1 根據(jù)人們學習程序語言的規(guī)律,講稿全部以實例為主線。以這種方式教學,首先介紹實際問題,接著介紹問題的解決辦法,也就是算法和數(shù)據(jù)結(jié)構(gòu),然后用偽代碼將問題描述出來,最后將偽代碼翻譯成C語言程序(當然也可以是其它語言的程序)。對于程序中碰到的新的語句或函數(shù),確改變了以往的程序語言教學的一般做法:一開始,先介紹語句或函數(shù),然后介紹用法(語法),再用一個小例子說明該語句或函數(shù)的使用,最后,羅列一大堆有關(guān)該語句或函數(shù)的若干細節(jié)。這樣的教學方法,對學生參加某些考試是很有幫助的。但要讓學生在學完語言課程后編制一個稍復雜的程序,往往就無從下手。 這樣學習,很多學生學了一

3、些語法或規(guī)律,但弄不明白為什么要這樣。以實例為主線,學生在學習程序之后,對不懂的語法現(xiàn)象再學習,就有了感性認識,也比較容易接受;2 利用超級鏈接功能模擬人在學習時的聯(lián)想,使得講稿可以從任何一部分進入,無需從頭開始學習;4 在以往的教材中,例題大多是為了說明語法而設計的,因此,各例題之間少有聯(lián)系。在本電子講稿中,大多數(shù)的例題之間是有聯(lián)系的,單獨使用時可以用來說明語言的語法現(xiàn)象,到課程結(jié)束時,這些例題又可以組合成一個較大的程序,以幫助學生進行程序設計訓練。3 在教學中,我們發(fā)現(xiàn),學生往往能讀懂一些簡單的程序,但對于一些簡單的問題,要自己進行程序設計比較困難。講稿中的例題,除少量較容易的例題外,全部

4、給予了詳細的算法分析,改變了以往教材或教學中的給出問題,然后給出程序,再給學生講解程序。本講稿以C程序作為基礎(chǔ),但對于其它高級語言的學習,也有參考價值。第1章 C 語言簡介第2章 順序程序設計第3章 分支結(jié)構(gòu)第4章 循環(huán)結(jié)構(gòu)第8章 結(jié)構(gòu)與共用體第11章 位運算第10章 C windows程序設計簡介第7章 指針第5章 函數(shù)第9章 文件第6章 數(shù)組第一章 C語言簡介一.程序的概念程序就是一系列的操作步驟,計算機程序就是由人事先規(guī)定的計算機完成某項工作的操作步驟。每一步驟的具體內(nèi)容由計算機能夠理解的指令來描述,這些指令告訴計算機“做什么”和“怎樣做”。 二.程序設計語言的概念編寫計算機程序所使用的

5、語言稱為程序設計語言。四 高級程序設計語言(簡稱高級語言) 高級語言是相對低級語言而言的。低級語言是計算機能直接識別的語言(機器語言)或符號化的機器語言(匯編語言),高級語言是一種通用的,面向用戶的各類需要,與特定的機器相分離,并遵循一定的嚴格規(guī)定與形式的語言,其語言格式接近于自然語言或接近于數(shù)學函數(shù)形式。三 計算機語言發(fā)展過程機器語言匯編語言高級語言BASIC,QUICK BASIC,FORTRAN,COBOL,PASCAL, C,LISP,PROLOG, ADA,PL/1,VISUAL BASIC,C+五 常用高級語言六 過程式語言 面向解題過程,告訴計算機“怎么做”,這種語言稱為過程式語

6、言。 面向處理對象,告訴計算機“做什么”而不必指出“怎么做”,計算機就能完成所要求的任務.這種語言稱為非過程式語言. BASIC,QUICK BASIC,FORTRAN,PASCAL,C等均為過程式語言, SQL查詢語言,SMALLTALK等均為非過程式語言.七 解釋型與編譯型語言 計算機不能直接識別高級語言,要讓計算機能執(zhí)行高級語言,需要將高級語言翻譯成等價的機器語言,這種翻譯有兩種形式:(1)邊翻譯邊執(zhí)行;(2)全部翻譯完成后才執(zhí)行。前一種方式稱為解釋方式,后一種稱為編譯方式.C,F(xiàn)ORTRAN,PASCAL 等為編譯型語言BASIC,java等為解釋型語言QUICK BASIC 有解釋和

7、編譯兩種方式.用高級語言寫成的程序稱為源程序(或源代碼)翻譯成的機器語言稱為目標程序(目標代碼)八 C 語言的特點 1 語言簡單、緊湊、使用方便、靈活。C語言一共只有32個關(guān)鍵字,9種控制語句,大小寫區(qū)別; 2 運算符豐富 共有34種運算符,表達式類型多樣化,使用靈活;3 數(shù)據(jù)結(jié)構(gòu)豐富,具有現(xiàn)代化的語言的各種結(jié)構(gòu);4 具有結(jié)構(gòu)化的控制語句,用函數(shù)作為程序模塊,以實現(xiàn)程序的模塊化,是結(jié)構(gòu)化的理想語言,符合現(xiàn)代編程風格的要求; 7 生成的目標代碼質(zhì)量高,一般只比匯編語言生成的目標代碼效率低10%20%; 8 用C語言編寫的程序可移植性好(與匯編語言相比)。 6 C語言允許直接訪問物理地址,能進行位

8、(bit)操作,可以直接對硬件進行操作,能實現(xiàn)匯編語言的大部分功能; 5 語法限制不太嚴格,程序設計自由度大。例如,對數(shù)組下標越界不作檢查,對變量的類型使用比較靈活。如整型量與字符型數(shù)據(jù)及邏輯型數(shù)據(jù)可通用。 九 C 語言學習中要注意的問題及學習方法 1 C語言關(guān)鍵字少,而且與其它高級語言類似,掌握標準C并不難。 2 C語言是基于函數(shù)的語言,C語言的大部分功能需要調(diào)用庫函數(shù)去實現(xiàn)。DOS下的C編譯器Turbo C 2.0大約有440個函數(shù), BC+2.0大約有500多個函數(shù),VC+除了標準的C運行庫之及C語言擴展外,還有600多個Windows API,以及VC+中的類庫,Linux的 C也有很

9、多擴展。要掌握好庫函數(shù)是不太容易的。3 C語言可以直接對硬件進行操作,因此,對計算機的硬件要有一定的了解,否則,就發(fā)揮不了C語言的這一特長。 4 C語言的指針使用極為靈活,這往往會給使用者帶來困難。 5 C語言的語法不太嚴格,給熟練的使用者以很大的靈活性,但給初學者帶來很多困難,尤其是程序的調(diào)試。學會調(diào)試程序是非常重要的。6 學習計算機語言要多實踐,學習C語言更要多實踐,只有通過大量的上機實踐才能真正掌握C語言。十 其它常用高級語言面向?qū)ο蟮腃語言。它是在C語言的基礎(chǔ)上增加了面向?qū)ο蟮膬?nèi)容。C+的學習比C語言更為困難。從目前的發(fā)展看,C+的應用更為普及。1 C+語言 PASCAL語言是一種有著

10、良好結(jié)構(gòu)化特性的高級語言,它是在軟件危機的70年代所創(chuàng)造的一種完全符合結(jié)構(gòu)化原則,有著嚴格的語法規(guī)則的高級語言。該語言在語言教學中有著良好的聲譽,但在實際使用中,利用該語言開發(fā)軟件并不多。所以許多人認為PASCAL 只是一種教學語言。2 PASCAL語言3 FORTRAN 語言FORTRAN是最早出現(xiàn)的高級語言之一。它是針對科學計算而設計的一種高級語言(早期計算機的主要任務就是進行科學計算),到目前為止,F(xiàn)ORTRAN仍主要是用于科學計算。C語言出現(xiàn)后,有人給FORTRAN語言判了死刑,但事實上,在科學計算上,尤其是在大規(guī)??茖W計算上,F(xiàn)ORTRAN仍是首選的高級語言。FORTRAN 自身也在

11、發(fā)展,目前,F(xiàn)ORTRAN已發(fā)展到90和95版本。微機上的FORTRAN編譯器也有多種,在國內(nèi)最流行的是VISUAL FORTRAN 5.0及更高的版本。此外還有其它的編譯器如NDP FORTRAN等,只是在國內(nèi)不大流行。4 VISUAL BASIC是由微軟公司開發(fā)的,支持WINDOWS平臺下開發(fā)的BASIC語言。它支持面向?qū)ο蟮拈_發(fā),是目前WINDOWS平臺下流行的開發(fā)工具之一。5 其它語言在實際應用中,還有許多其它的高級語言或開發(fā)工具。一般來說,每一種高級語言或開發(fā)工具都有它的使用范圍,到目前為止,還沒有一種語言能包打天下。十一 學習高級語言目的 對于計算機或電子專業(yè)來說, C語言的學習有

12、這樣幾個目的:1 學會使用C語言,能用C語言編制程序。2 掌握高級語言的基本特點,為學習其它的高級語言或開發(fā)工具打下堅實的基礎(chǔ)。同時,為后續(xù)有關(guān)課程的學習打下基礎(chǔ)3 對計算機程序的工作過程有所了解,增強使用程序的能力,而且,在學習C語言過程中所得到的能力,很容易遷移到其它軟件的使用中。第二章 順序結(jié)構(gòu)程序的設計順序結(jié)構(gòu)程序是指在程序的每次執(zhí)行過程中,程序中的各條語句按照在程序中的先后順序依次執(zhí)行。每個順序結(jié)構(gòu)程序中的可執(zhí)行語句在每一次程序執(zhí)行的過程中,執(zhí)行且只執(zhí)行一次。 順序程序是最簡單的程序。設計一個程序,首先要將問題分析清楚,然后用適當?shù)姆椒▽栴}描述出來,再根據(jù)問題的描述編成程序,最后調(diào)

13、試運行。描述問題的方法很多,有各種流程圖,層次圖、偽代碼等,更多的時候是多種手段混合使用。例2.1 最簡單的C程序,這也是世界上第一個C程序。/* exam21.c */* 最簡單的C程序 */#includemain() printf(“Hello,world!”);頭文件主函數(shù)例2.2 已知圓的半徑為R(R是一個可變的量),求圓的面積和周長,用計算機求解,程序如下/* exam22.c */* 計算圓的面積和周長 */#includemain() float r,area,s; scanf(“%f“,&r); area=3.14*r*r; s=2*3.14*r; printf(“面積= %

14、f, 周長=%f”,area,s);1、注釋2、數(shù)據(jù)說明3、數(shù)據(jù)輸入4、數(shù)據(jù)處理5、結(jié)果輸出例2.3 已知平行四邊形的長為50,寬為10,計算平行四邊形的面積和周長。程序如下:/ exam23.c/ 計算平行四邊形的面積和周長#includemain() float a,b; a=10.0; b=5.0; printf(“AREA=%f”,a*b);程序例2.4 以我國1992年工業(yè)產(chǎn)值為100,如果以9%的年增長率增長計算到2000年時的工業(yè)產(chǎn)值。1 算法分析:對此問題,要找出問題的數(shù)學模型。設r為年增長率,n為年數(shù),v為第n年的總產(chǎn)值。 則有 v=100*(1+r)n2 數(shù)據(jù)結(jié)構(gòu)根據(jù)算法分

15、析,至少要用到這么幾個量,年增長率、年數(shù)、第n年的總產(chǎn)值。而這幾個量中,年增長率肯定是小數(shù)(浮點)型數(shù)據(jù),年數(shù)是整數(shù)(整型),總產(chǎn)值不會是整數(shù),應為浮點數(shù)。這些數(shù)據(jù)都要放在相應的變量中,并要進行相應的數(shù)據(jù)說明。/ exam24.c/ 計算到2000年的工業(yè)產(chǎn)值#includemain() int n; float rate,value; n=2000-1992; rate=0.09; value=100*pow(float)(1+r),(float)n); printf( “2000年的產(chǎn)值為%f:”,value);pow為求冪的函數(shù)格式 pow(底,指數(shù))底,指數(shù)均為浮點數(shù)。強制類型轉(zhuǎn)換3

16、源程序代碼 此例中,只能算到2000年,且年增長率為9%時的工業(yè)產(chǎn)值。如果將工業(yè)產(chǎn)值改為10%,或者要算到其它年份,必須要修改源程序,使用不便。方法2:用scanf函數(shù)重新編寫程序。/ exam24.c/ 計算到2000年的工業(yè)產(chǎn)值#includemain() int n,year; float value,rate; printf(“請輸入年份和年增長率”); scanf(“%d,%f”,&year,&rate); n=year-1992; value=100*pow(float)(1+r),(float)n); printf(“按給定利率到指定年份的產(chǎn)值為%f”,value);例2.5 雞

17、兔同籠,已知雞兔總頭數(shù)為H(Heads),總數(shù)為F(Feet),問雞兔各有多少只?1 算法分析:(1)建立數(shù)學模型 設雞為x只,兔為y只,由題意有: x+y=h .(1) 2*x+4*y=f .(2)(2)求解方程,找出x,y的具體求解公式:以下用消元法找出方程的解(2)式-2(1)式注意:計算機不會自己建數(shù)學模型,也不會自己解方程!2y=f-2hy=(f-2h)/2 4(1)式-(2)式2X=4H-FX=(4H-F)/22 數(shù)據(jù)結(jié)構(gòu)程序中要用到不同的數(shù)據(jù),存放頭、腳數(shù)量的變量,存放方程解(雞、兔數(shù)量)的變量,存放方程判別式的變量等。對于頭、腳的數(shù)量,肯定是整型變量,方程的解理論上講是整型,但

18、在求解方程時要進行運算,為了避免發(fā)生錯誤,最好是用浮點數(shù)據(jù)。3 偽代碼(由于此問題比較簡單,也可直接編寫程序)。說明變量 x,y,f,h輸入數(shù)據(jù) f,h計算x,y打印結(jié)果偽代碼是一種程序設計工具,介于程序語言與自然語言之間,偽代碼不能被計算機編譯,但它很容易翻譯成高級語言./exam25.c#includemain() float x,y; int f,h; printf(“Input the numbers of Heads and Feet”); scanf(“%d,%d”,&f,&h); x=(4.0*h-f)/2.0; y=(f-2.0*h)/2.0; printf(“Heads=%d

19、;Feet=%d”,h,f); printf(“Chicken=%d,rabbits=%d”,x,y);4 源程序代碼說明輸入數(shù)據(jù)的內(nèi)容第三章 分支結(jié)構(gòu)程序設計問題:1、從鍵盤輸入一個數(shù),如果該數(shù)為正,打印,否則不打??;2、將考試成績不及格的學生名單打印出來;3、解一元二次方程,求出相應的實根或復根。 對于上述或類似問題,需要進行某種判斷,并根據(jù)不同情況進行不同的處理,怎樣進行程序設計?解決辦法:1、引入新的程序結(jié)構(gòu),分支結(jié)構(gòu), 有時也稱 判斷結(jié)構(gòu) 或 選擇結(jié)構(gòu)。2、為了和分支結(jié)構(gòu)相配合,同時還要引入 邏輯表達式的概念。3、有三種形式可進行分支結(jié)構(gòu)的程序設計A、 if 結(jié)構(gòu)B、多重選擇結(jié)構(gòu)(s

20、witch語句)C、無條件轉(zhuǎn)移結(jié)構(gòu)(goto語句)本章內(nèi)容 if 語句關(guān)系表達式和邏輯表達式if 語句的變形及嵌套多重選擇語句 (switch 語句)無條件轉(zhuǎn)移語句( goto 語句)本章小結(jié)例 3.1 求一元二次方程的根1、算法分析:2、數(shù)據(jù)結(jié)構(gòu): 由于問題簡單,只需用到一些單精度實數(shù)3、偽代碼輸入方程系數(shù) a,b,c計算判別式 d=b*b-4*a*cif 判別式大于等于 0 then 計算兩個實根 定位輸出光標 打印結(jié)果else 計算實部 計算虛部 定位輸出光標 打印結(jié)果end program4、源程序清單 #include #includemain() float a,b,d,c,x1,

21、x2,p,q; printf( “輸入方程系數(shù):” ); scanf(“%f,%f,%f”,&a,&b,&c); d=b*b-4*a*c; if ( d=0) x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf( “x1=%f,x2=%fn”,x1,x2); else p=-b/(2*a); q=sqrt(-d)/(2*a); printf( “x1=%f+i%f,x2=%f-i%fn”,p,q,p,q); 求平方根的函數(shù)例 3.2 商店售貨,按購買貨物款的多少分別給予不同的 優(yōu)惠折扣,編程計算實際應付貨款。購貨不足250元,沒有折扣;購貨25

22、0元(含250元,下同),不足500元,減價5%;購貨500元,不足1000元,減價7.5%;購貨1000元,不足2000元,減價10%;購貨2000元及以上,減價15%;1、算法分析: 設購物款為M,折扣為D,則D可表示為: D=0 (M250) D=0.05 (250 M500) D=0.075 (500 M1000) D=0.1 (1000 M2000) D=0.15 (2000M)2、源程序清單/ exam42.c#includemain() float m,d,t; printf(“請輸入購物金額: ”); scanf(“%f”,&m); if ( m=250 & m=500 & m

23、=1000 & m=2000) d=0.15; t=m*(1-d), /計算應付 款 printf( “實際應付款:%f”,t);輸入購物款: 249實際應付款:249輸入購物款: 500實際應付款:462.5例 3.3 購物折扣程序的另一個寫法改寫后,程序更清晰,執(zhí)行時間更省。/ exam42.c#includemain() float m,d,t; printf(“請輸入購物金額: ”); scanf(“%f”,&m); if ( m=250 & m=500 & m=1000 & m=2000) d=0.15; t=m*(1-d), /應付款 printf( “實際應付款:%f”,t);例

24、 3.4 從鍵盤輸入一字符,如果為Y,則打印是,為N,打印否,其它 字符,打印輸入錯誤。/ exam44.c#includemain() char a; printf(“輸入一個字符:”); a=getchar(); if( a=“Y” | a= =“N” ) if (a=“Y”) printf( “是”); else printf( “否”); else printf( “輸入數(shù)據(jù)不合要求”);演示#includemain() int x,y,z; printf(“Iput x,y,z:”); scanf(“%d,%d,%d”,&x,&y,&z); if ( x0) if (y0 ) if

25、(z0) printf( “所有數(shù)據(jù)大于零!”); else printf( “只有X,Y大于零!”); else if (x=0) if (y=0) if (z=0) printf( “所有數(shù)據(jù)都為零!”); else printf( “只有X,Y等于零!”); else printf( “X 小于零!”);例 3.5 演示 嵌套不能太深,一般以三層為限,嵌套太深,容易出錯。嵌套演示程序#includemain() int x,y,z; printf(“Iput x,y,x:”); scanf(“%d,%d,%”,&x,&y,&z); if ( x0 & y0 & z0) printf( “

26、所有數(shù)據(jù)大于零!”); else if (x0 & y) printf( “只有X,Y大于零!”); else if (x=0 & y=0 & z=0) printf( “所有數(shù)據(jù)都為零!”); else if (x=0 & y=0) printf( “只有X,Y等于零!”); else if (x=A & ch=A & chb?a:cd?c:d ab?a:(cd?c:d)此處使用了條件運算符3 源程序代碼之二#includemain() int i; printf(“輸入數(shù)字 1- 7: ”); scanf(“%d”,&i); if (i=1) printf ( “Today is Mond

27、ay!n”); else if (i=2) printf (“Today is Tuesday!n”); else if (i=3) printf (“Today is Wednesday !n”); else if (i=4) printf( “Today is Thursday!n”); else if (i=5) printf( “Today is Friday!n”); else if (i=6) printf( “Today is Saturday!n”); else printf( “Today is Sunday!n”);例 3.7 輸入星期中的某一天,顯示對應的英文此例似顯復雜

28、,是否有更好的辦法?main() int I; printf( “輸入數(shù)字 1- 7: ”); scanf(“%d”,&i); switch(i) case 1: printf( “Today is Monday!”); case 2: printf( “Today is Tuesday!”); case 3: printf( “Today is Wednesday !”); case 4: printf( “Today is Thursday!”); case 5: printf( “Today is Friday!”); case 6: printf( “Today is Saturday

29、!”); default: printf( “Today is Sunday!”); 例 3.8 用 switch 語句重寫打印星期程序。main() int I; printf( “輸入數(shù)字 1- 7: ”); scanf(“%d”,&i); if (i=1) printf( “Today is Monday!”); else if (i=2) printf( “Today is Tuesday!”); else if (i=3) printf( “Today is Wednesday !”); else if (i=4) printf( “Today is Thursday!”); els

30、e if (i=5) printf( “Today is Friday!”); else if (i=6) printf( “Today is Saturday!”); else printf( “Today is Sunday!”);例 3.9 用 switch 語句重寫例4.4的程序main() char a; printf( “輸入一個字符:” ); a=getchar(); if (a=“Y” | a=“N” ) if (a=“Y” ) printf( “是n”); else printf( “否n”); else printf( “字符不合要求!n”)顯然,改寫后的程序更清晰,更簡短

31、。main() char a; printf( “輸入字符:”); a=getchar(); switch (a) case Y: printf( “是n”); break; case N: printf( “否n”); break; default: printf( “字符不合要求!n”) 例 3.10 在屏幕上顯示菜單分析: 程序首先在屏幕上將功能顯示出來,用戶根據(jù)需要選擇相應的功能,程序根據(jù)用戶的選擇執(zhí)行相應的程序段。對于這類程序,往往是用戶輸入一個英文字母,然后程序根據(jù)字母來斷別程序該執(zhí)行什么程序段,故一般用 switch語句比較方便。2 源程序清單switch(a)case i: p

32、rintf(“調(diào)用輸入模塊!”); break;case o: printf(“調(diào)用輸出模塊!”); break;case l: printf(“調(diào)用查找模塊!”); break;case q: printf(“調(diào)用退出模塊!”); break; main() int char a; printf(“請選擇:”); printf(“輸入 i ”); printf(“ 輸出 o ”); printf(“找出最長的單詞 l”); printf(“退出 q”); a=getchar();執(zhí)行選項時,要調(diào)用相應的模塊(程序段)。由于現(xiàn)在還沒有相應的程序,暫用一條打印語句代替。以后會用相應程序代替例 3

33、.11 統(tǒng)計某班級中計算機課程中考試成績高于80分的人數(shù)。假設學生人數(shù)為 main() int i, fs, j=0;Loop: scanf(“%d”,&fs); j+; /統(tǒng)計已讀入的數(shù)據(jù)個數(shù) if (fs80) i+; printf(“%d, %d”,i,fs); if(j95 或者輸入數(shù)據(jù)完成(i某值) 退出輸入; else go 輸入成績行 ; if ( fs 95) 打印字符串“找到了!” else 打印字符串“沒找到!”結(jié)束程序3 程序偽代碼 main() int fs,i; i=1;loop1 scanf(“%d”,&fs); i=i+1; if(fs95| i10 ) goto

34、 loop2; else goto loop1; loop2 if ( fs 95) printf(“FIND !”); else printf( “DO NOT FIND !”);4 源程序代碼之一5 源程序代碼之二#includemain() int fs,i=1; printf(n請輸入第 %d 個數(shù)據(jù): ,i); scanf(%d,&fs); while(fs=95 & i95) printf( n找到啦!n ); else printf( n沒找到!n);注意輸入提示例 4.2 將輸入的正文復制到輸出,每次一個字符1 算法分析 本題的含義是每次從鍵盤上輸入一個字符,然后將該字符在屏幕

35、上輸出。因為是正文,故其結(jié)束的標志為ctrl+z 要使用字符函數(shù)來接受從鍵盤輸入的字符,一般用getchar函數(shù)。2 源程序代碼 #includeint main(void) char c; printf(“input a text end of ctrl+zn”); c=getchar(); while(c!=EOF) putchar(c); c=getchar(); 在頭文件中定義的常數(shù)(-1)#includeint main(void)char c;printf(input a text n);while(c=getchar()!=EOF) putchar(c);例 4.3 請閱讀下面的

36、程序,說明程序的功能。該程序與上面的程序功能一樣,只不過將字符輸入語句放入循環(huán)判斷條件中。例 4.4 比較兩種循環(huán)的用法。 從鍵盤輸入一個字符Y或N,直到輸入正確為止。1 算法分析在程序中,經(jīng)常會遇到要求用戶輸入Y或N,以確定某種狀態(tài)。為防止用戶在無意中碰到鍵盤而輸入錯誤的字符,程序?qū)τ脩糨斎氲牟缓弦蟮淖址雎?,并要求用戶重新輸入。為了做到上述要求,程序?qū)斎氲淖址M行判斷,如果不合要求,則將輸入的字符忽略,并等待用戶重新輸入。顯然,要做到這一點,須用一個循環(huán)程序,當輸入正確時,循環(huán)結(jié)束。設輸入變量為c ,則循環(huán)控制條件為!(c=Y | c=N) 或者(c!=Y & c!=N)2 源代碼比

37、較格式1: c=getchar(); while (c!=Y & c!=N) printf( answer is Y or N“); c=getchar(); 格式2: do printf( ”Enter Y or N“); c=getchar(); while(c!=Y & c!=N);顯然,格式 2更方便!#includemain() int fs,i=1; do printf(請輸入第 %d 個數(shù)據(jù): ,i); scanf(%d,&fs); i+; while(fs=95 & i95) printf( n找到啦!n ); else printf( n沒找到!n);例 4.5 將例4.1用

38、新的dowhile 語句重寫查找某班級考試結(jié)果是否有高于95分的成績。例 4.5 統(tǒng)計某班級中計算機課程中考試成績高于80分的人數(shù),現(xiàn)用for 循環(huán)語句重寫該程序。 main() int fs,sum,j; sum=0; for (j=1; j80) sum=sum+1; printf(“sum=%dn“,sum); 給循環(huán)變量 j 賦初值1循環(huán)變量 j 加1循環(huán)控制條件例4.6 求數(shù)列 的和。1、分析: 該數(shù)列中每一項的分母都有規(guī)律,后一項為前一項加5,分母的通式為: An =An-1 +5, A1 =1或: 程序/ exam53.c#includemain()int i;float sum

39、=0;for(i=0;i=100;i+)sum=sum+1.0/(1+i*5);printf(%f,sum);sunhui:2002年4月10日星期三6時16分56秒根據(jù)昨天上機的情況,本次課安排了一次習題課。昨天上機時也布置了兩道題。一道題是求和:加一道題是教材120頁的第八題。學生的思路還是很多的。例 4.7 求的近似值,精確到公式為:此類問題相對簡單,但要注意累加變量和通項的初值。該問題中,累加變量sum 的初值為0,通項 term 的初值為 1。#include#includemain()double pi,term,sum;int i;sum=0.0;term=1.0;for(i=1

40、;term0.00000000000001;i+)term=1.0/(i*i);sum=sum+term;pi=sqrt(sum*6);printf(%fn,pi);兩個相乘,其值會溢出,故得不到想要的結(jié)果例 4.8 分別統(tǒng)計某班學生各科成績中高于分的人數(shù)。 學生人數(shù)為30人,課程為:數(shù)學、語文、英語、物理、生物。int n,i;n=0;for(i=1;i=80) n=n+1; / 累加大于80 分的人數(shù) printf(n=%d“,n); 先看統(tǒng)計數(shù)學成績 統(tǒng)計五門課程,只需將統(tǒng)計一門課程的程序用不同的數(shù)據(jù)執(zhí)行 5 次,這可用一個循環(huán)實現(xiàn)。 / 統(tǒng)計某一門課程 n=0; for(i=0;i=8

41、0) n=n+1; printf(n=%d“,n);for(j=0;j5;j+) / 對課程循環(huán) 統(tǒng)計每門課程的成績! / 統(tǒng)計一門課程 n=0; for(i=0;i=80) n=n+1; printf(n=%d“,n); 這里,用到了二重循環(huán)。例 4.9 求自然對數(shù)的底e,取前 n 項的和。1 算法分析此題有兩種算法:一種是直接求通項,則先求 n!,然后求1/n! , 這種方法比較簡單。求 n 階乘的程序段為f=1;for(j =1;j=n;j+) f=f*j;,則有設通項為由于數(shù)列的第一項不能用通項表示,故將其直接放入累加變量中。程序片段為第二種求通項的公式e=1.0; a=1;for(m

42、=1;m=n;m+) a=a*(1/m ); e=e+ a;/ 利用雙重循環(huán)計算main() int i,j,n; float e,f; printf( “Please input N: ”); scanf(“%d”,&n); e=1.0; for(i=1;i=n;i+) f=1; for(j =1;j=i;j+) f=f*j; e=e+1/f; printf( “e=%f”,e);/ 利用單重循環(huán)計算main() int i,n; float e,f; printf( “Please input N:”); scanf(“%d”,&n); e=1.0; f=1; for(i=1;i=n;i+

43、) f=f*(1/i ); e=e+ f; printf( “e=%f”,e);2 源代碼例 4.10 從鍵盤上輸入字符并按行顯示,遇到Esc鍵結(jié)束,要求只顯示輸出內(nèi)容。 在每行前顯示字符串“The Line No. is n”,n為1,2,3,1 算法分析此題要求從鍵盤上輸入字符并按行顯示,初一看,只要用行輸入語句就行。但仔細分析后會發(fā)現(xiàn),用行輸入語句不行。如用 gets 或 scanf 語句,則輸入的內(nèi)容會在屏幕上回顯(即輸入的內(nèi)容顯示在屏幕上),其次,這兩個語句都不能單獨捕捉到Esc鍵。因此,只能用單個字符輸入的函數(shù),但要求不要回顯,getchar函數(shù)也不行,但推測是與getchar相類

44、似的函數(shù)。故可先調(diào)出getchar 的幫助,然后看See Also。既然是按行顯示,用字符輸入函數(shù),每輸入一個字符,立刻在屏幕上顯示出來。當接受到換行符時,轉(zhuǎn)入下一行。因此,對每一行的輸入,要用一個循環(huán),循環(huán)的控制條件就是輸入的字符不為換行符。當輸入為換行符時,循環(huán)從頭開始。程序的結(jié)束是以接受到Esc鍵為標志的,故而要在行輸入的外面再增加一個循環(huán),此循環(huán)的結(jié)束條件是輸入的字符為Esc鍵。行輸入的程序片段為printf(nThe Line No. is %d, i); do printf(%c, c); c=getch(); while(c!=13 & c!=27);13 return鍵ASCI

45、I碼27 Esc鍵ASCII碼getch 不回顯輸入 字符函數(shù)#include#includeint main(void) int i=0; char c=0; while(c!=27) c=0; i+; printf(nThe Line No. is %d, i); do printf(%c, c); c=getch(); while(c!=13 & c!=27); printf(nThe endn);從鍵盤上輸入一個字符,不回顯Esc鍵的ASCII碼值回車符的ASCII碼值2 源程序代碼 例 4.11 輸入一個算式,模擬袖珍計算機的加、減、乘、除四則運算。例如:輸入10.8+0.13*10

46、0 計算結(jié)果為: 1093.000000假定計算時不考慮運算符的優(yōu)先級,也不允許有( ),而是按照運算符出現(xiàn)的先后順序執(zhí)行運算。 main(void) double x,y; char op; inx: printf(input arithmetic expression:n); scanf(%lf,&x); while(op=getchar()!=n) iny: scanf(%lf,&y); switch(op) case +:x+=y; break; case -:x-=y; break; case *:x*=y; break; case /: if(y) x/=y; else print

47、f(division is zero,input y againn); goto iny; break; default: printf(illegal operator,input againn); goto inx; printf(%8.4fn,x);開始 輸入系數(shù)a,b,cd=b*b-4*a*cd=0例4.12:用流程圖描述求解一元二次方程的根x1=(-b+sqrt(d)/2x2=(-b-sqrt(d)/2輸出x1,x2p=-b/2q=sqrt(-d)/2輸出x1,x2結(jié)束TF例4.13 輸入一段C語言程序(一個正文),按原來格式復制到輸出,復制過程中刪除輸入程序中所有的注釋。此處注釋專

48、指“/* */”的注釋。1 算法分析程序先要輸入,在C語言中,當從鍵盤輸入時,先將輸入數(shù)據(jù)放入鍵盤緩沖區(qū)中,當接受到回車符后,程序才開始從鍵盤緩沖區(qū)中讀數(shù)據(jù)。分析之前,首先,弄明白問題的意思。程序要求輸入一段程序(C語言),并將輸入的程序在屏幕上輸出。在輸出時將程序中的注釋(/* */)過濾,既不輸出注釋。輸出時要將注釋過濾掉,首先要判別什么內(nèi)容是注釋內(nèi)容。例: while(ab) /*while a b */ printf(“*/”);字符的類型,僅從字符本身是無法區(qū)分的。如上面的串中,字符串while可能是普通字符串,也可能是注釋字符串。同樣,對“*/”字符,與/*配對是注釋字符,否則就是

49、普通字符。因此,需要一個類型標志 state 。因此,字符的類型標志可取為: 普通字符(COPY)、注釋開始(START)、注釋字符(COMMENT)、注釋結(jié)束(END)。因此,在C程序中,從注釋的角度來看,字符共有四種,普通字符、注釋開始字符、注釋結(jié)束字符及注釋字符。while(ab) printf(“*/”); 為普通字符,while ab 為注釋字符,/* */ 為注釋標志字符。參照下例開始程序設計。開始時,state 置普通字符狀態(tài)。在普通字符狀態(tài),如果輸入字符不是/,則將字符原樣輸出,如果輸入字符為/,在開始注釋狀態(tài),如果輸入字符為*,while(ab) /*while a b */

50、 printf(“*/”); 則可能開始注釋,將state 設為注釋狀態(tài),字符 / 不輸出;參照下例開始程序設計。開始時,state 置普通字符狀態(tài)。在普通字符狀態(tài),如果輸入字符不是/,則將字符原樣輸出,如果輸入字符為/,在開始注釋狀態(tài),如果輸入字符為*,表明注釋開始,state置為注釋狀態(tài);如果輸入字符不是*,while(ab) /*while a b */ printf(“*/”); 則可能開始注釋,將state 設為注釋狀態(tài),字符 / 不輸出;參照下例開始程序設計。開始時,state 置普通字符狀態(tài)。在普通字符狀態(tài),如果輸入字符不是/,則將字符原樣輸出,如果輸入字符為/,在開始注釋狀態(tài),

51、如果輸入字符為*,表明注釋開始,state置為注釋狀態(tài);如果輸入字符不是*,表明前面設置的注釋開始狀態(tài)不對,state改為普通字符狀態(tài);然后將/輸出,接下將剛輸入的字符原樣輸出。在注釋狀態(tài),如果輸入的字符不是*,字符不加處理,否則,表明注釋將要結(jié)束,將state置為結(jié)束狀態(tài)。在結(jié)束注釋狀態(tài),如果輸入字符為/,表明注釋結(jié)束,state 置為普通字符狀態(tài);否則,仍為注釋狀態(tài),state置為注釋狀態(tài)。while(ab) /*while a b */ printf(“*/”); 則可能開始注釋,將state 設為注釋狀態(tài),字符 / 不輸出;while(c=getchar()!=EOF) if(輸入換行

52、符)輸出換行符 else switch(state) 普通字符狀態(tài): if (輸入字符 /) 字符狀態(tài)設為 START; else 字符原樣輸出 開始注釋狀態(tài): if (輸入字符 *) 注釋內(nèi)容從此后開始,狀態(tài)設為注釋 else / 為普通字符 原樣輸出 / 原樣輸出輸入的字符 將字符狀態(tài)重新設為 普通字符(COPY) 注釋狀態(tài): if(輸入字符 *) 注釋即將結(jié)束,狀態(tài)設為END; 結(jié)束狀態(tài): if 輸入字符 / 注釋結(jié)束,狀態(tài)設為COPY else 仍為注釋狀態(tài) S輸出c輸出nFc=nc=/S=START輸出/輸出cc=*S=COMMc=/S=COPYS=COMMc=*S=ENDS=COP

53、YTCOPYSTARTCOMMEND輸入字符賦給c,c!=EOF循環(huán)體底部TTTTFFFFs=COPY循環(huán)流程圖演示#include#define COPY 0#define START 1#define COMMENT 2#define END 3int main(void)char c; int state; state=COPY; printf(input C program end of crtl+z:n);while(c=getchar()!=EOF) if(c=n)putchar(n); elseswitch(state)case COPY: if (c=/) state=STAR

54、T; else putchar(c);break;case START: if (c=*)state=COMMENT; elseputchar(/);putchar(c);state=COPY; break;case COMMENT: if(c=*) state=END; break;case END: state=(c=/)?COPY:COMMENT; break;返回例4.14 利用getch函數(shù),編寫密碼輸入程序。輸入密碼時,屏幕上不顯示輸入內(nèi)容,而代之以“星號”之類的內(nèi)容,以防他人看到密碼。#include#includemain() char c=0; printf(請輸入密碼:n)

55、; while(c!=13) c=getch(); putchar(*); putchar(n);一、函數(shù)過程的概念 過程是現(xiàn)代過程式語言的重要概念。在程序設計中,離開了過程就談不上結(jié)構(gòu)化程序設計。 過程是程序設計中的一個邏輯單元,是一段程序,能完成某一項簡單的功能。過程與程序的關(guān)系類似于機器中的零部件與機器之間的關(guān)系。 如系統(tǒng)提供的 sin(x) 函數(shù),就是一個函數(shù)過程。它是系統(tǒng)提供的求變量(參數(shù)) X 的正弦值的過程。系統(tǒng)中有許多這樣的過程,如 sqrt,strcat等。第五章 函數(shù)二、過程的優(yōu)點:1、利用過程可以把程序劃分為若干個獨立的邏輯單元,每一個單元相對于整個程序小得多,故其調(diào)試更

56、容易; 2、過程可作為一個功能模塊而被同一程序中的不同地方引用,也可被不同程序引用。如系統(tǒng)提供的函數(shù),就可被不同的使用者引用。三、C語言中的過程C語言只提供了一種過程,即函數(shù)過程,也簡稱函數(shù)。后面,我們將把函數(shù)過程簡稱為函數(shù)。例5.1 編程計算組合數(shù)。設有j, k, 且jk, 則組合數(shù) c為c=(j!-k!)/k!。!為階乘的符號。1 算法分析此題不難編程,只要分別求出二個數(shù)的階乘,然后根據(jù)公式進行計算即可。求一數(shù) j 的階乘的程序段為jc=1;for(i=1; i=j; i+) jc=jc*i;2 源程序代碼之一#includemain()int i,j,k,ic,jc,kc;float r

57、esult;scanf(%d,%d,&j,&k);jc=1;for(i=1;i=j;i+)jc=jc*i;kc=1;for(i=1;i=k;i+)kc=kc*i;result=(jc-kc)/(float)kc;printf(the result=%fn,result);3 源程序代碼之二#includefloat jc(int);main() int i,j,k,ic,jc,kc; float result; scanf(%d,%d,&j,&k); result=( jc(j)- jc(k) )/ jc( k ); printf(the result=%fn, result);float j

58、c(int n) int i; float j=1.0; for(i=1; i=n; i+) j=j*i; return j;函數(shù)定義函數(shù)說明參數(shù)返回值問題:在主函數(shù)和函數(shù) jc 中都定義了變量 j,它們之間的關(guān)系如何?例5.2 編寫程序,利用遞歸調(diào)用方式,計算n!。 遞歸公式總是有一個結(jié)束條件,這個結(jié)束條件稱為”邊界條件”,如n!的邊界條件為n1) C=計算n!可以用下式定義:n!=n(n-1)(n-2)(n-3)21int fact(n) int f; if(n=1) f=1; elsef=fact(n-1)*n; return f;#includeint fact(int);main()

59、int i,n;scanf(%d,&n);i=fact(n);printf(n!=%d,i);例5.3 編寫程序,利用遞歸調(diào)用方式計算兩個數(shù)m、n的最大公約數(shù)。(其中mn,且n0)分析:本例采用輾轉(zhuǎn)相除法來計算兩個數(shù)m,n的最大公約數(shù)。過程:m除以n,如余數(shù)r=0,則n 就是最大公約數(shù)。如r0,則mn,nr,再重復上述過程,直到r=0為止,這時的n就是要求的最大公約數(shù). 例:m=112,n=77 被除數(shù) 除數(shù) 商 余數(shù) 112 / 77 1 35 77 / 35 2 7 35 / 7 5 0因此,112和77的最大公約數(shù)為7本問題的特點是要多次處理同一個問題,只是處理所用數(shù)據(jù)不同,且后一次所用

60、數(shù)據(jù)為前一次處理的結(jié)果,正好用遞歸。運行結(jié)果: m,n=? 112,77 gcd =7 /exam63.c#includeint fgcd(int,int);main() int m,n,g; printf(“m,n=?”); scanf(%d,%d,&m,&n); if(nm) printf(input error!); return 1; g=fgcd(m,n); printf(“gcd%dn,g); return 0;fgcd(m,n) int g; if(n=0) g=m; return g; else fgcd(n,m%n);例 5.4 設口袋中放著12個球,其中3 個是紅的,個是白

溫馨提示

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

評論

0/150

提交評論