《新概念C語言能力教程(第2版)》全套教學課件_第1頁
《新概念C語言能力教程(第2版)》全套教學課件_第2頁
《新概念C語言能力教程(第2版)》全套教學課件_第3頁
《新概念C語言能力教程(第2版)》全套教學課件_第4頁
《新概念C語言能力教程(第2版)》全套教學課件_第5頁
已閱讀5頁,還剩1021頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第1章計算機和C語言新概念C語言能力教程(第2版)01第1章計算機和C語言02第2章基本數據類型03第3章表達式04第4章邏輯運算和選擇結構05第5章循環(huán)結構06第6章數組07第7章函數08第8章預處理09第9章指針10第10章自定義數據類型11第11章文件12第12章位運算13第13章數字化信息編碼全套可編輯PPT課件第1章計算機和C語言01程序員的工作:設計算法02程序員的工作:實現(xiàn)算法03C語言語句分析04算法可行嗎05自定義命令:函數+06C語言程序07編譯程序08printf函數的用法09觀察程序的運行過程++全套可編輯PPT課件設計算法全套可編輯PPT課件用戶、計算機和程序員用戶是計算機的使用者,提供輸入(數據),獲得輸出(結果)。但用戶通常不關心計算機把輸入變成輸出的過程。計算機是機器,只會執(zhí)行指令。程序員的工作就是設計一系列指令,指揮計算機把用戶的輸入數據加工成輸出結果。解決問題的一系列指令就是算法。結果輸出加工存儲計算機由五大部件組成結果輸出加工存儲求兩個整數的和的程序程序運行時,計算機會提示用戶輸入兩個整數。當用戶輸入完成后,計算機會求和,并把結果通過輸出設備反饋給用戶。用戶:使用鍵盤輸入兩個整數;在顯示器上得到兩個整數的和。設計算法是程序員的工作。程序員需分析求和過程中計算機要完成的操作,設計出對應的指令。求兩個整數的和的算法第一步:命令計算機在顯示器上顯示一行提示信息“請輸入兩個整數:”;第二步:(用戶輸入完成后)命令計算機把用戶輸入的數據存儲到內存中;第三步:命令計算機用運算器求和,并把和轉存到內存中;第四步:命令計算機在顯示器上輸出計算結果。求兩個整數的和的算法整理后的算法:1.在顯示器上提示用戶輸入兩個整數;2.獲得用戶的輸入,并把輸入存儲到內存中;3.運算器求和,并把計算結果轉存到內存中;4.在顯示器上輸出計算結果。小結程序員的工作就是設計算法,指揮計算機把用戶輸入的數據加工成用戶所需的輸出結果。程序員眼中的計算機由五大部件組成,算法中的每一步都與計算機的某個部件有關。1.在顯示器上提示用戶輸入兩個整數;2.獲得用戶的輸入,并把輸入存儲到內存中;3.運算器求和,并把計算結果轉存到內存中;4.在顯示器上輸出計算結果。實現(xiàn)算法C語言求兩個整數和的算法是用自然語言描述的,計算機不能理解和執(zhí)行。C語言是編程語言,計算機能夠理解并執(zhí)行C語言命令。程序員還需把求和算法翻譯成C語言語句。設計算法,即設計加工處理的步驟,是程序員的工作;實現(xiàn)算法,即把算法的每一步都翻譯成C語言語句,也是程序員的工作。1.在顯示器上提示用戶輸入兩個整數;2.獲得用戶的輸入,并把輸入存儲到內存中;3.運算器求和,并把計算結果轉存到內存中;4.在顯示器上輸出計算結果。1.在顯示器上提示用戶輸入兩個整數;C語言中使用printf函數可以“命令”計算機在輸出設備上顯示信息。此步驟可翻譯成C語言語句:printf("請輸入兩個整數:\n");C語言中以函數名加一對圓括號的方式使用函數命令。圓括號中有一對雙撇號,計算機執(zhí)行時,雙撇號中的內容就出現(xiàn)在顯示器上該程序的運行窗口中,其中\(zhòng)n代表回車鍵。C語言語句通常以分號結尾。2.獲得用戶的輸入,并把輸入數據存儲到內存中。C語言中使用scanf函數可以獲得用戶輸入的數據。scanf函數執(zhí)行時,程序通常會暫停運行等待用戶輸入。當用戶以按下回車鍵的方式表示輸入完成后,scanf函數就會獲得用戶的輸入。scanf函數的用法計算機中的數據有明確的類型,整數2和小數2.0是兩種不同類型的數據。使用scanf函數時,需向計算機明確獲得數據的類型??捎?d表示整數,可用%f表示小數,可用%c表示字符。除了數據類型,還需要明確獲得數據的個數,獲得兩個整數就用"%d%d"。最后還需明確獲得的輸入數據存放在內存中的具體地址。使用內存內存中的存儲單元用于存放數據。存儲單元分類型,整型存儲單元只能存儲整數(如2)而不能存儲小數(如2.0)。常用的存儲單元還有用于存小數的浮點型存儲單元和字符型存儲單元。存儲單元需提前申請,申請存儲單元類似于預定酒店的房間。為便于使用,程序員可以給申請的存儲單元命名。存儲單元在C語言中稱為變量。變量名由字母、數字或下劃線組成,但第一個字符不能是數字。如i,a0,sum都是合法的變量名。申請變量用語句inti;可向計算機申請一個整型的存儲單元,該存儲單元在程序中用變量i標識,即整型變量i。int是C語言中預先規(guī)定的命令,常稱為關鍵字。關鍵字int與整型或整數相關。程序中使用變量i,計算機會操作

內存中與變量i關聯(lián)的存儲單元。程序員通常只從C語言的角度

以變量的方式使用內存。使用變量語句i=5;把整數5存入整型變量i中,讀作“變量i賦值為5”。語句中的=是操作符命令,=操作符用于給變量賦值,故稱=操作符為賦值操作符。賦值之后變量i的值為5,即i==5的值為真。等于操作符==用于比較兩個值是否相等,初學者

常習慣性地將賦值操作符=讀作等于。2.獲得用戶的輸入,并把輸入數據存儲到內存中??捎谜Z句inta,b;申請兩個整型變量以存放用戶輸入的兩個整數。C語言語句scanf("%d%d",&a,&b);命令計算機獲得用戶輸入的兩個整數,并存到整型變量a和整型變量b中。語句中的&也是C語言操作符命令,用于獲得變量所標識的存儲單元在內存中的具體地址。3.運算器求和,并把計算結果轉存到內存中。讓運算器求和用+操作符。用戶輸入的兩個整數分別存在變量a和b中,用a+b即可讓運算器求出用戶輸入的兩個整數的和。用語句intc;定義一個整型變量c保存計算結果,則此步驟可翻譯成C語言語句c=a+b;,讀作變量c賦值為變量a與變量b的和。語句中有+和=兩個操作符命令。4.在顯示器上輸出計算結果。輸出結果仍需使用printf函數。語句printf("和為c");不會輸出變量c的值,只會輸出:和為c。雙撇號中的c不是變量,只是普通的字母c,雙撇號中的內容會“原樣輸出”。輸出整型變量c的值需用語句printf("和為%d",c);。其中的%d表示一個整數,與逗號后面的整型變量c對應,輸出時%d會被整型變量c的值替換。語句的執(zhí)行結果如圖最后一行所示。算法與實現(xiàn)算法1.在顯示器上提示用戶輸入兩個整數;2.獲得用戶的輸入,并把輸入數據存儲到內存中;3.運算器求和,并把計算結果轉存到內存中;4.在顯示器上輸出計算結果。對應的C語言語句inta,b,c;1.printf("請輸入兩個整數:\n");2.scanf("%d%d",&a,&b);3.c=a+b;4.printf("和為%d",c);C語言中的計算機scanf函數對應輸入設備;變量對應內存中的存儲單元;操作符對應運算器;printf對應輸出設備;C語言命令由控制器分析執(zhí)行。C語言語句分析C語言語句中的命令C語言語句用于指揮計算機工作,每條語句中都有命令。C語言命令有三種:關鍵字命令、函數命令和操作符命令。關鍵字:事先已有約定,具有特定的含義。如int與整型相關,float與小數相關,char與字符相關。語句intsum;使用關鍵字命令int向計算機申請一個整型存儲單元,即定義了一個整型變量sum。語句floatf1,f2;使用關鍵字命令float向計算機申請兩個浮點型存儲單元,即定義了兩個浮點型變量f1和f2。inta,b,c;1.printf("請輸入兩個整數:\n");2.scanf("%d%d",&a,&b);3.c=a+b;4.printf("和為%d",c);函數命令與操作符命令函數是完成特定功能的一系列指令的集合,如printf函數與輸出相關,可用于輸出數據;scanf函數與輸入相關,可用于獲得用戶輸入的數據。函數的語法特點是函數名總與一對圓括號相連。表示命令的一些符號稱為操作符命令,如+,-,*,/分別用于命令計算機的運算器求和,求差,求積,求商。個別常見符號在C語言有特殊的含義,如數學上的=在C語言中表示賦值,是賦值號。i=5;變量i賦值為5;i==5;變量i等于5。操作符命令&可用于求變量相關的存儲單元在內存中的實際地址。C語言語句中的字符(串)根據是否位于一對雙撇號內可將字符(串)分成兩類。在一對雙撇號內的字符通常為生活中的普通字符。如"abc"就是字母a,字母b和字母c;"="就是等號。少數特殊的字符串有特定的含義,如\n常表示回車鍵;%d表示一個整數。不在一對雙撇號內的字符(串)是C語言的語言成分,用于表示命令或標識存儲單元,是關鍵字、函數或變量。關鍵字是規(guī)定好的字符串。函數常與小括號相連。inta,b,c;1.printf("請輸入兩個整數:\n");2.scanf("%d%d",&a,&b);3.c=a+b;4.printf("和為%d",c);C語言語法規(guī)則1.C程序書寫格式自由。但是在多數情況下,一行寫一條語句。2.C語言語句以分號結束。3.關鍵字是C語言中預先定義了的有特定功能的標識符,不能作為變量或函數的名字。4.C語言中使用英文符號(半角符號),如不能把語句結束標志的分號“;”誤作中文的標點符號“;”(全角符號)?!癈trl+空格鍵”可用于中英文輸入法的切換。C語言語法規(guī)則5.注釋是對程序中的內容提供解釋說明,方便程序的閱讀和理解,不會被執(zhí)行。注釋內容用/*和*/界定。注釋可單行也可多行。/*這是一個單行注釋的示例*//*

這是一個

多行注釋的示例

*/VC6.0中單行注釋也可用//。scanf("%d%d",&a,&b);//操作符命令&用于獲得變量在內存中的具體地址思考題分析下列語句的組成和作用。1.floatx,y;2.printf("請輸入一個小數:\n");3.scanf("%f",&x);4.y=-x;//操作符命令-用于求相反數5.printf("%f的相反數是%f\n",x,y);求一個整數的絕對值,

算法可行嗎?求一個整數的絕對值的算法第一步:提示用戶輸入一個整數;第二步:獲得用戶的輸入,并把輸入數據存儲到內存中;第三步:求出絕對值,并把它轉存到內存中;第四步:在顯示器上輸出絕對值。算法中需要定義兩個整型變量保存數據。實現(xiàn)算法用intm,n;定義兩個整型變量m和n。第一步:提示用戶輸入一個整數;可翻譯成printf("請輸入一個整數:\n");第二步:獲得用戶的輸入,并把輸入數據存儲到內存中;可翻譯成scanf("%d",&n);第三步:求出絕對值,并把它轉存到內存中;求整型變量n的絕對值用什么命令呢,關鍵字,操作符,還是函數?若沒有求絕對值的C語言命令,則這個求絕對值算法就不可行。關鍵字命令和操作符命令沒有可用于求一個整數絕對值的關鍵字。C語言操作符表中也找不到求絕對值的操作符命令。運算器只能進行基礎的算術運算,比如加減乘除,不會直接求一個整數的絕對值。從關鍵字命令和操作符命令的角度分析,這個算法不可行。算法中求絕對值的步驟需要進一步分解,當分解后的每個步驟都能用關鍵字命令或操作符命令實現(xiàn)時,算法才可行。函數命令函數是完成特定功能的一系列指令的集合。abs函數的功能是求一個整數的絕對值。用abs(-3)可求出整數-3的絕對值。abs函數指揮計算機執(zhí)行定義好的指令序列,得到-3的絕對值3,最后把整數3作為abs(-3)的執(zhí)行結果。第三步:求出絕對值,并把它轉存到內存中;可翻譯成m=abs(n);使用函數命令可以讓計算機執(zhí)行定義好的指令序列完成特定功能,提高程序開發(fā)的效率。實現(xiàn)算法第四步:在顯示器上輸出絕對值??煞g成printf("%d的絕對值為%d",n,m);雙撇號中第一個%d會被變量n的值代替;第二個%d會被變量m的值代替。求一個整數的絕對值算法第一步:提示用戶輸入一個整數;第二步:獲得用戶的輸入,并把輸入數據存儲到內存中;第三步:求出絕對值,并把它轉存到內存中;第四步:在顯示器上輸出絕對值。對應的C語言語句intm,n;printf("請輸入一個整數:\n");scanf("%d",&n);m=abs(n);printf("%d的絕對值為%d",n,m);自定義命令:函數自定義命令:函數函數是完成特定功能的一系列指令的集合。函數實現(xiàn)的功能通常都需要復雜的算法,不需要重新設計和實現(xiàn)算法,只需借助函數名就可以使用已經定義好的算法,完成特定的功能,因此,函數極大地提高了程序開發(fā)的效率。如使用printf函數在顯示器上輸出信息,使用scanf函數獲得用戶的輸入等。printf("Hello,World!\n);,scanf("%d%d",&m,&n);。函數由程序員定義,因此,函數又稱為自定義命令。求兩個整數的和的函數定義函數時,根據功能,程序員先設計算法,再按照函數的語法實現(xiàn)算法。下面以求兩個整數的和的函數為例來介紹定義函數的語法。若給函數起名為sum,則用sum(5,3);可求出整數5和3的和,程序員在使用函數時會直接提供輸入數據,因此,函數中無需用scanf函數獲得輸入。sum函數需定義兩個整型變量保存輸入數據,即兩個加數,還要約定一個整型存儲單元存放函數的執(zhí)行結果,即和。sum函數定義的第一行為intsum(intx,inty)sum函數的首部函數首部即函數定義的第一行,格式為:

函數返回值類型函數名(函數的參數)函數返回值即函數的執(zhí)行結果,也稱為函數值。函數返回值類型規(guī)定了函數會返回什么樣的數據。sum函數中返回值類型int申請了一個匿名的int型存儲單元,函數執(zhí)行完畢,函數的使用者在這個匿名的存儲單元中獲得函數的執(zhí)行結果。函數的參數是指首部圓括號中定義的變量,用于存儲函數需處理的輸入數據。intsum(intx,inty)sum函數的函數體函數定義由兩部分組成:函數的首部和函數體。函數體緊接函數的首部,由一對花括號界定。函數執(zhí)行時,函數體中的語句序列會自上而下依次執(zhí)行。函數體中的算法將參數中存儲的輸入數據加工成輸出結果,并將最終的結果返回到約定的匿名存儲單元中。求和函數sum的輸入在參數x與參數y中存儲,

函數體中求出變量x和變量y的和即可。intsum(intx,inty){

intz;z=x+y;returnz;}return關鍵字語句returnz;中的return是C語言關鍵字。return命令用于立即結束函數的執(zhí)行,函數體中return語句后面的語句不會再執(zhí)行。沒有return命令時,函數將自上而下依次執(zhí)行語句,在界定函數結束的右花括號處返回。語句returnz;結束函數的執(zhí)行,并將

變量z的值作為函數的執(zhí)行結果,

存入約定的匿名存儲單元中。intsum(intx,inty){

intz;z=x+y;returnz;}函數調用sum(5,3)的執(zhí)行過程1.把輸入數據存入參數(變量);2.函數體中語句自上而下依次執(zhí)行;2.1定義整型變量z2.2求和,并轉存到變量z中,2.3結束函數的執(zhí)行,并將z的值返回,3.函數執(zhí)行完畢,約定的整型存儲單元的值為8,即函數的返回值為8。intsum(intx,inty){

intz;z=x+y;returnz;}sum函數函數的功能體現(xiàn)為由輸入(3和5)得到輸出(8)。思考題分析比較sum函數命令與操作符命令+。1.sum函數由程序員定義,是自定義命令;而操作符命令+由C語言提供;2.sum函數和+操作符的功能均為求和,但sum函數命令只能求兩個整數的和,而+操作符還可以求兩個小數的和,如1.2+2.3;sum函數的功能是多余的,定義sum函數的目的是學習定義函數的語法,分區(qū)函數執(zhí)行的過程。思考題1.語句8;中有命令嗎?這條語句會怎么執(zhí)行?怎樣理解函數調用sum(3,5)的執(zhí)行結果?2.分析語句printf("%d",sum(3,-5));的執(zhí)行順序及結果;3.用兩次+操作符可求3個數的和,如1+2+3,用sum函數怎樣求1,2,3的和?sum(1,sum(2,3))或sum(sum(1,2),3)C語言程序C語言程序C語言程序由函數組成。C語言規(guī)定,程序中必須有且僅有一個名為main的函數。main函數即主函數,C語言程序從main函數開始運行,main函數執(zhí)行完畢,程序運行結束。對于初學者,可簡單地認為main函數沒有返回值,即函數的返回值類型為空,用關鍵字void表示。main函數的首部voidmain()。圓括號中沒有定義參數表明main函數不需要輸入,使用函數時也只用一對圓括號,如main(),不能有輸入數據。求兩個整數的和的程序將求兩個整數的和的C語言語句置于main函數的函數體中,就可以得到求兩個整數的和的程序。inta,b,c;1.printf("請輸入兩個整數:\n");2.scanf("%d%d",&a,&b);3.c=a+b;4.printf("和為%d",c);printf函數和scanf函數的定義printf函數和scanf函數由C語言提供,可以簡單地認為它們在stdio.h文件中定義。(std-standard標準;io-input/output輸入輸出;h-header

頭;即標準輸入輸出頭文件)C語言中,函數需先定義再使用。先找到stdio.h文件,再找到printf函數和scanf函數的定義,把這兩個函數的定義拷貝到main函數定義的前面,就可以在main函數中使用了。使用庫函數C語言提供的函數又稱為庫函數。使用庫函數printf函數和scanf函數時,只需在程序中加入#include<stdio.h>即可引入函數的定義。#include的作用是找到尖括號中的文件,并用文件內容替換掉該行代碼。完整的程序如圖所示。abs函數也是庫函數abs函數也是庫函數,在math.h(即數學庫)中定義。數學庫中還有求平方根的sqrt函數,求正弦值的sin函數等。求一個整數的絕對值的完整程序如下所示。思考題討論求兩個整數的和的程序與求兩個整數的和的函數的異同intsum(intx,inty){

intz;z=x+y;returnz;}思考題程序與函數的異同1.相同點:兩者功能相同,程序和函數都可以求出兩個整數的和;它們都需要兩個整數作為輸入,它們都會輸出一個整數作為結果。2不同點:2.1使用者不同,

程序的使用者是用戶;函數的使用者是程序員;程序與函數的異同2.2獲得輸入數據的方式不同程序借助scanf函數獲得用戶通過輸入設備提供的輸入;函數借助參數獲得程序員直接提供的輸入;2.3提供輸出結果的方式不同程序借助printf函數在輸出設備上顯示結果讓用戶查看;函數把結果存入約定的匿名存儲單元中讓程序員(調用函數)使用;編譯程序編譯程序計算機只能理解執(zhí)行用機器語言編寫的程序。C語言是高級語言,用高級語言編寫的程序稱為源程序。盡管計算機不能直接執(zhí)行C語言程序,但由于利用編譯程序可以方便地將C語言程序翻譯成機器語言程序,由此認為計算機能理解并執(zhí)行C語言程序。本書利用VC6.0編譯C語言源程序。VisualC++6.0(簡稱VC6.0)VC6.0是微軟公司提供的在Windows環(huán)境下進行應用程序開發(fā)的C/C++編譯器系統(tǒng)。VC6.0中編譯程序先新建工程再新建源文件最后編譯執(zhí)行。新建工程1.選擇正確的工程類型2.輸入工程名稱選擇默認的控制臺程序的類型,即“空工程”查看新建工程信息匯總新建一個工程名為1的空控制臺程序后VC6.0的界面再次單擊文件菜單中的新建命令此時會彈出新建對話框并自動定位到文件標簽。選擇文件類型,輸入文件名可以在編輯窗口輸入程序了再次編譯其它程序一個工程只能有一個main函數,再次編譯其它程序之前需要關閉當前工程。單擊文件菜單,選擇“關閉工作空間”命令,即可關閉當前工程。編譯程序時遇到錯誤編譯程序時遇到錯誤,首先在信息輸出窗口找到第一個錯誤提示,接著用鼠標左鍵雙擊該提示,此時編程器會自動定位出現(xiàn)錯誤的位置,最后就是結合錯誤提示信息細心查找出錯原因了。修正一個錯誤后通常要再次嘗試運行程序,不要急著修改下一個錯誤。printf函數的用法標識起始位置的光標程序運行窗口中閃爍的光標是輸入或輸出的起始位置,程序開始運行時,標識起始位置的光標位于窗口中的第一行第一列。當用戶輸入數據或程序中使用printf函數輸出數據時,光標會自動調整位置,它始終指示下一次輸入或輸出的起始位置。printf函數從光標指示的位置開始輸出數據。分析下面程序的輸出。特殊字符組合使用printf函數時,一對雙撇號內的字符會原樣輸出,但有兩類特殊的字符組合例外。反斜杠\和下一個字符的組合稱為“轉義序列”,有著特殊的含義。如\"表示一個雙撇號";\\表示一個反斜杠\;\n在VC6.0中表示回車鍵。語句printf("Hi,\nWelcometoC!");的輸出結果如圖所示。思考題請用printf函數分別輸出如圖所示的字符串。printf("\"");printf("\\n");printf("\"C\"");占位序列占位序列可用于輸出數據,由百分號%和相鄰的字符組成。遇到占位序列時,printf函數會用對應位置上的數據代替占位序列。語句printf("%d\n",3+2);中的+操作符命令讓計算機求出3與2的和,即5;原語句轉化為printf("%d\n",5);,執(zhí)行結果為5↙。↙表示回車。格式字符串不同類型的數據需用不同的占位序列,整數用%d,浮點數用%f,字符用%c,因此,占位序列也稱格式字符串。語句printf("%f",1.1+2.2);的輸出結果為3.300000。printf函數輸出小數時,小數點后默認有6位。分析下面程序的執(zhí)行結果分析下面程序的執(zhí)行結果思考題:分析printf函數的輸出結果printf("%d",3);printf("3");printf("%d",3+5);

printf("3+5");printf("%d\n",3+5);printf("3+2=%d\n",3+2);3383+58↙3+2=5↙觀察程序的運行過程++分析下面程序的運行過程程序的兩種運行方式在VC6.0中程序有兩種方式:執(zhí)行(快捷鍵Ctrl+F5)和調試執(zhí)行(快捷鍵F5)。執(zhí)行程序時,程序中的語句會連續(xù)執(zhí)行。調試執(zhí)行程序時,遇到含有斷點的語句,程序就會暫停執(zhí)行。若程序中沒有“斷點”,則調試執(zhí)行時,程序會連續(xù)執(zhí)行。插入斷點插入斷點調試執(zhí)行程序程序在斷點處暫停執(zhí)行調試工具欄暫停程序執(zhí)行后,可以通過調試工具欄控制程序的執(zhí)行過程常用的有三個命令:StopDebugging結束調試執(zhí)行,回到編輯源程序狀態(tài)StepInto單步執(zhí)行程序,即程序執(zhí)行“一條語句”后再次進入暫停狀態(tài)。StepOver也是單步執(zhí)行程序,但語句中有函數調用時,StepOver會連續(xù)執(zhí)行被調用函數,而StepInto會調試執(zhí)行被調用函數。單步執(zhí)行(StepInto)快捷鍵F11程序執(zhí)行完語句a=23;后,再次暫停。函數調用sum(a,b)函數調用sum(a,b)函數執(zhí)行的過程:1.對輸入求值;sum(a,b)實為sum(23,-5)2.把值存儲到參數中sum函數中參數也是變量x的值變?yōu)?3,變量y的值變?yōu)?5。3.main函數暫停執(zhí)行,自上而下依次執(zhí)行sum函數函數體中的語句執(zhí)行函數調用sum(a,b)執(zhí)行函數調用sum(a,b)main函數即將繼續(xù)執(zhí)行調試庫函數?沒有必要調試執(zhí)行庫函數第14行語句將調用執(zhí)行printf函數,如果使用StepInto命令(按下快捷鍵F11),則將調試執(zhí)行printf函數。沒有必要調試執(zhí)行庫函數,因此,這里應使用StepOver命令(快捷鍵F10)來進行單步調試執(zhí)行。結束調試執(zhí)行C語言教程第2章基本數據類型01存儲單元的特點02整型03整型字面量04整型的輸入輸出05scanf函數的用法+06整型的使用07浮點型08字符型09字符型的輸入輸出10再談printf函數11典型例題存儲單元的特點二進制計算機采用二進制。二進制數最容易實現(xiàn),如用開關的接通表示1,斷開表示0。一個開關可表示一位(bit),如圖所示的數據是01011010,共8位。8(23)位一組,稱為字節(jié)(Byte)。字節(jié)用B表示,位用b表示,如4B=32b。常用的其它單位還有KB,MB和GB。1KB=210B,1MB=220B,1GB=230B計算機內存中的存儲單元以字節(jié)為單位。編碼和解碼現(xiàn)實世界中的數據轉換成由0和1組成的二進制串,計算機才能存儲和處理。由數據得到01串稱為編碼;由01串得到數據稱為解碼。每類數據都各有特點,只用一種編碼規(guī)則統(tǒng)一編碼是不現(xiàn)實的。不同類型的數據如整數和小數,采用了不同的編碼規(guī)則。多種編碼規(guī)則導致不同數據的編碼結果可能相同,因此,只有確定了編碼規(guī)則,才能正確解碼。解碼數據編碼規(guī)則不同,就會出現(xiàn)整數90、小數0.703125和字符Z編碼后的01串都是01011010。解碼01011010時顯然需要知道編碼規(guī)則,即存儲單元的類型。若是整型存儲單元,則值為90;若是浮點型存儲單元,則值為0.703125;若是字符型存儲單元,則值為字符Z。由于編碼規(guī)則不同,整型存儲單元只能存儲整數2,不能存儲小數2.0?;蛘哒f整型存儲單元只按整型的編碼規(guī)則解碼,結果只會是整數。變量的類型計算機內存中的存儲單元在C語言中用變量標識。變量的類型就是相關存儲單元的類型,也就是編碼規(guī)則。申請變量時,需明確變量的類型。每個變量都有確定的類型,因此,變量的值總是確定的。編程時,通常無需考慮編碼結果,即計算機內存中實際存儲的01串。若有inta=90;,則C語言中變量a的值就是90。存儲單元的長度為便于計算機存取數據,同類型存儲單元的長度相同。若存儲單元的長度為1個字節(jié),則可存儲的數據從00000000至11111111,一共有256(28)種狀態(tài)。一種狀態(tài)對應一個數,1B的存儲單元可存儲的數只有256個。確定長度的存儲單元能存儲的數據的個數固定,因此,變量的取值范圍有限。4個字節(jié)的存儲單元若存儲單元的長度是4個字節(jié),則有232

(232=4294967296)種狀態(tài),可存儲的數有232個。用于存儲整數時,整數的取值范圍可能是0到232-1;也可能是-216至216-1。用于存儲小數時,232個小數實在太少了。盡管0.1至0.2間就有無數個小數,但常用到的0.1至0.2間的小數并不多。C語言中變量的取值范圍有明確的規(guī)定。思考題分析C語言中的變量a與數學中的未知數x的異同。不同點:變量a是具體的,有關聯(lián)的存儲單元;未知數x是抽象的。變量a有類型限制,有取值范圍的限制;未知數x可表示任何一個數。相同點:都是字母代表“數”。整型short型short型,短整型,是shortint的簡寫。short型變量長度2個字節(jié),取值范圍-215至215-1,-32768至32767。語句shorta=-1;定義了一個短整型變量a,且變量a被初始化為-1,即變量a的值是-1。分析語句a=50000;。整數可以賦值給整型變量,這條語句沒有語法錯誤,可以執(zhí)行。但50000超出了變量a的取值范圍,賦值后,short型變量a的實際值不可能是50000。這條語句有邏輯錯誤。unsingedshort型unsingedshort型,無符號短整型,是unsignedshortint的簡寫。編碼長度也是2個字節(jié),但取值范圍0至216-1,即0至65535。語句unsingedshortu=50000;定義了一個無符號短整型變量u,且被初始化為50000,即變量u的值為50000。語句正確,既沒有語法錯誤,也沒有邏輯錯誤。long型long型,長整型,是longint的簡寫。long型變量的長度為4個字節(jié),取值范圍-231至231-1,約為-21億至21億。語句long

m=-50000;定義了長整型變量m,且被初始化為-50000,即變量m的值為-50000。在VC6.0中,int型與long型相同,長度4個字節(jié),取值范圍是-231至231-1。unsignedlong型unsignedlong型,

無符號長整型,是的unsingedlongint的簡寫。編碼長度4個字節(jié),取值范圍0至232-1,即0至4294967295。語句unsingedlongul=-2;定義了一個無符號長整型變量ul,且被初始化-2。這條語句有邏輯錯誤,ul的值不會是-2。unsignedint,無符號整型,在VC6.0中長度也是4個字節(jié),與unsignedlong相同。整型小結類型名稱簡稱取值范圍長度整數的個數shortshort有符號短整型短整型-32768~327672個字節(jié)65536unsignedshort無符號短整型無0~65535longlong有符號長整型長整型-231~231-14個字節(jié)232unsignedlong無符號長整型無0~232-1intint有符號整型整型-231~231-14個字節(jié)232unsignedint無符號整型無0~232-1思考題:分析下面的語句有無邏輯錯誤。shortsum=-23;unsignedshorta2=50000;longb=65536;unsignedlongul=-5;整型字面量字面量字面量是固定值的表示方法。語句a=sum+23;中,23就是一個整型字面量。字面量也需存儲,字面量的類型就是存儲字面量的存儲單元的類型。VC6.0中,整型字面量是int型。已知longa,sum=5;,分析語句a=sum+2300000000;。int型字面量23億超出了int型的取值范圍,因此,這條語句有邏輯錯誤。沒必要分析邏輯錯誤的語句的執(zhí)行結果。分析字面量2300000000和2300000000u整數23億的類型是int型,int型的值不會是23億,這個字面量有邏輯錯誤。字面量2300000000u中的u稱為后綴,后綴u表示需用unsignedint型存儲單元存放該整型字面量。unsignedint型的取值范圍0到42億,因此,字面量2300000000u的實際值就是23億,沒有問題。也可寫作2300000000U。用作后綴時,u和U沒有區(qū)別。例2-1

C語言中,-1u大于0嗎?-1是負數,后綴u表示字面量-1是無符號數,而無符號數不會是負的,-1u這種寫法似乎有問題。計算機中沒有負號,只有編碼后的01串。-1u表示用unsignedint存儲單元存儲-1的編碼。-1的編碼非常特殊是32個1。int型時,32個1的值是-1;unsignedint型時,32個1的值是最大的整數,232-1。因此,常用-1u表示最大的整數。注意:只可用-1u表示最大的整數,-2u就有邏輯錯誤。整型字面量的前綴整型字面量默認是十進制,可以用前綴改變進制。前綴為0的整數是八進制數。027=2×8+7×1=23前綴為0x或0X的整數是十六進制數。0x17=1×16+7×1=23語句inti=027,j=0x17,k=0X17;定義了三個整型變量i、j、k,且它們的值都被初始化成了23。思考題:分析下面語句有無邏輯錯誤。shortm=65535;longn=65535;變量m不能取值65535,語句有邏輯錯誤。變量n的值為65535。unsignedshorti=-1u;longj=-1;變量i的值是65535,即短整型中最大的整數。變量j的值是-1。unsignedshorta=-2;shortb=32768;兩條語句都有邏輯錯誤。無符號變量a不能取負值。32768超出了短整型變量b的取值范圍。整型的輸入輸出格式字符串scanf函數和printf函數常見的調用方式為scanf(格式字符串,輸入列表)和printf(格式字符串,輸出列表),其中的格式字符串需和數據的類型相匹配。int型用d,short型用hd,long型用ld,unsignedint型用u,unsignedshort型用hu,unsignedlong型用lu。其中的l(long)和h(short)稱為長度修飾符,是附加的格式說明符。格式字符串與數據類型unsignedshorta=-1u;語句printf("%hu",a);中格式字符串hu(無符號短整型)準確地匹配了變量a的類型,printf函數正確地輸出變量a的實際值65535。語句printf("%hd",a);中格式字符串hd(短整型)與變量a的類型不匹配,printf函數不會輸出a的實際值。這條語句有邏輯錯誤。語句printf("%ld",2200000000);中由于22億超出了長整型ld的取值范圍,故printf函數的輸出結果不會是22億。這條語句有邏輯錯誤。分析下面語句的輸出結果。printf("%lu",2200000000);printf("%ld",-1);printf("%lu",-1u);printf("%hd",-1);printf("%hu",-1u);printf("%hu",-2);格式字符o和x格式字符d對應于十進制的有符號整型,格式字符u對應于十進制的無符號整型。格式字符o(或O)對應于八進制整型。遇到格式字符o時,printf函數會以無符號整型解碼數據并以八進制形式輸出。格式字符o可用于查看整數的編碼。格式字符x(或X)對應于十六進制整型。scanf函數的用法輸入緩沖區(qū)用戶的輸入會保存在一塊稱作輸入緩沖區(qū)的內存中,scanf函數從輸入緩沖區(qū)中讀取數據。當輸入緩沖區(qū)中有數據時,scanf函數會直接從輸入緩沖區(qū)中取走數據。只有輸入緩沖區(qū)中沒有數據時,程序才會暫停執(zhí)行,等待用戶向輸入緩沖區(qū)中輸入數據。當用戶輸入完成后,scanf函數會再次嘗試從輸入緩沖區(qū)中讀取數據。如何編程測試呢?scanf函數識別數據scanf函數會根據格式字符串,依次匹配輸入的數據,遇到回車和空格時,正常結束識別;遇到非法數據時,也會結束識別,且使用已成功識別的數據。scanf("%d%d",&a,&b);,當用戶輸入2332↙時,%d對應整數,依次匹配2,3,遇到空格時,正常結束一次識別,整數23賦值給變量a。接下來匹配第2個%d,先匹配空格,忽略,接著匹配3,2,遇到↙時,正常結束一次識別,整數32賦值給變量b。scanf函數會從輸入緩沖區(qū)中取走識別成功的數據。識別舉例shortm=3;scanf("%hd",&m);當用戶輸入-2↙時,識別成功,變量m的值變?yōu)?2。當用戶輸入x16↙時,非法的x導致匹配失敗,識別結束,沒有成功的匹配,變量m值不變,仍為3。當用戶輸入16x↙時,非法的x導致匹配失敗,識別結束,變量m值變?yōu)橐殉晒Φ淖R別的16。當用戶輸入32789↙時,全部識別成功,但短整型變量m的實際值不會是32789,用戶的輸入“非法”。有shorti,j,k;

scanf("%ho%hx%hX",&i,&j,&k);,當用戶輸入78956↙時,分析變量i,j,k的值。由格式字符串可知,輸入應為一個八進制整數和兩個十六進制整數。第一次識別時,八進制數,字符7合法,字符8非法,識別結束,變量i的值為7。第二次識別時輸入緩沖區(qū)中有8956↙。8合法,9合法,遇到空格,結束本次識別,故變量j的值為137(0x89=8×16+9=137)。第三次識別后,變量k的值為5。識別舉例有inta,b;

scanf("%d%d",&a,&b);,當用戶輸入0x17027↙時,變量a和b的值是多少?由格式字符串可知,輸入應為兩個十進制整數。第一次識別時,0合法,x非法,本次識別結束,變量a的值為0。第二次識別時,輸入緩沖區(qū)中有x17027↙。x非法,本次識別結束,由于沒有成功的匹配,故變量b的值沒有改變。再談格式字符串輸入數據需嚴格匹配格式字符串。格式字符串為"%d%d"時,輸入應為兩個十進制整數,可用空格或回車分隔。格式字符串為"%d,%d"時,輸入應為一個十進制整數一個逗號和一個十進制整數。正確的輸入類似于27,17↙。思考題有inta,b;

scanf("%d,%d",&a,&b);,

用戶輸入2717↙時會怎樣識別?遇到空格時,識別結束,變量a的值是27。再次識別時,空格與逗號不匹配,非法數據,結束識別。變量b的值沒有改變。格式字符串為"%d\n"時,什么樣的輸入才能匹配成功?整型的使用整型的選用short,long,unsignedshort和unsignedlong變量的取值范圍不同,編程時先根據算法確定需存儲數據的取值范圍,然后再選用合適的整型變量。需用整型變量保存學生的數學成績,選用short型變量即可,當然也可以選用long型。某個車間的月產量可用unsignedshort型變量,年產量可用unsignedlong型變量。整型數據的輸入輸出輸入輸出整型數據時一定要選用匹配的格式字符串。d對應于有符號的十進制整數;u對應于無符號的十進制整數;O(O)對應于八進制整數;x(X)對應于十六進制整數;只有使用匹配的格式字符串,printf函數才能輸出數據的實際值。整數乘法C語言中用星號(*)代替乘號(×)。變量n乘2時不能省略乘號,需寫成2*n或n*2。若有short

n=20000;,分析語句n=n*2;變量n乘2的積是40000,而short型變量n的取值范圍是-32768至32767,40000賦值給變量n有邏輯錯誤。整數除法的商C語言中用斜杠(/)代替除號(÷)。兩個整數進行除法運算,商只保留整數部分,小數部分會被截掉。3/2的商為1,2/3的商為0,3/-2的商為-1。直接去掉商的小數部分,正數變小,負數變大,即“向零取整”。整數除法的余數求余操作符%可求出兩個整數相除的余數。3%2的值是1,即3除以2的余數為1。4%2的值是0。求余操作符%只用于整數,不能用于小數。3%-2的值可根據余數=被除數-商×除數求得,3/-2=-1,

3%-2=3-(-1)×(-2)=1。-1u是最大的整數-1u是最大的整數,可用于給無符號整型變量賦值。若有unsignedshortui=-1u;unsignedlonguj=-1u;,則變量ui的值為65535,變量uj的值4294967295。上述賦值語句也可簡寫為unsignedshortui=-1;unsignedlonguj=-1;,但可讀性變差。-1u是特殊用法。用超出取值范圍的整數給整型變量賦值時,賦值語句多有邏輯錯誤。思考題求-3%2和-3%-2的值?!?3/2=-1,∴-3%2=-3–2*(-1)=-1∵-3/-2=1,∴-3%-2=-3–(-2)*1=-1浮點型浮點型簡介浮點型變量用于存儲小數。常用的浮點型有兩類:float型和double型。float型長度4個字節(jié),又稱為單精度;double型長度8個字節(jié),又稱為雙精度。與整型不同,浮點型的取值范圍非常大。類型字節(jié)精度取值范圍float(單精度)46~7-3.4×10-38~3.4×1038double(雙精度)815~16-1.7×10-308~1.7×10308浮點型的精度小數在計算機中多為近似數。float型變量存儲小數時,精度至少可以保證6位或7位。double型變量的精度至少可以保證15位或16位。例2-6有floatf=0.1;doublelf=0.1;,通過輸出可知單精度變量f和雙精度變量lf的實際值如圖所示。浮點型字面量浮點型字面量有兩種:一般形式的字面量,如0.25,-3.0,和指數形式的字面量。為便于輸入輸出,指數形式的字面量省略了底數10,并用e或E把小數部分與指數隔開。如-1.23×10-2可寫作-1.23e-2,0.023×103可寫作0.023E3。浮點型字面量默認是雙精度數,可加后綴f或F改為單精度數。如0.25是雙精度數占8個字節(jié),而0.023E3F是單精度數占4個字節(jié)。浮點型數據的輸入格式字符f、e和E對應于單精度浮點型;雙精度浮點型須在格式字符前面加長度修飾符l。用戶輸入小數時可用一般形式,也可用指數形式。當輸入12時,會被識別成浮點數12.0。輸入時,格式字符f、e和E沒有區(qū)別,三者可互換使用。例2-7浮點型數據的輸入用戶輸入小數時,缺少整數部分或小數部分的浮點數也可正確識別,如.8或2.被識別成了0.8和2.0。浮點型數據的輸出輸出時,格式字符f、e或E不同。格式字符f以一般形式輸出浮點型數據,且默認小數點后有6位。格式字符e或E以規(guī)范的指數形式輸出浮點型數據,兩者不同之處在于是用e還是用E分隔小數部分和指數部分。規(guī)范的指數形式中,小數部分的絕對值大于0小于10;指數部分與編譯程序相關。VC6.0中,指數2會輸出成+002。例2-8浮點型數據的輸出變量fa的輸出結果是123.789001,其小數點后第6位是1,與單精度的精度至少是6位或7位不矛盾。浮點型的精度是指規(guī)范指數形式中小數部分的精度??刂聘↑c型數據輸出中小數點后面的位數在%和格式字符f、e或E之間插入.n形式的修飾符,其中n為正整數,輸出時小數點后面會有n位,第n+1位四舍五入。123.789對應格式字符串"%.1f"的輸出為123.8,小數點后第2位四舍五入。盡管可以輸出浮點型數據全部的小數部分,但超出精度的小數部分沒有實際意義。思考題計算機中0.1×6的積一定是0.6嗎?字符型字符C語言中的字符是指英文字符,包括英文字母、數字、標點符號、運算符號(+,-,*,/)等。編碼字符時會對字符排序編號,編號的編碼就是字符的編碼。如字符0的編號是48,則48就是字符0的編碼,48號字符就是字符0。C語言中字符用ASCII碼。ASCII碼表中字符編碼從0至127,共編碼了128個字符。字符型長度1個字節(jié)。關鍵字char定義字符型變量用關鍵字char。語句chara;就定義了一個字符型變量a,長度為1個字節(jié)。語句a='a';把字母a存入字符型變量a中。C語言語句中的單個字母應理解為變量名或函數名,因此,字符型字面量需加一對單撇號予以區(qū)分。語句a=a;把變量a的值賦給變量a;語句a='a';把字母a存入變量a中。字符型變量的值語句a='a';執(zhí)行后,字符型變量a的值就是字母a,但由字符型編碼規(guī)則可知,變量a存儲的是字符a的編碼(編號)。查表可知字母a的編碼是97,變量a實際上存儲的是整數97,但由于變量a是字符型,故變量a的值是97號字符,即字母a。語句charcb='A';執(zhí)行后,字符型變量cb的值就是字母A。查表可知,字母A編碼是65,因此,字符型變量cb的值是65號字符,即字母A。不必記字符的編碼,字符型變量a的值是字母a,而非其編號。例2-11比較語句shorti=9;和語句charc='9';。短整型變量i,兩個字節(jié),值是整數9。字符型變量c,一個字節(jié),值是字符9。i*10就是9*10,值為90。c*10為'9'*10,盡管執(zhí)行時會用字符9的編碼(57)乘10,但由于字符作乘法沒有實際意義,且結果也不是90,因此,這個表達式有邏輯錯誤。例2-12字符型變量ca中存儲了一個大字字母,怎么將其轉換為小寫字母呢?若ca中存儲了'A',則需將其轉換為'a'。查表可知,'A'的編號65,'a'的編號97,大小寫字母轉換其實就是將ca的存儲狀態(tài)由65變成97,即由65號字符變成97號字符,所以用語句ca=ca+32;就可以完成轉換。由于每個大寫字母的編碼比其小寫字母的小32,因此,無論變量ca中存儲了哪個大字字母,語句ca=ca+32;都可將其轉換為小字字母。字符型變量的值是字符,但實際存儲了字符的編號,可以進行算術運算,需強調的是字符參與算術運算時一定要有實際意義。編碼形式的字符型字面量可以直接使用編碼表示字符。用編碼表示字符時,編碼須為八進制形式或以x開頭的十六進制形式,并以反斜杠\開頭。語句charca='\10';把字符型變量ca初始化為8號字符。(010=1×8+0=8)字符型字面量'\x30'是48號字符,即字符0。(0x30=3×16+0=48)ca=

'0';也可寫為ca='\x30';,但前者的可讀性顯然更好。字符型字面量'\0'是0號字符。轉義序列用編碼直接表示字符,既難記,可讀性又差。對那些經常使用但又只能用編碼表示的字符,可以用第1章講到的轉義序列表示。序列含義ASCII碼等價形式\b退格,將輸入輸出光標移到本行的前一列8\10(\x8)\t相當于按下Tab鍵,將輸入輸出光標移到下一個第8*n+1列9\11(\x9)\n換行,將輸入輸出光標移到下一行的第一列10\12(\xa)\r回車,將輸入輸出光標移到本行的第一列13\15(\xd)\'單撇號(')39\47(\x27)\"雙撇號(")34\42(\x22)\\反斜杠(\)92\134(\x5c)字符串C語言中用一對雙撇號界定字符串。由七個字符'9'、'

'、'A'、'\''、'\12'、'*'和'\\'組成的字符串可寫作"9A\'\12*\\"或"9A'\12*\\"。printf函數只是輸出一個字符串。如語句printf("3+5=%d\n",3+5);執(zhí)行時會得到一個字符串"3+5=8\n",然后printf函數依次輸出每個字符。字符和字符串是字面量,而非C語言中用于標識存儲單元或函數的標識符。思考題分析下面語句或表達式的作用。

(1)ca=ca–'a'+'A';字符型變量ca中存儲了一個小寫字母

(2)('9'-'0')*10+('8'-'0')(1)ca–'a'求出了變量ca中的小寫字母與字母'a'的偏移量,再加上'A'即可得到對應的大寫字母。'c'–'a'的值是2,2+'A'即是'C'。將字符型變量ca中的小寫字母轉換為大寫字母。(2)('9'-'0')*10中'9'-'0'得到了兩個字符的偏移量,即整數9,再乘10,結果是90。由字符'9''8'得到整數98。

字符型的輸入輸出字符型數據的輸出與字符型數據對應的格式字符是c。charca='9';,則語句printf("%c",ca);的輸出結果是9。語句printf("%c",'A');的輸出結果是A。stdio.h中的庫函數putchar可用于單個字符的輸出。上面兩條輸出語句可改寫為putchar(ca);和putchar('A');。輸出字符的編碼利用格式字符d可以輸出字符的編碼。語句printf("%d",'0');的輸出結果是48,即字符0是48號字符。printf("%d",'\n');的輸出結果為10,即VC6.0中與回車鍵對應的是10號字符。printf("%c",'\n');的輸出結果相當于按下回車鍵。字符型數據的輸入對于格式字符c,用戶按下的任意一個鍵都是有效的輸入。語句scanf("%c",&ca);可以把用戶輸入的一個字符存入變量ca中。當用戶直接按下回車鍵時,字符型變量ca的值是'\n',即10號字符。例2-13輸入“Ze↙”時,分析程序的運行結果stdio.h中的庫函數getchar利用getchar函數可以獲得用戶輸入的一個字符。語句scanf("%c",&ca);可用語句ca=getchar();代替。與scanf函數一樣,getchar函數也從輸入緩沖區(qū)中讀取數據,且用戶按下的任意一個鍵都是有效的輸入。例2-15getchar函數的用法用戶輸入Zzj↙時,分析程序的運行結果。思考題討論:怎樣理解計算機通過字符型與用戶交互?請用戶輸入兩個整數時,用戶輸入2332↙,其實用戶只是輸出了一串字符"2332\n"。語句scanf("%d%d",&a,&b);執(zhí)行時,scanf函數匹配字符,將字符轉化為整數。輸出結果時,語句printf("和為%d",c);執(zhí)行時,printf函數先得到字符串"和為55",再在屏幕上顯示每個字符。用戶看到后,會認為和是整數55。字符到整數'9'-'0';整數到字符9+'0'。再談printf函數printf函數printf函數常見的調用方式為:printf(格式字符串,輸出列表);printf函數的作用是將由格式字符串產生的“輸出字符串”在指定的輸出設備上顯示。格式字符串由三類字符(串)組成:普通字符、轉義序列和占位序列。普通字符和轉義序列對應的字符會直接作為輸出字符串的一部分;占位序列則需要把輸出列表中的值轉換為相應的字符串后才能作為輸出字符串的一部分。占位序列占位序列的組成:%[修飾標記][域寬][.精度][長度修飾符]格式字符。方括號中的部分可選,但可選項的次序是固定的。長度修飾符指l(long)和h(short)。long型、unsignedlong型和double型數據需要長度修飾符l,如ld、lu和lf。.精度可用.n形式表示,其中n為正整數,多用于浮點型數據,輸出時小數點后面會有n位,第n+1位四舍五入。域寬和修飾標記域寬可用m表示,m為一個正整數,限定了輸出結果所占的最小寬度,即輸出的字符至少有m列。當寬度不足m列時,需用填充字符(默認為空格)湊夠m列。在輸出的左側填充空格時稱為右對齊;在輸出的右側填充空格時稱為左對齊。默認是右對齊。當修飾標記為負號(-)時,是左對齊。當修飾標記為0時,填充字符就會由空格變?yōu)?。例2-16已知floatf=123.0;intj=123;,分析下面語句的輸出結果。printf("%11.2e\n",f);printf("%11.2f\n",f);printf("%-11.2e\n",f);printf("%-11.2f\n",f);printf("%11d\n",j);printf("%-11d\n",j); printf("%-1d\n",j);思考題了解第13章數字化信息編碼中字形碼的知識。字庫中存儲了所有字符的字形碼。輸出字符的過程可簡述為:先由字符編碼找到字庫中對應的字形碼,再根據字形碼將屏幕上的像素設置成不同的顏色。典型例題輸入為5x↙時,分析變量i和ca的值。scanf函數第一次執(zhí)行時輸入緩沖區(qū)為空,程序暫停運行,等待用戶輸入。scanf函數識別整數時遇到空格結束,變量i的值為5,但并沒有取走空格。當再次識別字符時,scanf函數直接取走空格作為變量ca的值。當用戶輸入5↙時,分析程序的運行過程。例2-18倒序輸出用戶輸入的一個三位正整數,如用戶輸入123,程序輸出321??稍O計如下的算法。第一步:提示用戶輸入一個三位的正整數;第二步:用short型變量n保存用戶的輸入;第三步:求出變量n的倒序數;第四步:輸出倒序數。

第一次第二次第三次

用戶可能的輸入123230523n程序預期的輸出32132325?怎樣求變量i的倒序數?求出變量i百位上,十位上和個位上的數,然后在顯示器上輸出倒序數。設變量n百位上,十位上和個位上的數分別是1,2和3,則語句printf("%d",3*100+2*10+1);輸出了倒序數。語句printf("%d%d%d",3,2,1);也輸出了倒序數。怎樣求變量i百位上,十位上和個位上的數?可以借助算術運算,比如n%10的值就是個位上的數。不用算術運算可以嗎?換一種思路看到提示信息“請輸入一個三位的正整數”后,若用戶輸入了123↙。從用戶的角度看,輸入了個三位的正整數123,但輸入緩沖區(qū)中只是1,2,3,↙四個字符。若用scanf("%d",&n);,即用%d識別用戶的輸入,則整型變量n的值就是整數123;若用scanf("%c%c%c",&a,&b,&c);,即用%c識別用戶的輸入,則字符型變量a,b,c的值就是字符1,2和3。例2-18倒序輸出用戶輸入的一個三位正整數,如用戶輸入123,程序輸出321。新的算法如下。第一步:提示用戶輸入一個三位的正整數;第二步:獲得用戶輸入的三個字符;第三步:倒序輸出三個字符輸入和輸出

第一次第二次第三次變量用戶可能的輸入123230523cb,cs,cg程序預期的輸出32132325?分析下面的程序思考題當用戶輸入230時,程序的輸出為032,怎樣改進算法,使得程序的輸出為32?第3章表達式新概念C語言能力教程(第2版)第3章表達式01表達式概述02賦值表達式03算術表達式04強制類型轉換及自增自減05逗號表達式06典型例題表達式概述表達式表達式由操作符和操作數兩部分組成。操作符是C語言命令。操作數是操作符命令作用的對象。操作數可以是變量、字面量和有返回值的函數調用。根據操作數的個數,操作符分為單目操作符、雙目操作符和三目操作符。單目操作符如取地址操作符&,&a,求相反數操作符-,-a等;雙目操作符較常見,如加法操作符+,a+b等。三目操作符只有一個。根據功能,操作符分為賦值操作符、算術操作符、邏輯操作符等。優(yōu)先級操作符名

稱分

類結合性1()圓括號

左結合[]下標運算操作符下標->指向結構體成員操作符分量.結構體成員操作符2!邏輯非操作符邏輯單目操作符右結合~按位取反操作符位++自增操作符

--自減操作符

-負號操作符

(類型)強制類型轉換操作符

*間接引用操作符指針&取地址操作符sizeof求內存字節(jié)數操作符

3*乘法操作符算術雙目左結合/除法操作符%求余操作符4+加法操作符算術雙目左結合-減法操作符5<<

左移操作符位雙目左結合>>

右移操作符6<

小于操作符關系雙目左結合<=小于等于操作符>

大于操作符>=大于等于操作符7==等于操作符關系雙目左結合!=不等于操作符8&按位與操作符位雙目左結合9^按位異或操作符位雙目左結合10|按位或操作符位雙目左結合11&&邏輯與操作符邏輯雙目左結合12||邏輯或操作符邏輯雙目左結合13?:條件操作符條件三目右結合14=+=-=*=/=%=>>=<<=&=^=|=賦值操作符賦值雙目右結合15,逗號操作符逗號雙目左結合每個表達式都有值按照求值規(guī)則執(zhí)行表達式中的操作符,最終得到的結果就是表達式的值。執(zhí)行表達式的過程就是對表達式求值的過程。表達式求值的兩條主要規(guī)則是優(yōu)先級高的操作符先執(zhí)行和優(yōu)先級相同的相鄰操作符根據結合性確定執(zhí)行順序。表達式的求值規(guī)則與四則混合運算的規(guī)則類似。“先乘除,后加減”與優(yōu)先級有關?!爸挥屑訙p或乘除時,從左到右依次計算”與結合性有關。求表達式3-2/5的值表達式3-2/5中有減法-和除法/兩個操作符,除法/的優(yōu)先級高先執(zhí)行。除法/的操作數是2和5,子表達式2/5先求值。2/5的值是0,int型。原表達式變?yōu)?–0,值為3,int。故原表達式的值為3,int。圓括號的優(yōu)先級最高,可以用加圓括號的方式明確表達式的求值順序,如表達式3-2/5的求值順序為(3-(2/5))。表達式3-2/5中減法操作符的兩個操作數是3和2/5的結果。表達式3/2*2的求值表達式中除法/和乘法*的優(yōu)先級相同,結合性為左結合,求值順序為從左到右依次執(zhí)行操作符。3/2*2?1*2?2,int型。表達式3/2*2的求值順序為((3/2)*2)右結合操作符是左結合時,左邊的操作符先執(zhí)行;是右結合時,右邊的操作符先執(zhí)行。常見的操作符都是左結合。當賦值操作符=為左結合時,表達式a=b=c=23的求值順序是(((a=b)=c)=23)。

當賦值操作符=為右結合時,表達式a=b=c=23的求值順序是(a=(b=(c=23)))。例3-1查表并用加圓括號的方式確定下面表達式的求值順序。i=j=k=23求值順序為(i=(j=

溫馨提示

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

評論

0/150

提交評論