C語言程序設計(第三版)(2)_第1頁
C語言程序設計(第三版)(2)_第2頁
C語言程序設計(第三版)(2)_第3頁
C語言程序設計(第三版)(2)_第4頁
C語言程序設計(第三版)(2)_第5頁
已閱讀5頁,還剩246頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、語言程序設計(第三版)(第一-五章)整理課件整理課件本章要點整理課件 1-1 語言出現的歷史背景 C語言是國際上廣泛流行的高級語言。 C語言是在B語言的基礎上發展起來的。 B (BCPL)語言是1970年由美國貝爾實驗室設計的, 并用于編寫了第一個UNIX操作系統,在PDP 7上實現。優點:精練,接近硬件,缺點:過于簡單,數據無類型。 1973年貝爾實驗室的D.M.Ritchie 在B語言的基礎上設計出了C語言,對B取長補短,并用之改寫了原來用匯編編寫的UNIX,(即UNIX第5版),但僅在貝爾實驗室使用。 1-1語言出現的歷史背景 1975年UNIX第6版發布,C優點突出引起關注。 1977

2、年出現了可移植C語言編譯程序 ,推動了UNIX在各種機器上實現 ,C語言也得到推廣,其發展相輔相成。 1978年影響深遠的名著The C Programming Language由 和Dennis M.Ritchie 合著,被稱為標準C。 之后,C語言先后移植到大、中、小、微型計算機上,已獨立于UNIX和PDP,風靡世界,成為最廣泛的幾種計算機語言之一。 1-1語言出現的歷史背景 1983年,美國國家標準化協會(ANSI)根據C語言各種版本對C的發展和擴充,制定了新的標準ANSI C ,比標準C有了很大的發展。 1988年K & R按照 ANSI C修改了他們的The C Progra

3、mming Language。 1987年,ANSI公布了新標準87 ANSI C。 1990年,國際標準化組織接受了87 ANSI C為ISO C 的標準(ISO98991990)。 1994年,ISO又修訂了C語言標準。 目前流行的C語言編譯系統大多是以ANSI C為基礎進行開發的。 1-1語言出現的歷史背景 不同版本的C編譯系統所實現的語言功能和語法規則又略有差別,因此讀者應了解所用的C語言編譯系統的特點(可以參閱有關手冊)。本書的敘述基本上以ANSI C 為基礎。 1-2 語言的特點(1)語言簡潔、緊湊,使用方便、靈活。 32個關鍵字、9種控制語句,程序形式自由(2)運算符豐富。34種

4、運算符 (3)數據類型豐富,具有現代語言的各種數據結構。(4)具有結構化的控制語句 ,是完全模塊化和結構化的語言。 (5)語法限制不太嚴格,程序設計自由度大。 1-2 語言的特點(6)允許直接訪問物理地址,能進行位操作,能實現匯編語言的大部分功能,可直接對硬件進行操作。兼有高級和低級語言的特點 。(7)目標代碼質量高,程序執行效率高。只比匯編程序生成的目標代碼效率低10-20%。(8)程序可移植性好(與匯編語言比)。基本上不做修改就能用于各種型號的計算機和各種操作系統。 1-2 語言的特點C+是由于開發大型應用軟件的需要而產生的,并不是所有的人都要去編寫大型軟件;面向對象的基礎是面向過程。C+

5、是面向對象的語言,C是面向過程的,學起來比C語言困難得多,所以不太適合程序設計的初學者。既然有了面向對象的既然有了面向對象的C+C+語言,為語言,為什么還要學習什么還要學習C C語言?語言? 1-3 簡單的C語言程序介紹#include void main( ) printf (This is a C program.n); /*文件包含*/*主函數 */*函數體開始*/*輸出語句*/*函數體結束*/ main-主函數名, void-函數類型 每個C程序必須有一個主函數main 是函數開始和結束的標志,不可省 每個C語句以分號結束 使用標準庫函數時應在程序開頭一行寫: #include 說明:

6、說明: 本程序的作用是輸出一行信息本程序的作用是輸出一行信息: :This is a C program.This is a C program.例1.2 求兩數之和#include void main( ) /*求兩數之和*/ int a,b,sum; /*聲明,定義變量為整型*/ /*以下3行為C語句 */ a=123; b=456; sum=a+b; printf(sum is %dn,sum); /*/表示注釋。注釋只是給人看的,對編譯和運行不起作用。所以可以用漢字或英文字符表示,可以出現在一行中的最右側,也可以單獨成為一行。說明:說明: 輸出一行信息輸出一行信息:sum is 579

7、:sum is 579例1.3 求3個數中較大者。#include void main( ) /* 主函數*/ int max(int x,int y); / 對被調用函數max的聲明 */ int a, b, c; /*定義變量a、b、c */ scanf(d,d,&a,&b); /*輸入變量a和b的值*/ c=max(a,b); /*調用max函數,將得到的值賦給c */ printf(max=dn,c); /*輸出c的值*/ 程序運行情況如下程序運行情況如下: 8,5 8,5 ( (輸入輸入8 8和和5 5賦給賦給a a和和b)b) max=8 (max=8 (輸出輸出c

8、 c的值的值) )int max(int x, int y) int z; if (xy) z=x; else z=y; return (z); max(int x,int y); max(max(a a, ,b b);); 本程序包括main和被調用函數max兩個函數。max函數的作用是將x和y中較大者的值賦給變量z。return語句將z的值返回給主調函數main。 1-3 簡單的C語言程序介紹(1) C程序是由函數構成的。 這使得程序容易實現模塊化。 (2) 一個函數由兩部分組成: 函數的首部:例中的max函數首部 int max(int x,int y ) 函數體:花括號內的部分。若一個

9、函數有多個花括號,則最外層的一對花括號為函數體的范圍。 函數體包括兩部分 :聲明部分:int a,b,c; 可缺省執行部分:由若干個語句組成。可缺省 1-3 簡單的C語言程序介紹函數的聲明部分和執行部分都可缺省,例如:void dump ( ) 這是一個空函數,什么也不做,但是合法的函數。 1-3 簡單的C語言程序介紹小結小結:(3) C程序總是從main函數開始執行的,與main函數的位置無關。(4) C程序書寫格式自由,一行內可以寫幾個語句, 一個語句可以分寫在多行上,C程序沒有行號。(5) 每個語句和數據聲明的最后必須有一個分號。(6) C語言本身沒有輸入輸出語句。輸入和輸出的操作是由庫

10、函數scanf和printf等函數來完成的。C對輸入輸出實行“函數化”。 1-4 運行程序的步驟和方法一、上機輸入與編輯源程序對源程序進行編譯與庫函數連接運行目標程序整理課件 1-4 運行程序的步驟和方法l目前使用的大多數C編譯系統都是集成環境(IDE)的。可以用不同的編譯系統對C程序進行操作l常用的有、Visual C+等 l:是一個集成環境,它具有方便、直觀和易用的界面,雖然它也是DOS環境下的集成環境,但是可以把啟動Turbo C+ 3.0 集成環境的DOS執行文件生成快捷方式,也可以用鼠標操作。lVisual C+:也可以用Visual C+對C程序進行編譯。整理課件將編譯程序裝入磁盤

11、某一目錄下,例如:放在C盤根目錄下一級子目錄下。(1)進入進入集成環境集成環境在在DOS環境下環境下 C:TC3.0tc 整理課件 找到可執行文件,執行該文件。整理課件 整理課件在編輯(EDIT) 狀態下光標表示當前進行編輯的位置,在此位置可以進行插入、刪除或修改,直到自已滿意為止。 整理課件保存:在編輯(EDIT) 狀態下光標表示當前進行編輯的位置,在此位置可以進行插入、刪除或修改,直到自已滿意為止。 整理課件(3) 對源程序進行編譯對源程序進行編譯選擇“Compile”(或“Alt+F9”)對源程序進行編譯。 源程序,出現1個錯誤(error) ,0個警告(warming)。 整理課件(4

12、) 將目標程序進行連接將目標程序進行連接 選擇菜單“Compile” “Link” ,如果不出現錯誤,會得到一個后綴為.exe的可執行文件。 (5) 執行程序執行程序。 選菜單“Run” “Run”( 或按“Ctrl+F9” 鍵)。(6) 退出環境 選擇“File”“Quit” 。 整理課件第二章整理課件l 本章要點整理課件l 主要內容2.1 2.1 算法的概念算法的概念2.2 2.2 簡單算法舉例簡單算法舉例2.3 2.3 算法的特性算法的特性2.4 2.4 怎樣表示一個算法怎樣表示一個算法2.5 2.5 化程序設計方法化程序設計方法 整理課件一個程序應包括兩個方面的內容: 對數據的描述:數

13、據結構(data structure) 對操作的描述:算法(algorithm)著名計算機科學家沃思提出一個公式: 數據結構數據結構 + 算法算法 = 程序程序數據結構算法程序設計方法語言工具數據結構算法程序設計方法語言工具完整的程序設計應該是: 2.1 算法的概念 廣義地說,為解決一個問題而采取的方法和步驟,就稱為“算法”。 方法1:1+2,+3,+4,一直加到100 加99次 方法2:100+(1+99)+(2+98)+(49 +51)+50 = 100 + 49100 +50 加51次對同一個問題,可有不同的解題方法和步驟例: 求1001nn 2.1 算法的概念 為了有效地進行解題,不僅

14、需要保證算法正確,還要考慮算法的質量,選擇合適的算法。希望方法簡單,運算步驟少。計算機算法可分為兩大類別: 數值運算算法:求數值解,例如求方程的根、求函數的定積分等。 非數值運算:包括的面十分廣泛,最常見的是用于事務管理領域,例如圖書檢索、人事管理、行車調度管理等。 2.2 簡單算法舉例例例: 求求12345 步驟1:先求12,得到結果2步驟2:將步驟1得到的乘積2再乘以3,得到結果6步驟3:將6再乘以4,得24步驟4:將24再乘以5,得120如果要求如果要求1 12 210001000,則要寫,則要寫999999個步驟個步驟 S1:使p=1 S2:使i=2 S3:使pi,乘積仍放在變量p中,

15、可表示為:pip S4:使i的值加1,即i+1i。 S5:如果i不大于5,返回重新執行步驟S3以及其后的步驟S4和S5;否則,算法結束。最后得到p的值就是5!的值。可以設兩個變量:可以設兩個變量:一個變量代表被乘數,一個變量代表乘數。不另設變量存放乘積結果,而直接將每一步驟的乘積放在被乘數變量中。設p為被乘數,i為乘數。用循環算法來求結果, 算法可改寫: S1:1pS2:3iS3:pipS4:i+2pS5:若i11,返回S3。否則,結束。 如果題目改為:求1351000算法只需作很少的改動: 用這種方法表示的算法具有通用性、靈活性。S3到S5組成一個循環,在實現算法時 要反復多次執行S3,S4

16、,S5等步驟,直到某一時刻,執行S5步驟時經過判斷,乘數i已超過規定的數值而不返回S3步驟為止。此時算法結束,變量p的值就是所求結果。例例 有有50個學生,要求將他們之中成績在個學生,要求將他們之中成績在80分分以上者打印出來。設以上者打印出來。設n表示學號,表示學號, n1代表第代表第一個學生學號,一個學生學號, 代表第代表第i個學生學號。用個學生學號。用G代代表學生成績表學生成績 , gi代表第代表第i個學生成績,算法表個學生成績,算法表示如下示如下: S1:1i S2:如果80,則打印和,否則不打印。 S3:i+1i S4:如果i50,返回S2,繼續執行。否則算法結束 變量i作為下標,用

17、來控制序號(第幾個學生,第幾個成績)。當i超過50時,表示 已對50個學生的成績處理完畢,算法結束。例例 判定判定20002500年中的每一年是否閏年,將結年中的每一年是否閏年,將結果輸出。果輸出。 變量變量i i作為下標,用來控制序號作為下標,用來控制序號( (第幾個學第幾個學生,第幾個成績生,第幾個成績) )。當。當i i超過超過5050時,表示時,表示 已對已對5050個學生的成績處理完畢,算法結束。個學生的成績處理完畢,算法結束。分析:分析:閏年的條件是:(1)能被4整除,但不能被100整除的年份都是閏年,如1996,2004年是閏年;(2)能被100整除,又能被400整除的年份是閏年

18、。如1600,2000年是閏年。不符合這兩個條件的年份不是閏年。 設y為被檢測的年份,算法可表示如下 :S1:2000yS2:若y不能被4整除,則輸出y “不是閏年”。然后轉到S6。S3:若y能被4整除,不能被100整除,則輸出y “是閏年”。然后轉到S6。S4:若y能被100整除,又能被400整除,輸出y“是閏年”,否則輸出“不是閏年”。 然后轉到S6。S5: 輸出y “不是閏年”。S6:y+1yS7:當y2500時,轉S2繼續執行,如y2500,算法停止。 以上算法中每做一步都分別分離出一些范圍(巳能判定為閏年或非閏年),逐步縮小范圍,直至執行S5時,只可能是非閏年。“其它” 包括能被4整

19、除,又能被100整除,而不能被400整除的那些年份(如1990) 是非閏年。例例 求求算法如下 :1001991.4131211 S1:sign=1 S2:sum=1 S3:deno=2 S4:sign=(-1)sign S5:term=sign(1/deno) S6:sum=sum+term S7:deno=deno+1 S8:若deno100返回S4,否則算法結束。單詞作變量名,以使算法更易于理解:sum表示累加和,deno是英文分母(denom inator)縮寫,sign代表數值的符號,term代表某一項。 反復執行S4到S8步驟,直到分母大于100為止。一共執行了99次循環,向sum

20、累加入了99個分數。sum最后的值就是多項式的值。 例例 對一個大于或等于對一個大于或等于3的正整數,判斷它的正整數,判斷它是不是一個素數。是不是一個素數。 概念:概念:所謂素數,是指除了1和該數本身之外,不能被其它任何整數整除的數。例如,13是素數。因為它不能被2,3,4,12整除。分析:分析:判斷一個數n(n3)是否素數的方法: 將n作為被除數,將2到(n-1)各個整數輪流作為除數,如果都不能被整除,則n為素數。 算法如下 :S1:輸入n的值S2:i=2 (i作為除數)S3:n被i除,得余數rS4:如果r=0,表示n能被i整除,則打印n“不是素數”,算法結束。否則執行S5S5:i+1iS6

21、:如果in-1,返回S3。否則打印 n “是素數”。然后結束。 實際上,n不必被2到(n-1)的整數除,只需被2到n/2間整數除,甚至只需被2到 之間的整數除即可。n 2.3 算法的特性 有窮性:包含有限的操作步驟 確定性:算法中的每一個步驟都應當是確定的 有零個或多個輸入:輸入是指在執行算法時需要從外界取得必要的信息 有一個或多個輸出:算法的目的是為了求解,“解” 就是輸出 有效性:算法中的每一個步驟都應當能有效地執行,并得到確定的結果 。一個算法應該具有以下特點:一個算法應該具有以下特點: 2.4 算法的表示可以用不同的方法表示算法,常用的有:自然語言傳統流程圖結構化流程圖偽代碼PAD圖

22、2.4.1 用自然語言表示算法 自然語言就是人們日常使用的語言,可以是漢語或英語或其它語言。用自然語言表示通俗易懂,但文字冗長,容易出現“歧義性”。自然語言表示的含義往往不大嚴格,要根據上下文才能判斷其正確含義,描述包含分支和循環的算法時也不很方便。因此,除了那些很簡單的問題外,一般不用自然語言描述算法。 2.4.2 用流程圖表示算法美國國家標準化協會ANSI(American National Standard Institute)規定了一些常用的流程圖符號:起止框起止框判斷框判斷框處理框處理框輸入輸入/輸出框輸出框注釋框注釋框流向線流向線連接點連接點例例 將求將求5!的算法用流程圖表示的算

23、法用流程圖表示如果需要將最后結果打印出來,可在菱形框的下面加一個輸出框。 例例 將例將例的算法用流的算法用流程圖表示。打印程圖表示。打印50名名 學生中成績在學生中成績在80分以分以上者的學號和成績。上者的學號和成績。如果如果包括這個輸入數據的部分,流程圖為 例例 將例將例判判定閏年的算定閏年的算法用流程圖法用流程圖表示表示 用流程圖表示算法要比用文字描述算法邏輯清晰、易于理解。 例例 將例將例的算法用流程圖表示的算法用流程圖表示 1001991.4131211 例例 將例將例判斷素數的算法判斷素數的算法用流程圖表示用流程圖表示 小結: 流程圖是表示算法的較好的工具。一個流程圖包括以下幾部分

24、:(1)表示相應操作的框;(2)帶箭頭的流程線;(3)框內外必要的文字說明。 整理課件 三種基本結構和改進的流程圖1、傳統流程圖的弊端 傳統流程圖用流程線指出各框的執行順序,對流程線的使用沒有嚴格限制。因此,使用者可以毫不受限制地使流程隨意地轉向,使流程圖變得毫無規律,閱讀者要花很大精力去追蹤流程,使人難以理解算法的邏輯。如圖:傳統流程圖的流程可以是: 這種如同亂麻一樣的算法稱為BS型算法,意為一碗面條(A Bowl of Spaghetti),亂無頭緒。缺點:難以閱讀、修改,使算法的可靠性和可維護性難以保證。解決辦法:必須限制箭頭的濫用,即不允許無規律地使流程隨意轉向,只能順序地進行下去。

25、2、三種基本結構 Bohra和Jacopini提出了以下三種基本結構: 順序結構、選擇結構、循環結構順序結構、選擇結構、循環結構 用這三種基本結構作為表示一個良好算法的基本單元。三種基本結構的圖示: 順序結構順序結構選擇結構選擇結構循環循環結構的圖示: 當型當型(While型型)循環結構循環結構 直到型直到型(Until型型)循環循環 三種基本結構的共同特點:(1)只有一個入口; (2)只有一個出口;(請注意:一個菱形判斷框有兩個出口,而一個選擇結構只有一個出口。不要將菱形框的出口和選擇結構的出口混淆。)(3)結構內的每一部分都有機會被執行到;(4)結構內不存在“死循環”(無終止的循環)。 圖

26、中沒有一條從入口到出口的路徑通過A框。不正確的流程表示:流程內的死循環小結: 由三種基本結構順序組成的算法結構,可以解決任何復雜的問題。由基本結構所構成的算法屬于“結構化”的算法,它不存在無規律的轉向,只在本基本結構內才允許存在分支和向前或向后的跳轉。整理課件擴展: 只要具有上述四個特點的都可以作為基本結構。可以自己定義基本結構,并由這些基本結構組成結構化程序。此圖符合基本結構的特點整理課件 這是一個多分支選擇結構,根據表達式的值決定執行路線。虛線框內的結構是一個入口一個出口,并且有上述全部的四個特點。由此構成的算法結構也是結構化的算法。可以認為這是由三種基本結構所派生出來的。 用N-S流程圖

27、表示算法 1973年美國學者和提出了一種新的流程圖形式。在這種流程圖中,完全去掉了帶箭頭的流程線。全部算法寫在一個矩形框內,在該框內還可以包含其它的從屬于它的框,或者說,由一些基本的框組成一個大的框。這種流程圖又稱N-S結構化流程圖 。 N-S流程圖用以下的流程圖符號: (1)順序結構(2)選擇結構(3)循環結構 用三種N-S流程圖中的基本框,可以組成復雜的N-S流程圖。圖中的A框或B框,可以是一個簡單的操作,也可以是三個基本結構之一。 A框可以是一個選擇結構 B框可以是一個循環結構 例例 將例將例的求的求5!算法用算法用N-S圖圖表示表示例例2.12 將例將例的的算法用算法用N-S圖圖表示。

28、(打表示。(打印印50名學生名學生中成績高于中成績高于80分的學號分的學號和成績)和成績)沒有輸入數據例例2.12 將例將例的的算法用算法用N-S圖圖表示。(打表示。(打印印50名學生名學生中成績高于中成績高于80分的學號分的學號和成績)和成績)有輸入數據例例2.13 將例將例判定判定閏年的閏年的算法用算法用N-S圖表圖表示示例例2.14 將例將例的算法的算法用用N-S圖表示圖表示1001991.4131211例例2.15 將例將例判別素判別素數的算法用數的算法用N-S流流程圖表示。程圖表示。傳統流程圖分析:出口出口1出口出口2此圖不符合基本結構特點!由于不能分解為三種基本結構,就無法直接用N

29、-S流程圖的三種基本結構的符號來表示。因此,應當先作必要的變換。例例2.15 將例將例判別素判別素數的算法用數的算法用N-S流流程圖表示。程圖表示。傳統流程圖變換為:一個出口一個出口用用N-S流程圖表示:流程圖表示:N-S圖表示算法的優點 比文字描述直觀、形象、 易于理解;比傳統流程圖緊湊易畫。尤其是它廢除了流程線,整個算法結構是由各個基本結構按順序組成的,N-S流程圖中的上下順序就是執行時的順序。用N-S圖表示的算法都是結構化的算法,因為它不可能出現流程無規律的跳轉,而只能自上而下地順序執行。整理課件小結: 一個結構化的算法是由一些基本結構順序組成的。在基本結構之間不存在向前或向后的跳轉,流

30、程的轉移只存在于一個基本結構范圍之內(如循環中流程的跳轉);一 個非結構化的算法可以用一個等價的結構化算法代替,其功能不變 。如果一個算法不能分解為若干個基本結構,則它必然不是一個結構化的算法。整理課件 用位代碼表示算法 概念:偽代碼是用介于自然語言和計算機語言之間的文字和符號來描述算法。 特點:它如同一篇文章一樣 ,自上而下地寫下來。每一行(或幾行)表示一個基本操作。它不用圖形符號,因此書寫方便 、格式緊湊,也比較好懂,也便于向計算機語言算法(即程序)過渡。 用處:適用于設計過程中需要反復修改時的流程描述。 IF x is positive THEN print x ELSE print -

31、x也可以用漢字偽代碼表示:也可以用漢字偽代碼表示: 若若 x為正為正 打印打印 x 否則否則 打印打印 -x也可以中英文混用,如:也可以中英文混用,如: IF x 為正為正 print x ELSE print -x例: “打印x的絕對值”的算法可以用偽代碼表示為:開始開始 置置t的初值為的初值為1 置置i的初值為的初值為2 當當i=5,執行下面操作:,執行下面操作: 使使t=ti 使使i=i+1 循環體到此結束循環體到此結束 輸出輸出t的值的值 結束結束也可以寫成以下形式:也可以寫成以下形式: BEGIN算法開始算法開始 1t 2 i while i5 ti t i+1 i print t

32、END算法結束算法結束例例2.16 求求5!。用偽代。用偽代碼表示算法:碼表示算法:例例2.17 輸出輸出50個學生中成績高于個學生中成績高于80分者的學號和成績。分者的學號和成績。用偽代碼表示算法:用偽代碼表示算法:BEGIN算法開始算法開始 1 i while i50 input and i+1 i 1 i while i50 if 80 print and i+1 i END算法結束算法結束 用計算機語言表示算法 概念:用計算機實現算法。計算機是無法識別流程圖和偽代碼的。只有用計算機語言編寫的程序才能被計算機執行。因此在用流程圖或偽代碼描述出一個算法后,還要將它轉換成計算機語言程序。 特

33、點:用計算機語言表示算法必須嚴格遵循所用的語言的語法規則,這是和偽代碼不同的。 用處:要完成一件工作,包括設計算法和實現算法兩個部分。設計算法的目的是為了實現算法。#include void main( ) int i,t; t=1; i=2; while(i=5) t=t*I; i=i+1; printf(“%dn”,t); 例例 2.20 將例將例表示的表示的算法(求算法(求5!)用)用C語言表示。語言表示。 應當強調說明:寫出了C程序,仍然只是描述了算法,并未實現算法。只有運行程序才是實現算法。應該說,用計算機語言表示的算法是計算機能夠執行的算法。 2.5 結構化程序設計方法 一個結構化

34、程序 就是用高級語言表示的結構化算法。用三種基本結構組成的程序必然是結構化的程序,這種程序便于編寫、便于閱讀、便于修改和維護。 結構化程序設計強調程序設計風格和程序結構的規范化,提倡清晰的結構。 結構化程序設計方法的基本思路是:把一個復雜問題的求解過程 分階段進行,每個階段處理的問題都控制在人們容易理解和處理的范圍內。 2.5 結構化程序設計方法采取以下方法來保證得到結構化的程序: 自頂向下; 逐步細化; 模塊化設計; 結構化編碼。兩種不同的方法: 自頂向下,逐步細化; 自下而上,逐步積累。 用這種方法逐步分解,直到作者認為可以直接將各小段表達為文字語句為止。這種方法就叫 做“自頂向下,逐步細

35、化”。 自頂向下,逐步細化方法的優點: 考慮周全,結構清晰,層次分明,作者容易寫,讀者容易看。如果發現某一部分中有一段內容不妥,需要修改,只需找出該部分修改有關段落即可,與其它部分無關。我們提倡用這種方法設計程序。這就是用工程的方法設計程序。模塊設計的方法:模塊化設計的思想實際上是一種“分而治之”的思想,把一個大任務分為若干個子任務,每一個子任務就相對簡單了。在拿到一個程序模塊以后,根據程序模塊的功能將它劃分為若干個子模塊,如果這些子模塊的規模還嫌大,還再可以劃分為更小的模塊。這個過程采用自頂向下方法來實現。子模塊一般不超過50行劃分子模塊時應注意模塊的獨立性,即:使一個模塊完成一項功能,耦合

36、性愈少愈好。 第三章整理課件l 本章要點整理課件l 主要內容3.1 C3.1 C的數據類型的數據類型3.2 3.2 常量與變量常量與變量3.3 3.3 整型數據整型數據3.4 3.4 浮點型數據運行浮點型數據運行3.5 3.5 字符型數據字符型數據 整理課件l 主要內容3. 3.變量賦初值變量賦初值 3.7 3.7 各類數值型數據間的混合運算各類數值型數據間的混合運算 3.8 3.8 算術運算符和算術表達式算術運算符和算術表達式 3.9 3.9 賦值運算符和賦值表達式賦值運算符和賦值表達式 3.10 3.10 逗號運算符和逗號表達式逗號運算符和逗號表達式 整理課件 3.1 C的數據類型C語言提

37、供了以下一些數據類型。 3.2 常量與變量3.2.1 常量和符號常量常量和符號常量 在程序運行過程中,其值不能被改變的量稱為常量 常量區分為不同的類型:整型 100,125,-100,0實型 3.14 , ,字符型 a, b,2字符串 a, ab,1232例3.1 符號常量的使用#define PRICE 30#include void main ( ) int num, total; num=10; total=num * PRICE; printf(total=%dn,total); 程序中用#define命令行定義PRICE代表常量30,此后凡在本文件中出現的PRICE都代表30,可以和

38、常量一樣進行運算用一個標識符代表一個常量的,稱為符號常量,即以標識符形式出現的常量。符號常量的值在其作用域(在本例中為主函數)內不能改變,也不能再被賦值。 如再用賦值語句給PRICE賦值是錯誤的。 PRICE=40; /* 錯誤,不能給符號常量賦值。 運行結果:運行結果: total=300total=300 3.2 常量與變量變量變量 變量代表內存中具有特定屬性的一個存儲單元,它用來存放數據,這就是變量的值,在程序運行期間,這些值是可以改變的。 變量名實際上是一個以一個名字對應代表一個地址,在對程序編譯連接時由編譯系統給每一個變量名分配對應的內存地址。從變量中取值,實際上是通過變量名找到相應

39、的內存地址,從該存儲單元中讀取數據。圖 3.2 常量與變量 變量命名的規定:語言規定標識符只能由字母、數字和下劃線三種字符組成,且第一個字符必須為字母或下劃線。 例:例:sum,_total, month, Student_name, lotus_1_2_,BASIC, li_ling M.D.John, ¥123,3D64,ab 3.2 常量與變量 編譯系統將大寫字母和小寫字母認為是兩個不同的字符。 建議變量名的長度最好不要超過8個字符。 在選擇變量名和其它標識符時,應注意做到“見名知意”,即選有含意的英文單詞 (或其縮寫)作標識符。 要求對所有用到的變量作強制定義,也就是“先定義,后使用”

40、 。 3.3 整型數據整型常量的表示方法整型常量的表示方法 整型常量即整常數。在語言中,整常數可用以下三種形式表示:(1)十進制整數。 如:如:。(2)八進制整數。以0頭的數是八進制數。 如:如:0123表示八進制數123,等于十進制數83,-011表示八進制數-11,即十進制數-9。 3.3 整型數據(3)十六進制整數。以0 x開頭的數是16進制數。 如:如:0 x123,代表16進制數123,等于十進制數 291。 -0 x12等于十進制數10。 3.3.2 整型變量整型變量 (1)(1)整型數據在內存中的存放形式整型數據在內存中的存放形式 數據在內存中是以二進制形式存放的。 如如: :

41、int i; /* 定義為整型變量 */ i=10; /* 給i賦以整數10 */ 圖3.3 整型數據 十進制數10的二進制形式為1010,和為一個整型變量在內存中分配2個字節的存儲單元(不同的編譯系統為整型數據分配的字節數是不相同的,則分配4個字節)。 數值是以補碼(complement) 表示的。 3.3 整型數據(2)(2)整型變量的分類:整型變量的分類:共六種共六種有符號基本整型有符號短整型有符號長整型無符號基本整型無符號短整型無符號長整型(signed)int (signed)short (int )(signed) long (int)unsigned intunsigned sh

42、ort (int)unsigned long (int) 注意:注意:括號表示其中的內容是可選的. 3.3 整型數據 整數類型的有關數據: 3.3 整型數據(3)(3)整型變量的定義整型變量的定義: : 規定在程序中所有用到的變量都必須在程序中定義,即“強制類型定義”。 例如例如: : int a,bint a,b(指定變量、為整型) unsigned short c,d;unsigned short c,d;(指定變量、為無符號短整型) long e,f;long e,f;(指定變量、為長整型)例3.2 整型變量的定義與使用#include void main() int a,b,c,d;

43、/*指定、為整型變量* unsigned ; *指定為無符號整型變量* 12;-24;10; ; printf(,); 可以看到不同種類的整型數據可以進行算術運算 運行結果:運行結果: , 例3.3 整型數據的溢出#include void main()int a,b; a=32767; b=a+1; printf(“%d,%dn”,a,b);數值是以補碼表示的。一個整型變量只能容納-3276832767范圍內的數,無法表示大于32767或小于-32768的數。遇此情況就發生“溢出”。運行結果:運行結果: 32767,-3276832767,-32768 3.3 整型數據3.3.3 整型常量的

44、類型整型常量的類型 (1)一個整數,如果其值在-32768+32767范圍內,認為它是int型,它可以賦值給int型和long int型變量。 (2) 一個整數,如果其值超過了上述范圍,而在-2147483637+2147483647范圍內,則認為它是為長整型。可以將它賦值給一個long int型變量。 3.3 整型數據(3) 如果所用的C版本(如Turbo C)分配給short int與int型數據在內存中占據的長度相同,則它的表數范圍與int型相同。因此一個int型的常量同時也是一個short int型常量,可以賦給int型或short int型變量。 3.3 整型數據(4) 一個整常量后

45、面加一個字母u或U,認為是unsigned int型,如12345u,在內存中按unsigned int規定的方式存放(存儲單元中最高位不作為符號位,而用來存儲數據)。如果寫成-12345u,則先將-12345轉換成其補碼53191,然后按無符號數存儲。 3.3 整型數據(5) 在一個整常量后面加一個字母l或L,則認為是long int型常量。例如等。這往往用于函數調用中。如果函數的形參為long int型,則要求實參也為long int型。 3.4 浮點型數據浮點型常量的表示方法浮點型常量的表示方法兩種表兩種表示形式示形式小數小數指數指數3 3e-3e-3注意注意: :字母e(或E)之前必須

46、有數字,且e后面的指數必須為整數 3.4 浮點型數據規范化的指數形式:規范化的指數形式: 在字母e(或E)之前的小數部分中,小數點左邊應有一位(且只能有一位)非零的數字. 例如例如: : 可以表示為: 其中的稱為“規范化的指數形式”。 3.4 浮點型數據3.4.2 浮點型變量浮點型變量(1)(1)浮點型數據在內存中的存放形式浮點型數據在內存中的存放形式 一個浮點型數據一般在內存中占4個字節(32位)。與整型數據的存儲方式不同,浮點型數據是按照指數形式存儲的。系統把一個浮點型數據分成小數部分和指數部分,分別存放。指數部分采用規范化的指數形式。圖 3.4 浮點型數據(2) (2) 浮點型變量的分類

47、浮點型變量的分類 浮點型變量分為單精度(float型)、雙精度(double型)和長雙精度型(long double)三類形式。例3.4 浮點型數據的舍入誤差#include void main()float a,b; a = 123456.789e5; b = a + 20 ; printf(“%fn”,b); 一個浮點型變量只能保證的有效數字是7位有效數字,后面的數字是無意義的,并不準確地表示該數。應當避免將一個很大的數和一個很小的數直接相加或相減,否則就會“丟失”小的數運行結果:運行結果: 3.4 浮點型數據3.4.3 浮點型常量的類型浮點型常量的類型 C編譯系統將浮點型常量作為雙精度來

48、處理。 例如例如: 系統先把和作為雙精度數,然后進行相乘的運算,得到的乘也是一個雙精度數。最后取其前7位賦給浮點型變量f。如是在數的后面加字母f或F(如),這樣編譯系統就會把它們按單精度(32位)處理。 字符型數據 3.5.1 字符常量字符常量(1)用單引號包含的一個字符是字符型常量(2)只能包含一個字符a a, ,A A, , 1 1abcabc、“a a” 字符型數據 有些以有些以“ ”開頭的特殊字符稱為轉義字符開頭的特殊字符稱為轉義字符n 換行t 橫向跳格r 回車 反斜杠ddd ddd表示1到3位八進制數字xhh hh表示1到2位十六進制數字例3.5 轉義字符的使用#include vo

49、id () ( ab ct derftgn); printf(htibbj kn); 打印機上的顯示結果:打印機上的顯示結果: fab c gde h jik 顯示屏上顯示屏上的運行結果:的運行結果: f gde j k 字符型數據 字符變量字符變量 字符型變量用來存放字符常量,注意只能放一個字符。 字符變量的定義形式如下:char c1,c2; 在本函數中可以用下面語句對c1,c2賦值: c1a;c2 b ; 一個字符變量在內存中占一個字節。 字符型數據 字符數據在內存中的存儲形式及其使用方法字符數據在內存中的存儲形式及其使用方法 將一個字符常量放到一個字符變量中,實際上并不是把該字符本身放

50、到內存單元中去,而是將該字符的相應的ASCII代碼放到存儲單元中。圖這樣使字符型數據和整型數據之間可以通用。一個字符數據既可以以字符形式輸出,也可以以整數形式輸出。例3.6 向字符變量賦以整數。#include void main() char c1,c2; c1=97; c2=98; printf(“%c %cn”,c1,c2); printf(“%d %dn”,c1,c2); 在第和第4行中,將整數和分別賦給c1和c2,它的作用相當于以下兩個賦值語句: c1;c2;因為a和b的ASCII碼為和 運行結果:運行結果: 97 9897 98例3.7 大小寫字母的轉換#include void

51、main() char c1,c2; c1=a; c2=b;c1=c1-32;c2=c2-32; printf(“c c,c1,c2); 程序的作用是將兩個小寫字母a和b轉換成大寫字母A和B。從代碼表中可以看到每一個小寫字母比它相應的大寫字母的碼大。語言允許字符數據與整數直接進行算術運算。 運行結果:運行結果: 字符型數據 有些系統(如Turbo C)將字符變量定義為signed char型。其存儲單元中的最高位作為符號位,它的取值范圍是-128127。如果在字符變量中存放一個ASCII碼為0127間的字符,由于字節中最高位為0,因此用%d輸出字符變量時,輸出的是一個正整數。如果在字符變量中存

52、放一個ASCII碼為128255間的字符,由于在字節中最高位為1,用%d格式符輸出時,就會得到一個負整數。 字符型數據字符串常量字符串常量 字符串常量是一對雙撇號括起來的字符序列. 合法的字符串常量:“How do you do.”, “CHINA”, “a” , “” 可以輸出一個字符串,如printf(“How do you do.”); 字符型數據 是字符常量,”是字符串常量,二者不同。 如:如:假設被指定為字符變量 :char c c=a; ”a”;c”CHINA”; 結論:結論:不能把一個字符串常量賦給一個字符變量。 字符型數據 規定:在每一個字符串常量的結尾加一個 “字符串結束標志

53、”,以便系統據此判斷字符串是否結束。規定以字符作為字符串結束標志。 如:如:如果有一個字符串常量” ,實際上在內存中是:CHINA0 它占內存單元不是個字符,而是個字符,最后一個字符為。但在輸出時不輸出。變量賦初值 字符串常量(1)語言允許在定義變量的同時使變量初始化如如: : int a=3; / 指定為整型變量,初值為 float f=3.56; / 指定為浮點型變量,初值為.56 char c= a; / 指定為字符變量,初值為a 變量賦初值 (2)可以使被定義的變量的一部分賦初值。 如如: : int a,b,c=5; 表示指定、為整型變量,但只對初始化,c的初值為(3)如果對幾個變量

54、賦以同一個初值, 應寫成:int a=3,b=3,c=3; 表示、的初值都是。 不能寫成 int a=b=c3; 注意:注意:初始化不是在編譯階段完成的而是在程序運行時執行本函數時賦初值的,相當于有一個賦值語句。 各類數值型數據間的混合運算 整型(包括int,short,long)、浮點型(包括float,double)可以混合運算。在進行運算時,不同類型的數據要先轉換成同一類型,然后進行運算.圖上述的類型轉換是由系統自動進行的算術運算符和算術表達式3.8.1 運算符簡介運算符簡介 的運算符有以下幾類:的運算符有以下幾類:(1)算術運算符 (+ - * / %)(2)關系運算符 (!)(3)邏

55、輯運算符 (!|)(4)位運算符 ( |)(5)賦值運算符 (及其擴展賦值運算符)(6)條件運算符 (?:)(7)逗號運算符 (,)算術運算符和算術表達式(8)指針運算符 (*和)(9)求字節數運算符()(10)強制類型轉換運算符( (類型) )(11)分量運算符(-)(12)下標運算符()(13)其他 (如函數調用運算符()算術運算符和算術表達式3.8.2 算術運算符和算術表達式算術運算符和算術表達式 (1)(1)基本的算術運算符基本的算術運算符: : (加法運算符,或正值運算符。如:、) (減法運算符,或負值運算符。如:、)* * (乘法運算符。如:*) (除法運算符。如:) (模運算符,

56、或稱求余運算符,兩側均應為整型數據,如:的值為)。算術運算符和算術表達式(2) (2) 算術表達式和運算符的優先級與結合性基算術表達式和運算符的優先級與結合性基本的算術運算符本的算術運算符: : 用算術運算符和括號將運算對象(也稱操作數)連接起來的、符合語法規則的式子,稱為算術表達式。運算對象包括常量、變量、函數等。 例如例如: : *.5a 是一個合法的表達式 3.2 常量與變量 語言規定了運算符的優先級和結合性。 在表達式求值時,先按運算符的優先級別高低次序執行,例如先乘除后加減。 規定了各種運算符的結合方向(結合性) 算術運算符的結合方向為“自左至右”,即先左后右 。算術運算符和算術表達

57、式(3)(3)強制類型轉換運算符強制類型轉換運算符 可以利用強制類型轉換運算符將一個表達式轉換成所需類型。 一般形式:(類型名)(表達式)例如:例如:(double) 將轉換成double類型(int)(x+y) 將x+y的值轉換成整型(float)(5%3) 將5%3的值轉換成float型例3.8 強制類型轉換。#include void() ; ; ; (); printf(x=%f, i=%dn,x,i); 有兩種類型轉換,一種是在運算時不必用戶指定,系統自動進行的類型轉換,如。第二種是強制類型轉換。當自動類型轉換不能實現目的時,可以用強制類型轉換。 運行結果:運行結果: x, i=3算

58、術運算符和算術表達式(4)(4) 自增、自減運算符自增、自減運算符 作用是使變量的值增或減如如: ,(在使用之前,先使的值加 (減),(在使用之后,使的值加( 減) 算術運算符和算術表達式i+i+與與+i+i的區別:的區別: 是先執行后,再使用的值; 是先使用的值后,再執行。例如:例如: ; i的值先變成4, 再賦給,j的值均為 ; 先將 i的值3賦給,的值為,然后變為算術運算符和算術表達式注意:注意: (1)自增運算符(),自減運算符(),只能用于變量,而不能用于常量或表達式, (2)和的結合方向是“自右至左”。 自增(減)運算符常用于循環語句中使循環變量自動加。也用于指針變量,使指針指向下

59、一個地址 算術運算符和算術表達式(5) (5) 有關表達式使用中的問題說明有關表達式使用中的問題說明 ANSI C并沒有具體規定表達式中的子表達式的求值順序,允許各編譯系統自己安排。 例如:對表達式 a = f1( )+f2( ) 并不是所有的編譯系統都先調用f1( ), 然后調用f2( )。在有的情況下結果可能不同。有時會出現一些令人容易搞混的問題,因此務必要小心謹慎。 算術運算符和算術表達式語言中有的運算符為一個字符,有的運算符由兩個字符組成 ,為避免誤解,最好采取大家都能理解的寫法。 例如:不要寫成i+j的形式,而應寫成 (i+)+j的形式 算術運算符和算術表達式在調用函數時,實參數的求

60、值順序,標準并無統一規定。例如:例如:的初值為,如果有下面的函數調用: printf(,i+) 在有的系統中,從左至右求值,輸出“,”。在多數系統中對函數參數的求值順序是自右而左,函數輸出的是“,”。以上這種寫法不宜提倡, 最好改寫成 j = i+;j = i+; printf(%d printf(%d, %d%d, j j,i)i)不要寫出別人看不懂的也不知道系統會怎樣執行程序 3.9 賦值運算符和賦值表達式 (1)(1)賦值運算符賦值運算符 賦值符號“”就是賦值運算符,它的作用是將一個數據賦給一個變量。如“”的作用是執行一次賦值操作(或稱賦值運算)。把常量賦給變量。也可以將一個表達式的值賦給一個變量. 3.9

溫馨提示

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

評論

0/150

提交評論