C程序设计课件_第1页
C程序设计课件_第2页
C程序设计课件_第3页
C程序设计课件_第4页
C程序设计课件_第5页
已阅读5页,还剩313页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C程式設計

1.1C語言發展歷史1.2C語言特點1.3C程式格式和結構特點1.4C程式上機步驟第一章C語言概述1.1.1程式設計語言的發展機器語言組合語言高級語言面向過程面向對象CPU指令系統,由0、1序列構成的指令碼組成如:10000000加

10010000減用助記符號描述的指令系統如ADDA,B面向機器的語言程式設計是數據被加工的過程客觀世界可以分類,對象是類的實例對象是數據和方法的封裝對象間通過發送和接受消息發生聯繫程式設計關鍵是定義類,並由類派生對象1.1C語言發展歷史*產生背景*應用需求:界於彙編和高級語言之間的中級語言*產生過程*時間:1972~1973地點:美國貝爾實驗室目的:UNIX操作系統設計人:Ken.Thompson和Dennis.M.Ritchie*C標準*標準C:K&R合著《TheCProgrammingLanguage》(BrianW.Kernighan和DennisM.Rithchie)1978年ANSIC:1983年87ANSIC:1987年1990年國際標準的ANSIC1.1.2C語言發展過程

…見框圖<1960:ALGOL語言離開硬體遠,不適合編寫系統軟體1963:CPL語言(劍橋大學)接近硬體1967:BCPL語言(劍橋大學)簡化1970:B語言(Bell實驗室)1973:C語言(Bell實驗室)改進進一步簡化1978:傳統C語言1990:ANSIC語言規模龐大K&R著作ISO修訂語言簡潔、緊湊、靈活運算符和數據類型豐富程式設計結構化、模組化生成目標代碼品質高可移植性好(較之組合語言)可以直接操縱硬體<>>>>1.2C語言特點:(由系統定義,不能重作其他定義的字串)1類型說明符autocharconstdoubleenumexternfloatintlongregistershortsignedsizeofstaticstructunsignedunionvoidvolatile2語句定義符breakcasecontinuedefaultdoelseforgotoifreturnswitchtypedefwhile3預處理命令字(*)

defineinclude<32個關鍵字if()~else~for()~while()~do~while()continuebreakswitchgotoreturn<9種控制語句算術運算符:+-*/%++--關係運算符:<<===>>=!=邏輯運算符:!&&||位運算符:<<>>~|^&賦值運算符:=

及其擴展條件運算符:?:逗號運算符:,指針運算符:*&求位元組數:sizeof強制類型轉換:(類型)分量運算符:.->下標運算符:[]其他:()-(負號)<34種運算符基本類型構造類型指針類型空類型void定義類型typedef數值類型字元類型char枚舉類型enum整型浮點型單精確度型float雙精度型double短整型short長整型long整型int數組結構體struct共用體union<

C數據類型:例1.1第一個程式

Hello,World!/*example1.1ThefirstCProgram*/#include<stdio.h>main(){printf(“Hello,World!”);}注釋編譯預處理函數語句輸出:Hello,World!1.3C程式格式和結構特點/*example1.1calculatethesumofaandb*/#include<stdio.h>/*Thisisthemainprogram*/main(){inta,b,sum;a=10;b=24;sum=add(a,b);printf(”sum=%d\n",sum);}/*Thisfunctioncalculatesthesumofxandy*/intadd(intx,inty){intz;z=x+y;return(z);}運行結果:sum=34函數語句預處理命令注釋例1.2習慣用小寫字母,大小寫敏感不使用行號,無程式行概念可使用空行和空格常用鋸齒形書寫格式main(){

……………….………………

…………..…………..

……………….

………………………….

……………….………………..}main(){inti,j,sum;sum=0;for(i=1;i<10;i++){for(j=1;j<10;j++){sum+=i*j;}}printf(“%d\n”,sum);}優秀程式員的素質之一:使用TAB縮進{}對齊有足夠的注釋有合適的空行1.3.1C程式格式特點函數與主函數函數是C語言的基本單位程式由一個或多個函數組成必須有且只能有一個主函數main()程式執行從main開始,在main中結束,其他函數通過嵌套調用得以執行。(習慣上把main()函數放在最前面)程式語句C程式由語句組成用“;”作為語句終止符注釋/**/為注釋,不能嵌套不產生編譯代碼例:/*Thisisthemain/*ofexample1.1*/*/非法1.3.2結構特點任何函數(包括主函數main())都是由函數說明和函數體兩部分組成。其一般結構如下:

[函數類型]函數名(函數參數表)

{說明語句部分;執行語句部分;

}函數體部分函數說明部分(函數的首部)1.3.3函數的一般結構

…見後面實例

函數說明例如,某個函數:max(),其函數說明各部分如下所示。函數類型函數名函數參數表

↓↓↓intmax(intx,inty)

函數體在函數說明部分的下麵、大括弧(必須配對使用)內的部分。函數體一般由說明語句和可執行語句兩部分構成:說明語句部分說明語句部分由變數定義、自定義類型定義、自定義函數說明、外部變數說明等組成。可執行語句一般由若干條可執行語句構成。/*主函數main()*/main(){intnum1,num2;

printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}

函數體結構示意圖

…續函數體main(){intx,y; /*變數定義語句:定義2個整型變數x、y*/x=3; /*可執行的賦值語句:將3賦值給變數x*/y=6; /*可執行的賦值語句:將6賦值給變數y*/intmax; /*變數定義語句:出現在可執行的賦值語句“x=3;”和“

y=6;”之後,非法!*/max=x>y?x:y;printf(“max=%d\n”,max);}解決辦法很簡單,請讀者自己思考。說明語句部分需要放在可執行語句的前面<…續函數體一個程式應包括1)對數據的描述和2)對數據處理的描述

1.對數據的描述,即數據結構。數據結構是電腦學科的核心課程之一,有許多專門著作論述,本課程就不再贅述。

在C語言中,系統提供的數據結構,是以數據類型的形式出現的。

2.對數據處理的描述,即電腦演算法。演算法是為解決一個問題而採取的方法和步驟,是程式的靈魂。為此,著名電腦科學家沃思(NikiklausWirth)提出一個公式:

数据结构+演算法=程式

实际上,一个程序除了数据结构和算法外,还必须使用一种计算机语言,并采用结构化方法来表示。

2.1.1程式的組成2.1程式設計概述<2.1.2結構化程式設計方法1、含義:規範程式設計風格和程式結構。2、思路:將複雜的問題分階段處理3、方法:自頂向下、逐步細化、模組化設計、結構化編碼1、自然語言2、流程圖3、偽代碼4、電腦語言2.1.3演算法的表示方法<S1:輸入n的值.S2:置變數i的值為2.S3:求解m=n%i;若m=0,轉向S6,否則執行S4.S4:變數i的值自加1.S5:判斷i<n是否成立;若為真則轉向S3,否則執行S6.S6:判斷i<n是否成立;若為真輸出“非素數”,否則輸出“素數”.

判斷一個數n是否是素數(n>2)<流程圖N-S流程圖AB順序結構P成立不成立AB選擇結構當P成立A迴圈結構<輸入整數n(n>2),判斷其是否為素數

輸入n的值

i=2

當i<nm=n%im=0YN

結束迴圈i=i+1

Yi<nNn是非素數n是素數

<列印x的絕對值(偽代碼)IfxispositivethenPrintxElsePrint-x<列印x的絕對值(C根源程式段)if(x>0)printf("|x|=%d",x);elseprintf("|x|=%d",-x);電腦中數的表示及進制轉換數碼、基與權數碼:表示數的符號基:數碼的個數(10進制:10)權:每一位所具有的值數制不同的基和權構成不同的數制

2進制、8進制、10進制、16進制、……2.2數制之間的轉換2.2.1數制的基本概念數制基權表示數碼特點10º,10¹,10²,…十進位數0~910逢十進一二進位數0~122º,2¹,2²,…逢二進一八進制數0~788º,8¹,8²,…逢八進一十六進制數0~9,A~F,a~f1616º,16¹,16²,…逢十六進一十進位:4956=4

10³+9

10²+5

10¹+6

10º二進位:1011=1

2³+0

2²+1

2¹+1

2º十六進制:81AE=8

16³+1

16²+10

16¹+14

16º八進制:4275=4

8³+2

8²+7

8¹+5

8º二進位、八進制、十六進制轉換成十進位

方法:按權相加2.2.2各種進制之間的轉換十進位轉換成二進位、八進制、十六進制方法:連續除以基,從低到高記錄餘數,直至商為0例把十進位數459轉換成十六進制數4591628161160(459)10=(1CB)161CB餘11餘12餘1…續:各種進制之間的轉換二進位轉換成八進制:從右向左,每3位一組(不足3位左補0),轉換成八進制八進制轉換成二進位:用3位二進位數代替每一位八進制數例(1101001)2=(001,101,001)2=(151)8例(246)8=(010,100,110)2=(10100110)2000~0001~1010~2011~3100~4101~5110~6111~7二進位與八進制之間的轉換…續:各種進制之間的轉換二進位轉換成十六進制:從右向左,每4位一組(不足4位左補0),轉換成十六進制十六進制轉換成二進位:用4位二進位數代替每一位十六進制數例(11010101111101)2=(0011,0101,0111,1101)2=(357D)16例(4B9E)16=(0100,1011,1001,1110)2=(100101110011110)20000~00001~10010~20011~30100~40101~50110~60111~71000~81001~91010~A1011~B1100~C1101~D1110~E1111~F二進位與十六進制之間的轉換

…續:各種進制之間的轉換記憶體以位元組為單元組成每個位元組有一個地址一個位元組一般由8個二進位位組成每個二進位的值是0或101234567012345678910……...76432512.2.3位元組和位2.2.4原碼、反碼與補數原碼:最高位為符號位,其餘各位為數值本身的絕對值反碼:正數:反碼與原碼相同負數:符號位為1,其餘位對原碼取反補數:正數:原碼、反碼、補數相同負數:最高位為1,其餘位為原碼取反,再對整個數加1正數的原碼、反碼、和補數是相同的;負數的原碼:符號位為1,其餘不變;(一個實例)反碼:取反;補數:取反,再加1;負數補數轉換成十進位數:最高位是符號位(不動),取反加1<數據類型總表C數據類型基本類型構造類型指針類型空類型void定義類型typedef字元類型char枚舉類型enum整型實型單精確度型float雙精度型double數組結構體struct共用體union短整型short長整型long整型int數據類型決定:1.數據占記憶體位元組數2.數據取值範圍3.其上可進行的操作2.3

數據類型類型符號關鍵字數的表示範圍所占位數整型字元型實型有無(signed)int16-32768~32767(signed)short16-32768~32767(signed)long32-2147483648~214748364716unsigned

int0~65535320~4294967295unsigned

longunsigned

short160~65535有char8-128~127無unsignedchar80~255說明:數據類型所占位元組數隨機器硬體不同而不同,上表以IBMPC機為例:請注意int和unsignedint2.3.1基本數據類型有float323.4e-38~3.4e38有double641.7e-308~1.7e308<2.3.2構造型,指針型…例子2.4常量和變數2.4.1識別字定義:用來標識變數、常量、函數等的字元序列組成:只能由字母、數字、下劃線組成,且第一個字母必須是字母或下劃線大小寫敏感不能使用關鍵字長度:最長32個字元命名原則:見名知意不宜混淆如l與I,o與0例:判斷下列識別字號合法性sumSumM.D.JohndayDate3daysstudent_name#33lotus_1_2_3chara>b_above$123M.D.John3days#33char$123a>b一般用大寫字母是宏定義預處理命令,不是C語句直接常量:整型常量請點擊:實型常量請點擊:字元常量請點擊:字串常量請點擊:如#definePRICE30定義:程式運行時其值不能改變的量(即常數)分類:符號常量:用識別字代表常量定義格式:#define符號常量常量例符號常量舉例(ch2_1.c)#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}運行結果:total=3002.4.2常量<三種形式:十進位整數:由數字0~9和正負號表示.如123,-456,0八進制整數:由數字0開頭,後跟數字0~7表示.如0123,011十六進制整數:由0x開頭,後跟0~9,a~f,A~F表示.如0x123,0Xff例12與12L例30000為int型

65536為longint型整型常量的類型根據其值所在範圍確定其數據類型在整常量後加字母l或L,認為它是longint型常量問題:0123=()100x123=()100Xff=()1083291255問題:0123=()100x123=()100Xff=()10整型常量(整常數)<表示形式:十進位數形式:(必須有小數點)如0.123,.123,123.0,0.0,123.指數形式:(e或E之前必須有數字;指數必須為整數)如12.3e3,123E2,1.23e4,1e-5,1.2E-3.5實型常量的類型默認double型在實型常量後加字母f或F,認為它是float型實型常量(實數或浮點數)

<aaa42定義:用單引號括起來的單個普通字元或轉義字元.

字元常量的值:該字元的ASCII碼值<轉義字元及其含義:轉義字元含義\n\v\r\a\‘\ddd\t\b\f\\\“\xhh轉義字元含義換行垂直製錶回車響鈴單引號3位8進制數代表的字元水準製錶退格換頁反斜線雙引號2位16進制數代表的字元如‘\101’-----------‘A’‘\012’-----------’\n’‘\376’-----------’

’‘\x61’-----------’a’‘\60’-----------’0’‘\483’----------(

)例:‘A’-------’\101’-------’\x41’--------65如‘A’——65,‘a’——97,

‘0’——48,‘\n’——10如‘a’‘A’‘?’‘\n’‘\101’轉義字元:反斜線後面跟一個字元或一個代碼值表示例轉義字元舉例(ch2_001.c,ch2_004.c)main(){printf("\101\x42C\n");printf("Isay:\"Howareyou?\"\n");printf("\\CProgram\\\n");printf("Turbo\'C\'");}運行結果:(螢幕顯示)ABCIsay:”Howareyou?”\CProgram\Turbo‘C’例main(){printf(“Y\b=\n”);}運行結果:螢幕顯示:=印表機輸出:¥字元常量

<…習題3.6上機字元常量與字串常量不同定義:用雙引號(“”)括起來的字元序列存儲:每個字串尾自動加一個‘\0’作為字串結束標誌hello\0例字串“hello”在內存中a

a\0例‘a’“a”例空串“”\0例:charch;ch=“A”;例:charch;ch=‘A’;字串常量

編譯程序根據變數定義為其分配指定位元組的記憶體單元…...地址inta=1,b=-3,c;abc2位元組2位元組2位元組地址地址…...記憶體1-3

亂數概念:其值可以改變的量變數名與變數值變數定義的一般格式:數據類型變數1[,變數2,…,變數n];變數初始化:定義時賦初值例:inta,b,c;floatdata;決定分配位元組數和數的表示範圍合法識別字例:inta=2,b,c=4;floatdata=3.67;charch=‘A’;intx=1,y=1,z=1;intx=y=z=1;(X)變數的使用:先定義,後使用例1intstudent;stadent=19;//Undefinedsymbol‘stadent’infunctionmain

例2floata,b,c;c=a%b;//Illegaluseoffloatingpointinfunctionmain

變數定義位置:一般放在函數開頭main(){inta,b=2;floatdata;a=1;data=(a+b)*1.2;printf(“data=%f\n”,data);}變數定義可執行語句main(){inta,b=2;a=1;floatdata;data=(a+b)*1.2;printf(“data=%f\n”,data);}2.4.3變數

占位元組數隨機器不同而不同,一般占一個機器字short≤int≤long可用sizeof(類型識別字)測量實型變數float:占4位元組,提供7位有效數字double:占8位元組,提供15~16位有效數字字元型變數字元變數存放字元ASCII碼char與int數據間可進行算術運算例1:floata;a=111111.111;/*a=111111.1*/例2:doubleb;b=111111.111;/*b=111111.111*/例a=‘D’;/*a=68;*/x=‘A’+5;/*x=65+5;*/s=‘!’+‘G’/*s=33+71;*/沒有字串變數,用字符數組存放(第7章)整型變數

/*ch2_003.c*/#definePRICE12.5main(){intnum=3;floattotal;charch1,ch2=‘D’;total=num*PRICE;ch1=ch2-‘A’+‘a’;

printf(“total=%f,ch1=%c\n”,total,ch1);}宏定義變數定義輸出結果運行結果:total=37.500000,ch1=d例子<2.5.1隱式轉換什麼情況下發生運算轉換------不同類型數據混合運算時賦值轉換------把一個值賦給與其類型不同的變數時輸出轉換------輸出時轉換成指定的輸出格式函數調用轉換------實參與形參類型不一致時轉換運算轉換規則:不同類型數據運算時先自動轉換成同一類型2.5不同類型數據間的轉換doublefloatlongunsignedintchar,short低高說明:必定的轉換運算對象類型不同時轉換

charch;inti;floatf;doubled;ch/i+f*d-(f+i)intintdoubledoubledoubledoubledoubledouble10+‘a’+i*f-d/l例2inti;floatf;doubled;longl;例1intintdoubledoubledoubledoubledoubledouble一般形式:(類型名)(運算式)例:(int)(x+y)(int)x+y(double)(3/2)(int)3.6

說明:強制轉換得到所需類型的中間變數,原變數類型不變

例main(){floatx;inti;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);}結果:x=3.600000,i=3較高類型向較低類型轉換時可能發生精度損失問題2.5.2顯式轉換(強制轉換)<C運算符算術運算符:(+-*/%++--)關係運算符:(<<===>>=!=)邏輯運算符:((!&&||)位運算符:(<<>>~|^&)賦值運算符:(=及其擴展)條件運算符:(?:)逗號運算符:(,)指針運算符:(*&)求位元組數:(sizeof)強制類型轉換:(類型)分量運算符:(.->)下標運算符:([])其他:(()-)2.6運算符和運算式C表達式算術運算式關係運算式邏輯運算式

賦值運算式條件運算式逗號運算式

用運算符號將運算對象連接起來形成的運算式稱為運算式運算符功能與運算量關係要求運算量個數要求運算量類型運算符優先順序別結合方向結果的類型2.6.1學習運算符應注意基本算術運算符:+-*/%結合方向:從左向右優先順序:----->*/%----->+-(2)(3)(4) 說明:“-”可為單目運算符時,右結合性兩整數相除,結果為整數%要求兩側均為整型數據例5/2=-5/2.0=例5%2=-5%2=1%10=5%1=5.5%22.6.2算術運算符和運算式2-2.51-110(

)作用:使變數值加1或減1種類:前置++i,--i(先執行i+1或i-1,再使用i值)後置i++,i--(先使用i值,再執行i+1或i-1)例j=3;k=++j;j=3;k=j++;j=3;printf(“%d”,++j);j=3;printf(“%d”,j++);a=3;b=5;c=(++a)*b;a=3;b=5;c=(a++)*b;//k=4,j=4//k=3,j=4//4//3//c=20,a=4//c=15,a=42.6.3自增、自減運算符++--

作用:使變數值加1或減1種類:前置++i,--i(先執行i+1或i-1,再使用i值)後置i++,i--(先使用i值,再執行i+1或i-1)說明:++--不能用於常量和運算式,如5++,(a+b)++++--結合方向:自右向左對整型數使用優先順序:-++-------->*/%----->+-(2)(3)(4)例-i++

-(i++)i=3;printf(“%d”,-i++);//-3例j+++k;(j++)+k;例-i++i=3;printf(“%d”,-i++);

續:自增、自減運算符++--

簡單賦值運算符符號:=格式:變數識別字=運算式作用:將一個數據(常量或運算式)賦給一個變數複合賦值運算符種類:+=-=*=/=%=《=》=&=^=|=含義:a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%3例a=3;d=func();c=d+2;2.6.4賦值運算符和運算式結合方向:自右向左優先順序:14左側必須是變數,不能是常量或運算式賦值運算式的值與變數值相等,且可嵌套賦值轉換規則:使賦值號右邊運算式值自動轉換成其左邊變數的類型例3=x-2*y;a+b=3;例

floatf;inti;i=10;f=i;則

f=10.0例inti;i=2.56;//結果i=2;例:a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2)//運算式值為5,a,b,c值為5//b=5;a=5//運算式值11,c=6,a=11//運算式值10,a=10,b=4,c=6//運算式值5,a=5,b=10,c=2簡單賦值說明(1):

結合方向:自右向左優先順序:12

左側必須是變數,不能是常量或運算式賦值運算式的值與變數值相等,且可嵌套賦值轉換規則:使賦值號右邊運算式值自動轉換成其左邊變數的類型例:a=12;a+=a-=a*a例:inta=2;a%=4-1;a+=a*=a-=a*=3;//a=-264等價於a=a+(a=a-(a*a))//a=0等價於a=a+(a=a*(a=a-(a=a*3)))複合賦值說明:

形式:運算式1,運算式2,……運算式n結合性:從左向右優先順序:15逗號運算式的值:等於運算式n的值用途:常用於迴圈for語句中例a=3*5,a*4a=3*5,a*4,a+5例x=(a=3,6*3)x=a=3,6*a例a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);//a=15,運算式值60//a=15,運算式值20//賦值運算式,運算式值18,x=18//逗號運算式,運算式值18,x=3//1,2,3//3,2,32.6.5逗號運算符和運算式例:/*ch2_6.c*/#include<stdio.h>main(){intx,y=7;floatz=4;x=(y=y+6,y/z);printf("x=%d\n",x);}運行結果:x=3關係運算符種類:<<===>=>!=結合方向:自左向右優先順序別:<<=>>===!=優先順序6(高)優先順序7(低)例c>a+b//c>(a+b)a>b!=c//(a>b)!=ca==b<c//a==(b<c)a=b>c//a=(b>c)關係運算式的值:是邏輯值“真”或“假”,用1和0表示例inta=3,b=2,c=1,d,f;a>b(a>b)==cb+c<ad=a>bf=a>b>c//運算式值1//運算式值1//運算式值0//d=1//f=02.6.6關係運算符和運算式例若a=0;b=0.5;x=0.3;

則a<=x<=b的值為0例5>2>7>8在C中是允許的,值為0例inti=1,j=7,a;a=i+(j%4!=0);

則a=2例‘a’>0結果為‘A’>100結果為10關係運算注意(1)例注意區分“=”與“==”inta=0,b=1;if(a=b)printf(“aequaltob”);elseprintf(“anotequaltob”);例應避免對實數作相等或不等的判斷如1.0/3.0*3.0==1.0結果為可改寫為:fabs(1.0/3.0*3.0-1.0)<1e-60關係運算注意(2)ab!a!ba&&ba||b真假真假假假真真邏輯運算符種類:!&&||邏輯運算真值表C語言中,運算量:0表示“假”,非0表示“真”,

運算結果:0表示“假”,

1表示“真”,真假假假假假真真假假真真真假真真2.6.7邏輯運算符和運算式!(2)&&(11)||(12)高低例a<=x&&x<=ba>b&&x>ya==b||x==y!a||a>b優先順序:結合方向:!:從右向左&&:從左向右||:從左向右//(a<=x)&&(x<=b)//(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)…續邏輯運算符和運算式(2)!(2)&&(11)||(12)高低優先順序:結合方向:!:從右向左&&:從左向右||:從左向右例a=4;b=5;!aa&&ba||b!a||b4&&0||25>3&&2||8<4-!0‘c’&&‘d’值為1值為0值為1值為1值為1值為1//(5>3)&&2||(8<(4-(!0)))值為1…續邏輯運算符和運算式(3)!(2)&&(11)||(12)高低優先順序:結合方向:!:從右向左&&:從左向右||:從左向右短路特性:邏輯運算式求解時,並非所有的邏輯運算符都被執行,只是在必須執行下一個邏輯運算符才能求出運算式的解時,才執行該運算符<例a&&b&&c//只在a為真時,才判別b的值;只在a、b都為真時,才判別c的值例a||b||c//只在a為假時,才判別b的值;只在a、b都為假時,才判別c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b)&&(n=c>d)//結果m=0,n=1…續邏輯運算符和運算式(4)3.1C語言的語句C語句:以“;”作分隔符號,編譯後產生機器指令.C語句分類運算式語句:運算式加分號構成。空語句:;程式控制語句(9種):if()~else~switchfor()~while()~do~while()continuebreakgotoreturn分支迴圈輔助控制如total=total+limit;a=3;func();printf(“Hello,world!\n”);

:用{…}括起來的一組語句一般形式:

{[數據說明部分;]

執行語句部分;

}說明:“}”後不加分號語法上和單一語句相同複合語句可嵌套複合語句3.2數據輸出格式:putchar(c)參數:c為字元常量、變數或運算式功能:把字元c輸出到顯示器上返值:正常,為顯示的代碼值;出錯,為EOF(-1)C語言無I/O語句,I/O操作由函數實現

3.2.1字元輸出函數

#include<stdio.h>格式:printf(“格式控制串”,輸出表)功能:按指定格式向顯示器輸出數據返值:正常,返回輸出位元組數;出錯,返回EOF(-1)1)輸出表:要輸出的數據(可以沒有,多個時以“,”分隔)2)格式控制串:包含兩種資訊

格式說明:

%[修飾符]格式字元

,用於指定輸出格式普通字元或轉義序列:原樣輸出3.2.2格式輸出函數d,ix,Xoucse,Efg%%十六進制無符號整數不帶符號十進位整數十進位整數指數形式浮點小數單一字元字串八進制無符號整數小數形式浮點小數e和f中較短一種百分號本身inta=567;printf(“%d”,a);inta=255;printf(“%x”,a);inta=65;printf(“%o”,a);inta=567;printf(“%u”,a);chara=65;printf(“%c”,a);printf(“%s”,“ABC”);floata=567.789;printf(“%e”,a);floata=567.789;printf(“%f”,a);floata=567.789;printf(“%g”,a);printf(“%%”);567ff101567AABC5.677890e+02567.789000567.789%說明 格式字元一般要用小寫格式字元與輸出項個數應相同,按先後順序一一對應輸出轉換:格式字元與輸出項類型不一致,自動按指定格式輸出…續格式字串.n對實數,指定小數點後位數(四捨五入)修飾符功能m輸出數據域寬,數據長度<m,左補空格;否則按實際輸出輸出數據在域內左對齊(缺省右對齊)-指定在有符號數的正數前顯示正號(+)+輸出數值時指定左面不使用的空位置自動填00在八進制和十六進制數前顯示前導0,0x#在d,o,x,u前,指定輸出精度為long型在e,f,g前,指定輸出精度為double型l附加格式說明符(修飾符)對字串,指定實際輸出位數…續格式字串例inta=1234;floatf=123.456;printf(“%08d\n”,a);printf(“%010.2f\n”,f);printf(“%+08d\n”,a);printf(“%+010.2f\n”,f);0、+例inta=123;printf(“%o,%#o,%X,%#X\n”,a,a,a,a);

例#例longa=65536;printf(“%d,%8ld\n”,a,a);

例l00000000000000010000000000000000//00001234//0000123.46//+0001234//+000123.56//173,0173,7B,0X7B//0,65536例3.3數據輸入格式:getchar()功能:從鍵盤讀一字元返值:正常,返回讀取的代碼值;出錯,返回EOF(-1)3.3.1字元輸入函數

例/*ch3_4.c*/#include<stdio.h>main(){intc;printf("Enteracharacter:");c=getchar();printf("%c--->hex%x\n",c,c);}運行結果:Enteracharacter:A

A--->hex41格式:scanf(“格式控制串”,地址表)功能:按指定格式從鍵盤讀入數據,存入地址表指定的存儲單元中,並按回車鍵結束返值:正常,返回輸入數據個數地址表:變數的地址,常用取地址運算符&格式字元:d,i,o,x,u,c,s,f,e例scanf(“%d”,&a);

輸入:10

則a=10例scanf(“%x”,&a);

輸入:11

則a=173.3.2格式輸入函數附加格式說明符(修飾符)l修飾符功能h域寬*用於d,o,x前,指定輸入為short型整數用於d,o,x前,指定輸入為long型整數用於e,f前,指定輸入為double型實數指定輸入數據寬度,遇空格或不可轉換字元則結束抑制符,指定輸入項讀入後不賦給變數例scanf(“%4d%2d%2d”,&yy,&mm,&dd);

輸入19991015

則1999

yy,10

mm,15

dd修飾符功能…續格式輸入函數一般以空格、TAB或回車鍵作為分隔符號其他字元做分隔符號:格式串中兩個格式符間字元例scanf(“%d%o%x”,&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);

輸入123123123

輸出a=123,b=83,c=291例scanf(“%d:%d:%d”,&h,&m,&s);

輸入12:30:45

則12

h,30

m,45

s例scanf(“%d,%d”,&a,&b)

輸入3,4

則3

a,4

b例scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);

輸入a=12,b=24,c=36

輸入分隔符號的指定

用“%c”格式符時,空格和轉義字元作為有效字元輸入如scanf(“%c%c%c”,&c1,&c2,&c3);

若輸入abc

則a

c1,

c2,b

c3

輸入數據時,遇以下情況認為該數據結束:遇空格、TAB、或回車遇寬度結束遇非法輸入如scanf(“%d%c%f”,&a,&b,&c);

若輸入1234a123o.26

則1234

a,‘a’

b,123

c說明:賦值抑制字元*

表示本輸入項對應的數據讀入後,不賦給相應的變數(該變數由下一個格式指示符輸入)。例如,scanf("%2d%*2d%3d",&num1,&num2);printf("num1=%d,num2=%d\n",num1,num2);

假設輸入“123456789”,則系統將讀取“12”並賦值給num1;讀取“34”、但捨棄掉(“*”的作用);讀取“567”並賦值給num2。所以,printf()函數的輸出結果為:num1=12,num2=567。進一步介紹:

數據輸入操作

1.如果相鄰2個格式指示符之間,不指定數據分隔符號(如逗號、冒號等),則相應的2個輸入數據之間,至少用一個空格分開,或者用Tab鍵分開,或者輸入1個數據後,按回車,然後再輸入下1個數據。例如,scanf("%d%d",&num1,&num2);

假設給num1輸入12,給num2輸入36,則正確的輸入操作為:12□36↙

或者:12↙36↙

注:使用“↙”符號表示按回車鍵操作,在輸入數據操作中的作用是,通知系統輸入操作結束。2.“格式字串”中出現的普通字元(包括轉義字元形式的字元),務必原樣輸入。例如,scanf("%d,%d",&num1,&num2);

假設給num1輸入12,給num2輸入36,正確的輸入操作為:12,36↙

另外,scanf()函數中、格式字串內的轉義字元(如\n),系統並不把它當轉義字元來解釋,從而產生一個控制操作,而是將其視為普通字元,所以也要原樣輸入。例如:scanf("num1=%d,num2=%d\n",&num1,&num2);

假設給num1輸入12,給num2輸入36,正確的輸入操作為:

num1=12,num2=36\n↙

提高人機交互性建議:為改善人機交互性,同時簡化輸入操作,在設計輸入操作時,一般先用printf()函數輸出一個提示資訊,再用scanf()函數進行數據輸入。例如,將scanf("num1=%d,num2=%d\n",&num1,&num2);改為:

printf("num1=");scanf("%d",&num1);printf("num2=");scanf("%d",&num2);3.輸入數據時,遇到以下情況,系統認為該數據結束:(1)遇到空格,或者回車鍵,或者Tab鍵。(2)遇到輸入域寬度結束。例如“%3d”,只取3列。(3)遇到非法輸入。例如,在輸入數值數據時,遇到字母等非數值符號(數值符號僅由數字字元0-9、小數點和正負號構成)。4.使用格式說明符“%c”輸入單個字元時,空格和轉義字元均作為有效字元被輸入。例如,scanf("%c%c%c",&ch1,&ch2,&ch3);printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3);

假設輸入:A□B□C↙,則系統將字母'A'賦值給ch1,空格'□'賦值給ch2,字母'B'賦值給ch3。

[Return]/*ch3_12.c*/#include<math.h>#include<stdio.h>main(){floata,b,c,s,area;scanf("%f,%f,%f",&a,&b,&c);s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf("a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n",a,b,c,s);printf("area=%7.2f\n",area);}輸入:3,4,6

輸出:a=3.00,b=4.00,c=6.00s=6.50area=5.33檔包含預處理命令變數定義輸入數據輸出數據例輸入三角形邊長,求面積PAB真假PBA真假kA1A2AiAnk=k2k=k1k=knk=ki......二分支選擇結構多分支選擇結構4.1選擇結構簡介形式一:格式:if(expression)statement執行過程:exprstatement非0=0例:if(x>y)printf(“%d”,x);exprstatement1statement2非0=0形式二:格式:if(expression)statement1elsestatement2執行過程:例:if(x>y)max=x;elsemax=y;4.2if語句形式三:if(expr1)statement1elseif(expr2)statement2elseif(expr3)statement3…...[elsestatementn]expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0執行過程:

例:if(salary>1000)index=0.4;elseif(salary>800)index=0.3;elseif(salary>600)index=0.2;elseif(salary>400)index=0.1;elseindex=0;

如:if(a==b&&x==y)printf(“a=b,x=y”);if(3)printf(“OK”);if(‘a’)printf(“%d”,’a’);if(x)

if(x!=0)if(!x)

if(x==0)if後面的運算式類型任意,必須用()語句可以是複合語句else子句(可選)是if語句的一部分,必須與if配對使用,不能單獨使用。當if和else下麵的語句組,僅由一條語句構成時,也可不使用複合語句形式(即去掉花括弧)。例考慮下麵程式的輸出結果:#include<stdio.h>main(){intx,y;scanf(“%d,%d”,&x,&y);if(x>y)x=y;y=x;elsex++;y++;printf(“%d,%d\n”,x,y);}CompileError!對If語句的說明一般形式:if(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4內嵌if內嵌ifif(expr1)if(expr2)statement1elsestatement2內嵌ifif(expr1)if(expr2)statement1elsestatement3

內嵌ifif(expr1)statement1elseif(expr3)statement3elsestatement4內嵌ifif語句嵌套…續If語句說明/*ch4_4.c*/#include<stdio.h>main(){intx,y;printf("Enterintegerx,y:");scanf("%d,%d",&x,&y);if(x!=y)if(x>y)printf("X>Y\n");elseprintf("X<Y\n");elseprintf("X==Y\n");}運行:Enterintegerx,y:12,23

X<YEnterintegerx,y:12,6

X>YEnterintegerx,y:12,12

X==Y例輸入兩數並判斷其大小關係…續If語句的說明缺省{}時,else總是和它上面離它最近的未配對的if配對if(……)if(……)if(……)else…...else…...else…...if~else配對原則…續If語句的說明例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);實現if~else正確配對方法:加{}…續If語句的說明一般形式switch(運算式){caseE1:

語句組1;break;caseE2:

語句組2;break;…….caseEn:

語句組n;break;[default:

語句組;

break}執行過程switch運算式語句組1語句組2語句組n語句組…...E1E2Endefaultcase4.3switch語句(開關分支語句)(1)當switch後面“運算式”的值,與某個case後面的“常量運算式”的值相同時,就執行該case後面的語句(組);當執行到break語句時,跳出switch語句,轉向執行switch語句的下一條。(2)如果沒有任何一個case後面的“常量運算式”的值,與“運算式”的值匹配,則執行default後面的語句(組)。然後,再執行switch語句的下一條。說明(1)switch後面的“運算式”,可以是int、char和枚舉型中的一種。(2)每個case後面“常量運算式”的值,必須各不相同,否則會出現相互矛盾的現象(即對運算式的同一值,有兩種或兩種以上的執行方案)。(3)case後面的常量運算式僅起語句標號作用,並不進行條件判斷。系統一旦找到入口標號,就從此標號開始執行,不再進行標號判斷,所以必須加上break語句,以便結束switch語句。…續執行過程(4)case後可包含多個可執行語句,且不必加{}(5)switch可嵌套(6)多個case可共用一組執行語句如:……case‘A’:case‘B’:case‘C’:printf(“score>60\n”);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论