高级程序设计语言课件_第1页
高级程序设计语言课件_第2页
高级程序设计语言课件_第3页
高级程序设计语言课件_第4页
高级程序设计语言课件_第5页
已阅读5页,还剩307页未读 继续免费阅读

下载本文档

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

文档简介

高級程式設計語言2004-9-15第一章 C語言概述2004-9-15電腦基本結構2004-9-15電腦基本結構CPU

(CentralProcessingUnit)主記憶體運算器控制器外設輸入設備輸出設備主機電腦2004-9-15程式設計語言程式設計語言:是人和電腦之間交換資訊所用的一種工具。是用來編寫電腦程式的工具;電腦將嚴格按照程式運行和工作,並提供產生的結果。即人通過程式的形式向電腦提出服務要求,電腦按程式自動進行工作2004-9-15程式設計語言程式設計語言包括:機器語言組合語言高級語言2004-9-15機器語言與組合語言機器語言:機器語言就是能夠被電腦直接識別和執行的機器指令。機器指令是CPU提供的基本功能(與電腦體系結構相關)機器指令是二進位代碼是電腦唯一能夠直接執行的程式語言編程、閱讀程式比較困難組合語言:用助記符表示的機器語言,即符號化的機器語言電腦不能直接執行組合語言程式,需要轉化為機器語言與電腦體系結構相關2004-9-15機器語言與組合語言例:X=10,Y=17,計算SUM=X+Y0A11...A00000020601A20300F400DATA SEGMENTX DB 10Y DB 17SUM DB 0DATA ENDS... MOV AL,X ADD AL,Y MOV SUM,AL HLT 機器語言程式組合語言程式2004-9-15高級(programming,程式設計)語言高級語言:又稱為演算法語言,是一種接近於自然語言的電腦程式設計語言。這種語言通常由:基本字元集,詞法規則,語法規則,語義規則等構成。一般由兩部分內容組成:對數據的描述對處理過程(操作)的描述獨立於電腦體系結構電腦不能直接執行高級語言程式,需要轉換(高級語言程式→組合語言程式→機器指令)2004-9-15高級(programming,程式設計)語言例:X=10,Y=17,計算SUM=A+BDATA SEGMENTA DB 10B DB 17SUM DB 0DATA ENDS... MOV AL,A ADD AL,B MOV S,AL HLT 組合語言程式...int A,B,SUM;A=10;B=17;SUM=A+B;...C語言程式2004-9-15高級(程式設計)語言高級程式語言與自然語言自然語言程式設計語言人與人資訊交流的工具(人具有思維、推理能力)人-機對話的工具(電腦具有計算與邏輯判斷的能力)語法規則靈活(可以省略,顛倒)嚴格遵循語法規則表達方式多樣演算法多樣2004-9-15高級(programming,程式設計)語言根源程式(高級語言成語)“轉換”成目標程式(機器指令)的方法:編譯方式:將根源程式一次性地轉換成等價的目標程式。此後,可以多次直接運行這個目標程式。翻譯方式:"運行"根源程式的"當時"逐個語句地進行"翻譯"並立即"運行"這一句的功能,直到最後一個語句為止2004-9-15編譯方式與翻譯方式編譯方式:翻譯方式2004-9-15C語言的歷史C語言產生與UNIX操作系統(OperatingSystem)密切相關標準化1983年,美國標準化組織(ANSI,AmericanNationalStandardsInstitute)成立C語言工作小組,發表C語言標準:ANSIC1987年,ANSI發表新的C語言標準:87ANSIC1989年,國際標準化組織(ISO,InternationalStandardizationOrganization)接納ANSIC,標準,發表ISOC標準2004-9-15C語言的特點語言簡潔、緊湊,使用方便、靈活(32個關鍵字,9中控制語句)運算符豐富(34種運算式)豐富的數據類型結構化的控制語句,程式模組化(函數是基本模組)語法限制不嚴格,程式設計自由度大能夠進行位操作(即對存儲單位進行操作)高效率的目標代碼可移植性好(與彙編比較)2004-9-15"Hello,world"例1“Hello,world”C程式是由函數(function)和變數組成(variable)main函數:C程式總是從main函數開始執行代碼在main函數中調用其他函數來完成相應的工作“其它函数”:用户自行编写的函数庫函數(libraryfunctions)函數之間通信的一種方式是:調用者提供一組參數(arguments)給被調用函數#include<stdio.h>main(){ printf("hello,world\n");}函數名參數表2004-9-15"Hello,world"printf函數是一個庫函數的參數“hello,world\n”:字串(characterstring/stringconstant)\n:由\開頭的字元:用於表示難於輸入、特殊的控制字元換行符(newlinecharacter

)#include<stdio.h>main(){

}printf("hello,world\n");函數名2004-9-15#include<stdio.h>intmax(intx,inty);

main(){inta,b,c;/*announcement,variablesdefination*/scanf("%d%d,",&a,&b); /*inputthevalueofaandb*//*callmaxfunction,gettheresult,andassignittoc*/

c=max(a,b);printf("max=%d\n",c);/*outputthevalueofc*/return;}/*definemaxfunction,functionvalueisinteger*/intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}例2 比較兩個整數的大小,輸出其中較大的數2004-9-15“Hello,world”C程式的格式一條語句(statement)占一行;運算符之間應用空格(blanks)分割;語句縮進(indentation):4個空格/一個tab的舉例,突出程式的邏輯結構{}(braces)位置函數定義:均置與行首其餘情況:{在行尾}在行首2004-9-15程式程式包括兩個方面:對數據的描述,即數據結構(datastructure)對操作的描述(操作步驟),即演算法(algorithm)操作的對象是數據,操作的目的是對數據進行加工處理,以獲取結果演算法:解決”做什麼”和”怎麼做”的問題語句(statements)只是演算法的具體體現沃思公式:數據結構+演算法=程式2004-9-15演算法的概念演算法(廣義):為解決一個問題而採用的方法和步驟。演算法多樣性不同的演算法具有簡單和複雜的分別,但首要保證演算法正確性,再考慮演算法的品質。電腦演算法:是電腦為解決一個問題而採用的方法和步驟。電腦演算法的兩大類:數值運算演算法:目的求數值解非數值運算演算法:應用廣泛2004-9-15簡單演算法舉例例2.1求5!思考:給定正整數n,求n

應具有通用性、靈活性累加,累乘等運算問題的基本演算法累計結果(total):需要設定初值;變化量(i):正確確定每次參與運算的變化量累次計算,直到i到達預期範圍total=totalOPERATOR(運算符)i;改變i值,重複計算應用:例2.42004-9-15簡單演算法舉例例2.3判斷2000-2500年中的每一年是否閏年,將結果輸出。仔細確定判斷條件,逐步縮小判斷範圍對範圍的確定要保證無遺漏2004-9-15演算法的特性有窮性:要確定合理的限定範圍確定性有零個或多個輸入有一個或多個輸出有效性2004-9-15怎樣表示一個演算法演算法表示的方法:自然語言:通俗易懂,但文字冗長,不嚴格,易出現歧義性傳統流程圖:直觀形象,易於理解用圖框表示各種操作。用流程線表示各圖框的執行順序要注意避免無規律的流程轉向結構化流程圖(N-S流程圖)演算法全部的矩形框內無流程線偽代碼PAD圖2004-9-15程式設計的三種基本結構順序結構:自頂向下,無分支,無轉移選擇結構:有分支,需條件判斷迴圈結構:有轉移,某些語句需要重複執行當型(While型)迴圈直到型(Until型)迴圈這三種基本結構可以組成任意複雜的演算法。2004-9-15順序結構順序結構:自頂向下順序執行,無分支,無轉移AB流程圖表示法ABN-S圖表示法ab2004-9-15選擇結構(選取結構、分支結構)選擇結構:有分支,需條件判斷無論條件p是否成立,只能執行A,B兩個分支中的一支A、B分支中,可以有一支是“空語句”(圖2.16)AB流程圖表示法N-S圖表示法pYes/成立NO/不成立ABp成立不成立ab2004-9-15迴圈結構(重複結構)當型(While型)迴圈流程順序:“判斷

執行

再判斷

再執行

...”由判斷條件P決定重複執行的次數,迴圈次數可控當P不成立時,停止迴圈循環體內應該有使迴圈停止的操作A流程圖表示法N-S圖表示法p成立不成立A當p成立ab2004-9-15迴圈結構(重複結構)直到(Until型)型迴圈先執行,再判斷(即操作A至少要執行一次)重複執行,直到條件滿足(即條件不成立時,重複執行)流程圖表示法N-S圖表示法p不成立成立A直到p成立Aab2004-9-15基本結構的特點基本結構的特點:只有一個入口只有一個出口結構內部每一部分都能被執行到結構內不存在“死迴圈”由基本結構所構成的演算法屬於”結構化”的演算法不存在無規律的轉向,只在結構內部才存在分支和跳轉2004-9-15偽代碼(pseudocode)偽代碼:用文字和符號描述演算法格式自由,書寫方便,修改容易一般在設計演算法時使用數據類型(Type)數據類型:是數據結構的表現形式決定了該類型的變數或者常量的取值範圍決定了該類型的變數或者常量可以執行哪些操作例:"inti" i是整數類型的變數,其取值範圍為-32768~32767之間的整數;可以執行的操作:加、減、乘、除、求餘(算術運算);比大小(關係運算)等實數無此操作運算符(Operators)與運算式(Expressions)運算符:定義了對不同數據類型變數或者常量的基本操作(運算)算術運算符(ArithmeticOperators)關係運算符(RelationalOperators)邏輯運算符(LogicalOperators)賦值運算強制類型轉換運算式(Expressions):通過運算符將變數、常量連接起來,產生新值常量與變數常量(Constants):是指在程式執行過程中值不發生改變的量。常量也有數據類型常量分為直接常量(字面常量)和符號常量(SymbolicConstants)直接常量,例:50,3.14,'A',“abc”符號常量,例:#define PRICE 30符號常量符號常量:是一種特殊形式的常量,即用一個識別字表示一個常量。定義形式

#define常量名(識別字)常量值使用符號常量:含義清楚;在需要改變一個常量時能做到“一改全改”編程風格在程式中不要出現“magicnumbers”(例如:

x=100*50+78),而符號常量名可以指明每一個常量的含義符號常量名使用大寫字母符號常量舉例例:計算某類食品的價格,要求從鍵盤讀入購買該食品的數目,輸出總價格。#include<stdio.h>#definePRICE 28Main(){ int num; printf("inputnumber:"); scanf("%d",&num); printf("total=%d",num*PRICE); return0;}變數(Variable)程式執行過程中,其值可以改變的量稱為變數。它用變數名(識別字)來表示,在內存中佔據一定記憶體單元。變數變數名:一個變數有一個名字變數在內存中佔據一定的存儲單元,在該存儲單元中存放變數的值——變數值變數名是一個符號地址在程式中從變數中取值,實際上是通過變數名找到相應的記憶體地址,從其存儲單元中讀取數據。變數名與變數值例:inta=3;......3...............3a變數名變數值存儲單元80A580A680A780A880A980AA80AB80AD變數a

地址

記憶體

識別字(包含變數名)的命名規則識別字(identifier):用來標識變數名、符號常量名、函數名、數組名、檔案名等的有效字元序列稱之為識別字。命名規則只能由字母(a~z,A~Z)、數字(0~9)和下劃線('_')三種字元組成例:不合法的識別字 bass-9 firstone 第一個字元只能是字母或下劃線一般只有庫函數才有以'_'為首字母識別字用戶一般不用'_'作為識別字的首字母,避免衝突區分字母大小寫例如:int a,A;/*a和A是兩個不同的整型變數*/識別字(包含變數名)的命名規則關鍵字(Keywords)保留關鍵字(保留字):在C語言中具有特定含義,專門用作C語言特定成分的一類識別字,例如:intfloatcharifelsewhilefor例:

intfor;X某些系統有標誌符長度限制(建議不超過8字元)。內部表示符長度可以為31bytes選擇變數名和其他標誌符時,應注意做到“見名知義”聲明(Declarations)變數聲明(Declarations):指定數據類型;列出將要使用的變數格式:

數據類型 變數名1,變數名2,...變數名n;一切變數,都要先聲明,後使用!數據類型概述內容:基本數據類型數據在內存中的存儲形式(即類型在電腦內部如何表示的)取值範圍限定符基本數據類型基本數據類型char:字元型,1個位元組長度,可以存放系統本地字元集(characterset)中的一個字元int:整型,其存儲空間長度通常反映了機器中整數的自然長度(字長)float:單精確度浮點型double:雙精度浮點型char(字元型)char:字元型,長度為一個位元組字元在內存單元中存放的是其對應的ASCII碼(8bit的0、1二進位序列)例字元'a',在內存中占一個位元組(8bits)

'a'類型長度決定了類型的取值範圍,char的取值範圍(ASCII碼取值):0~28-1(0~255)ASCII碼(P364)‘0’48;‘A’65;‘a’9701100001補充1:字長bit:在電腦中採用二進位,代碼只有“0”和“1”,其中無論是“0”或是“1”在CPU中都是一“位”。字長:CPU在單位時間內(同一時間)能一次處理的二進位數的位數叫字長。例:8位CPU:即能一次處理8位數據的CPU。32位的CPU:就能在單位時間內處理字長為32位的二進位數據。位元組和字長的區別:由於常用的英文字元用8位二進位就可以表示,所以通常就將8位稱為一個位元組。字長的長度是不固定的,對於不同的CPU、字長的長度也不一樣。8位的CPU一次只能處理一個位元組,而32位的CPU一次就能處理4個位元組,同理字長為64位的CPU一次可以處理8個位元組。補充2:補數(1/3)源碼:電腦中採用一組二進位序列來存儲數值,其中最高位為符號為(0為正,1為負)。例:(+10)源=00001010例:(-10)源=10001010例:十進位:10-10=10+(-10)=0

源碼:00001010

+10001010

=10010100=-20X

補充2:補數(2/3)反碼:正數的反碼=源碼負數的反碼=除符號位外,源碼的其餘各位逐位取反例:(-10)源=10001010,則(-10)反=11110101補數:正數的補數=源碼=反碼負數的補數=反碼+1例:(-10)補=11110110例:(10)補+(-10)補=00000000補=(0)10

例:(9)10+(-6)10=(9)補+(-6)補 =00001001+11111010=00000011=(3)10補充2:補數(3/3)例:(5)10+(-6)10=-1

(5)補+(-6)補=00000101+11111010=11111111補=(-1)10補數的設計目的是:使符號位能與有效值部分一起參加運算,從而簡化運算規則。所以,在電腦內部數值都被表示成為補數的形式。int(整型)整型數據在內存中以二進位補數來表示int其存儲空間長度通常=機器字長通常int長度為32bit/16bit,其中第一個bit表示符號位(0:正,1:負)例:intnum=120;例:intnum=-120;如果int長度為16bit,取值範圍是-216-1~216-1-1,(-32768~32767)00000000011110001111111110001000浮點型(實數型)實數有兩種表示形式:十進位數形式,由數字和小數點組成例:123.4,5.0指數形式,字母e之前必須有數字,e之後必須為整數例:123.4e0=123.4,1.234e2=123.4,

123.4e-2=1.234規範化的指數形式(C中實數的指數形式的輸出)字母e之前的小數部分,小數點左邊應有且只有一位(非0)數字例:4.321e-02,4.321e+02浮點型在內存中的存放形式以float型為例:按指數形式存儲(小數)符號位+小數部分+(指數)符號位+指數部分例:12.345在內存中一般占4個位元組(32bit)C標準未定義具體格式,一般C編譯器以24bit表示小數部分(包括符號位),8bit指數部分(包括指數的符號位)小數部分位越多,有效數字越多,數值範圍越小float型的有效數字為7位數符小數階符指數01.234501浮點型float型:單精確度浮點類型,典型長度:32bit,典型有效數字:7位double型:雙精度浮點類型,典型長度:64bit;典型有效數字:15~16位例:floatf=

1.2345678;f的有效數字只有7位,即1.234567,超出7位的部分直接舍去(8被舍去)f的指數形式的輸出為:1.234567e+00限定符(qualifiers)限定符(即修飾符)用於限定基本數據類型主要用於改變數據類型在內存中的長度

改變類型的取值範圍格式:限定符1[限定符2]類型例:shortint例:unsignedshortint3類限定符short和long(限定整型)signed和unsigned(限定字元和整型)longdouble(限定浮點型)short和longshort和long:用於限定整型,提供不同長度的整數型例: shortintsh;

longintcounter;通常,int:16/32bit,shortint:16bit,

longint:32bit編譯器會跟據機器的硬體特性自主選擇整型的長度。基本規則:shortint和int至少為16bitlongint至少為32bitshortint類型的長度≤int類型長度

≤longint類型長度signed和unsignedsigned和unsigned:用於限定char類型和所有整型(包括shortint類型、int類型、longint類型)

unsigned限定的類型的數值總是非負(0,正整數)signed限定的類型的數值有正、有負例:unsignedchar:取值範圍0~28-1=255例:signedchar:取值範圍-128~127例:unsignedint:取值範圍0~216-1=65535signed和unsigned注意:signed和unsigned可以限定所有整型例:unsigendint

signdlongint當整數沒有限定符時,默認是有符號的(即類型記憶體結構中有1bit的符號位)例:intnum;/*長度為16bit,其中1bit符號位,15bit數據*/字元型沒有限定符時,是否有符號位由編譯系統決定longdoublelongdouble(高精度浮點數),類型長度≥double(雙精度類型)longdouble型:典型長度:128bit;典型有效數字:18~19位基本數據類型詳述每一種類型:記憶體中的存放形式分類常量(表示的方法,特殊的常量)變數(類型的聲明與定義,取值範圍)細節問題整型數據整型分類有符號型:[signed]int:基本整型短整型([signed]short[int])長整型([signed]long[int])無符號型:無符號整型(unsignedint)無符號短整型(unsignedshort)無符號長整型(unsignedlong)在內存中的存放形式(P41,P44)取值範圍(P43)整型數據整型常量基本型(int)常量表示方法:十進位數,例:12、345、0八進制數(以0開頭),例:012、045十六進制數(0x開頭),例:0x12、0x345長整型(long)常量表示方法:常數後加尾碼L(l)例:43210L(43210l);0x10ACA870L;1234L無符號整型常量表示方法:常數後加尾碼U(u)例:4321U;43210UL;-1234U(=64302);1234U整型數據整型變數分類(P42)定義格式(P44)細節問題:溢出避免溢出:根據估計變數值的範圍,定義相應類型的整型變數實型數據(浮點型)實型變數的分類(P46)單精確度(float) 例:float x,y;雙精度(double) 例:doublez;長雙精度(longdouble) 例:longdoublet;在內存中的存放形式:按指數形式存放取值範圍和有效數字長度(P46)取值範圍由小數部分和指數部分共同決定記憶體中,小數域的長度決定的該種類型浮點數的有效位數。例如:float型,小數部分為24bit,小數域的長度為24-1=23bit,223=8388608,有7位有效數字數符小數階符指數小數部分指數部分實型數據(浮點型)細節問題:舍入誤差(P47):一個浮點型數據的有效數字長度有限的,在有效位以外的數據會被省去,這樣可能會產生誤差例3.4實型數據實型常量兩種表示方法:十進位數形式和指數形式例:10.0(實數常量)而10(整型常量)例:1.234e4也可以在實常量加尾碼F(f)實型變數分類(P46)定義格式(P47)字元型數據字元數據的存儲字元在內存單元中存放的是其對應的ASCII碼(P374),且一個字元佔用一個位元組的存儲空間C語言中,字元型數據可以視為是一種特殊的整型數據(8bit的整數)。字元型數據可以賦值為整數值(ASCII值,0~255),字元數據可以以字元形式輸出,也可以用整數形式輸出。例3.6可以對字元型數據進行算術運算例3.7字元數據的存儲(續)在TurboC中把字元處理為帶符號的整數ASCII碼取值為0~255,所以ASCII碼值為128~255間的字元,最高位為1(即符號位)例:求下段代碼的輸出

char c=130

printf("c=%d",c);解:C在內存中:

10000010補=-126

所以列印出來c=-12610000010字元型數據字元常量一般字元常量的表示:撇號(單引號)括起來的單個字元例:'a';'F','0','+'特殊字元常量(鍵盤無法直接輸入):特點由'\'轉義字元引導(P48)例:'\n':換行符例:'\\':反斜杠例:'\016':對應ASCII碼值為14的字元(見P374)字元型數據字串常量用雙引號括起來的字元序列例:"abcd","a"(區別字元常量'a')存儲形式(P52)系統自動在字串的末尾加上一個字串結束標記‘\0’,以此判斷字串是否結束。程式中長度為n個字元的字串常量,在內存中需要用n+1個位元組空間來存儲它。舉例:字串“string”的存儲string\01151161141051101030字元型數據字元變數字元變數用來存放字元常量只能放一個字元例:charch='a';變數賦初值C語言允許在定義變數時對變數進行初始化,即對變數賦初值。例::

對變數進行初始化,允許只對定義的變數的一部分賦初值。例:inta,b,c=25;

例:inta,b=c=25;

XC語言中若有幾個變數初值相同,必須分別賦值。對字元型變數初始化時,既可以將字元用單引號括起來直接賦值,也可以使用該字元的ASCII碼進行賦值。例:charch=‘A’; charch=65;inta=2;inta;a=2;基本的算術運算符:+-*/%乘法運算(*),例:2*y,而2y和2∙y都是非法的除法運算(\),兩個運算元中:均是整數,其值為整數。例:8/3=2有一個負整數運算元,結果向零取整。例:-5/3-2有一個浮點數,其結果為double型模運算(%),例:7%4=3兩個運算元必須都是整型算術運算符算術運算式算術運算式:用算術運算符和括弧將運算對象(運算元)連接起來,符合C語法規則的式子運算對象(運算元):包括常量、變數、函數例:x+sqrt(a+b)/(abs(a-b)+x)

=運算符(包括算術運算符)具有優先順序與結合性算術運算式求值時,先確定優先順序,例*、/、%、+、-相同優先順序,根據運算符的結合性(結合方向)確定執行順序算術運算符結合方向:從左向右例如:x+y*3/(z-8)算術運算式強制類型轉換符將一個運算式的值轉換為所需類型的值強制類型轉換符格式:(類型名)(運算式)例:a是int型,而(double)a:將a的值轉換為double型例:(int)(x+y)(區別:(int)x+y)強制類型轉換符並不改變操作變數的類型值,例3.8強制類型轉換符自增、自減運算符(++,--)++i,--i:先自增/減,再使用i(i值已修改)i++,i--:先使用i(i值已修改),再自增/減例:例:j=i++;j=i;i=i+1;j=++i;i=i+1;j=i;區分:j=i+1;/*i值未變*/j=++i;/*i值改變*/自增、自減運算符自增、自減運算符只能用於變數,而不能用於常量和運算式例:PRICE++X;5++X;(a+b)++X;(-b)++X自增、自減運算符優先順序高於算術運算符,結合方向“自右向左”例:如果i=3,那麼printf("%d",-i++)輸出是幾?i值又為幾?格式:變數=運算式/常量/變數例:a=(x+y);x=3;x=y;作用:將等號右邊的運算式/常量/變數的值賦值給等號左邊變數區別賦值運算符與數學中的”等於“賦值,例賦值運算符i=3;j=i;3i存儲單元3j存儲單元整型與浮點型浮點型數據

整型變數:取整(舍掉實數的小數部分)整型數據

浮點型變數(單,雙精度):數值不變,以浮點形式存儲到變數中浮點型間double型數據float型變數:截取前面7位有效數字存放到變數中,注意避免數值範圍溢出float型變數

double型數據:數值不變,有效數字擴展到16位賦值結果與類型轉換整型之間長度相同的有符號和無符號的整型數間:原樣賦值整型包括:char,short,int,long負值

無符號整型變數,無符號整數

整型變數間轉換時,數值會變化。例3.9賦值結果與類型轉換1111111111111111intb=-1;1111111111111111unsigneda=b;/*a=216-1=65535*/賦值結果與類型轉換整型之間長度不同的有符號整型數(char,short,int,long)間:短數據

長變數:需要符號擴展

符號擴展:若最高位為1(負值),變數高位元組補1,反之補0。例11111110charc='\376';1111111111111111inta=c;賦值結果與類型轉換整型之間長度不同的有符號整型數(char,short,int,long)間:長數據

短變數:將數據低位元組位原封不動地送到變數中例1000000000001000intb=a;/*b=-32760*/00000000011000001000000000001000longa=6324232L;幾個需要注意的問題子運算式的求值順序運算符的結合規律實參數的求值順序第三章數據類型、運算符與運算式C語句概述語句(statement):指示電腦完成一定操作任務的指令。一條語句

編譯

若干條機器指令聲明:數據的描述,而語句:對數據的操作每條語句以分號(;)結束C程式結構C程式根源程式檔1根源程式檔2根源程式檔N預處理指令全局變數聲明函數1函數n函數首部函數體局部變數聲明執行語句C語句的分類控制語句選擇語句:if–else;switch迴圈語句:for()~while()~do~while()轉向語句break;continuegoto;returnC語句的分類函數調用語句格式:函數名(參數表);例:printf("Helloworld\n");運算式語句格式:運算式;例:i++;例:a=x+y;重要的運算式語句:賦值語句格式:賦值運算式;例:a=3; 例:if((a=b)>0)t=a;/*區別與賦值運算式的區別,P69*/區別:賦值運算式可以包含在其他運算式中,賦值語句不行C語句的分類空語句格式: ;功能:什麼也不做應用:迴圈語句中的空循環體,例

for(i=0;I<1000;i++)

;在程式開發過程中起到占位的作用,例

...

;/*某一功能暫時未完成,有待今後補齊代碼*/C語句的分類複合語句(語句塊)格式:

{

語句1;

語句2;

...

語句N;

}複合語句中}後無分號複合語句在語法上相當於一條語句在複合語句中(語句塊中),可以聲明變數數據的輸入、輸出C語言沒有專門的輸入/輸出(I/O)語句I/O操作由標準庫函數提供原始檔案必須包含I/O庫函數所對應的頭檔(stdio.h)方法:在原始檔案頂部,添加#include"stdio.h"標準I/O設備標準輸入設備:鍵盤標準輸出設備:顯示器字元輸出函數putchar功能:向標準輸出(顯示器)輸出一個字元調用方式:putchar(c);參數c可以是字元型或者整型常量、變數、運算式例: 例:#include"stdio.h"main(){charc1='a',c2=97;putchar(c1);putchar(c2);putchar('a');putchar(97);}#include"stdio.h"main(){putchar('a');putchar('\n');putchar('\141');}字元輸入函數getchar功能:從標準輸入(鍵盤)輸入一個字元調用方式:getchar();使用注意無參數,函數返回值就是從標準輸入得到的字元輸入時,按回車後,才開始接收字元只能接收第一個字元,多餘的字元將省略getchar()得到的字元可以賦給字元型,整型變數,或作為運算式的一部分例:c=getchar()+('a'–'A');字元輸入函數getchar例:例:#include"stdio.h"main(){charc;printf("Enteracharacter:");c=getchar();putchar(c);}#include"stdio.h"main(){printf("Enteracharacter:");putchar(getchar());}格式輸出函數printf功能:向標準輸出(顯示器)按照指定格式輸出任意類型的數據。調用方式:printf(格式控制,輸出表);例:printf("Answer=%d\n",11);例:printf("Helloworld!\n");雙引號括起來的字串要輸出的內容,包括:常量、變數、運算式格式控制格式控制符的組成:普通字元:原樣輸出例:printf("a+b=12,\141\n");格式轉換說明:將要輸出的數據轉換為指定格式輸出每一個格式轉換說明都由%引導,而以格式字元結束例:printf("%d%f%c",a,f1,'a');有多少個的格式轉換說明,就對應有多少個數據參數

intprintf(格式轉換說明,參數1,參數2,...);

格式轉換說明格式轉換說明組成:%-7.3f引導符格式字元表示左對齊輸出,省略表示右對齊輸出表示輸出最小寬度表示輸出精度表示引導精度值格式轉換說明例:printf("%d",12345);輸出:例:printf("%7d",12345);輸出:例:printf("%-7d",12345);輸出:例:printf("%4d",12345);輸出:例:printf("%-4d",12345);輸出:例:printf("%7.3d",12345);輸出:01234567812345

1234512345--123451234512345格式轉換說明例:printf("%f",1.2345);輸出:例:printf("%7f",1.2345);輸出:例:printf("%-7f",1.2345);輸出:例:printf("%3f",1.2345);輸出:例:printf("%9f",12345);輸出:例:printf("%9.3f",12345);輸出:例:printf("%.3f",12345);輸出:例:printf("%-9.3f",12345);輸出:0123456781.2345001.2345001.2345001.2345001.2345001.2341.2341.234格式轉換說明例:printf("%s","hello");輸出:例:printf("%9s","hello");輸出:例:printf("%-4s","hello");輸出:例:printf("%.3s","hello");輸出:例:printf("%9.3s","hello");輸出:例:printf("%-9.3s","hello");輸出:012345678hellohellohellohelhelhel------格式轉換說明注意:printf函數默認是右對其輸出寬度值m:輸出的最小寬度,如果沒有指定精度,按數值的實際長度輸出如果數值的位數>m,則直接按數值的位數輸出如果數值的位數<m,則補齊位數(默認用空格)精度值:整型:輸出數值的最小位數,如果數值的位數>m,則直接按數值的位數輸出浮點型:指定實數小數點後的位數字串:指定輸出字串的最大位數(超出的截斷)格式字元格式字元:指定輸出數據的類型和相應的格式整型格式字元(P73-P74)d:帶符號的十進位整型u:無符號的十進位整型o:以無符號的八進制整型x:以無符號的十六進制整型ld:帶符號的十進位長整型整型格式字元例(P74例4.3)a:1111111111111111b:1111111111111110#include"stdio.h"main(){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);}輸出:a=-1,177777,ffff,65535b=-2,177776,fffe,65534格式字元c:輸出一個字元s:輸出字串例:#include"stdio.h"main(){charc='a';printf("c=%c,%c\n",c,97);printf("%s\n","CHINA");}格式字元e:以指數形式輸出實型數據;f:以小數形式輸出實型數據;g:自動選擇f格式或e格式中寬度較小的一種輸出實數,且不列印無效的0。注意:單精確度型數據,用%f輸出,前7位有效,且小數點後固定位6位雙精度型數據,用%lf輸出,前16位有效,且小數點後固定位6位printf函數注意事項輸出數據類型要與格式說明相匹配,包括類型、格式格式字元x,e,g可以是大寫字母X,E,G除x,e,g外的格式字元均為小寫如若輸出字元“%”,在“格式控制”中用連續兩個“%”即可長度修正符:h(short):只能修飾整型數據l(long):修飾整型數據——輸出長整型,修飾浮點型——輸出雙精度格式輸入函數scanf功能:將用戶從標準輸入輸入的數據存儲到由變數地址所指定的記憶體空間。調用格式:scanf(格式控制,變數地址表);“格式控制”部分同printf函數,但有區別(無精度控制)。“地址表”由變數地址組成,表明每個輸入項應在存儲單元的首地址。獲取變數首地址的格式:&變數名例:#include"stdio.h"main(){charc;inti;

scanf("%c%d",&c,&i)}......變數c

地址

記憶體

80A580A680A780A880A980AD變數i

格式輸入函數scanf格式控制:與printf函數中的格式控制相似每一個格式轉換說明都由%引導,而以格式字元結束例:scanf("%d%i%f",&i1,&i2,&f);格式字元(P80)對於無符號整型,可使用u,o,x格式符i,表示可以用十進位(123),也可用八進制(0123),和十六進制(0x123)輸入;而格式符d只能輸入十進位整型附加格式說明字元:l,h,*,域寬(P80)scanf函數注意事項輸入數據的分割採用隱含的分隔符號:空格、回車、Tab鍵根據格式中指定的域寬分隔資料項目(不提倡)採用用戶指定的分隔符號,即在格式控制字串內除格式說明以外的其他字元,輸入數據時都應照樣輸入例:scanf("input%d,%d",&a,&b);

在輸入時應鍵入:input2,3輸入無符號數據時,應採用o,x格式符引例計算函數值:輸入xX=0?

YNy=1y=six/x

輸出y#include"stdio.h"#include"math.h"main(){floatx,y;printf("inputx:\n");scanf("%f",&x);if(x!=0.0)y=sin(x)/x;elsey=1;printf("y=%f",y);}關係運算符關係運算實際上是“比較運算”<<=>>=(優先順序相同)==!=(優先順序相同)優先順序:算術運算符關係運算符賦值運算符結合方向:從左向右例:c>a+b

c>(a+b)a==b>ca==(b>c)a=b==ca=(b==c)低高低高關係運算式關係運算式:用關係運算符將兩個運算式(算術運算式,字元運算式,關係運算式,邏輯運算式,賦值運算式)連接起來的式子例:x+y>5'a'=='A' 字元量比較:根據ASCII值(4*2)>(4==2) 關係運算式的值:“真”(1)或“假”(0)

例:a=3,b=2,c=1則:a>b的值為真,運算式的值為1a>b==c的值為真,運算式的值為1b+c<a的值為假,運算式的值為0b+c<=a的值為真,運算式的值為1例:a=3,b=2,c=1,如果d=a!=

b==c,則d=1邏輯運算符邏輯運算符:&&邏輯與例:a&&b,若a,b都為真,則邏輯運算式值為真。||邏輯或例:a||b,若a,b都為假,則邏輯運算式值為假,(換言之:a,b中有一個為真,則邏輯運算式值為真)。!邏輯非例: !a,若a為真,則邏輯運算式值為假;反之依然。真值表(P89)邏輯運算符優先順序:!&&||結合順序:!:從右向左&&和||:從左向右例:!a||b&&x>y&&c

(!a)||

b&&(x>y)&&c低高低高!(非)

算術運算符關係運算符&&

||賦值運算符各種運算符的優先順序12345邏輯運算式邏輯運算式:用邏輯運算符將關係運算式或邏輯量連接起來的式子邏輯量:用來進行判斷的變數或者常量C編譯系統認為:值等於零:假非零值:真例:若a=4,在a&&1中,a就是邏輯量,代表真邏輯運算式的值:真為1,假為0例:若a=4,則:!a 0a&&-5 1a||0 1a&&0 0邏輯運算式例:a=3,b=2,c=1則:a>b&&b>c(a>b)&&(b>c)a!=b&&b!=c(a!=b)&&(b!=c)!a||c>a(!a)||(c>a)例:5>3||

2&&

!8<4-!0,結果為1例:判斷某年year是否是閏年(閏年:能被4整除,且不能被100整除,或者能被400整除)year%4==0&&year%100!=0||year%400==0

例:x≤a+1,並且y≤b,C語言邏輯運算式:x<=a+1&&y<=b例 的定義域(x>2||x<1)&&x!=0if語句if語句的三種形式:條件執行格式:if(判斷條件p)

語句A;例:例A空p真假if(a>0)printf("a=%dispositive\n",a);...if(x>y){ temp=x;x=y;y=temp;}...條件執行注意:語句A可以是複合語句判斷條件P是一個運算式,如果值為0

假,非0

真例:例:例:if('a')printf("OK\n");x=-1;

if(x)printf("OK\n");y=0;

if(y)printf("OK\n");例:任給a,b,c三數,按從大到小順序輸出(1/2)例:任給a,b,c三數,按從大到小順序輸出方法:判斷-交換若a<b,則a,b交換若a<c,則a,c交換a最大若b<c,則b,c交換c最小判斷——ifelse語句交換:需引入臨時變數

tmp=a;a=b;b=tmp;例:任給a,b,c三數,按從大到小順序輸出(2/2)交換a,bBa<b真假輸入a,b,c交換a,cBa<c真假交換b,cBb<c真假輸出a,b,c#include"stdio.h"main(){inta,b,c;inttmp;printf("Inputa,b,c:\n");scanf("%d%d%d",&a,&b,&c);if(a<b){tmp=a;a=b;b=tmp}if(a<c)tmp=a;a=c;c=tmp;}if(b<c){tmp=b;b=c;c=tmp;}printf("%d,%d,%d\n",a,b,c);}if語句——分支選擇if語句的三種形式:分支選擇格式:if(判斷條件p)

語句A;

else

語句B;例:注意:else部分不能單獨存在,它必須是if語句的一部分語句A、B都可以是複合語句ABp真假if(a>0)printf("a=%dispositive\n",a);elseprintf("a=%disnotpositive\n",a);if語句例:輸入一個整數,判斷奇偶#include"stdio.h"main(){inta;printf("Inputinteger:\n");scanf("%d",&a);if(a%2)printf("%disanodd\n",a);elseprintf("%disaeven\n",a);}if語句——階梯式if語句的三種形式:多分支選擇(稱為

階梯式ifelse或elseif語句)格式:if(判斷條件p1)

語句A1

elseif(判斷條件p2)

語句A2

elseif(判斷條件p3)

語句A3

else

語句A4注意:執行順序:從上向下逐個判斷條件pi,一旦發現條件pi滿足,執行Ai,並跳過剩餘的階梯最後一個else表示除了以上所有條件(p1、p2、p3)外的情況下,有時可以省略else與最近的if語句匹配A1p2p1真假真假A2p3真假A3A4if語句例:評價學生成績,規則:score>=90,Ascore>=80,Bscore>=60,Cscore<60,D#include"stdio.h"main(){intscore;printf("Inputscore:\n");scanf("%d",&score);if(score>=90)printf("%dgreedisA\n",score);elseif(score>=80)printf("%dgreedisB\n",score);elseif(score>=60)printf("%dgreedisC\n",score);else printf("%dgreedisD\n",score);printf("finish\n");

}if語句例:判斷輸入的字元是數字、大寫字母、小寫字母或其他字元。#include<stdio.h>intmain(){ charc; printf("Enteracharacter:"); c=getchar(); if(c>='0'&&c<='9') printf("Digit!\n"); elseif(c>='A'&&c<='Z') printf("Uppercase!\n"); elseif(c>='a'&&c<='z') printf("Lowercase!\n"); elseprintf("Othercharater!\n");}if語句的嵌套標準格式

if(P1)

if(P2)

A1;

else

A2;

else

if(P3)

A3;

else

A4;P1真假P2真假P3真假A1A2A3A4if語句的嵌套標準格式

if(P1)

if(P2)

A1;

else

A2;

else

if(P3)

A3;

else

A4;格式1

if(P1)

A1;

else

if(P2)

A2;

else

A3;格式2

if(P1)

if(P2)

A1;

else

A2;

else

A3;else與最近的if語句匹配

if(P1)

if(P2)

A1;

else

if

(P3)

A3;

else

A4;if語句的嵌套注意:else與最近的if語句匹配例:

if(x>0)

if(y==1)printf("1");

elseprintf("2");通過加{}可以改變else的層次例

if(x>0){

if(y==1)printf("1");

}

elseprintf("2");例:斷某一年是否是閏年(被4整除且不被100整除,或者被400整除)#include"stdio.h"main(){intyear,flag;scanf(“%d”,%year);if(year%400==0)flag=1;elseif(year%4==0) if(year%100==0)flag=0; elseflag=1;elseflag=0;if(flag) printf("%disleapyear\n",year);else printf("%disnotaleapyear\n",year);}flag=1year%4year%400真假真假

year%100真假flag=0flag=1flag=0輸入yearflag真假輸入閏年輸入非閏年例:斷某一年是否是閏年(被4整除且不被100整除,或者被400整除)#include"stdio.h"main(){intyear,flag;scanf(“%d”,%year);if(year%400==0)flag=1;elseif(year%4==0) if(year%100==0)flag=0; elseflag=1;elseflag=0;if(flag) printf("%disleapyear\n",year);else printf("%disnotaleapyear\n",year);}if(year%4!=0)flag=0;elseif(year%100!=0)flag=1;elseif(year%400==0)flag=1;elseflag=0;if(year%4==0&&year%100||year%400==0)flag=1;elseflag=0;條件運算符唯一的三目運算符格式:運算式1?運算式2:運算式3例:x=a>b?a:b

等價if(a>b)x=a;

elsex=b;優先順序:高於賦值運算賦,低於算術、條件、邏輯運算符結合方向:從右向左例:a>b?a:c>d?c:d等價a>b?a:(c>d?c:d)

switch語句和break語句switch語句:是專門用於實現多分支選擇的語句break語句:終止switch語句的執行格式:

switch語句的一般形式:

switch(運算式){

case常量運算式1:語句1

case常量運算式2:語句2

……

case常量運算式n:語句n

[default:語句n+1]

}執行過程:計算運算式若與常量運算式i一致,開始執行,直到遇到break語句或switch語句的}時結束若與所有常量運算式均不一致,執行default後的語句switch語句switch語句中的“運算式”和case後面的“常量運算式”的結果值的類型應該一致。每一個case的常量運算式的值必須互不相同,否則出現矛盾現象。各個case的出現次序不影響執行結果。執行完一個case後面的語句後,流程控制轉移下一個case繼續執行。default語句為選擇項,可有可無。另外,default後面可以不加break語句。多個case可以共用一組執行語句,如例:

case‘A’:

case‘B’:

case‘C’:printf(“>60\n”);break;Grade的值為‘A’、‘B’、‘C’時都執行同一組語句。概述迴圈結構:在給定條件成立時,反復執行某程式段,直到條件不成立為止。給定的條件稱為迴圈條件,反復執行的程式段稱為循環體。實現迴圈的四種語句用goto語句和if語句構成迴圈;(不提倡)用while語句;(while型迴圈,先判斷,再執行)用do-while語句;(先執行,再判斷)用for語句;(多功能)goto語句以及用goto語句構成迴圈goto語句功能:無條件地轉向語句標號所在的語句行出開始執行格式為:goto語句標號;語句標號:屬於識別字,命名規則與變數相同不提倡使用,會破壞結構化,例: 例:求1+2+3…+100的和

for(...)for(...){...if(disaster)gotoerror;}...er

温馨提示

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

最新文档

评论

0/150

提交评论