第4章c語言譚浩強版頂級講義PPT學習課件.ppt_第1頁
第4章c語言譚浩強版頂級講義PPT學習課件.ppt_第2頁
第4章c語言譚浩強版頂級講義PPT學習課件.ppt_第3頁
第4章c語言譚浩強版頂級講義PPT學習課件.ppt_第4頁
第4章c語言譚浩強版頂級講義PPT學習課件.ppt_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、4.1 C語句概述 4.2 程序的三種基本結構 4.3 賦值語句 4.4 數據輸入輸出的概念及在語言中的實現 4.5 字符數據的輸入輸出 4.6 格式輸入與輸出 4.7 順序結構程序設計舉例 習題,第4章 最簡單的c程序設計順序程序設計,在上一章介紹了程序中用到的一些基本要素(常量、變量、運算符、表達式等),它們是構成程序的基本成分。在第1章中已經介紹了幾個簡單的c程序。本章將介紹為編寫簡單的程序所必需的一些內容。,4.1 C語句概述,和其他高級語言一樣,c語言的語句用來向計算機系統(tǒng)發(fā)出操作指令。一個語句經編譯后產生若干條機器指令。一個實際的程序應當包含若干語句。應當指出,c語句都是用來完成一

2、定操作任務的。聲明部分的內容不應稱為語句。如:int a;不是一個c語句,它不產生機器操作,而只是對變量的定義。從第1章已知,一個函數包含聲明部分和執(zhí)行部分,執(zhí)行部分即由語句組成。c程序結構可以用圖4.1表示。即一個c程序可以由若干個源程序文件(分別進行編譯的文件模塊)組成,一個源文件可以由若干個函數和預處理命令以及全局變量聲明部分組成(關于“全局變量”見第7章,“預編譯命令”見第8章),一個函數由數據定義部分和執(zhí)行語句組成。,圖4.1,在第2章中已經說明,程序應該包括數據描述(由聲明部分來實現)和數據操作(由語句來實現)。數據描述主要定義數據結構(用數據類型表示)和數據初值。數據操作的任務是

3、對已提供的數據進行加工。 C語句可以分為以下5類: (1) 控制語句,完成一定的控制功能。c只有9種控制語句,它們是: if()else(條件語句) for() (循環(huán)語句) hile() (循環(huán)語句) dohile() (循環(huán)語句) continue (結束本次循環(huán)語句), break (中止執(zhí)行switch或循環(huán)語句) sitch (多分支選擇語句) goto (轉向語句) return (從函數返回語句) 上面9種語句中的括號()表示其中是一個條件,表示內嵌的語句。例如:“if()else”的具體語句可以寫成: if(xy) z=x;else z=y; (2) 函數調用語句。由一次函數調

4、用加一個分號構成一個語句,例如:printf(this is a c stateent);,(3) 表達式語句。由一個表達式構成一個語句,最典型的是,由賦值表達式構成一個賦值語句。 a=3 是一個賦值表達式,而 a=3; 是一個賦值語句??梢钥吹揭粋€表達式的最后加一個分號就成了一個語句。一個語句必須在最后出現分號,分號是語句中不可缺少的一部分(而不像pascal語言那樣,分號只是語句間的分隔符號)。例如: i=i+1(是表達式,不是語句) i=i+1;(是語句),任何表達式都可以加上分號而成為語句,例如i+;是一語句,作用是使i值加1。又如x+y;也是一個語句,作用是完成x+y的操作,它是合法

5、的,但是并不把x+y的和賦給另一變量,所以它并無實際意義。 表達式能構成語句是c語言的一個重要特色。其實“函數調用語句”也是屬于表達式語句,因為函數調用(如sin(x)也屬于表達式的一種。只是為了便于理解和使用,我們把“函數調用語句”和“表達式語句”分開來說明。由于c程序中大多數語句是表達式語句(包括函數調用語句),所以有人把c語言稱作“表達式語言”。,(4) 空語句。下面是一個空語句: ; 即只有一個分號的語句,它什么也不做。有時用來做被轉向點,或循環(huán)語句中的循環(huán)體(循環(huán)體是空語句,表示循環(huán)體什么也不做)。 (5) 可以用 把一些語句括起來成為復合語句,又稱分程序。如下面是一個復合語句。 z

6、=x+y; t=z/100; printf(%f,t); ,注意:復合語句中最后一個語句中最后的分號不能忽略不寫(這是和pascal不同的)。 C語言允許一行寫幾個語句,也允許一個語句拆開寫在幾行上,書寫格式無固定要求(fortran、cobol有嚴格要求)。 4.2 程序的三種基本結構 為了提高程序設計的質量和效率,現在普遍采用結構化程序設計方法。結構化程序由若干個基本結構組成。每一個基本結構可以包含 一個或若干個語句。有三種基本結構: (1) 順序結構,見圖4.2。先執(zhí)行a操作,再執(zhí)行b操作,兩者是順序執(zhí)行的關系。圖中(b)是ns結構化流程圖(下同)。,圖4.2,圖4.3,(2) 選擇結構

7、,見圖4.3。p代表一個條件,當p條件成立(或稱為“真”)時執(zhí)行a,否則執(zhí)行b。注意,只能執(zhí)行a或b之一。兩條路徑匯合在一起然后出口。 (3) 循環(huán)結構,有兩種循環(huán)結構: 當型循環(huán)結構,見圖4.4。當p條件成立(“真”)時,反復執(zhí)行a操作。直到p為“假”時才停止循環(huán)。 直到型循環(huán)結構,見圖4.5。先執(zhí)行a操作,再判斷p是否為“假”,若p為“假”,再執(zhí)行a,如此反復,直到p為“真”為止。,圖4.4,圖4.5,由選擇結構可以派生出另一種基本結構: 多分支選擇結構,見圖4.6。 根據k的值(k1,k2,kn)不同而決定執(zhí)行a1,a2,an之一。 已經證明,由以上基本結構組成的程序能處理任何復雜的問題

8、。上面圖4.2圖4.7中方框中的a,b,a1,an等可以是一個簡單的語句,也可以又是一個基本結構。例如,圖4.7是一個順序結構,它由兩個操作順序組成。虛線框內是一個當型循環(huán)結構,可以用“b”表示,因此圖4.7就可以理解為圖4.2(a)所示的順序結構。,圖4.6,圖4.7,關于三種基本結構的特征以及結構化程序設計方法,讀者可能已在學習其他高級語言程序設計時學習過,在此不再重復。只是應當強調說明,在今后的程序設計中應當采用結構化程序設計方法。在本章中,我們將介紹幾種最基本的語句,以及用它們構成順序結構的程序。在第4、第5章介紹選擇結構和循環(huán)結構的程序設計。,4.3 賦值語句 前已介紹,賦值語句是由

9、賦值表達式加上一個分號構成。由于賦值語句應用十分普遍,所以專門再討論一下。 C語言的賦值語句具有其他高級語言的賦值語句的一切特點和功能。但也應當注意到它們的不同: (1) C語言中的賦值號“=”是一個運算符,在其他大多數語言中賦值號不是運算符。 (2) 關于賦值表達式與賦值語句的概念,其他多數高級語言沒有“賦值表達式”一概念。作為賦值表達式可以包括在其他表達式之中,例如: if(a=b)0)t=a;,按語法規(guī)定if后面的()內是一個條件,例如可以是:“if(x0)”。現在在x的位置上換上一個賦值表達式“a=b”,其作用是:先進行賦值運算(將b的值賦給a),然后判斷a是否大于0,如大于0,執(zhí)行t

10、=a。在if語句中的“a=b”不是賦值語句而是賦值表達式,這樣寫是合法的。如果寫成if(a=b;)0)t=a;就錯了。在if的條件中不能包含賦值語句。由此可以看到,c把賦值語句和賦值表達式區(qū)別開來,增加了表達式的種類,使表達式的應用幾乎“無孔不入”,能實現其他語言中難以實現的功能.,4.4 數據輸入輸出的概念及在C語言中的實現 (1) 所謂輸入輸出是以計算機主機為主體而言的。從計算機向外部輸出設備(如顯示屏、打印機、磁盤等)輸出數據稱為“輸出” ,從外部向輸入設備(如鍵盤、磁盤、光盤、掃描儀等)輸入數據稱為“輸入”。 (2) C語言本身不提供輸入輸出語句,輸入和輸出操作是由函數來實現的。在c標

11、準函數庫中提供了一些輸入輸出函數,例如,printf函數和scanf函數。讀者在使用它們時,千萬不要誤認為它們是C語言提供的“輸入輸出語句”。printf和scanf不是C語言的關鍵字,而只是函數的名字。實際上完全可以不用printf和scanf這兩個名字,而另外編兩個,輸入輸出函數, 用其他的函數名。C提供的函數以庫的形式存放在系統(tǒng)中,它們不是c語言文本中的組成部分。 在第1章中曾介紹,不把輸入輸出作為C語言提供的語句的目的是使C語言編譯系統(tǒng)簡單,因為將語句翻譯成二進制的指令是在編譯階段完成的,沒有輸入輸出語句就可以避免在編譯階段處理與硬件有關的問題,可以使編譯系統(tǒng)簡化,而且通用性強,可移植

12、性好,對各種型號的計算機都適用,便于在各種計算機上實現。各種版本的C語言函數庫是各計算機廠商(或軟件開發(fā)公司)針對某一類型計算機的情況編寫的,并且已編譯成目標文件(.obj文件)。它們在連接階段與由源程序經編譯而得到的目標文件相連接,生成一個可執(zhí)行的目標程序。如果在源程序中有printf函,數,在編譯時并不把它翻譯成目標指令,而是在執(zhí)行階段中調用已被連接的函數庫中的printf函數。由于c編譯系統(tǒng)與c函數庫是分別進行設計的,因此不同的計算機系統(tǒng)所提供函數的數量、名字和功能是不完全相同的。不過,有些通用的函數(如printf和scanf等),各種計算機系統(tǒng)都提供,成為各種計算機系統(tǒng)的標準函數。c

13、語言函數庫中有一批“標準輸入輸出函數” ,它是以標準的輸入輸出設備(一般為終端設備)為輸入輸出對象的。其中有:putchar(輸出字符),getchar(輸入字符),printf(格式輸出),scanf(格式輸入), puts(輸出字符串),gets(輸入字符串)。在本章中介紹前面4個最基本的輸入輸出函數。,(3) 在使用c語言庫函數時,要用預編譯命令“include”將有關的“頭文件” 包括到用戶源文件中。在頭文件中包含了與用到的函數有關的信息。例如使用標準輸入輸出庫函數時,要用到“stdio.h”文件。文件后綴“h” 是head的縮寫,#include命令都是放在程序的開頭,因此這類文件被

14、稱為“頭文件” 。在調用標準輸入輸出庫函數時,文件開頭應有以下預編譯命令: #include 或 #include studio.h studioh是standard input putchar(n);putchar(b);putchar(n);putchar(c); putchar(n); 則輸出結果為: b o y 也可以輸出其他轉義字符,如: putchar(101)(輸出字符a) putchar() (輸出單引號字符) putchar(015) (輸出回車,不換行,使輸出的當前位置移到本行開頭),4.5.2 getchar函數(字符輸入函數) 此函數的作用是從終端(或系統(tǒng)隱含指定的輸入

15、設備)輸入一個字符。getchar函數沒有參數,其一般形式為getchar() 函數的值就是從輸入設備得到的字符。例如: 例4.2輸入單個字符 #include main() charc; c=getchar(); putchar(c); ,在運行時,如果從鍵盤輸入字符a并按回車鍵,就會在屏幕上看到輸出的字符a。a(輸入a后,按“回車”鍵,字符才送到內存) a (輸出變量c的值a) 請注意,getchar()只能接收一個字符。getchar函數得到的字符可以賦給一個字符變量或整型變量,也可以不賦給任何變量,作為表達式的一部分。例如,例4.2第4、5行可以用下面一行代替: putchar(get

16、char(); 因為getchar()的值為a,因此putchar函數輸出a。也可以用printf函數輸出: printf(”%c,getchar();請不要忘記,如果在一個函數中(今為main函數)要調用getchar函數,應該在該函數的前面(或本文件開頭)加上“包含命令” #include,4.6.1 printf函數(格式輸出函數) 在前面各章節(jié)中已用到printf函數,它的作用是向終端(或系統(tǒng)隱含指定的輸出設備)輸出若干個任意類型的數據(putchar只能輸出字符,而且只能是一個字符,而printf可以輸出多個數據,且為任意類型)。 1. printf函數的一般格式為printf(格式

17、控制,輸出表列) 如:printf(%d, %cn,i,c) 括弧內包括兩部分:,4.6 格式輸入與輸出,(1) “格式控制”是用雙引號括起來的字符串,也稱“轉換控制字符串”,它包括兩種信息: 格式說明,由“%”和格式字符組成,如%d,%f等。它的作用是將輸出的數據轉換為指定的格式輸出。格式說明總是由“%”字符開始的。 普通字符,即需要原樣輸出的字符。例如上面printf函數中雙引號內的逗號、空格和換行符。 (2) “輸出表列”是需要輸出的一些數據,可以是表達式。 2. 格式字符 對不同類型的數據用不同的格式字符。常用的有以下幾種格式字符:,(1) d格式符。用來輸出十進制整數。有以下幾種用法

18、: %d,按整型數據的實際長度輸出。 %md, m為指定的輸出字段的寬度。如果數據的位數小于m,則左端補以空格,若大于,則按實際位數輸出。如 printf(%4d,%4d,a,b); 若a=123,b=12345,則輸出結果為 123,12345 %ld,輸出長整型數據。如 longa=135790; printf(%ld,a);,如果用%d輸出,就會發(fā)生錯誤,因為整型數據的范圍為-3276832767。對long型數據應當用%ld格式輸出。對長整型數據也可以指定字段寬度,如將上面printf函數中的“%ld”改為“%8ld”,則輸出為: 135790 8列 一個int型數據可以用%d或%ld

19、格式輸出。 (2) o格式符,以八進制數形式輸出整數。由于是將內存單元中的各位的值(0或1)按八進制形式輸出,因此輸出的數值不帶符號,即將符號位也一起作為八進制數的一部分輸出。例如: int a=-1; printf(%d,%o,a,a); -1在內存單元中的存放形式(以補碼形式存放)如下:,1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 輸出為 -1,177777 不會輸出帶負號的八進制整數。對長整數(long型)可以用“%lo”格式輸出。同樣可以指定字段寬度,如printf(“%8o”,a)輸出為177777。 (3) x格式符,以十六進制數形式輸出整數。同樣不會出現負的十

20、六進制數。例如: int a=-1; printf(%x,%o,%d,a,a,a);,輸出結果為 ffff,177777,-1 同樣可以用“%lx”輸出長整型數,也可以指定輸出字段的寬度,如“%12x”。 (4) u格式符,用來輸出unsigned型數據,即無符號數,以十進制形式輸出。 一個有符號整數(int型)也可以用%u格式輸出;反之,一個unsigned型數據也可以用%d格式輸出。按相互賦值的規(guī)則處理(見第2章2.9節(jié))。unsigned型數據也可用%o或%x格式輸出。 例4.3無符號數據的輸出。,main() unsigned int a=65535; int b=-2; printf

21、(a=%d,%o,%x,%un,a,a,a,a); printf(b=%d,%o,%x,%un,b,b,b,b); 運行結果為: a=-1,177777,ffff,65535 b=-2,177776,fffe,65534 請讀者自己分析。,(5) c格式符,用來輸出一個字符。如: charc=a; printf(%c,c); 輸出字符a,請注意:“%c”中的c是格式符,逗號右邊的c是變量名,不要搞混。 一個整數,只要它的值在0255范圍內,也可以用字符形式輸出,在輸出前,系統(tǒng)會將該整數作為ascii碼轉換成相應的字符;反之,一個字符數據也可以用整數形式輸出。例4.4字符數據的輸出。 main(

22、) char c=a; int i=97;,printf(%c,%dn,c,c); printf(%c,%dn,i,i); 運行結果為: a,97 a,97 也可以指定輸出字數寬度,如果有 printf(%3c,c) 則輸出:“ a”,即c變量輸出占3列,前2列補空格。 (6) s格式符,用來輸出一個字符串。有幾種用法:,%s,例如:printf(%s,china) 輸出“china”字符串(不包括雙引號)。 %ms,輸出的字符串占列,如字符串本身長度大于m,則突破的限制,將字符串全部輸出。若串長小于m,則左補空格。 %-ms,如果串長小于,則在列范圍內,字符串向左靠,右補空格。 %mns,輸

23、出占列,但只取字符串中左端n個字符。這n個字符輸出在列的右側,左補空格。 %-mns,其中、n含義同上,n個字符輸出在列范圍的左側,右補空格。如果n,則自動取n值,即保證n個字符正常輸出。,例4.5字符串的輸出。 main() printf(%3s,%7.2s,%.4s,%-5.3sn,china,china, china, china) 輸出如下: china, ch,chin,chi 其中第3個輸出項,格式說明為“%.4s”,即只指定了n,沒指定,自動使=n=4,故占4列。,(7) f格式符,用來輸出實數(包括單、雙精度),以小數形式輸出。有以下幾種用法: %f,不指定字段寬度,由系統(tǒng)自動

24、指定,使整數部分全部如數輸出,并輸出6位小數。應當注意,并非全部數字都是有效數字。單精度實數的有效位數一般為7位。 例4.6輸出實數時的有效位數。 main() float x,y; x=111111111;y=222222222; printf(%f,x+y); ,運行結果為 333333328125 顯然,只有前7位數字是有效數字。千萬不要以為凡是打印出來的數字都是準確的。 雙精度數也可用%f格式輸出,它的有效位數一般為16位,給出小數6位。 例4.7輸出雙精度數時的有效位數。 main() double x,y; x=1111111111111.111111111; y=22222222

25、22222.222222222; printf(%f,x+y); ,輸出結果為 3333333333333.333010 可以看到最后3位小數(超過16位)是無意義的。 %nf指定輸出的數據共占列,其中有n位小數。如果數值長度小于,則左端補空格。 %-nf與%nf基本相同,只是使輸出的數值向左端靠,右端補空格。 例4.8輸出實數時指定小數位數。 main() float f=123.456;,printf(%f %10f %10.2f %.2f %-10.2fn,f,f,f,f,f); 輸出結果如下: 123.456001 123.456001 123.46 123.46 123.46 f的值

26、應為123.456,但輸出為123.455994, 這是由于實數在內存中的存儲誤差引起的。 (8) e格式符,以指數形式輸出實數??捎靡韵滦问剑?%e不指定輸出數據所占的寬度和數字部分的小數位數,有的c編譯系統(tǒng)自動指定給出6位小數,指數部分占5位(如e+002),其中“e”占1位,指數符號,占1位,指數占3位。數值按規(guī)范化指數形式輸出(即小數點前必須有而且只有1位非零數字)。例如 printf(%e,123456); 輸出:1234560e+002。 6列 5列 輸出的實數共占13列寬度。(注: 不同系統(tǒng)的規(guī)定略有不同) %m.ne和%-m.ne。、n和“-”字符含義與前相同。此處n指擬輸出的

27、數據的小數部分(又稱尾數)的小數位數。若f=123456,則: printf(%e %10e %10.2e %.2e %-10.2e,f,f,f,f,f);,輸出如下: 1.234560e+002 1.234560e+002 1.23e+002 1.23e+002 1.23e+002 13列 13列 10列 9列 10列 第2個輸出項按%10e輸出,即只指定了=10,未指定n,凡未指定n,自動使n=6,整個數據長13列,超過給定的10列,乃突破10列的限制,按實際長度輸出。第3個數據共占10列,小數部分占2列。第4個數據按“%2e”格式輸出,只指定n=2,未指定,自動使等于數據應占的長度,今為

28、9列。第5個數據應占10列,數值只有9列,由于是“%-102e”,數值向左靠,右補一個空格。(注: 有的c系統(tǒng)的輸出格式與此略有不同),(9) g格式符,用來輸出實數,它根據數值的大小,自動選f格式或e格式(選擇輸出時占寬度較小的一種),且不輸出無意義的零。例如,若f=123468,則printf(“%f %e %g”,f,f,f); 輸出如下: 123.468000 1.234680e+002 123.468 10列 13列 10列 用%f格式輸出占10列,用%e格式輸出占13列,用%g格式時,自動從上面兩種格式中選擇短者(今以%f格式為短),故占10列,且按%f格式用小數形式輸出,最后3個

29、小數位“0”為無意義的0,不輸出,因此輸出123.468,然后右補3個空格。%g格式用得較少。,在使用printf函數時,還有幾點要說明: (1) 除了x,e,g外,其他格式字符必須用小寫字母,如%d不能寫成%d。 (2) 可以在printf函數中的“格式控制”字符串內包含第2章2.5節(jié)2.5.1段中的“轉義字符”,如“n”、“t”、“b”、“r”、“f”、“377”等。 (3) 上面介紹的d、o、x、u、c、s、f、e、g等字符,如用在“%”后面就作為格式符號。一個格式說明以“%”開頭,以上述9個格式字符之一為結束,中間可以插入附加格式字符(也稱修飾符)。例如:,第一個格式說明為“%c”而不

30、包括其后的f,第二個格式說明為“%f”,不包括其后的s,第三個格式說明為%s。其他的字符為原樣輸出的普通字符。 (4) 如果想輸出字符“%”,則應該在“格式控制”字符串中用連續(xù)兩個%表示,如:,printf(%f%,10/3); 輸出: 0333333% 4.6.2 scanf函數(格式輸入函數) 在第1章中已初步接觸到了scanf函數,在本節(jié)中再作詳細介紹。 1. 一般形式 scanf(格式控制,地址表列) “格式控制”的含義同printf函數;“地址表列”是由若干個地址組成的表列,可以是變量的地址,或字符串的首地址。,例4.9用scanf函數輸入數據。 ain() int a,b,c; scanf(“%d%d%d”, 運行情況如下: a=1,b=3,c=2 x1=-100 x2=-200 注意程序中用了預處理命令include 。,4.8習題 4

溫馨提示

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

評論

0/150

提交評論