譚浩強C語言程序設計_第1頁
譚浩強C語言程序設計_第2頁
譚浩強C語言程序設計_第3頁
譚浩強C語言程序設計_第4頁
譚浩強C語言程序設計_第5頁
已閱讀5頁,還剩324頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第一章第二章第三章第四章第五章第六章第七章第一章第一章 C C語言概述語言概述 C語言 既可作為系統軟件的程序設計語言,又可作為應用軟件的程序設計語言。 尤其是當今計算機應用極為廣泛,軟件的設計、編寫質量要求高,經常與硬件部分打交道,如:界面設計等,所以用C語言編寫是最理想的。因而C語言也是當前計算機語言中用得最廣泛的語言之一。 1.1 1.1 C C語言出現的歷史背景語言出現的歷史背景一、操作系統的設計語言一、操作系統的設計語言O.S. 操作系統,為用戶使用計算機提供一個操作環境:系統命令、語言編程等。如:DOS. UNIX以前:O. S .軟件用匯編指令編寫。匯編語言:一種二進制指令代碼的

2、符號表示,既繁瑣,又易出錯,可讀性差。改進:用C語言編寫,既提高了程序的可讀性,又可與硬件打交道。二 、二 、發 展 過 程發 展 過 程 1960年出現了Algol60語言,但該語言主要面向問題,與硬件較遠,故英國劍橋大學推出了CPL(Combined Programming Language) 1967年,Matin Richards對CPL進行改進、簡化 、 推 出 了 B C P L ( B a s i c C o m b i n e d Programming Language) 1970年,美國貝爾實驗室Ken Thomson 以BCPL為基礎,再次簡化推出了B語言,并寫了第一個U

3、NIX系統。 美國貝爾實驗室D.M. Ritchie 在B語言基礎上設計出了C語言,并用其將UNIX系統全部改寫并實現。 經進一步改進,至1977年出現了與具體機器無關的C編譯文本,從而使C語言廣泛應用,各種機器皆可使用。 1978年,美國Brain W.Kernighan與Dennis. M. Ritchie 聯合出版一書The C Programming Language成為 ANSI C之基礎。 1983年,美國標準化協會(ANSI) 制定了ANSI C。 ANSI C 為基礎: 不同機器有不同版本,尤其是函數均應參考相應的機器。 1.2 C語言的特點語言的特點 只有通過學習,方可理解C

4、之特點,先簡敘之:1. 簡潔、緊湊、方便、靈活簡潔、緊湊、方便、靈活 32個關鍵字,9種控制語句, 主要用小寫字母,壓縮一切不必要成分2. 運算符豐富運算符豐富 除了最基本的、%等運算外,還將括號、賦值、類型強制轉換等均作為運算符,共有34種運算符。3. 數據結構豐富數據結構豐富 除基本類型外, 有指針, 結構體、共同體等類型。4. 具有結構化的控制語句具有結構化的控制語句 模塊完整,控制中的語句可完整化。5. 語法嚴格,但有靈活性語法嚴格,但有靈活性 如:數據類型可相互通用:整型、字符型通用。6. 可與機器硬件打交道,直接訪問內存地址,具可與機器硬件打交道,直接訪問內存地址,具有有“ 高高”

5、、“ 低低”級語言之功能。級語言之功能。7. 生成目標代碼質量高,執行效率高。生成目標代碼質量高,執行效率高。8. 可移植性優于匯編語言。可移植性優于匯編語言。1.3 簡單的簡單的C程序介紹程序介紹 為了更好、更快地掌握C程序,我們先看幾個C語言程序:例1. main( ) printf (This is a c programn); 例2. main ( ) /*求兩個數之和*/ int a, b, sum; /*這是定義變量*/ a=123; b=456; sum=a+b; printf(sum is %dn, sum); 例3.main( ) /* 主函數*/ int a, b, c;

6、/*定義變量*/ scanf(%d, %d, &a, &b); /*輸入變量a和b的值*/ c=max(a, b);/*調用max函數,將得到的值賦給c*/ printf(max=%d,c;) /*輸出c的值*/ int max (x, y) int x, y; /*對形參x、y作類型定義*/ int z; /*max函用到的變量z,也要加以定義*/ z=y; if (xy) z=x; return (z); /*將z的值返回,通過max帶回調用處*/ 通過分析,初步看到通過分析,初步看到:1. C程序全部由一個一個的函數構成。至少有一個主函數main ( ), 其它函數可被主函數調用或相互調

7、用。其它函數可為C 函數庫中函數,也可為自己編的函數。上述特點稱為程序的模塊化.2. 函數的構成: 函數說明+函數體 函數體: 變量定義與執行語句 可允許空函數: dump ( ) 函數說明包括:函數名、類型、屬性、參數等3. 函數的執行一定從main ( )開始。盡管main ( )函數位置可自由。4. 書寫自由,一個語句可多行,一行可多個語句。5. 每一條語句必須有一個分號;6. C語言的輸入 / 出均以函數形式出現。scanf( ), printf( ).7. 可用/ /對C語言加注釋第二章第二章 數據類型、運算符與表達數據類型、運算符與表達式式2.1. 數據類型數據類型 著名計算機科學

8、家沃思提出: 程序數據結構算法 所以,存放數據的方式直接反映了一種語言的數據表達能力。 數據的存儲方式又稱之為:數據類型。 舉 一個例子:以考生各科成績及總分排隊問題為列。 成績的存放 以數組形式 排隊方法 算法前面已述. C數據類型豐富,分為:基本類型構造類型指針類型空類型整型字符型實型單精度雙精度數組結構體共用體數據有常量、變量之分,均為其中一種類型。本章先學習基本類型。枚舉2.2 常量與變量常量與變量2.2.1 常量和符號常量常量和符號常量常量 程序運行過程中不能被改變的量。一般的數據顯式寫法均表示常量。 如程序中: 20 整型常量 15.8 實型常量 a 字符常量例: #define

9、PRICE 30 main ( ) int num, total; num=10; total=num*PRICE; printf(total=%d,total); 還可用一個符號表示一個常量 符號常量符號常量(一般用大寫,以區分變量)再如: =3.1415629 #define PAI 3.1415629 #define PRICE 302.2.2變量變量 程序執行中可以改變的量稱為變量。變量包括變量名和變量值。變量名 用標識符命名,對應一定數量的內存存貯單元,其單元數視變量類型而定。標識符 由字母、數字、下劃線組成且由字母或下劃線開頭的字符串。 標識符可用來命名變量及作為常量名、函數名、類

10、型名、文件名等,一個程序內不得有重復名。 如: _sum, sum, student_name, price等 習慣上,變量名、函數名等用小寫字母表示。常量名用大寫字母表示(以增加可讀性)。 另: 需注意標識符長度,視不同系統而定。 設允許8個字符。 則: student_ name student_ number為同一名字。C語言中, 變量須先定義,后使用 如: int student student=30; 則若寫成student=30, 則未定義, 編譯時指出其錯。 一旦變量被定義,即可在編譯時為其分配相應數量的單元。 一旦變量被定義, 其類型便確定。則可檢查其運算的合法性。如: a %

11、 b 表示a整除以b的余,則a,b必須為整型量。2.3.1 整型常量整型常量整型常量 整型常數C語言提供了三種形式 十進制 如: 256, 308, 120等 八進制 以數字0開頭表示的整數 例:0235, 0146 012等. 0235=28238515710 014618248610210 012(182)1010十六進制 以0 x開頭的整型數 如: 0 x16, 0 x282.3.2 整型變量整型變量一、分類:一、分類: 分為四種:基本型、短整型、長整型、無符號型 2.短整型: 用short int或 short定義 3.長整型: 用long 或 long int 定義 1.基本型: 用

12、int定義 4.無符號型: 不存放符號,則不帶符號數. 又分無符號整型,無符號短整型, 無符號長整型。 上述各種類型所占內存單元數及取值范圍視不同機器而不同。詳見P13。二、定義方法二、定義方法 整型變量分別以下列方式定義2. 短整型 short int 或 short a, b, c;3. 長整型 long int 或 long a, b, c;1. 基本整型: int a, b, c;4. 無符號型 unsigned a, b, c; unsigned short a, b, c; unsigned long a, b, c;例: main ( ) int a, b, c, d; /*指定

13、a, b, c, d為整型變量*/ unsignd u; /*指定u為無符號整型變量*/ a=12; b= 24; u=10; c=a+u; d=b+u; printf(a+u=%d, b+u=%dn,c,d); 由此看到: 不同類型的整型數據可進行算術運算。 但有一定規則,見2.7.運行結果為 a+u=22, b+u= 14三、關于整型常量三、關于整型常量 程序中出現的整型常數, 系統按以下規則分配變量(內存單元)或賦值給相應變量 2. 若超越,而在21474836482147483647之間,則可賦給 long int 變量。 1. 當常數(量)在 3276832767之間,則可賦給int

14、, long int 變量。4. 一個非負整數, =, =, !=4. 位運算符 , , , , &.5. 賦值運算符 = 等6. 條件運算符 ? 等7. 逗號運算符 ,8. 指針運算符 *, &11. 分量運算符 , ,12. 下標運算符 13. 其它運算符 如函數的調用( )9. 求字節數運算符 size of 10. 強制類型轉換運算符 (類型) 2.8.2 算術運算符和算術表達式算術運算符和算術表達式一、基本算術運算符+ 加法 正值 3+6, +3 減法 負值 6 4, 5 乘法 38/ 除法 8 / 5% 求余 7 % 4 的值為3注: 兩個整型數據相除 (結果為整,一般向零靠攏)。

15、 5/ 3 1“ /” 中,有一個 float, 則結果為double型,使用時千萬注意 int / int 出現數據丟失。二、算術表達式及算術運算符的優先級與結合性運算對象: 常量、變量、函數等優先級: ( ), , /, %, +, 結合性: 同一優先級, 自左向右,為左結合性,反之為右結合性。例: a b / c 1.5 + ad e 當類型不同的數據進行運算時,按2.7介紹的類型轉換。 算術表達式: 用算術運行運算符和括號將運算對象連接起來,且符合C語法規則的式子。三、可利用強制類型轉換運算符將一個算術表達式轉換為所需類型形式: (類型名) (表達式)例如: (double) a 將a

16、轉換為double(int) (x+y) 將x+y轉換為int(float) (5%3) 將5%3轉換為float注: 1. 括號不能省略。 如: intx 會理解為變量intx. 2. 轉換后的類型數據由系統分配一個中間變量存放,而原變量類型不變。 float x; 又如: (int) (x+y) 若省略: (int)x+y會變成將x轉成整型. (int)x; 則x本身仍為實型,而(int)x由一個中間變量(整)存放x的整數部分。例: main ( ) float x; int i; x=3.6; i= (int) x; printf (x=%d, x, i); 則: x=3.600000,

17、 i=3.總結以上類型轉換,有二種: 1. 強制另: 強制類型轉換運算優先于算術運算符.2. 系統自動如: 若x為float, 則x%3不合法。 但可用(int)x%3來解決。(附錄III介紹了優先級)四、自增,自減運算符設有int i = 3;+ + 自增1 自減1則: + +i, i+都會使i變為4,但有區別:+i: 先使i值+1,再使用i值;i+: 先使用i值,再使i值+1.j= +i; j=4, i=4. (i=i+1; j=i;)j=i+; j=3, i=4. (j=i; i=i+1)同理: i, i ,均使i值1,但: 又如: printf (i=%dn, i+); 結果: i=3

18、若: printf (i=%dn, +i); 結果: i=4 i: 先使i值1,再使用i值;i : 先使用i值,再使i值1i=3;幾點注意:1. +和 運算法只能用于變量,不得用于常量和表達式.2. +, ,的結合性為從右至左,而一般算術運算符為從左至右。如:如 5+ +, (a+b)+ +均為不合法.i+ 和+ +為同一優先級.i+相當于(i+)若 i=3, 則結果為3, i為4. +, 主要用于循環變量自增或自減。1. 要慎用+、 運算符。五、有關表達式使用中的問題說明則:先對i進行3次自加,為6,然后三個i相加為18,而i為6。如: 表達式(i+)+(i+)+(i+) (i=3) 一般認

19、為: 從左至右: 3+4+5=12,i6.但Turbo C. MSC 都是先取三個原值相加: i+i+i=9 i6如果表達式數為: k=(+i)+(+i)+(+i)2. 在表達式中,有的運算符為一個字符,有的為兩個字符。3. 在函數調用時,如:一般地: 自左至右盡可能多地將若干字符組成一個運算符。例: i+j, 究竟理解為(i+)+j還是i+(+j)?printf(%d, %d, i, i+);若i=3, 若參數計算從左至右, 則輸出 3, 3若從右至左, 則輸出4, 3上述問題看似復雜,最好上機實踐.2.9 賦值運算符和 賦值表達式符號 = 為賦值運算符。2. 整型數據賦給實型變量,數值不變

20、,但按實數形式存放. 1. 將實型數據(無論單,雙精度)賦給整型變量時,舍棄小數.賦值時,兩邊類型若不一致,則按以下規則轉換:4. 將intlong int, 進行符號擴展。 即: 符號擴展, 低16位long 的低16位。5. long int int 則高16位截斷。3. 字符型數據賦給整型變量時:(2)字符帶符號整型變量,則字符高位擴展。(1)字符無符號整型變量,則存入低8位,高8位補零。6. 將unsigned int 型long int高位補0。原值傳送,但數據大小不能超值。 如: unsigned int a=65535; int b; b=a; 則越界。而位數相同部分賦值 uns

21、igned int int unsigned long long unsigned short short7. 非unsigned 型長度相同的unsigned型數據,原樣傳送(包括符號位) 一、復合賦值運算符:在 號之前加一個其它運算符。C語言規定:凡是二目運算符均可構成復合運算符。例: a+=3; 相當于 a=a+3 x=y+8; 相當于 x=x (y+8) x%=3; 相當于x=x% 一般形式: 二、賦值表達式例: x=10 為一賦值表達式 其中又可以是一個賦值表達式。例: x=(y=10) 相當于 y=10;x=y 由于賦值號為右結合性,于是 ( ) 可省略, 即為:x=y=10;例:

22、 a + = a =aa (設a12)又: a=5+(c=6) c=6, a=11 a=(b=4)+(c=6) b=4, c=6, a=10 a=(b=10)/ (c=2)b=10,c=2, a=5進一步,還可用復合賦值運算符作下列運算:步驟: aa144. a =a a a=a a a=12 144= 132 a + = 132 a = a+(132) = 2642.10 2.10 逗號運算符和逗號運算符和逗號表達式逗號表達式 一般形式: 表達式1, 表達式2其計算規則: 先計算表達式1,再計算表達式2,最后值為表達式2的值。例:a=35, a 4 則: 先計算3 5, a15, a 4=6

23、0,結果為60。又如: (a=35, a 4), a+5 擴展形式: 表達式1, 表達2, ,表達式n,結果為20(作為逗號表達式的值) a+5a 即 20a. 3 5=15a a 4=60 (此時a值仍未變)結果為表達式n的值 注意: x=(a=3, 63) 賦值表達式, x18; x=a=3, 6 a 逗號表達式, x3. 逗號表達式主要用于某些語句中需一次計算多個表達式值的情況。如在循環語句中。 函數調用中的實參之間雖然用的是逗號間隔,但不是逗號表達式。 如: printf (%d, %d, %d, a, b, c);第三章第三章 最簡單的最簡單的C C程序設計程序設計3.1 C語句概述

24、語句概述 C語句全部為可執行語句,對應若干機器操作指命令C程序由許多源文件組成。(分別編譯,然后連接)每一個源文件由預編譯命令和若干函數組成。每一個函數由說明部分和語句部分組成。其結構如圖除說明部分外,重要部分為語句部分。C 程 序源程序文件1源程序文件i源程序文件n預編譯命令函 數 1函 數 n說 明 部 分執行部分(語句)C C 語句分為五類1. 控制語句改變語句的執行順序共有共有9種控制語句種控制語句: if ( ) else (條件) for ( ) (循環) while ( ) (循環) do while (循環) continue (結束本次循環) switch (多分支選擇) b

25、reak (中止整個循環) goto (轉移) return ( 函數返回)( )表示條件, 表示語句2. 函數調用語句3. 表達式語句printf ();表達式加; 如: i=i+1; i+; x+y; 其函數調用也可理解為表達式語句.5. 復合語句4. 空語句 ; 任何事情都不做.用 括起來的一系列語句。 如: z=x+y; t=z/100; printf (%f, t); 從結構化程序設計角度出發,程序有三種結構:順序結構選擇結構循環結構1. 順序結構表示ABAB先執行A, 再執行B.2. 選擇結構表示為ABPTFB TPFA存在某條件P, 若P為真,則執行A, 否則執行B。3. 循環結

26、構循環結構表示為PFTAAP為T(1) 當型結構 當P條件成立時(T),反復執行A,直到P為“ 假”時才停止循環.有兩種結構:當型和直到型(2) 直到型APFTA直到P為真 先執行A, 再判斷P,若為F,再執行A,如此反復,直到P為T. 另外:由選擇結構可以派生出另一種基本結構多分支結構.KK=K1A1A2AiAnK=K2K=Ki 已證明: 上述三種結構組成的程序可以解決全部的問題,所以任何一種高級語言都具備上述三種結構。 由賦值表達式加分號;構成,與其它高級語言相比有以下不同點:“ =”為一運算符,由此,構成一賦值表達式,可出現于表達式能出現的任何地方:if ( (a=b)0) t=a; 前

27、面已論述: C語言本身無輸入/ 出語句, 由函數實現,如printf.等。 一般:C語言提供了一些標準的輸入/出函數系統函數。形式: putchar (c );功能: 向終端(一般為顯示器)輸出一個字符,其中c為 字符型或整型變量注意: 用該函數時,須用預編譯命令: #include stdio.h 3.4.1 putchar 函數函數 字符輸出函數字符輸出函數舉例: #include stdio.h main( ) char a, b, c; a=B ; b=O ; c=Y; putchar(a); putchar(b); putchar ( C); 結果: BOY putchar(a);

28、putchar( n ); putchar(b); putchar( n ); putchar(c); putchar( n );*利用putchar還可輸出其它轉義字符結果: B O Y putchar( 101 ); 輸出Aputchar( ); 輸出putchar( 015 ); 輸出*若將最后一行改為:3.4.2 printf 函數函數格式輸出函數格式輸出函數一、printf的一般形式 是C語言中使用得最多的一種輸出函數,它可一次按格式輸出多個不同類型的數據。printf(格式控制序列,輸出表列);輸出表列 用“ ,”號隔開的變量或表達式序列,其變量的值按對應的格式控制符所指定的格式輸

29、出。格式控制序列用雙引號“ .”括起來的格式符序列。格式控制序列由格式說明符和普通字符組成。2. 普通字符 原樣輸出1. 格式說明符: 由%接格式字符組成 如: %f, %d等例: a=3; b=4; printf(a=%d, b=%d, a, b); 結果: a=3,b=4無論 a, b中位數多少, 均為上述形式:a=123 b=45二、格式字符 如直接用%d,則將出錯。不同類型的數據輸出,用不同格式字符:1. d格式符十進制整數輸出。(1) %d: 按數據的實際長度輸出。(2) %md: m表示輸出字段寬度。若實際位數m,則m自動取n值,即保證n個字符正常輸出。(2)%ms, 如果串長小于

30、m,則在m列范圍內,字符串向左靠,右補空格。7. f格式符以小數形式輸出單、雙精度實數,有以下幾種形式: %m.nf, 指定輸出的數據共占m列,其中有n位小數。如果值長度小于m,則左端補空格。 %mn.f, 與%m.nf基本相同,只是使輸出的數值向左端靠,右端補空格。 %f, 不指定字段寬度,由系統自動指定,使整數部分全部如數輸出,并輸出6位小數。%f %m.nf %m.nf8. e格式符以指數形式輸出單,雙精度實數基本形式: %e結果: 1.23456共13列6例5例可有%m.ne和%m.ne的形式9. g格式符根據實數大小自動選擇f格式,或e格式輸出單雙精度實數。e+002例: print

31、f ( %e , 123.456)表表3.1 printf格式字符總結格式字符總結格式字符d以帶符號的十進制形式輸出整數(正數不輸出符號)oxucsfeg以8進制無符號形式輸出整數(不輸出前導符0)。以16進制無符號形式輸出整數(不輸出前導符0 x)。以無符號10進制形式輸出整數。以字符形式輸出,只輸出一個字符。說明輸出字符串。以小數形式輸出單、雙精度數,隱含輸出6位小數。以標準形式輸出單、雙精度數,數字部分小數位數為6位。選用f或%e格式中輸出寬度較短的一種格式,不輸出無意義的0。 許多情況與具體機器或系統有關,最好機器上一試。表表3.2 附加格式說明字符附加格式說明字符字符說明用于長整型整

32、型,可加在格式符d、o、x、u前面。數據最小寬度對實數,表示輸出n位小數; 對字符串,表示截取的字符個數。輸出的數字或字符在域內向左靠。m(代表一個正整數).n(代表一個正整數)字母1 系統提供了若干函數,以提供從標準輸入設備(鍵盤)上輸入數據.3.5.1 getchar 函數函數本節先介紹兩個輸入函數.形式: getchar( )功能: 從標準輸入裝置(鍵盤)上輸入一個字符要求: 有#include stdio.h預編譯命令例: #include stdio.h main ( ) char c; c=getchar ( ); putchar (c ); 3.5.2 scanf函數函數功能:

33、在標準輸入裝置(鍵盤)上按指定格式 輸入各種類型的數據地址表列變量的地址或字符串首地址。形式: scanf(格式控制序列, 地址表列)格式控制序列同printf(.)例: main( ) int a, b, c; scanf( %d%d%d , &a, &b, &c); prinft( %d,%d,%dn, a, b, c); 運行,機器等待你輸入: 3 4 5 結果 3, 4, 5注意: 1.scanf函數順用地址量接受數據。2. 輸入數據的間隔為 ,Tab. 空格, 不能為“ ,”.3. 允許在格式符中插入附加字符。格式字符及附加字符的定義如下表3.3和表3.4表表3.3 scanf格式字

34、符格式字符格式字符d用來輸入十進制整數。oxcsfe用來輸入八進制整數。用來輸入十六進制整數。用來輸入單個字符。說明用來輸入字符串,將字符串送到一個字符數組中,在輸入時以非空白字符開始,以第一個空白字符結束。字符串以串結束標志 0作為其最后一個字符。用來輸入實數,可以用小數形式或指數形式輸入。以f作用相同,e與f可以互相替換。表表3.4 scanf附加的格式說明字符附加的格式說明字符字符說明用于輸入長整型數據(可用ld, %lo, %lx), 以及double型數據(用%lf或%le)。用于輸入短整型數據(可用%hd, %ho, %hx)。指定輸入數據所占寬度(列數)。表示本輸入項在讀入后不賦

35、給相應的變量。h域寬(為一正整數)*l4. 對于輸入unsigned型數據,不用%u,而用%d, %o, %x.5. 指定數據長度時,系統自動截取。則當輸入123456時, scanf( %3d%3d , &a, &b);a12, b347. 輸入數據不能規定精度. 6. 在%后加“ *”表示跳過相應的數據則當輸入為12 345 67則a12 b67scanf(%2d %*3d %2d, &a, &b);scanf ( %7.2f , &a);是錯誤的8. 在格式控制中除格式說明符外若還有其它字符,則應按順序原樣輸入。例: scanf( %d, %d, &a, &b);則必須輸入 21, 28

36、又如: scanf(a=%d, b=%d, c=%d, &a, &b, &c);則輸入: a=34, b=58, c=100例1: 輸入三角形三邊, 求三角形面積。例2: 輸入一個大寫字母,要求系統改為小寫字母輸出。例3. 當b24ac0時,求ax2+bx+c=0的兩個根。 在C程序的三種結構中,分支結構是一重要結構,其中的P為條件問題:條件如何表達?邏輯運算、關系運算 關系運算比較運算, 如: a3為一比較運算,當a=5, a3成立。結果稱為“ 真”, 否則, 如: a=1,a3不成立,為假。上述表達式a3稱為關系表達式。4.1.1 關系運算符及其優先次序關系運算符及其優先次序1. , ,

37、=為同一優先級, = =, !=等為同一優先級, 但前者高于后者。2. 關系運算符優先級低于算術運算符。C語言提供了六種關系運算符 = = = !=優先級為:3. 關系運算符優先級高于賦值運算符。如下圖:算術運算符賦值運算符關系運算符高低舉例: ca+b c(a+b)ab!=c (ab)!=ca= =bc a= =(bc a=(bc)4.1.2 關系表達式關系表達式關系表達式的結果值規定為1或0.如: ab, a+bb+c, (a=3)(b=5) , a b , (ab)(bb)= =c 成立 1b+cb 則ab值為1, 所以d=1. f=abc ab為1, abc為0,所以f=0. 用邏輯運

38、算符將關系表達式、邏輯表達式連接起來的式子邏輯表達式。4.2.1 邏輯運算符及優先級 a b !a !b a&b a b 真 真 假 假 真 真 真 假 假 真 假 真 假 真 真 假 假 真 假 假 真 真 假 假三種: & (與), (或) ! (非)其意義見真值表a&b 當a, b均為1時,才為1a b 當a, b中有一個為1時,才為1!a 當a為1, !a為0,反之為1.由此看到:和&為雙目運算符. !為單目運算符。優先級定義:2. &和低于關系運算符。!高于算術運算符1. !(非)優先于&(與).&優先于即: !& 例: !a&b xy & c (!a)&b) (xy)&c)4.2.

39、2 邏輯表達式 1. 邏輯表達式的值與關系表達式值一樣,真為1,假為0。例: a=4 則 !a 值為0.此處只要a 0,為真.則!a值為0. a=4, b=5 a&b為1 前面已定義了邏輯表達式,以下看一看邏輯表達式的值及具體的運算。 4&0 2 為1. 總之,在邏輯運算中,非0值參加邏輯運算時被看成1處理. a=4, b=5 a b為1 a=4, b=5 !a b為12. 一個邏輯表達式中的邏輯運算符并不是一定全部執行. 一個實際的例子:判斷年號是否為潤年。如: a&b&c. 則當a=0(假)時, b,c不需判斷。當a=1,b=0,則不需判c.又如: a b c. 當a=1時,b, c均不必

40、判別。潤年的定義: 能被4整除且又能被400整除。 年號能被4整除但不能被100整除。 當(year%4!=0) (year%100= =0& year%400!=0) 為1時, year為非潤年。設用變量year表示年號 當(year%4= =0& year% 100 !=0) year%400= =0)為1時,year為潤年,否則為非潤年。如果要判別非潤年可在上述表達式前加非(!)運算符. 當!( (year%4= =0 & year%100!=0) year% 400= = 0) 為1時,year為非潤年。或者:即:則:4.3.1 4.3.1 ifif的三種形式的三種形式 功能: 當表達

41、式值非0時, 執行語句A,否則不執行語句A.表達式語句A00例如: if (xy) printf( %d, x)形式1 if(表達式)語句A其流程圖:形式2 if(表達式)語句A else 語句B功能: 表達式為非0,執行語句A 表達式為0,執行語句B表達式語句A語句B 0= 0例: if(xy)printf(%d, x);else printf( %d, y);形式3 if(表達式1)語句1 else if (表達式2) 語句2else if (表達式3) 語句3 else if(表達式n) 語句nelse 語句n流程:表達1表達2表達3表達n語句1語句2語句3語句n語句n語句1 0= 0=

42、 0 0 0 0如: if (3) prinft(o.k); if (a) 1. 表達式可以是邏輯、關系,甚至是算術表達式。 2. 上述形式中的語句必須以分號結束 3. 上述形式中的語句可以是由 括起來的復合語句。此時,在 外可以不用分號.注意的問題:main ( ) float a, b, t; scabf (%f, %f, &a, &b); if (ab) t=a; a=b; b=t; printf (%5.2f, %5.2f, a, b);例4.1 輸入兩個實數,按代數值由小到大次序輸出這兩個數。 3.6, 3.2 3.20, 3.60運行情況如下:例4.2 輸入三個數,按大小順序輸出。

43、 main ( ) float a, b, c,t; scanf(%f,%f,%f, &a, &b,&c); if (ab) t=a; a=b; b=t; if (ac) t=a; a=c; c=t; if (bc) t=b; b=c; c=t; printf(%5.2f, %5.2f, %5.2f, a, b, c);運行情況如下:3,7,1 1.00, 3.00, 7.004.3.2. if語句的嵌套if (表達式1)內嵌ifelse內嵌注意: else與最近的if 配對.一般形式 在上述形式的if語句中, 又可以是if語句稱為嵌套。if (表達式2) 語句1if (表達式3) 語句3el

44、se 語句2else 語句4例: if ( )if ( ) 語句2else 語句3if ( ) if ( ) 語句1 else 所以:必要時加 .if ( ) 語句1else例4.3 有一函數y=1 (x0)編一程序,輸入一個x值,輸出y值。有以下幾種寫法,請判斷哪些是正確的?程序1: main ( ) int x, y; scanf(d, &x); if (x=0) if (x0) y=1; else y=0; else y= 1;程序3: 將上述if語句改為: y= 1; if (x! =0) if (x0) y=1; else y=0;程序4: y=0; if (x=0) if (x0)

45、 y=1; else y= 1;4.3.3 4.3.3 條件運算符條件運算符 C語言提供了一個簡單的條件賦值語句或條件表達式。問題: 當判斷條件不論是“ 真”是“ 假”, 均給同一變量賦值時,能否簡化語句書寫?條件運算符為? : 三目運算符。功能: 先判表達式1, 若非0,則值為表達式2的值,否則為表達式3的值。一般形式表達式1?表達式2: 表達式3 max=ab? a:b;當ab. max a. 否則maxb注: 1. 條件運算符優先于賦值運算符. 例: max=(ab? a:b)可去掉( ) 2. 條件運算符低于關系運算符和算術運算符。 例: max=ab? a:b+1 max= ab?

46、a:(b+1)并不是 max=(ab? a:b)+1 3. 條件運算符結合性為從右至左. 如: ab? a:cd ? c:d 相當于 ab? a:(cd? c:d)4. 條件表達式不能取代一般的if語句,只有當if 的兩 個分支為給同一變量賦值時才可替代if.if (ab) printf(%d, a); else printf (%d, b)由于printf.不是表達式,故不可用條件表達式,但可為: printf(%d, ab? a:b);5. 表達式1、表達式2、表達式3可類型不同。 main ( ) char ch; scanf (%c, &ch); ch=(ch=A & ch=Z? (c

47、h+32):ch;printf(%c, ch)例4.4 輸入一個字符,判別它是否大寫字母,如果是,將它轉換成小寫字母;如果不是,不轉換。然后輸出最后得到的字符。運行結果如下: A a 問題: 當某一表達式有n個取值,每一取值執行一語句,則如果用內嵌if十分繁鎖,而用switch簡單.一般形式: switch(表達式) case 常量表達式1: 語句1 case 常量表達式2: 語句2 case 常量表達式n: 語句n default : 語句n+1 例: 根據成績等級打印百分數段.switch (grade) case A: printf (85100n);case B: printf (70

48、84n);case C: printf (6069n);case D: printf (60n); break; case D: printf(60n); break; 例1 寫一程序,輸入年號,判斷是否為閏年。1. 算法: 根據閏年的判斷條件 當年號能被4整除但不能被100整除時,它為閏年。 當年號能被100整除又能被400整除時,它為閏年。 設用變量year表示年號,leap為待置值變量,當year為閏年:leap1, 否則leap0.輸入yearyear%4=0year%100=0leap0leap1yesANoNoyes 2. 流程圖leap%400=0leap1leap=0打印非閏年

49、打印是閏年結束leap1yesNoyesNoA3. 程序:main ( ) int year, leap; scanf(%d, &year); if (year%4= =0) if (year%100= =0) if (year%400= =0) leap=1; else leap=0; else leap=1;else leap=0;if (leap) printf(%d is, year);else printf(%d is not, year);printf (a leap yearn);運行情況如下:2000 2000 is a leap year1989 1989 is not a

50、leap year 上述條件也可用一個邏輯表達式表示: if ( ( year%4=0)& year%100!) (year%= =0) leap=1; else leap=0;例2: 求ax2+b x+c=0方程的解例3: P62 請同學們閱讀 前面已介紹了順序結構,選擇結構,本章介紹循環結構。如: sum=1+2+3+100;, i1002i實際問題: 一組重復執行的語句。則用循環結構解決。C語言用四種形式循環2. while 語句3. do while 語句4. for語句01.if語句與goto語句1. goto語句2. 與if構成循環.例: 求100211001ii main ( )

51、 int i, sum=0;形式: goto標號;功能: 無條件轉向標號處。標號:用標識符命名。i=1;loop:if (i=100) sum=sum+i; i+; goto loop; printf(%d, sum); 運行結果如下: 5050main ( ) int sum=0, i=0; loop: sum=sum+i; i + +; if (i=100) goto loop; printf (sum=%d , sum); 本例相當于當型循環,若改為直到型: 為了使程序的結構化功能強,應盡量少用goto語句。1. 形式: while (表達式)語句2. 執行過程: 先判斷表達式的值。若0

52、.則執行其后面的語句,否則while執行完畢。專門的當型循環語句while語句3. 流程圖:表達式語句0=0下一語句將上述例子用while語句寫出 while (i=100) sum+ =i; i+; 語句中應有使表達式=0的語句。 否則會出現無限循環死循環。注: while后面的語句一般為復合語句, 即:加 一種專門的“ 直到型” 循環語句。2. 執行過程: 先執行語句,再判表達式的值,若0,再執行語句,否則結束循環3. 流程:語句表達式0=01. 形式: do語句while(表達式);main ( ) int i, sum=0; i=1; do sum=sum+i; i+; while (

53、i=100); printf(%d,sum); 程序如下: while語句與dowhile語句的區別: 當第一次執行時,若表達式=0時,則while語句與do while有所不同,do while 執行一次后面的語句,而while不執行。1. 形式 首先計算表達式1,接著執行表達式2,若表達式2的值0,則執行語句,接著計算表達式3,再判斷表達式2的值.依此重復下去,直到表達式2的值=0(假)。一種形式更為靈活的循環語句。2.執行過程for(表達式1; 表達式2; 表達式3)語句3. 流程:計算表達式1求表達式2值語句計算表達式3結束for語句=0(假)0(真)用for語句寫出上述例子for用w

54、hile代替的流程 表達式1; while(表達式2) 語句 表達式3; for ( i=1; ib) i=b; j=a; for (; i=j; i+) sum=sum+i; printf ( n sum=%d, sum); 表達式2一般不可省略,否則為無限循環相當于: while (1) sum=sum+i; i+; 例: for (i=1; ; i+) sum=sum+i;相當于條件永真、永不為0,若用while表示 表達式3亦可省略,但在循環體中須有語句修改循環變量;以使表達式2在某一時刻為0而正常結束循環。例: for (sum=0,i=1;i=100;) sum=sum+v; i+

55、; 若同時省略表達式1,表達式3,則相當于while(表達式2)語句。相當于 while (i=100) sum:=i; i+; 例: for (; i=100,) sum+=i; i+; 三個表達式均省略 即for(;)語句則相當于while(1)語句.表達式1、表達式3可以是逗號表達式,以使循環變量值在修改時可以對其它變量賦值。如 for (sum=0, i=1; i=100; i+, i+) sum=0; for (i=1; i100時結束。for(r=1; r100) break; printf (%f, area); 從結構化程序要求出發,用break,退出循環,進入for語句的下一

56、條語句。 注: break只能用于循環語句和switch語句。 main( ) int n; for (n=100; n200; n+) if (n%3!=0) printf(%d, n); 問題: 編寫程序,打印100200中不能被3整除的數。換一種方式: main ( ) int n; for (n=100; n2)程序如下: main ( ) long int f1, f2;int i;f1=1; f2=1;for (i=1; i=20; i+)printf(%12ld %12ld , f1, f2); if (i%2= =0) printf(n ); f1=f1+f2; f2=f2+f

57、1; f1=1, f2=1 for i=1 to 20 輸出f1, f2 f1=f1+f2 f2=f2+f1圖5.13運行結果為:15342331597109467502551422935245782415781718553772584177111211393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155 判一個數m是否為素數的方法: 每打印10個數,換一次行。m當用2, 3, 的整數去除它時均不能除盡, 則為素數

58、。程序如下: #include math.h main ( ) 例2. 求100200的素數. int m, k, i, n=0; for (m=101; m=200; m=m+2) if ( n%10= =0) printf(n); k=sqrt(m); for (i=2; i=k+1) printf(%d ,m); n=n+1; 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199運行結果如下:主講教師:劉主講教師:劉 丹丹 前面所用到的數據均為基本類型(整、實、字符),為了豐

59、富數據類型 ,須提供強有力的數據表達方式。C語言提供了一種構造類型數據由基本類型按某一規則組合在一起。 其中數組:同一種(基本)類型按一定順序組合在一起的數據類型。6.16.1 一維數組一維數組6.1.1 一維數組的定義一維數組的定義1. 數組名的確定方法同變量名。2. C語言用方括號 表示數組元數個數。形式: 類型說明符 數組名常量表達式;例: int a 20; float x 100;3. 常量表達式為常量和符號常量。不允許有變量,其表達式的值代表了元素的個數。例: int a20; 表示有20個元素 且元素從0開始編排:a0,a1,a 194. 可在定義時對靜態數組和外部存儲(全局)數

60、組賦初值, 方法如下: 對部分元素賦初值 static int a10=0,1,2,3,4;靜態 對全部元素賦初值 static int a10=10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 如此,只有前5個元素初值確定,后5個元素由系統設置。 如對數組元素賦同一初值,必須一一寫出: static int a10=0,0,0,0,0,0,0,0,0,0;不可寫成: static int a10*0; 若賦全部元素的初值,可省略常量表達式 a =0,1,2,3; 表示a4,即只有4個元素。6.1.2 一維數組的引用一維數組的引用 2. 引用方式: 數組名下標 代

溫馨提示

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

評論

0/150

提交評論