C語言程序設計課件_第1頁
C語言程序設計課件_第2頁
C語言程序設計課件_第3頁
C語言程序設計課件_第4頁
C語言程序設計課件_第5頁
已閱讀5頁,還剩170頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程式設計第一章C語言概述C語言的發(fā)展與特點

C語言的基本程式結(jié)構(gòu)

C語言程式的開發(fā)過程

C語言的基本詞法演算法1.1C語言出現(xiàn)的歷史背景組合語言依賴於電腦硬體,程式的可讀性和可移植性差;一般高級語言難以實現(xiàn)組合語言的某些功能如對內(nèi)存地址的操作、位操作等。1.2C語言的發(fā)展史1960年ALGOL60;1963年英國劍橋大學提出CPL語言;1967年MatinRichards提出BCPL語言;1970年KenThompson提出B語言;1972-1973Dennis.M.Ritchie提出C語言;BrianW.Kernighan和D.M.Ritchie介紹標準C;1987年美國國家標準化協(xié)會提出ANSIC。1.3C語言的特點簡潔、緊湊,使用方便、靈活;允許直接訪問地址,能進行位操作;運算符豐富;數(shù)據(jù)類型豐富;結(jié)構(gòu)化程式語言,便於實現(xiàn)程式的模組化;程式執(zhí)行效率高,可移植性好。1.4C語言的基本程式結(jié)構(gòu)C程式是由函數(shù)構(gòu)成的,每個C程式有且只有一個主函數(shù)(main),可包含若干其他函數(shù);每個函數(shù)由首部與函數(shù)體組成;首部包括函數(shù)類型、函數(shù)名、函數(shù)參數(shù)(形參)、參數(shù)類型,

intmax(intx,inty)

函數(shù)體包括聲明部分和執(zhí)行部分。main函數(shù)位置任意,但總是從main函數(shù)開始執(zhí)行,在main函數(shù)中結(jié)束;C程式書寫自由,每個語句後需加一個分號;主函數(shù)可調(diào)用任何非主函數(shù),非主函數(shù)之間可互相調(diào)用,但不能調(diào)用主函數(shù);C語言本身沒有輸入輸出語句;用/*…………*/進行注釋。1.5C語言程式的開發(fā)過程編輯編譯鏈接

電腦只能識別和執(zhí)行由0和1組成的二進位的指令,為了使電腦能執(zhí)行高級語言根源程式,必須先用“編譯程序”把根源程式翻譯成二進位形式的“目標程式”,然後將該目標程式與系統(tǒng)的函數(shù)庫和其他目標程式連接成為可執(zhí)行的目標程式。1.6C語言的基本詞法字元集:包括大小寫英文字母52個、數(shù)字10個、鍵盤符號33個、轉(zhuǎn)義字元。識別字:是用戶自定義的一組字元序列,用來表示程式中需要辨認的對象名稱,如符號常量、變數(shù)、數(shù)組、函數(shù)。規(guī)定:

識別字是由字母或下劃線開頭的字母、數(shù)字、下劃線組成的一串符號,最長不能超過32個字元;大小寫字母有區(qū)別,大寫字母只用來定義宏名,其他都採用小寫字母表示。保留字:32個,有特殊含義,主要用於構(gòu)成語句,進行存儲類型和數(shù)據(jù)類型的定義,不允許用戶作為自定義識別字使用;詞類:常量、變數(shù)、運算符、函數(shù)、表達示、保留字;語句:完成特定的操作,語句的有機組合序列完成指定的功能;語句的種類賦值語句;函數(shù)調(diào)用語句;運算式語句;流程控制語句;複合語句;空語句;1.7

演算法著名電腦科學家沃思提出公式:程式=數(shù)據(jù)結(jié)構(gòu)+演算法數(shù)據(jù)結(jié)構(gòu):對數(shù)據(jù)的描述即指定數(shù)據(jù)的類型和數(shù)據(jù)的組織形式;演算法:對操作的描述即操作步驟。1.7.1

簡單演算法舉例判定2000-2500年中的每一年是否閏年。設定y為被檢測的年份。演算法如下:S1:2000=>yS2:若y不能被4整除,則輸出y“不是閏年”,然後轉(zhuǎn)至S6S3:若y能被4整除,不能被100整除,則輸出y“是閏年”,然後轉(zhuǎn)至S6S4:若y能被100整除,又能被400整除,輸出y“是閏年”;否則輸出y“不是閏年”,然後轉(zhuǎn)至S6S5:輸出y“不是閏年”S6:y+1=>yS7:當y<=2500時,轉(zhuǎn)S2繼續(xù)執(zhí)行,如y>2500,演算法停止;1.7.2

演算法的特點有窮性;確定性;有零個或多個輸入;有一個或多個輸出;有效性1.7.3

演算法的表示用流程圖表示演算法;用偽代碼表示演算法;用電腦語言表示演算法。第二章C語言的數(shù)據(jù)類型、運算符與運算式C語言的數(shù)據(jù)類型;

C語言的運算符與運算式;2.1C語言的數(shù)據(jù)類型數(shù)據(jù)類型基本類型構(gòu)造類型指針類型空類型(void)整型(int)字元型(char)實型(浮點型)數(shù)組類型結(jié)構(gòu)體類型(struct)共用體類型(聯(lián)合類型)(union)枚舉類型單精確度型(float)雙精類型(double)2.2

常量

在程式運行過程中,其值不能被改變的量稱為常量。

C語言中規(guī)定的常量類型有以下五種:整型常量、實型常量、字元常量、字串常量和符號常量。2.2.1

整型常量1.整型常量的表示方法:十進位整數(shù):無首碼,數(shù)碼取值為0~9,如123,-456。八進制整數(shù):首碼為0,數(shù)碼取值為0~7,如0123,-011。八進制數(shù)與十進位數(shù)的轉(zhuǎn)換方法如下:(0123)8=1*82+2*81+3*80=64+16+3=(83)10十六進制整數(shù):首碼0X或0x,數(shù)碼取值為0~9,A~F或a~f,如0x2A,-0x12。十六進制數(shù)與十進位數(shù)轉(zhuǎn)換方法:(-0x12)16=-(1*161+2*160)=-(16+2)=(-18)102.整型常量的尾碼:加尾碼L或l,表示長整型數(shù)。加尾碼u,表示無符號數(shù)。2.2.2

實型常量實型常量即實數(shù)又稱為浮點數(shù),C語言中實數(shù)只採用十進位,有兩種表示形式:小數(shù)形式:由數(shù)碼0~9和小數(shù)點組成(注意必須有小數(shù)點),如.123,-123.4567;指數(shù)形式:由十進位數(shù),加階碼標誌“e”或“E”以及階碼(只能為整數(shù)),如

-2.1e2,2.1e-2。2.2.3

字元常量

C語言中,字元常量是用單引號括起來的單個字元,如‘a(chǎn)’,‘D’,‘$’等。轉(zhuǎn)義字元是一種特殊形式的字元常量,它是以一個“\”開頭的字元序列。表2.1轉(zhuǎn)義字元及其含義字元形式含義\n換行,將當前位置移到下一行開頭\t水準製錶(跳到下一個tab位置)\b退格,將當前位置移到前一列\(zhòng)r回車,將當前位置移到本行開頭\f換頁,將當前位置移到下頁開頭\\反斜杠字元“\”\’單引號字元\”雙引號字元\ddd1到3位8進制數(shù)所代表的ASCⅡ字元\xhh1到2位16進制數(shù)所代表的ASCⅡ字元例2.1轉(zhuǎn)義字元的使用main(){printf(“

ab

c\t

de\rf\tg\n”);printf(“h\ti\b\bj

k”);}例2.1結(jié)果

程式運行後在印表機上得到以下結(jié)果:fab

c

gdeh

jik

注意在顯示幕上最後看到結(jié)果以與上述列印結(jié)果不同,是:f

gdeh

j

k2.2.4

字串常量C語言中,字串變數(shù)是由一對雙引號括起來的字元序列,如“China”,“$3.232”。注意:不要將字元常量與字串常量混淆。字元常量與字串常量的區(qū)別字元常量是由單引號括起來的,字串常量是由雙引號括起來的;字元常量只能是單個字元,字串常量則可是零個或多個字元;可把一個字元常量賦予一個字元變數(shù),但不能把一個字串變數(shù)賦予一個字元變數(shù),C語言中沒有相應的字串變數(shù),可用字元數(shù)組來存放字串常量;字元常量占一個位元組的記憶體,字串常量占的記憶體位元組數(shù)等於字串中位元組數(shù)加1,最後一個位元組存放字元‘\0’作為字串結(jié)束標誌。2.2.5

符號常量C語言中,可用一個識別字來表示一個常量,稱為符號常量又稱為宏定義,使用前須先定義,其定義規(guī)則為:#define識別字常量例2.2

符號常量的使用#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf(“total=%d”,total);}使用符號常量的好處:含義清楚;在需要改變一個常量時能做到“一改全改”;2.3

變數(shù)

變數(shù)是指在程式運行中其值是變化的量。一個變數(shù)應該有一個變數(shù)名,在內(nèi)存中佔據(jù)一定的存儲單元,在該存儲單元中存放變數(shù)的值。3變數(shù)值a變數(shù)名存儲單元圖2.1C語言中,要求對變數(shù)作強制定義,即“先定義,後使用”。便於發(fā)現(xiàn)錯誤;為每一個變數(shù)指定確定類型,在編譯時就能為其分配相應的存儲單元。整型數(shù)據(jù)在內(nèi)存中的存儲方式

整型數(shù)據(jù)在內(nèi)存中是以二進位形式存放的。若定義了一個整型變數(shù)i:

inti=10;

圖3.2(a)是數(shù)據(jù)存放的示意圖,圖3.2(b)是數(shù)據(jù)在內(nèi)存中實際存放的情況;i10(a)i0000000000001010(b)圖2.2

實際上,整型數(shù)值是以補數(shù)表示的。一個正數(shù)的補數(shù)與其原碼相同,求負數(shù)的補數(shù)方法:將該數(shù)的絕對值的二進位形式按位取反再加1。例如求-10的補數(shù):00000000000010101111111111110101111111111111011010的原碼取反再加1得-10的補數(shù)2.3.1整型變數(shù)有符號基本整型[signed]int有符號短整型[signed]short[int]有符號長整型[signed]long[int]無符號基本型unsignedint無符號短整型unsignedshort[int]無符號長整形unsignedlong[int]1.整型變數(shù)的分類:類型說明符數(shù)的取值範圍位元組數(shù)[signed]int-32768~32767即-215~(215-1)2unsignedint0~65535即0~(216-1)2[signed]short[int]-32768~32767即-215~(215-1)2unsignedshort[int]0~65535即0~(216-1)2[signed]long[int]-2147483648~2147483647即

-231~(231-1)4unsignedlong[int]0~4294967295即0~(232-1)4表2.1整型數(shù)據(jù)的所占的記憶體位元組數(shù)與取值範圍2.整型變數(shù)的說明

類型說明符變數(shù)名識別字,變數(shù)名識別字,…...;如:inta,b,c;unsignedshortx,y;例2.3整型變數(shù)的定義和運算見教材P34例2.32.3.2實型變數(shù)單精確度型float

占4個位元組記憶體,提供7位有效數(shù)字,雙精度型double

占8個位元組記憶體,提供16位有效數(shù)字。整數(shù)沒有誤差,實數(shù)有精度,有誤差,提供6位小數(shù),7位有效數(shù)字。2.實型變數(shù)的說明格式和書寫規(guī)則同整型變數(shù)說明相同,如:floats,t;doubleh,k;例2.4實型數(shù)據(jù)的舍入誤差main(){floata,b;a=123456.789e5;b=a+20;printf(“%f,%f”,a,b);}結(jié)果:12345678848.000000,12345678848.000000誤差原因分析b的理論值應是12345678920,而一個實型變數(shù)只能保證的有效數(shù)字是7位有效數(shù)字,後面的數(shù)字是無意義的,並不準確表示該數(shù),從結(jié)果看出,把20加在後幾位上,是無意義的,應當避免將一個很大的數(shù)與一個很小的數(shù)直接相加減,否則就會“丟失”小的數(shù)。與此類似,用程式計算1.0/3*3的結(jié)果並不等於1。2.3.3字元變數(shù)

字元變數(shù)用來存放字元常量,只能存放一個字元,佔用1個位元組記憶體。

字元變數(shù)定義如下:

charc1,c2;1.字元數(shù)據(jù)在內(nèi)存中的存儲

將一個字元常量放到一個字元變數(shù)中,不是把該字元本身放到記憶體單元中,而是將該字元的相應的ASCⅡ代碼存放在存儲單元中,如字元‘a(chǎn)’的ASCⅡ代碼為97,‘b’為98,9798c1c20110000101100010c1c1圖2.3

在內(nèi)存中,字元數(shù)據(jù)以ASCⅡ碼存儲,它的存儲形式與整數(shù)存儲形式類似,C語言允許對整型變數(shù)賦以字元值,也允許對字元變數(shù)賦以整型量。在輸出時,允許把字元變數(shù)按整型量輸出,也允許把整型變數(shù)按字元型量輸出。注意:當整形變數(shù)按字元型量處理時,只有低八位參與處理。例2.5向字元型變數(shù)賦以整型值main(){charc1,c2;c1=97;c2=98;printf(“%c,%c\n”,c1,c2);printf(“%d,%d\n”,c1,c2);}結(jié)果:a,b97,982.補充TurboC將字元變數(shù)中的最高位作為符號位,也就是將字元處理成帶符號的整數(shù),即signedchar型。它的取值範圍是-128~127。如果使用ASCⅡ碼為0~127間的字元,由於位元組中最高位為0,因此用%d輸出時,輸出一個正整數(shù)。如果使用ASCⅡ碼為128~255間的字元,由於在位元組中最高位為1,用%d格式符輸出時,就會得到一個負整數(shù)。例如:main(){charc=130;printf(“%d”,c);}

得到-126。如果不想按有符號處理,可以將變數(shù)定義為unsignedchar類型,這時其取值範圍是0~255。signedchar和unsignedchar相仿,但它只有一個位元組。例2.6main(){charc1=130;unsignedcharc2=130;printf(“c1=%d,c2=%d\n”,c1,c2);}結(jié)果:c1=-126,c2=1302.3.4變數(shù)賦初值

程式中常需要對一些變數(shù)預先設置初值。C語言允許在定義變數(shù)的同時使變數(shù)初始化,如inta=3;floatf=3.56;charc=‘a(chǎn)’;

也可以使被定義的變數(shù)的一部分賦初值,如:inta,b,c=5;

如果對幾個變數(shù)賦予初值3,應寫成inta=3,b=3,c=3;

不能寫成:inta=b=c=3;inta=3;相當於:inta;a=3;2.4運算符和運算式運算符是一些特定的符號,它用來對數(shù)據(jù)進行某些特定的操作;運算對象(運算元)是用來進行運算的數(shù)據(jù),包括常量、變數(shù)等;運算式是用運算符將運算對象連接起來的式子。如1+2,1和2為運算對象,而1+2就是運算式。2.4.1運算符種類、優(yōu)先順序和結(jié)合性⑴算術運算符用於各類數(shù)值計算。運算符有:加(+)、減(-)、乘(*)、除(/)、求餘(或稱模運運算,%)、自增(++)、自減(--)。⑵關係運算符用於比較運算。運算符主要有:大於(>)、小於(<)、等於(==)、大於等於(>=)、小於等於(<=)和不等於(!=)。1.運算符的種類⑶邏輯運算符用於邏輯運算。運算符有:與(&&)、或(||)、非(!)。⑷位操作運算符參與運算的量,按二進位位進行運算。運算符有:按位與(&)、按位或(|)、取反(~)、按位異或(^)、左移(<<)、右移(>>)。⑸賦值運算符用於賦值運算。賦值運算符有:簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)、複合位運算賦值(&=,|=,^=,<<=,>>=)等三類。⑹條件運算符是一個三目運算符,用於條件求值。運算符有:(?:)。⑺逗號運算符用於把若干運算式組合成一個運算式。運算符有:(,)。⑻指針運算符用於取內(nèi)容(*)和取地址(&)兩種運算。⑼求位元組運算符用於數(shù)據(jù)類型所占的位元組數(shù)(sizeof)。⑽強制類型轉(zhuǎn)換運算符可以利用強制類型轉(zhuǎn)換運算符將一個表達式轉(zhuǎn)換成所需類型。其一般形式為:(類型名)(運算式)如(double)a;(int)(x+y);(float)(5%3)⑾其他運算符

其他運算符有:括弧()、數(shù)組下標[]、成員運算符.和用指針訪問結(jié)構(gòu)體成員的指向運算符->。2.運算符的運算優(yōu)先順序C語言中,運算符的運算優(yōu)先順序共分為15級。1級最高,15級最低。在運算式中,優(yōu)先順序較高的先於優(yōu)先順序低的進行運算。如求運算式x+y*z的值:

y的值左側(cè)為加號,右側(cè)為乘號,而乘號優(yōu)先於加號,因此相當於x+(y*z),即先進行乘法運算,然後再進行加法運算。3.運算符的結(jié)合性C語言的運算符不僅具有不同的優(yōu)先順序,還有結(jié)合性的問題。在運算式的運算過程中,各運算對象參與運算的先後順序不僅要遵循運算符優(yōu)先順序別的規(guī)定,還要受運算符結(jié)合性的制約,當一個運算對象兩側(cè)的運算符優(yōu)先順序別相同時,需按運算符的結(jié)合性來處理,以便確定是自左向右進行運算還是自右向左進行運算。C語言中運算符的結(jié)合性分為兩種:即左結(jié)合性(自左向右)和右結(jié)合性(自右向左)。例如:算術運算符就是左結(jié)合性的運算符運算式:x-y+z,運算對象y的左側(cè)運算符“-”和右側(cè)運算符“+”優(yōu)先順序相同,應按結(jié)合性來進行自左向右的運算,即先執(zhí)行x-y運算,再執(zhí)行+z的運算。

賦值運算符是右結(jié)合性的運算符運算式:x=y=z,由於賦值運算符“=”的右結(jié)合性,所以先執(zhí)行y=z運算,再執(zhí)行x=(y=z)運算。優(yōu)先級別運算符運算形式結(jié)合方向含義1()[].->(e)a[e]x.yp->x自左至右圓括號數(shù)組下標運算符結(jié)構(gòu)體成員運算符指向結(jié)構(gòu)體成員運算符2-++--!~(t)*&sizeof-e++x或x++!e~t(t)e*p&xsizeof(t)自右至左負號運算符自增運算符和自減運算符邏輯非運算符按位取反運算符強制類型轉(zhuǎn)換運算符指針運算符,由地址求內(nèi)容求變數(shù)地址的運算符求某類型變數(shù)的長度運算符3*/%e1*e2自左至右乘、除、求餘運算符表2.2C語言各運算符的優(yōu)先順序別與結(jié)合方向4+-e1+e2自左至右加法、減法運算符5<<>>e1<<e2自左至右左移、右移運算符6<<=>>=e1<e2自左至右關係運算符7==!=e1==e2自左至右等於、不等於運算符8&e1&e2自左至右按位與運算符9^e1^e2自左至右按位異或運算符10|e1|e2自左至右按位或運算符11&&e1&&e2自左至右邏輯與運算符12||e1||e2自左至右邏輯或運算符13?:e1?e2:e3自右至左條件運算符14=+=-=*=/=%=>>=<<=&=^=|=x=ex+=ex&=e自右至左賦值運算符15,e1,e2自左至右逗號運算符(順序求值)續(xù)表⑴同一優(yōu)先順序的運算符優(yōu)先順序別相同,運算次序由結(jié)合方向決定;⑵不同的運算符要求有不同的運算對象個數(shù)如+(加)和-(減)為雙目運算符,要求在運算符運算符兩側(cè)各有一個運算對象(如3+5、8-3等);而++(自增)和-(負號)運算符為單目運算符,只能在運算符的一側(cè)出現(xiàn)一個運算對象(如-a、i++、--i、(float)i、sizeof(int)、*p等);條件運算符是C語言中唯一的三目運算符,如

x?a:b。⑶從上述表中可以大致歸納出各類運算符的優(yōu)先順序:表2.2說明:特殊運算符()[].->單目運算符算術運算符關係運算符邏輯運算符(不包括!)條件運算符賦值運算符逗號運算符

優(yōu)先順序別由上到下遞減。特殊運算符優(yōu)先順序最高,逗號運算符優(yōu)先順序最低。位運算符的優(yōu)先順序比較分散(有的在算術運算符之前(如~),有的在關係運算符之前(如<<、>>),有的在關係運算符之後(如&、^、|))。2.4.2

算術運算符和算術運算式

1.基本的算術運算符

基本的算術運算符有:加(+)、減(-)、乘(*)、除(/)、求餘(或稱模運算,%)五種。

兩個整數(shù)相除的結(jié)果為整數(shù),如5/3的結(jié)果為1,舍去小數(shù)部分。但是,如果除數(shù)或被除數(shù)中有一個為負值,多數(shù)機器採取“向零取整”的方法,即5/3=1,-5/3=-1,取整後向零靠近。

求餘運算符“%”要求參與運算的量均為整型,運算結(jié)果等於兩數(shù)相除後的餘數(shù),餘數(shù)的符號取決於被除數(shù)的符號,如-100%3餘數(shù)為-1,100%-3餘數(shù)為1。

2.自增自減運算符++i,--i在使用i之前,先使i的值加(減)1i++,

i--

在使用i之後,再使i的值加(減)1

粗略地看,++i和i++的作用相當於i=i+1,但++i和i++不同之處在於++i是先執(zhí)行i=i+1後,再使用i的值;而i++是先使用i的值後,再執(zhí)行i=i+1。例2.6

如果i的原值等於3,執(zhí)行下麵的賦值語句:①j=++i;(i的值先變?yōu)?,再賦給j,j的值為4)②j=i++;(先將i的值3賦給j,j的值變?yōu)?,然後i的值變?yōu)?)例2.7P35例2.5main(){intc=5;printf(“%d,%d,%d\n”,c+=c++,c+8,++c);printf(“%d\n”,c+=c++,c+8,++c);}注意:TurboC規(guī)定,printf()函數(shù)中出現(xiàn)多個運算式輸出項時,先按從右到左的順序計算各運算式的值,然後再從左到右輸出結(jié)果。本例中先計算++c,得c=6,然後計算c+8得14,最後計算c+=c++,得c=13。1.有如下兩個程式,試比較結(jié)果①

main(){inti=3;printf(“%d,%d\n”,(i++)+(i++)+(i++),i);}②

main(){inti=3,k;k=(i++)+(i++)+(i++);printf(“%d,%d\n”,k,i);}補充:①結(jié)果:12,3②結(jié)果:9,62.當出現(xiàn)難以區(qū)分的若干個+或-組成運算符串時,C語言規(guī)定,自左向右取盡可以多的符號組成運算符。例如:設整型變數(shù)x,y均為3,則:

x+++y應理解為(x++)+y,結(jié)果為6,x值為4,y值不變

x---y應理解為(x--)-y,結(jié)果為0,x值為2,y值不變3.算術運算符的優(yōu)先規(guī)則單目算術運算符(-、++、--)優(yōu)先於*、/、%算術運算符優(yōu)先於+、-算術運算符;同級單目算術運算符的結(jié)合性自右向左;同級雙目算術運算符的結(jié)合性自左向右。

4.算術運算式

用算術運算符和括弧將運算對象連接起來的式子,稱為算術運算式。例如下麵的運算式為算術運算式:

a*b/c-1.5+’a’

如果一個算術運算符的兩側(cè)的數(shù)據(jù)類型不同,則按下麵所述的內(nèi)容先自動進行類型轉(zhuǎn)換,使二者具有同一類型,然後再進行運算。各類數(shù)值型數(shù)據(jù)間的混合運算

整型(包括int,short,long,unsignedint,unsignedshort,unsignedlong)和實型(包括float,double)數(shù)據(jù)可以混合運算。而字元型數(shù)據(jù)可以與整型通用,因此整型、實型和字元型數(shù)據(jù)間可以混合運算,在進行運算時,不同類型的數(shù)據(jù)要先換成同一類型,然後進行運算,轉(zhuǎn)換規(guī)則如下圖所示:doublefloatlongunsignedintchar,short高低

圖中橫向向左的箭頭表示必須的轉(zhuǎn)換,如字元數(shù)據(jù)必須先轉(zhuǎn)換為整數(shù),short型轉(zhuǎn)換為int,float型數(shù)據(jù)在運算時一律先轉(zhuǎn)換為double型,以提高精度(即使是兩個float型數(shù)據(jù)相加,也先都化成double型,然後再相加)。

縱向的箭頭表示當運算為不同類型時轉(zhuǎn)換的方向。例如int型與double型數(shù)據(jù)進行運算,先將int型數(shù)據(jù)轉(zhuǎn)換為double型,然後在兩個同類型(double型)數(shù)據(jù)間進行運算,結(jié)果為double型。注意箭頭方向只表示數(shù)據(jù)類型級別的高低,由低向高轉(zhuǎn)換。不要理解為int型先轉(zhuǎn)換為unsignedint型,再轉(zhuǎn)成long型,再轉(zhuǎn)成double型。如果一個int型數(shù)據(jù)與一個double型數(shù)據(jù)運算,是直接將int型轉(zhuǎn)換成double型。例2.8

假設已指定i為int型變數(shù),f為float型變數(shù),d為double型變數(shù),e為long型變數(shù),有以下式子:

10+‘a(chǎn)’+i*f-d/e在電腦執(zhí)行時從左至右掃描,運算次序為:①進行10+‘a(chǎn)’的運算,先將‘a(chǎn)’轉(zhuǎn)換為整數(shù)97,運算結(jié)果為107;②由於“*”比“+”優(yōu)先,先進行i*f的運算。先將i與f都轉(zhuǎn)換成double型,運算結(jié)果為double型;③整數(shù)107與i*f的結(jié)果相加。先將整數(shù)107轉(zhuǎn)換成double型,再相加,結(jié)果為double型;④將變數(shù)e化為double型,d/e結(jié)果為double型;⑤將10+‘a(chǎn)’+i*f的結(jié)果與d/e的商相減,結(jié)果為double型。main(){floatx;inti;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);}結(jié)果:x=3.600000,i=3

上述類型轉(zhuǎn)換由系統(tǒng)自動進行的,另一種類型轉(zhuǎn)換為強制類型轉(zhuǎn)換。需要說明的是在強制類型轉(zhuǎn)換時,得到一個所需類型的中間變數(shù),原來變數(shù)的類型未發(fā)生變化。如:(int)x;如果x原來指定為float型,進行強制類型運算後得一一個int型的中間變數(shù),它的值等於x的整數(shù)部分,而x的類型不變(仍為float型)。見下例2.9:2.4.3關係運算符和關係運算式所謂“關係運算”實際上是“比較運算”。將兩個值進行比較,判斷其比較的結(jié)果是否符合給定的條件。例如,a>3是一個關係運算式,大於號(>)是一個關係運算符,如果a的值為5,則滿足給定的“a>3”條件,因此關係運算式的值為邏輯值“真”(即“條件滿足”),用整數(shù)“1”來表示;如果a的值為2,不滿足“a>3”的條件,則稱關係運算式的值為邏輯值“假”,用整數(shù)“0”來表示。1.關係運算符及其優(yōu)先次序C語言提供下麵6種關係運算符:<(小於)<=(小於等於)>(大於)>=(大於等於)==(等於)!=(不等於)優(yōu)先順序相同(高)優(yōu)先順序相同(低)關於優(yōu)先順序:

⑴前4種關係運算符(<、<=、>、>=)的優(yōu)先順序別相同,後2種也相同。前4種高於後2種;

⑵關係運算符的優(yōu)先順序低於算術運算符;

⑶關係運算符的優(yōu)先順序高於賦值運算符。例2.10例如:c>a+b等效於c>(a+b)a>b==c等效於(a>b)==ca==b<c等效於a==(b<c)a=b>c等效於a=(b>c)

用關係運算符將兩個運算式(可以是算術運算式、關係運算式、邏輯運算式、賦值運算式、字元運算式)連接起來的式子,稱為關係運算式。關係運算式的值是一個邏輯值,即“真”或“假”。例如,關係運算式“5==3”的值為“假”,“5>=0”的值為“真”。C語言沒有邏輯型數(shù)據(jù)類型,以1代表“真”,以0代表“假”。2.關係運算式例2.11a=3,b=2,c=1,則:

關係運算式“a>b”的值為“真”,運算式的值為1;

關係運算式“(a>b)==c”的值為“真”(因為a>b的值為1,等於c的值),運算式的值為1;

關係運算式“b+c<a”的值為“假”,運算式的值為0;

若有以下賦值運算式:

d=a>bd的值為1f=a>b>cf的值為0(因為“>”運算符是自左向右的結(jié)合方向,先執(zhí)行“a>b”得值為

1,再執(zhí)行關係運算“1>c”,得值

0,賦給f)。例2.12P36例2.6main(){inta=5,b=3;floatx=3.14,y=6.53;printf(“%d,%d\n”,a+b!=a-b,x<=(y-=6.1));}結(jié)果:1,02.4.4邏輯運算符C語言提供的邏輯運算符有三種:&&(邏輯與)、||(邏輯或)、!(邏輯非)。“&&”和“||”為雙目運算符,它要求有兩個運算量,如(a>b)&&(x>y),(a<b)||(x>y)?!?”是單目運算符,只要求有一個運算量,如!(a>b)。1.邏輯運算符及其優(yōu)先次序邏輯運算舉例如下:a&&b若a、b為真,則a&&b為真。a||b若a、b之一為真,則a||b為真。!a若a為真,則!a為假。ab!a!ba&&ba||b真真假假真真真假假真假真假真真假假真假假真真假假表2.3邏輯運算的真值表

在一個邏輯運算式中如果包含多個邏輯運算符,如!a&&b||x>y&&c,按以下的優(yōu)先順序和結(jié)合性:!優(yōu)先於雙目算術運算符優(yōu)先於關係運算符優(yōu)先於&&優(yōu)先於||;單目邏輯運算符!和單目算術運算符同級別,結(jié)合性自右向左;雙目邏輯運算符的結(jié)合性是自左向右。2.邏輯運算式

如前所述,邏輯運算式的值應該是一個邏輯量“真”或“假”。C語言編譯系統(tǒng)給出邏輯運算結(jié)果時,以數(shù)值1代表“真”,以0代表“假”,但在判斷一個量是否為“真”時,以0代表“假”,以非0代表“真”。即將一個非0的數(shù)值認作“真”。例如:若a=4,則!a的值為0。因為a的值為非0,被認作“真”,對它進行“非”運算,得“假”,“假”以0來代表。若a=4,b=5,則a&&b的值為1。因為a和b均為非0,被認為是“真”,因此a&&b的值也為“真”,值為1。a、b值同前,a||b的值為a、b值同前,!a||b的值為4&&0||2的值為結(jié)論:由系統(tǒng)給出的邏輯運算結(jié)果不是就是1,不可能是其他數(shù)值。而在邏輯運算式中作為參加邏輯運算的運算對象可以是0(“假”)或任何非0的數(shù)值(按“真”)對待。如果在一個運算式中不同位置上出現(xiàn)數(shù)值,應區(qū)分哪些是作為數(shù)值運算或關係運逄的對象,哪些作為邏輯運算的對象。例如1115>3&&8<4-!0

運算式自左到右掃描求解。首先處理“5>3”(因為關係運算符優(yōu)先於&&)。在關係運算符兩側(cè)的5和3作為數(shù)值參加關係運算,“5>3”的值為1。再進行“1&&8<4-!0”運算,8的左側(cè)為“&&”,右側(cè)為“<”運算符,根據(jù)優(yōu)先規(guī)則,應先進行“<”的運算,即先進行“8<4-!0”的運算。現(xiàn)在4的左側(cè)為“<”,右側(cè)為“-”運算符,而“-”優(yōu)先於“<”,因此應先進行“4-!0”的運算,由於“!”級別高,因此先進行“!0”的運算,得到結(jié)果1。然後進行“4-1”的運算,得結(jié)果3,再進行“8<3”的運算,得結(jié)果0,最後進行“1&&0”的運算,得到結(jié)果0。注意

在邏輯運算式的求解中,並不是所有的邏輯運算符都被執(zhí)行,只是在必須執(zhí)行下一個邏輯運算符才能求出運算式的解時,才執(zhí)行該運算符。a&&b&&c只有a為真(非0)時,才需在判斷b的值,只有a和b都為真的情況下才需在判別c的值。只要a為假,就不必判別b和c(此時整個運算式已確定為假)。如果a為真,b為假,不判別c。a||b||c只要a為真(非0),就不必判斷b和c;只有a為假,才需要判別b;a和b都為假才判別c。例2.13main(){intw=1,x=2,y=3,z=4,a=5,b=6,c;c=(a=w>x)&&(b=y>z);printf(“a=%d,b=%d,c=%d\n”,a,b,c);}結(jié)果:a=0,b=6,c=0main()

{intm,n,l,a,b,c,d;m=n=a=b=c=d=0;l=(m=a==b)||(n=c==d);printf(“m=%d,n=%d,l=%d\n”,m,n,l);}結(jié)果:m=1,n=0,l=12.4.5賦值運算符和賦值運算式1.簡單賦值運算符賦值符號“=”就是賦值運算符,它的作用是將一個數(shù)據(jù)賦給一個變數(shù)。如“a=3”的作用就是執(zhí)行一次賦值運算,把常量3賦給變數(shù)a。也可以將一個運算式的值賦給一個變數(shù)。如:x=a+b*c。2.複合賦值運算符

在賦值符“=”之前加上某些二目運算符可構(gòu)成複合賦值運算符。複合算術賦值運算符有:+=、-=、*=、/=、%=五種。複合位運算賦值運算符有:<<=、>>=、&=、^=、|=五種。3.賦值運算式

由賦值運算符將一個變數(shù)和一個運算式連接起來的的式子稱為“賦值運算式”。其一般形式為:

<變數(shù)><賦值運算符><運算式>賦值運算式的求解過程:將賦值運算符右側(cè)的“運算式”的值賦給左側(cè)的變數(shù),賦值運算式的值就是被賦值的變數(shù)的值。如“a=5”這個賦值運算式的值為5(變數(shù)a的值也為5)。

上述賦值運算式的一般形式中的“運算式”,又可以是一個賦值運算式。如a=(b=5),括弧內(nèi)的“b=5”是一個賦值運算式,它的值等於5?!癮=(b=5)”相當於“b=5”和“a=b”兩個賦值運算式,因此a的值等於5,整個賦值運算式的值也等於5。我們知道賦值運算符按照“自右向左”的結(jié)合順序,因此,“b=5”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等價,都是先求“b=5”的值(得5),然後再賦給a,下麵舉幾個例子:a=b=c=5(賦值運算式值為5,a、b、c

值均為5)a=5+(c=6)(運算式值為11,a值為11,c

值為6)a=(b=4)+(c=6)(運算式值為10,a值為10,

b值為4,c值為6)a=(b=10)/(c=2)(運算式值為5,a值為5,b

值為10,值為2)

賦值運算式中可包含複合的賦值運算符。如:a+=a-=a*a,如果a的初值為12,此賦值運算式的求解步驟如下:

a)先進行“a-=a*a”運算,它相當於

a=a-a*a=12-144=-132;

b)再進行“a+=-132”運算,相當於

a=a+(-132)=-132-132=-264。補充

如果賦值運算符兩側(cè)的類型不一致,但都是數(shù)值型或字元型時,在賦值時要進行類型轉(zhuǎn)換。將實型數(shù)據(jù)(包括單、雙精度)賦給整型變數(shù)時,捨棄實數(shù)的小數(shù)部分。如i為整型變數(shù),執(zhí)行“i=3.56”的結(jié)果是使i的值為3,在內(nèi)存中以整數(shù)形式存儲。將整型數(shù)據(jù)賦給單、雙精度變數(shù)時,數(shù)值不變,但以浮點數(shù)形式存儲到變數(shù)中,如將23賦給float變數(shù)f,即f=23,先將23轉(zhuǎn)換成23.00000,再存儲在f中。如將23賦給double型變數(shù)d,即d=23,則將23補足有效位數(shù)字為23.00000000000000,然後以雙精度浮點數(shù)形式存儲到d中。將一個double型數(shù)據(jù)賦給float變數(shù)時,截取前面7位有效數(shù)字,存放到float變數(shù)的存儲單元中,但應注意數(shù)值取值範圍不以溢出。字元型數(shù)據(jù)賦給整型變數(shù)時,由於字元只佔有1個位元組,而整型變數(shù)占2個位元組,因此將字元數(shù)據(jù)(8位)放到整型變數(shù)低8位中,整型變數(shù)高8位有兩種情況:

①若是將unsignedchar數(shù)據(jù)賦給整型變數(shù),高8位補0。

②若是將char數(shù)據(jù)賦給整型變數(shù),如果字元最高位為0(0~127),則整型變數(shù)高8位補0;如果字元最高位為1(-128~-1),則整型變數(shù)高8位補1。將一個int、short、long型數(shù)據(jù)賦給一個char型變數(shù)時,只將其8位原封不動地送到char型變數(shù)(即截斷)。將int型數(shù)據(jù)賦給long型變數(shù)時,要進行符號擴展,將整型數(shù)據(jù)的16位送到long型低16位中,如果int型數(shù)據(jù)為正值(符號位為0),則long型變數(shù)的高16位補0;如果int型變數(shù)為負值(符號位為1),則long型變數(shù)的高16位補1,以保持數(shù)值不變。將unsignedint型數(shù)據(jù)賦給long型變數(shù)時,不存在符號擴展問題,只需將高位補0。將一個unsigned類型數(shù)據(jù)賦給一個占位元組數(shù)相同的signed變數(shù)(如:unsignedint=>int,unsignedlong=>long,unsignedshort=>short,unsignedchar=>char),將unsigned型數(shù)據(jù)的記憶體中各位原樣送到signed型變數(shù)中,若unsigned類型數(shù)據(jù)未超過要賦值的變數(shù)的範圍,則signed型變數(shù)值與unsigned型數(shù)據(jù)值相同;若超過,要根據(jù)補數(shù)知識進行轉(zhuǎn)換。如:main(){unsignedinta=65535;intb;b=a;printf(“%d”,b);}結(jié)果輸出-1

將signed型數(shù)據(jù)賦給所占位元組相同的unsigned型變數(shù),同樣將signed型數(shù)據(jù)所占記憶體的各位原樣送到unsigned型變數(shù)記憶體中,若signed型數(shù)據(jù)為非負值,則unsigned型變數(shù)值與signed型數(shù)據(jù)值相同;若為負值,要根據(jù)補數(shù)知識進行轉(zhuǎn)換。如:main(){unsigneda;intb=-1;a=b;printf(“%u”,a);}

結(jié)果輸出65535。2.4.6條件運算符和條件運算式1.條件運算符條件運算符要求有3個操作對象,它是C語言中唯一的三目運算符。條件運算符的優(yōu)先順序規(guī)則:其他運算符優(yōu)先於條件運算符,條件運算符優(yōu)先於賦值運算符和逗號運算符;條件運算符的結(jié)合性是自右向左。2.條件運算式

用條件運算符構(gòu)成的運算式稱為條件運算式,其一般形式為:運算式1?運算式2:運算式3

條件運算式的執(zhí)行順序是:先計算運算式1的值,若值為非0(真),則計算運算式2的值,並將運算式2的值作為整個條件運算式的結(jié)果;若運算式1的值為0(假),則計算運算式3的值,並將運算式3的值作為整個條件運算式的結(jié)果。例2.14main(){inta=1,b=2,c=3,d=4,e;e=a>b?a:c<d?c:d;

printf(“%d\n”,e);}條件運算符的結(jié)合方向為“自右向左”。所以條件運算式a>b?a:c>d?c:d相當於a>b?a:(c>d?c:d)。2.4.7逗號運算符和逗號運算式C語言中提供了一種特殊的運算符——逗號運算符。它用來將兩個運算式連接起來組成一個運算式,如3+5,6+8

稱為逗號運算式。其一般形式為:

運算式1,運算式2

其求解過程是:先求解運算式1,再求解運算式2,並將運算式2的值作為整個逗號運算式的值。如上面的逗號運算式“3+5,6+8”的值為14,又如a=3*5,a*4

由表2.2可知:賦值運算符的優(yōu)先順序別高於逗號運算符,因此應先求解a=3*5這個賦值運算式,計算得這個賦值運算式值為15,再求解a*4這個運算式,得60,整個逗號運算式的值為60。一個逗號運算式又可以與另一個運算式組成一個新的運算式,所以逗號運算式的一般形式可擴展為:

運算式1,運算式2,運算式3……運算式n

順序求解這n個運算式,整個運算式值為運算式n的值。請注意並不是任何地方出現(xiàn)的逗號都是作為逗號運算符,例如變數(shù)說明:inta,b,c;函數(shù)參數(shù):printf(“%d,%d,%d”,a,b,c);其中的“a,b,c”並不是一個逗號運算式,它是printf函數(shù)的3個參數(shù)。2.4.8位運算符和位運算1.“按位與”運算符(&)參與運算的兩個數(shù),按二進位進行“與”運算。如果兩個相應的二進位都為1,則該位的結(jié)果值為1,否則為0。即:

0&0=0;0&1=0;1&0=0;1&1=12.“按位或”運算符(|)

參與運算的兩個數(shù),按二進位進行“或”運算。如果兩個相應的二進位只要一個為1,則該位的結(jié)果值為1,即:

0&0=0;0&1=1;1&0=1;1&1=13.“按位異或”運算符(^)

異或運算符^也稱XOR運算符。它的規(guī)則是若參加運算的兩個二進位相異時,結(jié)果位為1。即

0^0=0;0^1=1;1^0=1;1^1=02.4.8位運算符和位運算4.“按位取反”運算符(~)~是一個單目運算符,用來對一個二進位數(shù)按位取反,即將0變?yōu)?,1變?yōu)?。例2.15教材P37例2.9第三章輸入和輸出

所謂輸入輸出是以電腦主機為主體而言的,從電腦向外部輸出設備(如顯示幕、印表機、磁片等)輸出數(shù)據(jù)稱為“輸出”,從外部由輸入設備(如鍵盤、磁片、光碟、掃描器等)輸入數(shù)據(jù)稱為“輸入”。一個完整的程式都應該有數(shù)據(jù)的輸入輸出功能,沒有輸出功能是無用的,因為程式運行的結(jié)果看不見;沒有輸入功能則程式缺乏靈活性,每次運行都只能對相同的數(shù)據(jù)執(zhí)行操作,所以輸入輸出是程式中不可缺少的部分。C語言中輸入和輸出都是由函數(shù)來實現(xiàn)的,C提供的函數(shù)以庫的形式存放在系統(tǒng)中(如輸入輸出函數(shù)庫、數(shù)學函數(shù)庫、字元函數(shù)庫、字串函數(shù)庫等),每個函數(shù)庫含有若干個函數(shù),C語言提供了一批標準輸入輸出函數(shù),其中有putchar(輸出字元)、getchar(輸入字元)、printf(格式輸出)、scanf(格式輸入)、puts(輸出字串)、gets(輸入字串),本章仲介紹前四個最基本的輸入輸出函數(shù)。

在使用C語言庫函數(shù)時,要用檔包含命令“#include”將有關的“頭檔”包括到用戶的原始檔案中,在頭檔中包含了要用到的函數(shù)有關的一些資訊,如變數(shù)的定義和宏定義。例如使用標準輸入輸出庫函數(shù)時,要用到“stdio.h”檔,stdio是standardinput&output的縮寫,檔尾碼“h”是head的縮與,#include命令都是放在程式的開頭,因些這類檔又被稱為“頭檔”,在調(diào)用標準輸入輸出庫函數(shù)時,程式開頭應用以下檔包含命令:#include<stdio.h>

考慮到printf和scanf函數(shù)使用頻繁,系統(tǒng)允許在使用這兩個函數(shù)時可不加#include命令。3.1字元的輸入輸出函數(shù)C語言提供了兩個標準的字元輸入輸出函數(shù)putchar和getchar,在使用這兩個函數(shù)時,在程式的頭部一定要加上下麵的檔包含命令:

#include<stdio.h>3.1.1字元輸出函數(shù)(putchar)putchar函數(shù)的作用是向終端(顯示幕)輸出一個字元,其一般形式為

putchar(ch);

意思是在顯示幕上輸出括弧內(nèi)字元變數(shù)ch所代表的字元,ch可以是字元數(shù)據(jù)(常量或變數(shù))和整型數(shù)據(jù)(常量或變數(shù))。例3.1教材P49例3.7#include<stdio.h>main(){chara=‘Y’;b=‘e’;putchar(a);putchar(b);putchar(‘s’);putchar(‘\n’);putchar(‘\141’);}Yesa結(jié)果:3.1.2字元輸入函數(shù)(getchar)getchar函數(shù)的作用是從終端(鍵盤)設入一個字元。其一般形式為:

getchar();getchar()只能接收一個字元,該字元可以賦給一個字元變數(shù)或整型變數(shù),也可以不賦給任何變數(shù),作為運算式的一個運算對象參加運算式的運算處理。例3.2教材P50例3.8#include<stdio.h>main(){charc;c=getchar();putchar(c);}例3.3教材P50例3.9#include<stdio.h>main(){intc;c=getchar();c>=‘a(chǎn)’&&c<=‘z’?putchar(c+‘A’-‘a(chǎn)’):putchar(c);}3.2格式輸入輸出函數(shù)C語言提供了兩個標準的格式輸入輸出函數(shù),即格式輸入函數(shù)scanf和格式輸出函數(shù)printf。字元輸入輸出函數(shù)只能輸入輸出單個字元,而格式輸入輸出函數(shù)可按指定的格式輸入輸出若干個任意類型的數(shù)據(jù)。3.2.1格式輸出函數(shù)(printf)printf函數(shù)作用是按用戶指定的格式,把若干個任意類型的數(shù)據(jù)輸出到顯示幕上。其一般形式為

printf(“格式控制字串”,輸出表列);

格式控制字串用來指定輸出的格式,它由格式字串和非格式字串兩大類組成。

格式字串是以%開頭的字串,用來指定輸出數(shù)據(jù)的類型、形式、長度、小數(shù)位數(shù)等。非格式字串包括普通字元(原樣輸出)和轉(zhuǎn)義字元(如\n、\t、\r、\101等)。輸出表列表示要輸出的各個資料項目,要求格式字串和各輸出項在數(shù)量和類型上應該一一對應。1.格式字串格式字串的一般形式為:%[標誌][輸出最小寬度][.精度][長度]類型類型:指定輸出數(shù)據(jù)的類型格式符意義d以十進位形式輸出有符號整數(shù)(正數(shù)不輸出符號)o以八進制形式輸出無符號整數(shù)(不輸出首碼0)x以十六進制形式輸出無符號整數(shù)(不輸出首碼0x)u以十進位形式輸出無符號整數(shù)(不輸出符號)c輸出單個字元s輸出字串f以小數(shù)形式輸出單、雙精度實數(shù)e以指數(shù)形式輸出單、雙精度實數(shù)g以%f和%e中較短寬度輸出單、雙精度

標誌:有-、+、#、0四種標誌意義-輸出結(jié)果左對齊,右邊補空格+輸出符號(正號或負號)#對c,s,d,u無影響;對o在輸出時加首碼0;對x在輸出時加ox;0輸出結(jié)果右對齊時,左邊空格用0代替輸出最小寬度:用十進位正整數(shù)來表示輸出的最小位數(shù),若實際位數(shù)多於定義的寬度,則按實際位數(shù)輸出,若實際位數(shù)少於定義的寬度則補以空格或0。精度:以“.”開頭,後跟十進位正整數(shù),如果輸出實數(shù),則表示小數(shù)的位數(shù);如果輸出字串,則表示輸出字元的寬度,若實際小數(shù)位數(shù)大於所定義的精度數(shù),要截去超過的部分。長度:格式符“l(fā)”表示按長整型輸出。例3.4main(){unsignedinta=65535;intb=-2;printf(“a=%d,%o,%x,%u\n”,a,a,a,a);printf(“b=%d,%o,%x,%u\n”,b,b,b,b);}結(jié)果:a=-1,177777,ffff,65535b=-2,177776,fffe,65534

例3.5字串的輸出main(){printf(“%3s,%7.2s,%.4s,%-5.3s\n”,“china”,“china”,“china”,”china”);}結(jié)果:china,

ch,chin,chi

例3.6輸出實數(shù)時指定小數(shù)位數(shù)main(){floatf=123.456;printf(“%f

%10f

%10.2f

%.2f

%-10.2f\n”,f,f,f,f,f);}結(jié)果:123.456001

123.456001

123.46

123.46

123.46

3.2.2格式輸入函數(shù)(scanf)scanf函數(shù)作用是按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變數(shù)中。其一般形式為:

scanf(“格式控制字串”,地址表列);

格式控制字串是用來指定要輸入的數(shù)據(jù)的格式,地址表列給出要賦值的各變數(shù)的地址,地址由地址運算符“&”後加變數(shù)名構(gòu)成,如&a表示變數(shù)a的地址。1.格式字串格式字串的一般形式為:%[*][輸入寬度][長度]類型類型:指定輸入數(shù)據(jù)的類型格式符意義d輸入十進位整數(shù)o輸入八進制整數(shù)x輸入十六進制整數(shù)u輸入十進位無符號整數(shù)c輸入單個字元s輸入字串f以小數(shù)形式輸入實數(shù)e以指數(shù)形式輸入實數(shù)“*”格式符用來表示所對應的輸入項讀入後不賦予相應的變數(shù)。如

scanf(“%d%*d%d”,&a,&b);

當輸入123時,把1賦給變數(shù)a後,跳過2,再把3賦給變數(shù)b。輸入寬度:是十進位的正整數(shù),用來指定輸入的寬度,系統(tǒng)自動按它截取所需數(shù)據(jù)。如:

scanf(%3d%3d”,&a,&b);

輸入:123456,系紡自動將123賦給變數(shù)a,456賦給變數(shù)b。長度:l表示輸入長整型數(shù)據(jù)(如%ld)和雙精度浮點數(shù)(如%lf);h表示輸入短整型數(shù)據(jù)(如%hd)。2.使用scanf函數(shù)應注意的問題scanf函數(shù)中的“格式控制字串”後面應當是變數(shù)地址,而不是變數(shù)名。如:若a、b為整型變數(shù),則:

scanf(“%d,%d”,a,b);是錯誤的,應將a,b改為&a,&b。如果在“格式控制字串”中有非格式字元則在輸入數(shù)據(jù)時,也應輸入與這些字元相同的字元。如:scanf(“%d,%d,%d”,&a,&b,&c);格式控制字串中有非格式字元“,”以作間隔符,輸入時一定要輸為:1,2,3同樣:

scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);輸入時要輸為:a=1,b=2,c=5在輸入多個數(shù)值數(shù)據(jù)時,如果格式控制字串中沒有非格式字元作輸入數(shù)據(jù)之間的間隔符時,則可用空格,tab或回車作間隔;在輸入字元數(shù)據(jù)時,若格式控

制字串中沒有非格式字元,則所有輸入的字元都被認為是有效字元,如:

scanf(“%c%c%c”,&a,&b,&c);若輸入為def,系統(tǒng)把’d’賦給變數(shù)a,把‘’賦給變數(shù)b,‘e’賦給變數(shù)c。scanf函數(shù)中不能規(guī)定精度,如:

scanf(“%7.2f”,&a);是不合法的。第四章語句和流程控制

流程主要用來規(guī)定程式的執(zhí)行的順序。流程分為3種基本結(jié)構(gòu):順序、分支、迴圈。各種複雜的程式都可由這三種基本結(jié)構(gòu)來構(gòu)成。C語言提供了多種語句來實現(xiàn)這三種結(jié)構(gòu)。4.1C語句

應當指出:C語句都是用來完成一定操作任務的,聲明部分的內(nèi)容不應稱為語句,如inta;C語句可分為以下5類:運算式語句由運算式加上分號“;”組成,如:

a=3是一個賦值運算式而a=3;是一個賦值語句函數(shù)調(diào)用語句由函數(shù)名、實際參數(shù)加上分號“;”組成,

執(zhí)行函數(shù)調(diào)用語句就是把實際參數(shù)賦給被調(diào)用函數(shù)控制語句C有9種控制語句:if語句(條件語句)switch語句(多分支選擇語句)while語句dowhile語句for語句條件判斷語句迴圈執(zhí)行語句goto語句(轉(zhuǎn)向語句)break語句(中止執(zhí)行switch或迴圈語句)continue語句(結(jié)束本次迴圈語句)return語句(函數(shù)調(diào)用返回值語句)複合語句把多個語句用花括弧{}括起來組成一個語句,如:

{z=x+y;t=z/100;printf(“%f”,t);}空語句只用一個分號“;”組成的語句,空語句表示什行也不做,有時用來作迴圈語句中的空循環(huán)體。4.2分支結(jié)構(gòu)

分支結(jié)構(gòu)又稱為選擇結(jié)構(gòu),根據(jù)對指定條件的判斷決定執(zhí)行某個分支程式段。4.2.1if語句

if語句是用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。

一、if語句的3種形式:1、if(運算式)語句;如果運算式的值為真,則執(zhí)行其後的語句,否則不執(zhí)行該語句。運算式真語句假例4.1輸入a、b兩個整數(shù),並由小到大輸出。main(){inta,b,t;scanf(“%d,%d”,&a,&b);if(a>b){t=a;a=b;b=a;}printf(“%d,%d\n”,a,b);}2、if(運算式)

語句1;else

語句2;運算式真語句1假語句2例4.2用if-else語句重寫例4.1。main(){inta,b;scanf(“%d,%d”,&a,&b);if(a<b)printf(“%d,%d\n”,a,b);elseprintf(“%d,%d\n”,b,a);}3、if(運算式1)

語句1;elseif(運算式2)

語句2;elseif(運算式3)

語句3;

...…

elseif(運算式m)

語句m;else

語句n;語句n運算式1真語句1假運算式2真假語句2運算式3真真語句3……假運算式m真假語句m……例4.3P62例4.3#include<stdio.h>main(){charc;printf(“inputacharacter:”;c=getchar();if(c<32)printf(“Thisisacontrolcharacter!\n”);elseif(c>=’0’&&c<=‘9’)printf(“Thisisadigit!\n”);elseif(c>=’A’&&c<=‘Z’)printf(“Thisisacapitalletter!\n”);elseif(c>=’a’&&c<=‘z’)printf(“Thisisasmallletter!\n”);elseprintf(“Thisisanothercharacter!\n”);}二、if語句的嵌套

當if語句中的執(zhí)行語句又是if語句就構(gòu)成了if語句的嵌套。一般形式如下:

if(運算式1)if(運算式2)語句1;else語句2;elseif(運算式3)語句3;else語句4;內(nèi)嵌if內(nèi)嵌if運算式1真語句1假語句2運算式2真假真假運算式3語句3語句4注意:

對if語句的嵌套,可能會出現(xiàn)多個if和多個else,這就特別要注意if和else的配對問題

else總是與它前面最近的且不帶else的if配對。例4.4if()if()語句1;elseif()語句2;else語句3;

編程者本意把else寫在與第一個if(外層if)同一列上,希望else與第一個if對應,但實際上else是與第二個if配對,因為它們距離最近。

為實現(xiàn)程式設計者的意圖,可以加花括弧來確定配對關係:if()

{if()語句1;}elseif()語句2;else語句3;4.2.2switch語句if語句只有兩個分支可供選擇,而實際問題中常常需要用到多分支的選擇。例如,學生成績分等級(90分以上為‘A’等,80~89分為‘B’等,70~79分為‘C’等……);人口統(tǒng)計分類(按年齡段分類老年、中年、青年、少年、兒童)等等

溫馨提示

  • 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

提交評論