版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C語言(第三版)譚浩強(qiáng)譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)第一章C語言概述譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
本章要點(diǎn)
C語言的特點(diǎn)
C程序的結(jié)構(gòu)在計(jì)算機(jī)上運(yùn)行C程序的方法譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
§1-1C語言出現(xiàn)的歷史背景C語言是國際上廣泛流行的高級(jí)語言。C語言是在B語言的基礎(chǔ)上發(fā)展起來的。B(BCPL)語言是1970年由美國貝爾實(shí)驗(yàn)室設(shè)計(jì)的,并用于編寫了第一個(gè)UNIX操作系統(tǒng),在PDP7上實(shí)現(xiàn)。優(yōu)點(diǎn):精練,接近硬件,缺點(diǎn):過于簡單,數(shù)據(jù)無類型。1973年貝爾實(shí)驗(yàn)室的D.M.Ritchie在B語言的基礎(chǔ)上設(shè)計(jì)出了C語言,對(duì)B取長補(bǔ)短,并用之改寫了原來用匯編編寫的UNIX,(即UNIX第5版),但僅在貝爾實(shí)驗(yàn)室使用。
§1-1C語言出現(xiàn)的歷史背景1975年UNIX第6版發(fā)布,C優(yōu)點(diǎn)突出引起關(guān)注。1977年出現(xiàn)了《可移植C語言編譯程序》,推動(dòng)了UNIX在各種機(jī)器上實(shí)現(xiàn),C語言也得到推廣,其發(fā)展相輔相成。1978年影響深遠(yuǎn)的名著《TheCProgrammingLanguage》由BrianW.Kernighan和DennisM.Ritchie合著,被稱為標(biāo)準(zhǔn)C。之后,C語言先后移植到大、中、小、微型計(jì)算機(jī)上,已獨(dú)立于UNIX和PDP,風(fēng)靡世界,成為最廣泛的幾種計(jì)算機(jī)語言之一。
§1-1C語言出現(xiàn)的歷史背景1983年,美國國家標(biāo)準(zhǔn)化協(xié)會(huì)(ANSI)根據(jù)C語言各種版本對(duì)C的發(fā)展和擴(kuò)充,制定了新的標(biāo)準(zhǔn)ANSIC,比標(biāo)準(zhǔn)C有了很大的發(fā)展。1988年K&R按照ANSIC修改了他們的《TheCProgrammingLanguage》。1987年,ANSI公布了新標(biāo)準(zhǔn)——87ANSIC。1990年,國際標(biāo)準(zhǔn)化組織接受了87ANSIC為ISOC的標(biāo)準(zhǔn)(ISO9899—1990)。1994年,ISO又修訂了C語言標(biāo)準(zhǔn)。目前流行的C語言編譯系統(tǒng)大多是以ANSIC為基礎(chǔ)進(jìn)行開發(fā)的。
§1-1C語言出現(xiàn)的歷史背景說明:
不同版本的C編譯系統(tǒng)所實(shí)現(xiàn)的語言功能和語法規(guī)則又略有差別,因此讀者應(yīng)了解所用的C語言編譯系統(tǒng)的特點(diǎn)(可以參閱有關(guān)手冊(cè))。本書的敘述基本上以ANSIC為基礎(chǔ)。
§1-2C語言的特點(diǎn)(1)語言簡潔、緊湊,使用方便、靈活。32個(gè)關(guān)鍵字、9種控制語句,程序形式自由(2)運(yùn)算符豐富。34種運(yùn)算符(3)數(shù)據(jù)類型豐富,具有現(xiàn)代語言的各種數(shù)據(jù)結(jié)構(gòu)。(4)具有結(jié)構(gòu)化的控制語句,是完全模塊化和結(jié)構(gòu)化的語言。(5)語法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。
§1-2C語言的特點(diǎn)(6)允許直接訪問物理地址,能進(jìn)行位操作,能實(shí)現(xiàn)匯編語言的大部分功能,可直接對(duì)硬件進(jìn)行操作。兼有高級(jí)和低級(jí)語言的特點(diǎn)。(7)目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。只比匯編程序生成的目標(biāo)代碼效率低10%-20%。(8)程序可移植性好(與匯編語言比)?;旧喜蛔鲂薷木湍苡糜诟鞣N型號(hào)的計(jì)算機(jī)和各種操作系統(tǒng)。
§1-2C語言的特點(diǎn)解釋1:C++是由于開發(fā)大型應(yīng)用軟件的需要而產(chǎn)生的,并不是所有的人都要去編寫大型軟件;解釋2:面向?qū)ο蟮幕A(chǔ)是面向過程。C++是面向?qū)ο蟮恼Z言,C是面向過程的,學(xué)起來比C語言困難得多,所以不太適合程序設(shè)計(jì)的初學(xué)者。問題:既然有了面向?qū)ο蟮腃++語言,為什么還要學(xué)習(xí)C語言?
§1-3簡單的C語言程序介紹#include<stdio.h>void
main(){
printf("ThisisaCprogram.\n");}/*文件包含*//*主函數(shù)*//*函數(shù)體開始*//*輸出語句*//*函數(shù)體結(jié)束*/說明:main-主函數(shù)名,void-函數(shù)類型每個(gè)C程序必須有一個(gè)主函數(shù)main{}是函數(shù)開始和結(jié)束的標(biāo)志,不可省每個(gè)C語句以分號(hào)結(jié)束使用標(biāo)準(zhǔn)庫函數(shù)時(shí)應(yīng)在程序開頭一行寫:
#include<stdio.h>說明:
本程序的作用是輸出一行信息:ThisisaCprogram.例1.2求兩數(shù)之和
#include<stdio.h>
voidmain()/*求兩數(shù)之和*/
{
inta,b,sum;/*聲明,定義變量為整型*/
/*以下3行為C語句*/
a=123;b=456;
sum=a+b;
printf(″sumis%d\n″,sum);
}說明:
/*……*/表示注釋。注釋只是給人看的,對(duì)編譯和運(yùn)行不起作用。所以可以用漢字或英文字符表示,可以出現(xiàn)在一行中的最右側(cè),也可以單獨(dú)成為一行。說明:
輸出一行信息:sumis579例1.3求3個(gè)數(shù)中較大者。
#include<stdio.h>
voidmain()/*主函數(shù)*/
{
intmax(intx,inty);/對(duì)被調(diào)用函數(shù)max的聲明*/
inta,b,c;/*定義變量a、b、c*/
scanf(″%d,%d″,&a,&b);/*輸入變量a和b的值*/
c=max(a,b);/*調(diào)用max函數(shù),將得到的值賦給c*/
printf(″max=%d\\n″,c);/*輸出c的值*/
}程序運(yùn)行情況如下:8,5↙(輸入8和5賦給a和b)max=8(輸出c的值)intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}max(int
x,int
y);
max(a,b);
說明:本程序包括main和被調(diào)用函數(shù)max兩個(gè)函數(shù)。max函數(shù)的作用是將x和y中較大者的值賦給變量z。return語句將z的值返回給主調(diào)函數(shù)main。
§1-3簡單的C語言程序介紹C程序:(1)C程序是由函數(shù)構(gòu)成的。這使得程序容易實(shí)現(xiàn)模塊化。(2)一個(gè)函數(shù)由兩部分組成:
函數(shù)的首部:例1.3中的max函數(shù)首部
intmax(intx,inty)
函數(shù)體:花括號(hào)內(nèi)的部分。若一個(gè)函數(shù)有多個(gè)花括號(hào),則最外層的一對(duì)花括號(hào)為函數(shù)體的范圍。函數(shù)體包括兩部分:聲明部分:inta,b,c;可缺省執(zhí)行部分:由若干個(gè)語句組成??扇笔?/p>
§1-3簡單的C語言程序介紹注意:函數(shù)的聲明部分和執(zhí)行部分都可缺省,例如:voiddump(){}
這是一個(gè)空函數(shù),什么也不做,但是合法的函數(shù)。
§1-3簡單的C語言程序介紹小結(jié):(3)C程序總是從main函數(shù)開始執(zhí)行的,與main函數(shù)的位置無關(guān)。(4)C程序書寫格式自由,一行內(nèi)可以寫幾個(gè)語句,一個(gè)語句可以分寫在多行上,C程序沒有行號(hào)。(5)每個(gè)語句和數(shù)據(jù)聲明的最后必須有一個(gè)分號(hào)。(6)C語言本身沒有輸入輸出語句。輸入和輸出的操作是由庫函數(shù)scanf和printf等函數(shù)來完成的。C對(duì)輸入輸出實(shí)行“函數(shù)化”。
§1-4運(yùn)行C程序的步驟和方法一、運(yùn)行C程序的步驟上機(jī)輸入與編輯源程序?qū)υ闯绦蜻M(jìn)行編譯與庫函數(shù)連接運(yùn)行目標(biāo)程序譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
§1-4運(yùn)行C程序的步驟和方法二、上機(jī)運(yùn)行C程序的方法目前使用的大多數(shù)C編譯系統(tǒng)都是集成環(huán)境(IDE)的??梢杂貌煌木幾g系統(tǒng)對(duì)C程序進(jìn)行操作常用的有TurboC2.0、TurboC++3.0、VisualC++等TurboC++3.0:是一個(gè)集成環(huán)境,它具有方便、直觀和易用的界面,雖然它也是DOS環(huán)境下的集成環(huán)境,但是可以把啟動(dòng)TurboC++3.0集成環(huán)境的DOS執(zhí)行文件tc.exe生成快捷方式,也可以用鼠標(biāo)操作。VisualC++:也可以用VisualC++對(duì)C程序進(jìn)行編譯。譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)例:TurboC++3.0的使用將TurboC++3.0編譯程序裝入磁盤某一目錄下,例如:放在C盤根目錄下一級(jí)TC3.0子目錄下。進(jìn)入TurboC++3.0集成環(huán)境①在DOS環(huán)境下
C:\TC3.0>tc↙
譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)②在Windows環(huán)境下找到可執(zhí)行文件tc.exe,執(zhí)行該文件。主菜單:11個(gè)菜單項(xiàng):FileEditSearchRunCompileDebugProjectOptionsWindowHelp譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)(2)編輯源文件新建:單擊“File”菜單下的“New”,
修改:選擇“File”→“Open”(即單擊“File”的下拉菜單中的“Open”項(xiàng),修改已有的源程序。
譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)在編輯(EDIT)狀態(tài)下光標(biāo)表示當(dāng)前進(jìn)行編輯的位置,在此位置可以進(jìn)行插入、刪除或修改,直到自已滿意為止。譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)保存:在編輯(EDIT)狀態(tài)下光標(biāo)表示當(dāng)前進(jìn)行編輯的位置,在此位置可以進(jìn)行插入、刪除或修改,直到自已滿意為止。譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)(3)對(duì)源程序進(jìn)行編譯選擇“Compile”(或“Alt+F9”)對(duì)源程序進(jìn)行編譯。c1.cpp源程序,出現(xiàn)1個(gè)錯(cuò)誤(error),0個(gè)警告(warming)。譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)(4)將目標(biāo)程序進(jìn)行連接
選擇菜單“Compile”→“Link”,如果不出現(xiàn)錯(cuò)誤,會(huì)得到一個(gè)后綴為.exe的可執(zhí)行文件。(5)執(zhí)行程序。選菜單“Run”→“Run”(或按“Ctrl+F9”鍵)。(6)退出TurboC++3.0環(huán)境選擇“File”→“Quit”。譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)第二章程序的靈魂--算法譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
本章要點(diǎn)算法的概念算法的表示結(jié)構(gòu)化程序設(shè)計(jì)方法譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
主要內(nèi)容2.1算法的概念2.2簡單算法舉例2.3算法的特性2.4怎樣表示一個(gè)算法2.5化程序設(shè)計(jì)方法譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)一個(gè)程序應(yīng)包括兩個(gè)方面的內(nèi)容:對(duì)數(shù)據(jù)的描述:數(shù)據(jù)結(jié)構(gòu)(datastructure)對(duì)操作的描述:算法(algorithm)著名計(jì)算機(jī)科學(xué)家沃思提出一個(gè)公式:
數(shù)據(jù)結(jié)構(gòu)+算法=程序
數(shù)據(jù)結(jié)構(gòu)+算法+程序設(shè)計(jì)方法+語言工具完整的程序設(shè)計(jì)應(yīng)該是:
§2.1算法的概念
廣義地說,為解決一個(gè)問題而采取的方法和步驟,就稱為“算法”。方法1:1+2,+3,+4,一直加到100加99次方法2:100+(1+99)+(2+98)+…+(49+51)+50=100+49×100+50加51次對(duì)同一個(gè)問題,可有不同的解題方法和步驟例:求
§2.1算法的概念
為了有效地進(jìn)行解題,不僅需要保證算法正確,還要考慮算法的質(zhì)量,選擇合適的算法。希望方法簡單,運(yùn)算步驟少。計(jì)算機(jī)算法可分為兩大類別:數(shù)值運(yùn)算算法:求數(shù)值解,例如求方程的根、求函數(shù)的定積分等。非數(shù)值運(yùn)算:包括的面十分廣泛,最常見的是用于事務(wù)管理領(lǐng)域,例如圖書檢索、人事管理、行車調(diào)度管理等。
§2.2簡單算法舉例例2.1:求1×2×3×4×5
步驟1:先求1×2,得到結(jié)果2步驟2:將步驟1得到的乘積2再乘以3,得到結(jié)果6步驟3:將6再乘以4,得24步驟4:將24再乘以5,得120太繁瑣如果要求1×2×…×1000,則要寫999個(gè)步驟
S1:使p=1S2:使i=2S3:使p×i,乘積仍放在變量p中,可表示為:p×ipS4:使i的值加1,即i+1i。
S5:如果i不大于5,返回重新執(zhí)行步驟S3以及其后的步驟S4和S5;否則,算法結(jié)束。最后得到p的值就是5!的值??梢栽O(shè)兩個(gè)變量:一個(gè)變量代表被乘數(shù),一個(gè)變量代表乘數(shù)。不另設(shè)變量存放乘積結(jié)果,而直接將每一步驟的乘積放在被乘數(shù)變量中。設(shè)p為被乘數(shù),i為乘數(shù)。用循環(huán)算法來求結(jié)果,算法可改寫:S1:1pS2:3iS3:p×ipS4:i+2pS5:若i≤11,返回S3。否則,結(jié)束。
如果題目改為:求1×3×5×……×1000算法只需作很少的改動(dòng):算法簡練
用這種方法表示的算法具有通用性、靈活性。S3到S5組成一個(gè)循環(huán),在實(shí)現(xiàn)算法時(shí)要反復(fù)多次執(zhí)行S3,S4,S5等步驟,直到某一時(shí)刻,執(zhí)行S5步驟時(shí)經(jīng)過判斷,乘數(shù)i已超過規(guī)定的數(shù)值而不返回S3步驟為止。此時(shí)算法結(jié)束,變量p的值就是所求結(jié)果。例2.2
有50個(gè)學(xué)生,要求將他們之中成績?cè)?0分以上者打印出來。設(shè)n表示學(xué)號(hào),n1代表第一個(gè)學(xué)生學(xué)號(hào),代表第i個(gè)學(xué)生學(xué)號(hào)。用G代表學(xué)生成績,gi代表第i個(gè)學(xué)生成績,算法表示如下:
S1:1iS2:如果≥80,則打印和,否則不打印。
S3:i+1iS4:如果i≤50,返回S2,繼續(xù)執(zhí)行。否則算法結(jié)束
變量i作為下標(biāo),用來控制序號(hào)(第幾個(gè)學(xué)生,第幾個(gè)成績)。當(dāng)i超過50時(shí),表示已對(duì)50個(gè)學(xué)生的成績處理完畢,算法結(jié)束。例2.3
判定2000~2500年中的每一年是否閏年,將結(jié)果輸出。
變量i作為下標(biāo),用來控制序號(hào)(第幾個(gè)學(xué)生,第幾個(gè)成績)。當(dāng)i超過50時(shí),表示已對(duì)50個(gè)學(xué)生的成績處理完畢,算法結(jié)束。分析:閏年的條件是:(1)能被4整除,但不能被100整除的年份都是閏年,如1996,2004年是閏年;(2)能被100整除,又能被400整除的年份是閏年。如1600,2000年是閏年。不符合這兩個(gè)條件的年份不是閏年。設(shè)y為被檢測(cè)的年份,算法可表示如下
:
S1:2000yS2:若y不能被4整除,則輸出y“不是閏年”。然后轉(zhuǎn)到S6。S3:若y能被4整除,不能被100整除,則輸出y“是閏年”。然后轉(zhuǎn)到S6。S4:若y能被100整除,又能被400整除,輸出y“是閏年”,否則輸出“不是閏年”。然后轉(zhuǎn)到S6。S5:輸出y“不是閏年”。S6:y+1yS7:當(dāng)y≤2500時(shí),轉(zhuǎn)S2繼續(xù)執(zhí)行,如y>2500,算法停止。
以上算法中每做一步都分別分離出一些范圍(巳能判定為閏年或非閏年),逐步縮小范圍,直至執(zhí)行S5時(shí),只可能是非閏年?!捌渌卑鼙?整除,又能被100整除,而不能被400整除的那些年份(如1990)是非閏年。例2.4
求算法如下
:
S1:sign=1S2:sum=1S3:deno=2S4:sign=(-1)×signS5:term=sign×(1/deno)S6:sum=sum+termS7:deno=deno+1S8:若deno≤100返回S4,否則算法結(jié)束。單詞作變量名,以使算法更易于理解:sum表示累加和,deno是英文分母(denominator)縮寫,sign代表數(shù)值的符號(hào),term代表某一項(xiàng)。
反復(fù)執(zhí)行S4到S8步驟,直到分母大于100為止。一共執(zhí)行了99次循環(huán),向sum累加入了99個(gè)分?jǐn)?shù)。sum最后的值就是多項(xiàng)式的值。
例2.5
對(duì)一個(gè)大于或等于3的正整數(shù),判斷它是不是一個(gè)素?cái)?shù)。概念:所謂素?cái)?shù),是指除了1和該數(shù)本身之外,不能被其它任何整數(shù)整除的數(shù)。例如,13是素?cái)?shù)。因?yàn)樗荒鼙?,3,4,…,12整除。分析:判斷一個(gè)數(shù)n(n≥3)是否素?cái)?shù)的方法:將n作為被除數(shù),將2到(n-1)各個(gè)整數(shù)輪流作為除數(shù),如果都不能被整除,則n為素?cái)?shù)。算法如下
:S1:輸入n的值S2:i=2(i作為除數(shù))S3:n被i除,得余數(shù)rS4:如果r=0,表示n能被i整除,則打印n“不是素?cái)?shù)”,算法結(jié)束。否則執(zhí)行S5S5:i+1iS6:如果i≤n-1,返回S3。否則打印n“是素?cái)?shù)”。然后結(jié)束。
實(shí)際上,n不必被2到(n-1)的整數(shù)除,只需被2到n/2間整數(shù)除,甚至只需被2到之間的整數(shù)除即可。
§2.3算法的特性有窮性:包含有限的操作步驟確定性:算法中的每一個(gè)步驟都應(yīng)當(dāng)是確定的有零個(gè)或多個(gè)輸入:輸入是指在執(zhí)行算法時(shí)需要從外界取得必要的信息有一個(gè)或多個(gè)輸出:算法的目的是為了求解,“解”就是輸出有效性:算法中的每一個(gè)步驟都應(yīng)當(dāng)能有效地執(zhí)行,并得到確定的結(jié)果。一個(gè)算法應(yīng)該具有以下特點(diǎn):
§2.4算法的表示可以用不同的方法表示算法,常用的有:自然語言傳統(tǒng)流程圖結(jié)構(gòu)化流程圖偽代碼PAD圖
§2.4.1用自然語言表示算法
自然語言就是人們?nèi)粘J褂玫恼Z言,可以是漢語或英語或其它語言。用自然語言表示通俗易懂,但文字冗長,容易出現(xiàn)“歧義性”。自然語言表示的含義往往不大嚴(yán)格,要根據(jù)上下文才能判斷其正確含義,描述包含分支和循環(huán)的算法時(shí)也不很方便。因此,除了那些很簡單的問題外,一般不用自然語言描述算法。
§2.4.2用流程圖表示算法美國國家標(biāo)準(zhǔn)化協(xié)會(huì)ANSI(AmericanNationalStandardInstitute)規(guī)定了一些常用的流程圖符號(hào):起止框判斷框處理框輸入/輸出框注釋框流向線連接點(diǎn)例2.6
將求5!的算法用流程圖表示如果需要將最后結(jié)果打印出來,可在菱形框的下面加一個(gè)輸出框。
例2.7
將例2.2的算法用流程圖表示。打印50名學(xué)生中成績?cè)?0分以上者的學(xué)號(hào)和成績。如果如果包括這個(gè)輸入數(shù)據(jù)的部分,流程圖為
例2.8
將例2.3判定閏年的算法用流程圖表示
用流程圖表示算法要比用文字描述算法邏輯清晰、易于理解。
例2.9
將例2.4的算法用流程圖表示
例2.10
將例2.5判斷素?cái)?shù)的算法用流程圖表示小結(jié):流程圖是表示算法的較好的工具。一個(gè)流程圖包括以下幾部分:(1)表示相應(yīng)操作的框;(2)帶箭頭的流程線;(3)框內(nèi)外必要的文字說明。譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
§2.4.3
三種基本結(jié)構(gòu)和改進(jìn)的流程圖1、傳統(tǒng)流程圖的弊端傳統(tǒng)流程圖用流程線指出各框的執(zhí)行順序,對(duì)流程線的使用沒有嚴(yán)格限制。因此,使用者可以毫不受限制地使流程隨意地轉(zhuǎn)向,使流程圖變得毫無規(guī)律,閱讀者要花很大精力去追蹤流程,使人難以理解算法的邏輯。如圖:傳統(tǒng)流程圖的流程可以是:
這種如同亂麻一樣的算法稱為BS型算法,意為一碗面條(ABowlofSpaghetti),亂無頭緒。缺點(diǎn):難以閱讀、修改,使算法的可靠性和可維護(hù)性難以保證。解決辦法:必須限制箭頭的濫用,即不允許無規(guī)律地使流程隨意轉(zhuǎn)向,只能順序地進(jìn)行下去。
2、三種基本結(jié)構(gòu)
Bohra和Jacopini提出了以下三種基本結(jié)構(gòu):
順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)用這三種基本結(jié)構(gòu)作為表示一個(gè)良好算法的基本單元。三種基本結(jié)構(gòu)的圖示:
順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)的圖示:
當(dāng)型(While型)循環(huán)結(jié)構(gòu)直到型(Until型)循環(huán)三種基本結(jié)構(gòu)的共同特點(diǎn):
(1)只有一個(gè)入口;(2)只有一個(gè)出口;(請(qǐng)注意:一個(gè)菱形判斷框有兩個(gè)出口,而一個(gè)選擇結(jié)構(gòu)只有一個(gè)出口。不要將菱形框的出口和選擇結(jié)構(gòu)的出口混淆。)(3)結(jié)構(gòu)內(nèi)的每一部分都有機(jī)會(huì)被執(zhí)行到;(4)結(jié)構(gòu)內(nèi)不存在“死循環(huán)”(無終止的循環(huán))。
圖中沒有一條從入口到出口的路徑通過A框。不正確的流程表示:流程內(nèi)的死循環(huán)小結(jié):由三種基本結(jié)構(gòu)順序組成的算法結(jié)構(gòu),可以解決任何復(fù)雜的問題。由基本結(jié)構(gòu)所構(gòu)成的算法屬于“結(jié)構(gòu)化”的算法,它不存在無規(guī)律的轉(zhuǎn)向,只在本基本結(jié)構(gòu)內(nèi)才允許存在分支和向前或向后的跳轉(zhuǎn)。譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)擴(kuò)展:只要具有上述四個(gè)特點(diǎn)的都可以作為基本結(jié)構(gòu)??梢宰约憾x基本結(jié)構(gòu),并由這些基本結(jié)構(gòu)組成結(jié)構(gòu)化程序。此圖符合基本結(jié)構(gòu)的特點(diǎn)譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
這是一個(gè)多分支選擇結(jié)構(gòu),根據(jù)表達(dá)式的值決定執(zhí)行路線。虛線框內(nèi)的結(jié)構(gòu)是一個(gè)入口一個(gè)出口,并且有上述全部的四個(gè)特點(diǎn)。由此構(gòu)成的算法結(jié)構(gòu)也是結(jié)構(gòu)化的算法??梢哉J(rèn)為這是由三種基本結(jié)構(gòu)所派生出來的。
§2.4.4
用N--S流程圖表示算法1973年美國學(xué)者I.Nassi和B.Shneiderman提出了一種新的流程圖形式。在這種流程圖中,完全去掉了帶箭頭的流程線。全部算法寫在一個(gè)矩形框內(nèi),在該框內(nèi)還可以包含其它的從屬于它的框,或者說,由一些基本的框組成一個(gè)大的框。這種流程圖又稱N--S結(jié)構(gòu)化流程圖。
N--S流程圖用以下的流程圖符號(hào):
(1)順序結(jié)構(gòu)
(2)選擇結(jié)構(gòu)
(3)循環(huán)結(jié)構(gòu)
用三種N--S流程圖中的基本框,可以組成復(fù)雜的N--S流程圖。圖中的A框或B框,可以是一個(gè)簡單的操作,也可以是三個(gè)基本結(jié)構(gòu)之一。
A框可以是一個(gè)選擇結(jié)構(gòu)B框可以是一個(gè)循環(huán)結(jié)構(gòu)例2.11
將例2.1的求5!算法用N--S圖表示例2.12將例2.2的算法用N--S圖表示。(打印50名學(xué)生中成績高于80分的學(xué)號(hào)和成績)沒有輸入數(shù)據(jù)例2.12將例2.2的算法用N--S圖表示。(打印50名學(xué)生中成績高于80分的學(xué)號(hào)和成績)有輸入數(shù)據(jù)例2.13
將例2.3判定閏年的算法用N--S圖表示例2.14將例2.4的算法用N--S圖表示例2.15將例2.5判別素?cái)?shù)的算法用N--S流程圖表示。傳統(tǒng)流程圖分析:出口1出口2此圖不符合基本結(jié)構(gòu)特點(diǎn)!由于不能分解為三種基本結(jié)構(gòu),就無法直接用N--S流程圖的三種基本結(jié)構(gòu)的符號(hào)來表示。因此,應(yīng)當(dāng)先作必要的變換。例2.15將例2.5判別素?cái)?shù)的算法用N--S流程圖表示。傳統(tǒng)流程圖變換為:一個(gè)出口用N--S流程圖表示:N--S圖表示算法的優(yōu)點(diǎn)比文字描述直觀、形象、易于理解;比傳統(tǒng)流程圖緊湊易畫。尤其是它廢除了流程線,整個(gè)算法結(jié)構(gòu)是由各個(gè)基本結(jié)構(gòu)按順序組成的,N--S流程圖中的上下順序就是執(zhí)行時(shí)的順序。用N--S圖表示的算法都是結(jié)構(gòu)化的算法,因?yàn)樗豢赡艹霈F(xiàn)流程無規(guī)律的跳轉(zhuǎn),而只能自上而下地順序執(zhí)行。譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)小結(jié):一個(gè)結(jié)構(gòu)化的算法是由一些基本結(jié)構(gòu)順序組成的。在基本結(jié)構(gòu)之間不存在向前或向后的跳轉(zhuǎn),流程的轉(zhuǎn)移只存在于一個(gè)基本結(jié)構(gòu)范圍之內(nèi)(如循環(huán)中流程的跳轉(zhuǎn));一個(gè)非結(jié)構(gòu)化的算法可以用一個(gè)等價(jià)的結(jié)構(gòu)化算法代替,其功能不變。如果一個(gè)算法不能分解為若干個(gè)基本結(jié)構(gòu),則它必然不是一個(gè)結(jié)構(gòu)化的算法。譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
§2.4.5
用位代碼表示算法概念:偽代碼是用介于自然語言和計(jì)算機(jī)語言之間的文字和符號(hào)來描述算法。特點(diǎn):它如同一篇文章一樣,自上而下地寫下來。每一行(或幾行)表示一個(gè)基本操作。它不用圖形符號(hào),因此書寫方便、格式緊湊,也比較好懂,也便于向計(jì)算機(jī)語言算法(即程序)過渡。用處:適用于設(shè)計(jì)過程中需要反復(fù)修改時(shí)的流程描述。
IFxispositiveTHENprintxELSEprint-x也可以用漢字偽代碼表示:
若x為正打印x
否則打印-x也可以中英文混用,如:
IFx為正
printxELSEprint-x例:“打印x的絕對(duì)值”的算法可以用偽代碼表示為:開始
置t的初值為1
置i的初值為2
當(dāng)i<=5,執(zhí)行下面操作:使t=t×i
使i=i+1
{循環(huán)體到此結(jié)束}輸出t的值結(jié)束也可以寫成以下形式:
BEGIN{算法開始}
1
t2
iwhilei≤5{t×i
ti+1
i}printtEND{算法結(jié)束}例2.16求5!。用偽代碼表示算法:例2.17輸出50個(gè)學(xué)生中成績高于80分者的學(xué)號(hào)和成績。用偽代碼表示算法:BEGIN{算法開始}
1
iwhilei≤50{inputandi+1
i}1
iwhilei≤50{if≥80printandi+1
i}END{算法結(jié)束}
§2.4.6
用計(jì)算機(jī)語言表示算法概念:用計(jì)算機(jī)實(shí)現(xiàn)算法。計(jì)算機(jī)是無法識(shí)別流程圖和偽代碼的。只有用計(jì)算機(jī)語言編寫的程序才能被計(jì)算機(jī)執(zhí)行。因此在用流程圖或偽代碼描述出一個(gè)算法后,還要將它轉(zhuǎn)換成計(jì)算機(jī)語言程序。特點(diǎn):用計(jì)算機(jī)語言表示算法必須嚴(yán)格遵循所用的語言的語法規(guī)則,這是和偽代碼不同的。用處:要完成一件工作,包括設(shè)計(jì)算法和實(shí)現(xiàn)算法兩個(gè)部分。設(shè)計(jì)算法的目的是為了實(shí)現(xiàn)算法。#include<stdio.h>voidmain(){inti,t;t=1;i=2;while(i<=5){t=t*I;i=i+1;}printf(“%d\n”,t);}例2.20將例2.16表示的算法(求5!)用C語言表示。應(yīng)當(dāng)強(qiáng)調(diào)說明:寫出了C程序,仍然只是描述了算法,并未實(shí)現(xiàn)算法。只有運(yùn)行程序才是實(shí)現(xiàn)算法。應(yīng)該說,用計(jì)算機(jī)語言表示的算法是計(jì)算機(jī)能夠執(zhí)行的算法。
§
2.5結(jié)構(gòu)化程序設(shè)計(jì)方法一個(gè)結(jié)構(gòu)化程序就是用高級(jí)語言表示的結(jié)構(gòu)化算法。用三種基本結(jié)構(gòu)組成的程序必然是結(jié)構(gòu)化的程序,這種程序便于編寫、便于閱讀、便于修改和維護(hù)。
結(jié)構(gòu)化程序設(shè)計(jì)強(qiáng)調(diào)程序設(shè)計(jì)風(fēng)格和程序結(jié)構(gòu)的規(guī)范化,提倡清晰的結(jié)構(gòu)。結(jié)構(gòu)化程序設(shè)計(jì)方法的基本思路是:把一個(gè)復(fù)雜問題的求解過程分階段進(jìn)行,每個(gè)階段處理的問題都控制在人們?nèi)菀桌斫夂吞幚淼姆秶鷥?nèi)。
§
2.5結(jié)構(gòu)化程序設(shè)計(jì)方法采取以下方法來保證得到結(jié)構(gòu)化的程序:自頂向下;逐步細(xì)化;模塊化設(shè)計(jì);結(jié)構(gòu)化編碼。
兩種不同的方法:自頂向下,逐步細(xì)化;自下而上,逐步積累。
用這種方法逐步分解,直到作者認(rèn)為可以直接將各小段表達(dá)為文字語句為止。這種方法就叫做“自頂向下,逐步細(xì)化”。自頂向下,逐步細(xì)化方法的優(yōu)點(diǎn):考慮周全,結(jié)構(gòu)清晰,層次分明,作者容易寫,讀者容易看。如果發(fā)現(xiàn)某一部分中有一段內(nèi)容不妥,需要修改,只需找出該部分修改有關(guān)段落即可,與其它部分無關(guān)。我們提倡用這種方法設(shè)計(jì)程序。這就是用工程的方法設(shè)計(jì)程序。模塊設(shè)計(jì)的方法:模塊化設(shè)計(jì)的思想實(shí)際上是一種“分而治之”的思想,把一個(gè)大任務(wù)分為若干個(gè)子任務(wù),每一個(gè)子任務(wù)就相對(duì)簡單了。在拿到一個(gè)程序模塊以后,根據(jù)程序模塊的功能將它劃分為若干個(gè)子模塊,如果這些子模塊的規(guī)模還嫌大,還再可以劃分為更小的模塊。這個(gè)過程采用自頂向下方法來實(shí)現(xiàn)。子模塊一般不超過50行劃分子模塊時(shí)應(yīng)注意模塊的獨(dú)立性,即:使一個(gè)模塊完成一項(xiàng)功能,耦合性愈少愈好。
第三章數(shù)據(jù)類型、運(yùn)算符與表達(dá)式譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
本章要點(diǎn)數(shù)據(jù)的描述規(guī)則數(shù)據(jù)的操作規(guī)則譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
主要內(nèi)容3.1C的數(shù)據(jù)類型3.2常量與變量3.3整型數(shù)據(jù)3.4浮點(diǎn)型數(shù)據(jù)運(yùn)行3.5字符型數(shù)據(jù)
譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
主要內(nèi)容3.6變量賦初值
3.7各類數(shù)值型數(shù)據(jù)間的混合運(yùn)算
3.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式
3.9賦值運(yùn)算符和賦值表達(dá)式
3.10逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式譚浩強(qiáng)-C語言程序設(shè)計(jì)(第三版)
§3.1C的數(shù)據(jù)類型C語言提供了以下一些數(shù)據(jù)類型。
數(shù)據(jù)類型構(gòu)造類型指針類型空類型(無值類型)void枚舉類型enum數(shù)組類型結(jié)構(gòu)類型struct聯(lián)合類型
union基本類型整型int字符型char實(shí)型(浮點(diǎn)型)單精度實(shí)型
float雙精度實(shí)型
double
§3.2常量與變量3.2.1常量和符號(hào)常量在程序運(yùn)行過程中,其值不能被改變的量稱為常量常量區(qū)分為不同的類型:整型100,125,-100,0實(shí)型3.14,0.125,-3.789字符型‘a(chǎn)’,‘b’,‘2’字符串‘a(chǎn)’,‘a(chǎn)b’,‘1232’例3.1符號(hào)常量的使用
#definePRICE30
#include<stdio.h>
voidmain()
{
intnum,total;
num=10;
total=num*PRICE;
printf(″total=%d\n″,total);
}
說明:
程序中用#define命令行定義PRICE代表常量30,此后凡在本文件中出現(xiàn)的PRICE都代表30,可以和常量一樣進(jìn)行運(yùn)算說明:用一個(gè)標(biāo)識(shí)符代表一個(gè)常量的,稱為符號(hào)常量,即以標(biāo)識(shí)符形式出現(xiàn)的常量。符號(hào)常量的值在其作用域(在本例中為主函數(shù))內(nèi)不能改變,也不能再被賦值。說明:如再用賦值語句給PRICE賦值是錯(cuò)誤的。
PRICE=40;/*錯(cuò)誤,不能給符號(hào)常量賦值。運(yùn)行結(jié)果:
total=300
§3.2常量與變量3.2.2變量變量代表內(nèi)存中具有特定屬性的一個(gè)存儲(chǔ)單元,它用來存放數(shù)據(jù),這就是變量的值,在程序運(yùn)行期間,這些值是可以改變的。變量名實(shí)際上是一個(gè)以一個(gè)名字對(duì)應(yīng)代表一個(gè)地址,在對(duì)程序編譯連接時(shí)由編譯系統(tǒng)給每一個(gè)變量名分配對(duì)應(yīng)的內(nèi)存地址。從變量中取值,實(shí)際上是通過變量名找到相應(yīng)的內(nèi)存地址,從該存儲(chǔ)單元中讀取數(shù)據(jù)。圖
§3.2常量與變量
變量命名的規(guī)定:C語言規(guī)定標(biāo)識(shí)符只能由字母、數(shù)字和下劃線三種字符組成,且第一個(gè)字符必須為字母或下劃線。
例:sum,_total,month,Student_name,
lotus_1_2_3,BASIC,li_lingM.D.John,¥123,3D64,a>b
§3.2常量與變量注意:編譯系統(tǒng)將大寫字母和小寫字母認(rèn)為是兩個(gè)不同的字符。建議變量名的長度最好不要超過8個(gè)字符。在選擇變量名和其它標(biāo)識(shí)符時(shí),應(yīng)注意做到“見名知意”,即選有含意的英文單詞(或其縮寫)作標(biāo)識(shí)符。要求對(duì)所有用到的變量作強(qiáng)制定義,也就是“先定義,后使用”。
§3.3整型數(shù)據(jù)3.3.1整型常量的表示方法
整型常量即整常數(shù)。在C語言中,整常數(shù)可用以下三種形式表示:(1)十進(jìn)制整數(shù)。
如:123,-456.4。(2)八進(jìn)制整數(shù)。以0頭的數(shù)是八進(jìn)制數(shù)。
如:0123表示八進(jìn)制數(shù)123,等于十進(jìn)制數(shù)83,-011表示八進(jìn)制數(shù)-11,即十進(jìn)制數(shù)-9。
§3.3整型數(shù)據(jù)(3)十六進(jìn)制整數(shù)。以0x開頭的數(shù)是16進(jìn)制數(shù)。
如:0x123,代表16進(jìn)制數(shù)123,等于十進(jìn)制數(shù)291。-0x12等于十進(jìn)制數(shù)-10。
3.3.2整型變量
(1)整型數(shù)據(jù)在內(nèi)存中的存放形式
數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存放的。
如:inti;/*定義為整型變量*/i=10;/*給i賦以整數(shù)10*/
圖§3.3整型數(shù)據(jù)注意:十進(jìn)制數(shù)10的二進(jìn)制形式為1010,TurboC2.0和TurboC++3.0為一個(gè)整型變量在內(nèi)存中分配2個(gè)字節(jié)的存儲(chǔ)單元(不同的編譯系統(tǒng)為整型數(shù)據(jù)分配的字節(jié)數(shù)是不相同的,VC++6.0則分配4個(gè)字節(jié))。數(shù)值是以補(bǔ)碼(complement)表示的。
§3.3整型數(shù)據(jù)(2)整型變量的分類:共六種有符號(hào)基本整型有符號(hào)短整型有符號(hào)長整型無符號(hào)基本整型無符號(hào)短整型無符號(hào)長整型(signed)int(signed)short(int)(signed)long(int)unsignedintunsignedshort(int)unsignedlong(int)
注意:括號(hào)表示其中的內(nèi)容是可選的.
§3.3整型數(shù)據(jù)整數(shù)類型的有關(guān)數(shù)據(jù):
類型類型說明符長度數(shù)的范圍基本型int
2字節(jié)-32768~32767
短整型short2字節(jié)-215~215-1
長整型long4字節(jié)-231~231-1
無符號(hào)整型unsigned2字節(jié)0~65535
無符號(hào)短整型unsignedshort2字節(jié)0~65535
無符號(hào)長整型unsignedlong4字節(jié)0~(232-1)
§3.3整型數(shù)據(jù)(3)整型變量的定義:
C規(guī)定在程序中所有用到的變量都必須在程序中定義,即“強(qiáng)制類型定義”。
例如:
inta,b(指定變量a、b為整型)
unsignedshortc,d;(指定變量c、d為無符號(hào)短整型)
longe,f;(指定變量e、f為長整型)例3.2整型變量的定義與使用
#include<stdio.h>
voidmain()
{inta,b,c,d;/*指定a、b、c、d為整型變量*/
unsignedu;/*指定u為無符號(hào)整型變量*/
a=12;b=-24;u=10;
c=a+u;d=b+u;
printf(″a+u=%d,b+u=%d\n″,c,d);
}說明:
可以看到不同種類的整型數(shù)據(jù)可以進(jìn)行算術(shù)運(yùn)算運(yùn)行結(jié)果:
a+u=22,b+u=-14
例3.3整型數(shù)據(jù)的溢出
#include<stdio.h>
voidmain()
{inta,b;
a=32767;
b=a+1;
printf(“%d,%d\n”,a,b);
}
說明:數(shù)值是以補(bǔ)碼表示的。一個(gè)整型變量只能容納-32768~32767范圍內(nèi)的數(shù),無法表示大于32767或小于-32768的數(shù)。遇此情況就發(fā)生“溢出”。運(yùn)行結(jié)果:
32767,-32768
§3.3整型數(shù)據(jù)3.3.3整型常量的類型
(1)一個(gè)整數(shù),如果其值在-32768~+32767范圍內(nèi),認(rèn)為它是int型,它可以賦值給int型和longint型變量。
(2)一個(gè)整數(shù),如果其值超過了上述范圍,而在-2147483637~+2147483647范圍內(nèi),則認(rèn)為它是為長整型??梢詫⑺x值給一個(gè)longint型變量。
§3.3整型數(shù)據(jù)(3)如果所用的C版本(如TurboC)分配給shortint與int型數(shù)據(jù)在內(nèi)存中占據(jù)的長度相同,則它的表數(shù)范圍與int型相同。因此一個(gè)int型的常量同時(shí)也是一個(gè)shortint型常量,可以賦給int型或shortint型變量。
§3.3整型數(shù)據(jù)(4)一個(gè)整常量后面加一個(gè)字母u或U,認(rèn)為是unsignedint型,如12345u,在內(nèi)存中按unsignedint規(guī)定的方式存放(存儲(chǔ)單元中最高位不作為符號(hào)位,而用來存儲(chǔ)數(shù)據(jù))。如果寫成-12345u,則先將-12345轉(zhuǎn)換成其補(bǔ)碼53191,然后按無符號(hào)數(shù)存儲(chǔ)。
§3.3整型數(shù)據(jù)(5)在一個(gè)整常量后面加一個(gè)字母l或L,則認(rèn)為是longint型常量。例如123l.432L.0L等。這往往用于函數(shù)調(diào)用中。如果函數(shù)的形參為longint型,則要求實(shí)參也為longint型。
§3.4浮點(diǎn)型數(shù)據(jù)3.4.1浮點(diǎn)型常量的表示方法兩種表示形式小數(shù)指數(shù)0.1233e-3注意:字母e(或E)之前必須有數(shù)字,且e后面的指數(shù)必須為整數(shù)1e3、1.8e-3、-123e-6、-.1e-3e3、2.1e3.5、.e3、e
§3.4浮點(diǎn)型數(shù)據(jù)規(guī)范化的指數(shù)形式:
在字母e(或E)之前的小數(shù)部分中,小數(shù)點(diǎn)左邊應(yīng)有一位(且只能有一位)非零的數(shù)字.
例如:123.456可以表示為:
123.456e0,12.3456e1,1.23456e2,0.123456e3,0.0123456e4,0.00123456e
其中的1.23456e3稱為“規(guī)范化的指數(shù)形式”。
§3.4浮點(diǎn)型數(shù)據(jù)3.4.2浮點(diǎn)型變量(1)浮點(diǎn)型數(shù)據(jù)在內(nèi)存中的存放形式
一個(gè)浮點(diǎn)型數(shù)據(jù)一般在內(nèi)存中占4個(gè)字節(jié)(32位)。與整型數(shù)據(jù)的存儲(chǔ)方式不同,浮點(diǎn)型數(shù)據(jù)是按照指數(shù)形式存儲(chǔ)的。系統(tǒng)把一個(gè)浮點(diǎn)型數(shù)據(jù)分成小數(shù)部分和指數(shù)部分,分別存放。指數(shù)部分采用規(guī)范化的指數(shù)形式。圖類型位數(shù)數(shù)的范圍有效數(shù)字float32
10-37~10386~7位double型64
10-307~1030815~16位longdouble12810-4931~10493218~19位
§3.4浮點(diǎn)型數(shù)據(jù)(2)浮點(diǎn)型變量的分類浮點(diǎn)型變量分為單精度(float型)、雙精度(double型)和長雙精度型(longdouble)三類形式。例3.4浮點(diǎn)型數(shù)據(jù)的舍入誤差
#include<stdio.h>
voidmain()
{floata,b;
a=123456.789e5;
b=a+20;
printf(“%f\n”,b);
}
說明:一個(gè)浮點(diǎn)型變量只能保證的有效數(shù)字是7位有效數(shù)字,后面的數(shù)字是無意義的,并不準(zhǔn)確地表示該數(shù)。應(yīng)當(dāng)避免將一個(gè)很大的數(shù)和一個(gè)很小的數(shù)直接相加或相減,否則就會(huì)“丟失”小的數(shù)運(yùn)行結(jié)果:
123456.789e5
§3.4浮點(diǎn)型數(shù)據(jù)3.4.3浮點(diǎn)型常量的類型
C編譯系統(tǒng)將浮點(diǎn)型常量作為雙精度來處理。
例如:f=2.45678*4523.65
系統(tǒng)先把2.45678和4523.65作為雙精度數(shù),然后進(jìn)行相乘的運(yùn)算,得到的乘也是一個(gè)雙精度數(shù)。最后取其前7位賦給浮點(diǎn)型變量f。如是在數(shù)的后面加字母f或F(如1.65f,654.87F),這樣編譯系統(tǒng)就會(huì)把它們按單精度(32位)處理。
§3.5字符型數(shù)據(jù)
3.5.1字符常量(1)用單引號(hào)包含的一個(gè)字符是字符型常量(2)只能包含一個(gè)字符例‘a(chǎn)’,’A’,‘1’‘a(chǎn)bc’、“a”
§3.5字符型數(shù)據(jù)
有些以“\”開頭的特殊字符稱為轉(zhuǎn)義字符\n換行\(zhòng)t橫向跳格\r回車\\反斜杠\dddddd表示1到3位八進(jìn)制數(shù)字\xhhhh表示1到2位十六進(jìn)制數(shù)字例3.5轉(zhuǎn)義字符的使用
#include<stdio.h>
voidmain()
{printf(″abc\tde\rf\tg\n″);
printf(″h\ti\b\bjk\n″);
}
打印機(jī)上的顯示結(jié)果:
fabcgdehjik顯示屏上的運(yùn)行結(jié)果:
fgde
hjk
§3.5字符型數(shù)據(jù)
3.5.2字符變量字符型變量用來存放字符常量,注意只能放一個(gè)字符。字符變量的定義形式如下:charc1,c2;在本函數(shù)中可以用下面語句對(duì)c1,c2賦值:
c1=‘a(chǎn)’;c2=‘b’
;一個(gè)字符變量在內(nèi)存中占一個(gè)字節(jié)。
§3.5字符型數(shù)據(jù)
3.5.3字符數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式及其使用方法將一個(gè)字符常量放到一個(gè)字符變量中,實(shí)際上并不是把該字符本身放到內(nèi)存單元中去,而是將該字符的相應(yīng)的ASCII代碼放到存儲(chǔ)單元中。圖這樣使字符型數(shù)據(jù)和整型數(shù)據(jù)之間可以通用。一個(gè)字符數(shù)據(jù)既可以以字符形式輸出,也可以以整數(shù)形式輸出。例3.6向字符變量賦以整數(shù)。
#include<stdio.h>
voidmain()
{charc1,c2;
c1=97;
c2=98;
printf(“%c%c\n”,c1,c2);
printf(“%d%d\n”,c1,c2);
}
說明:在第3和第4行中,將整數(shù)97和98分別賦給c1和c2,它的作用相當(dāng)于以下兩個(gè)賦值語句:
c1=′a′;c2=′b′;因?yàn)椤痑’和’b’的ASCII碼為97和98運(yùn)行結(jié)果:ab
9798例3.7大小寫字母的轉(zhuǎn)換
#include<stdio.h>
voidmain()
{charc1,c2;
c1=’a’;
c2=’b’;
c1=c1-32;
c2=c2-32;
printf(“%c%c″,c1,c2);
}說明:程序的作用是將兩個(gè)小寫字母a和b轉(zhuǎn)換成大寫字母A和B。從ASCII代碼表中可以看到每一個(gè)小寫字母比它相應(yīng)的大寫字母的ASCII碼大32。C語言允許字符數(shù)據(jù)與整數(shù)直接進(jìn)行算術(shù)運(yùn)算。運(yùn)行結(jié)果:AB
§3.5字符型數(shù)據(jù)說明:有些系統(tǒng)(如TurboC)將字符變量定義為signedchar型。其存儲(chǔ)單元中的最高位作為符號(hào)位,它的取值范圍是-128~127。如果在字符變量中存放一個(gè)ASCII碼為0~127間的字符,由于字節(jié)中最高位為0,因此用%d輸出字符變量時(shí),輸出的是一個(gè)正整數(shù)。如果在字符變量中存放一個(gè)ASCII碼為128~255間的字符,由于在字節(jié)中最高位為1,用%d格式符輸出時(shí),就會(huì)得到一個(gè)負(fù)整數(shù)。
§3.5字符型數(shù)據(jù)3.5.4字符串常量字符串常量是一對(duì)雙撇號(hào)括起來的字符序列.合法的字符串常量:
“Howdoyoudo.”,“CHINA”,“a”
,“$123.45”可以輸出一個(gè)字符串,如
printf(“Howdoyoudo.”);
§3.5字符型數(shù)據(jù)
‘a’是字符常量,”a”是字符串常量,二者不同。
如:假設(shè)C被指定為字符變量
:charcc=’a’;
c=”a”;c=”CHINA”;
結(jié)論:不能把一個(gè)字符串常量賦給一個(gè)字符變量。
§3.5字符型數(shù)據(jù)CHINA\0C規(guī)定:在每一個(gè)字符串常量的結(jié)尾加一個(gè)“字符串結(jié)束標(biāo)志”,以便系統(tǒng)據(jù)此判斷字符串是否結(jié)束。C規(guī)定以字符’\0’作為字符串結(jié)束標(biāo)志。
如:如果有一個(gè)字符串常量”CHINA”,實(shí)際上在內(nèi)存中是:
它占內(nèi)存單元不是5個(gè)字符,而是6個(gè)字符,最后一個(gè)字符為’\0’。但在輸出時(shí)不輸出’\0’。§3.6變量賦初值
字符串常量(1)C語言允許在定義變量的同時(shí)使變量初始化如:inta=3;//指定a為整型變量,初值為3
floatf=3.56;//指定f為浮點(diǎn)型變量,初值為3.56charc=‘a(chǎn)’;//指定c為字符變量,初值為‘a(chǎn)’§3.6變量賦初值
(2)可以使被定義的變量的一部分賦初值。
如:
inta,b,c=5;表示指定a、b、c為整型變量,但只對(duì)c初始化,c的初值為5(3)如果對(duì)幾個(gè)變量賦以同一個(gè)初值,應(yīng)寫成:inta=3,b=3,c=3;表示a、b、c的初值都是3。不能寫成∶
inta=b=c3;
注意:初始化不是在編譯階段完成的而是在程序運(yùn)行時(shí)執(zhí)行本函數(shù)時(shí)賦初值的,相當(dāng)于有一個(gè)賦值語句?!?.7各類數(shù)值型數(shù)據(jù)間的混合運(yùn)算
整型(包括int,short,long)、浮點(diǎn)型(包括float,double)可以混合運(yùn)算。在進(jìn)行運(yùn)算時(shí),不同類型的數(shù)據(jù)要先轉(zhuǎn)換成同一類型,然后進(jìn)行運(yùn)算.圖上述的類型轉(zhuǎn)換是由系統(tǒng)自動(dòng)進(jìn)行的§3.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式3.8.1C運(yùn)算符簡介
C的運(yùn)算符有以下幾類:(1)算術(shù)運(yùn)算符(+-*/%)(2)關(guān)系運(yùn)算符(><==>=<=!=)(3)邏輯運(yùn)算符(?。Γ|)(4)位運(yùn)算符(<<>>~|∧&)(5)賦值運(yùn)算符(=及其擴(kuò)展賦值運(yùn)算符)(6)條件運(yùn)算符(?:)(7)逗號(hào)運(yùn)算符(,)§3.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式(8)指針運(yùn)算符(*和&)(9)求字節(jié)數(shù)運(yùn)算符(sizeof)(10)強(qiáng)制類型轉(zhuǎn)換運(yùn)算符((類型))(11)分量運(yùn)算符(.->)(12)下標(biāo)運(yùn)算符([])(13)其他(如函數(shù)調(diào)用運(yùn)算符())§3.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式3.8.2算術(shù)運(yùn)算符和算術(shù)表達(dá)式
(1)基本的算術(shù)運(yùn)算符:+(加法運(yùn)算符,或正值運(yùn)算符。如:3+5、+3)-(減法運(yùn)算符,或負(fù)值運(yùn)算符。如:5-2、-3)*(乘法運(yùn)算符。如:3*5)/(除法運(yùn)算符。如:5/3)%(模運(yùn)算符,或稱求余運(yùn)算符,%兩側(cè)均應(yīng)為整型數(shù)據(jù),如:7%4的值為3)?!?.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式(2)算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級(jí)與結(jié)合性基本的算術(shù)運(yùn)算符:
用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象(也稱操作數(shù))連接起來的、符合C語法規(guī)則的式子,稱為C算術(shù)表達(dá)式。運(yùn)算對(duì)象包括常量、變量、函數(shù)等。
例如:
a*b/c-1.5+′a′
是一個(gè)合法的表達(dá)式
§3.2常量與變量C語言規(guī)定了運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。在表達(dá)式求值時(shí),先按運(yùn)算符的優(yōu)先級(jí)別高低次序執(zhí)行,例如先乘除后加減。
C規(guī)定了各種運(yùn)算符的結(jié)合方向(結(jié)合性)
算術(shù)運(yùn)算符的結(jié)合方向?yàn)椤白宰笾劣摇?,即先左后右?!?.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式(3)強(qiáng)制類型轉(zhuǎn)換運(yùn)算符
可以利用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符將一個(gè)表達(dá)式轉(zhuǎn)換成所需類型。
一般形式:(類型名)(表達(dá)式)例如:(double)a將a轉(zhuǎn)換成double類型(int)(x+y)將x+y的值轉(zhuǎn)換成整型(float)(5%3)將5%3的值轉(zhuǎn)換成float型例3.8強(qiáng)制類型轉(zhuǎn)換。
#include<stdio.h>
voidmain()
{floatx;
inti;
x=3.6;
i=(int)x;
printf("x=%f,i=%d\n",x,i);
}
說明:有兩種類型轉(zhuǎn)換,一種是在運(yùn)算時(shí)不必用戶指定,系統(tǒng)自動(dòng)進(jìn)行的類型轉(zhuǎn)換,如3+6.5。第二種是強(qiáng)制類型轉(zhuǎn)換。當(dāng)自動(dòng)類型轉(zhuǎn)換不能實(shí)現(xiàn)目的時(shí),可以用強(qiáng)制類型轉(zhuǎn)換。運(yùn)行結(jié)果:
x=3.600000,i=3§3.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式(4)
自增、自減運(yùn)算符
作用是使變量的值增1或減1如:++i,--i(在使用i之前,先使i的值加(減)1)i++,i--(在使用i之后,使i的值加(減)1)
§3.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式i++與++i的區(qū)別:
++i是先執(zhí)行i=i+1后,再使用i的值;i++是先使用i的值后,再執(zhí)行i=i+1。例如:①j=++i;
i的值先變成4,再賦給j,j的值均為4②j=i++;先將i的值3賦給j,j的值為3,然后i變?yōu)椋础?.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式注意:
(1)自增運(yùn)算符(++),自減運(yùn)算符(--),只能用于變量,而不能用于常量或表達(dá)式,
(2)++和--的結(jié)合方向是“自右至左”。
自增(減)運(yùn)算符常用于循環(huán)語句中使循環(huán)變量自動(dòng)加1。也用于指針變量,使指針指向下一個(gè)地址
§3.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式(5)有關(guān)表達(dá)式使用中的問題說明
①ANSIC并沒有具體規(guī)定表達(dá)式中的子表達(dá)式的求值順序,允許各編譯系統(tǒng)自己安排。例如:對(duì)表達(dá)式a=f1()+f2()
并不是所有的編譯系統(tǒng)都先調(diào)用f1(),然后調(diào)用f2()。在有的情況下結(jié)果可能不同。有時(shí)會(huì)出現(xiàn)一些令人容易搞混的問題,因此務(wù)必要小心謹(jǐn)慎。
§3.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式②C語言中有的運(yùn)算符為一個(gè)字符,有的運(yùn)算符由兩個(gè)字符組成,為避免誤解,最好采取大家都能理解的寫法。例如:不要寫成i+++j的形式,而應(yīng)寫成
(i++)+j的形式
§3.8算術(shù)運(yùn)算符和算術(shù)表達(dá)式③在調(diào)用函數(shù)時(shí),實(shí)參數(shù)的求值順序,C標(biāo)準(zhǔn)并無統(tǒng)一規(guī)定。例如:i的初值為3,如果有下面的函數(shù)調(diào)用:
printf(″%d,%d″,i,i++)
在有的系統(tǒng)中,從左至右求值,輸出“3,3”。在多數(shù)系統(tǒng)中對(duì)函數(shù)參數(shù)的求值順序是自右而左,printf函數(shù)輸出的是“4,3”。以上這種寫法不宜提倡,最好改寫成
j=i++;printf("%d,%d",j,i)不要寫出別人看不懂的也不知道系統(tǒng)會(huì)怎樣執(zhí)行程序
§3.9賦值運(yùn)算符和賦值表達(dá)式
(1)賦值運(yùn)算符
賦值符號(hào)“=”就是賦值運(yùn)算符,它的作用是將一個(gè)數(shù)據(jù)賦給一個(gè)變量。如“a=3”的作用是執(zhí)行一次賦值操作(或稱賦值運(yùn)算)。把常量3賦給變量a。也可以將一個(gè)表達(dá)式的值賦給一個(gè)變量.
§3.9賦值運(yùn)算符和賦值表達(dá)式
(2)類型轉(zhuǎn)換
如果賦值運(yùn)算符兩側(cè)的類型不一致,但都是數(shù)值型或字符型時(shí),在賦值時(shí)要進(jìn)行類型轉(zhuǎn)換。①將浮點(diǎn)型數(shù)據(jù)(包括單、雙精度)賦給整型變量時(shí),舍棄浮點(diǎn)數(shù)的小數(shù)部分。如:i為整型變量,執(zhí)行“i=3.56”的結(jié)果是使i的值為3,以整數(shù)形式存儲(chǔ)在整型變量中.
§3.9賦值運(yùn)算符和賦值表達(dá)式
②將整型數(shù)據(jù)賦給單、雙精度變量時(shí),數(shù)值不變,但以浮點(diǎn)數(shù)形式存儲(chǔ)到變量中
如:
將23賦給float變量f,即執(zhí)行f=23,先將23轉(zhuǎn)換成23.00000,再存儲(chǔ)在f中。將23賦給double型變量d,即執(zhí)行d=23,則將23補(bǔ)足有效位數(shù)字為23.00000000000000,然后以雙精度浮點(diǎn)數(shù)形式存儲(chǔ)到變量d中。
§3.9賦值運(yùn)算符和賦值表達(dá)式
③將一個(gè)double型數(shù)據(jù)賦給float變量時(shí),截取其前面7位有效數(shù)字,存放到float變量的存儲(chǔ)單元(4個(gè)字節(jié))中。但應(yīng)注意數(shù)值范圍不能溢出。
如:floatf;doubled=123.456789e100;f=d;
就出現(xiàn)溢出的錯(cuò)誤。
如果將一個(gè)float型數(shù)據(jù)賦給double變量時(shí),數(shù)值不變,有效位數(shù)擴(kuò)展到16位,在內(nèi)存中以8個(gè)字節(jié)存儲(chǔ)
§3.9賦值運(yùn)算符和賦值表達(dá)式
④字符型數(shù)據(jù)賦給整型變量時(shí),由于字符只占1個(gè)字節(jié),而整型變量為2個(gè)字節(jié),因此將字符數(shù)據(jù)(8?jìng)€(gè)二進(jìn)位)放到整型變量存儲(chǔ)單元的低8位中。第一種情況:
如果所用系統(tǒng)將字符處理為無符號(hào)的字符類型,或程序已將字符變量定義為unsignedchar型,則將字符的8位放到整型變量低8位,高8位補(bǔ)零例如:將字符‘\376’賦給int型變量i圖
§3.9賦值運(yùn)算符和賦值表達(dá)式
第二種情況:
如果所用系統(tǒng)(如TurboC++)將字符處理為帶符號(hào)的(即signedchar),若字符最高位為0,則整型變量高8位補(bǔ)0;若字符最高位為1,則高8位全補(bǔ)1。這稱為“符號(hào)擴(kuò)展”,這樣做的目的是使數(shù)值保持不變,如變量c(字符‘\376’)以整數(shù)形式輸出為-2,i的值也是-2。圖
§3.9賦值運(yùn)算符和賦值表達(dá)式
⑤將一個(gè)int、short、long型數(shù)據(jù)賦給一個(gè)char型變量時(shí),只將其低8位原封不動(dòng)地送到char型變量(即截?cái)啵?。例如:inti=289;charc=′a′;c=i;
賦值情況:圖c的值為33,如果用“%c”輸出c,將得到字符“!”(其ASCII碼為33)。
§3.9賦值運(yùn)算符和賦值表達(dá)式
將帶符號(hào)的整型數(shù)據(jù)(int型)賦給long型變量時(shí),要進(jìn)行符號(hào)擴(kuò)展,將整型數(shù)的16位送到long型低16位中:如果int型數(shù)據(jù)為正值(符號(hào)位為0),則long型變量的高16位補(bǔ)0;如果int型變量為負(fù)值(符號(hào)位為1),則long型變量的高16位補(bǔ)1,以保持?jǐn)?shù)值不改變。反之,若將一個(gè)long型數(shù)據(jù)賦給一個(gè)int型變量,只將long型數(shù)據(jù)中低16位原封不動(dòng)地送到整型變量(即截?cái)啵?/p>
§3.9賦值運(yùn)算符和賦值表達(dá)式
例如:inta;longb=8;a=b
賦值情況如圖:圖如果b=65536(八進(jìn)制數(shù)0200000),則賦值后a值為0。見圖3.14圖3.14
§3.9賦值運(yùn)算符和賦值表達(dá)式
⑦將unsignedint型數(shù)據(jù)賦給longint型變量時(shí),不存在符號(hào)擴(kuò)展問題,只需將高位補(bǔ)0即可。將一個(gè)unsigned類型數(shù)據(jù)賦給一個(gè)占字節(jié)數(shù)相同的非unsigned型整型變量(例如:unsignedint->int,unsignedlong->long,unsignedshort->short),將unsigned型變量的內(nèi)容原樣送到非unsigned型變量中,但如果數(shù)據(jù)范圍超過相應(yīng)整型的范圍,則會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)誤。
§3.9賦值運(yùn)算符和賦值表達(dá)式
例如:unsignedinta=65535;intb;b=a;
圖將a整個(gè)送到b中,由于b是int,第1位是符號(hào)位,因此b成了負(fù)數(shù)。根據(jù)補(bǔ)碼知識(shí)可知,b的值為-1,可以用printf(″%d″,b);來驗(yàn)證。
⑧將非unsigned型數(shù)據(jù)賦給長度相同的unsigned型變量,也是原樣照賦(連原有的符號(hào)位也作為數(shù)值一起傳送)。
例3.9有符號(hào)數(shù)據(jù)傳送給無符號(hào)變量。
#include<stdio.h>
voidmain()
{unsigneda;
intb=-1;
a=b;
printf(″%u\n″,a);
}
說明:“%u”是輸出無符號(hào)數(shù)時(shí)所用的格式符。如果b為正值,且在0~32767之間,則賦值后數(shù)值不變。賦值情況見圖
圖運(yùn)行結(jié)果:65535
§3.9賦值運(yùn)算符和賦值表達(dá)式
(3)復(fù)合的賦值運(yùn)算符
在賦值符“=”之前加上其他運(yùn)算符,可以構(gòu)成復(fù)合的運(yùn)算符。例如:a+=3等價(jià)于a=a+3x*=y+8等價(jià)于x=x*(y+8)x%=3等價(jià)于x=x%3以“a+=3”為例來說明,它相當(dāng)于使a進(jìn)行一次自加(3)的操作。即先使a加3,再賦給a。
§3.9賦值運(yùn)算符和賦值表達(dá)式
為便于記憶,可以這樣理解:①a+=b(其中a為變量,b為表達(dá)式)②a+=b(將有下劃線的“a+”移到“=”右側(cè))
|___↑③a=a+b(在“=”左側(cè)補(bǔ)上變量名a)
§3.9賦值運(yùn)算符和賦值表達(dá)式
注意:如果b是包含若干項(xiàng)的表達(dá)式,則相當(dāng)于它有括號(hào)。如:
①x%=y+3
②x%=(y+3)|__↑
③x=x%(y+3)(不要錯(cuò)寫成x=x%y+3)
凡是二元(二目)運(yùn)算符,都可以與賦值符一起組合成復(fù)合賦值符。C語言規(guī)定可以使用10種復(fù)合賦值運(yùn)算符:+=,-=,*=,/=,%=,<<=,>>=,&=,∧=,|=
§3.9賦值運(yùn)算符和賦值表達(dá)式
(4)賦值表達(dá)式
由賦值運(yùn)算符將一個(gè)變量和一個(gè)表達(dá)式連接起來的式子稱為“賦值表達(dá)式”。一般形式為:
<變量><賦值運(yùn)算符><表達(dá)式>
例如:“a=5”是一個(gè)賦值表達(dá)式
§3.9賦值運(yùn)算符和賦值表達(dá)式
對(duì)賦值表達(dá)式求解的過程是:
①求賦值運(yùn)算符右側(cè)的“表達(dá)式”的值;②賦給賦值運(yùn)算符左側(cè)的變量。例如:賦值表達(dá)式“a=3*5”的值為15,執(zhí)行表達(dá)式后,變量a的值也是15。
注意:一個(gè)表達(dá)式應(yīng)該有一個(gè)值
§3.9賦值運(yùn)算符和賦值表達(dá)式
左值(lvalue)
:賦值運(yùn)算符左側(cè)的標(biāo)識(shí)符變量可以作為左值;而表達(dá)式就不能作為左值(如a+b);常變量也不能作為左值,
右值(lvalue)
:出現(xiàn)在賦值運(yùn)算符右側(cè)的表達(dá)式
左值也可以出現(xiàn)在賦值運(yùn)算符右側(cè),因而左值都可以作為右值。
§3.9賦值運(yùn)算符和賦值表達(dá)式
賦值表達(dá)式中的“表達(dá)式”,又可以是一個(gè)賦值表達(dá)式.例如:a=(b=5)
分析:括弧內(nèi)的“b=5”是一個(gè)賦值表達(dá)式,它的值等于5。執(zhí)行表達(dá)式“a=(b=5)”相當(dāng)于執(zhí)行“b=5”和“a=b”兩個(gè)賦值表達(dá)式。賦值運(yùn)算符按照“自右而左”的結(jié)合順序,因此,“(b=5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等價(jià).
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024鋼渣加工合同
- 2024廣告承包合同范文
- 2024購房合同商品房預(yù)售合同
- 2024施工合同樣本范文
- 2024家具銷售合同范本
- 云計(jì)算與大數(shù)據(jù)在水果種植數(shù)據(jù)分析中的應(yīng)用案例
- 紀(jì)律主題班會(huì)
- 蘇州科技大學(xué)天平學(xué)院《書籍設(shè)計(jì)》2021-2022學(xué)年第一學(xué)期期末試卷
- 妊娠管理的職責(zé)
- 制糖業(yè)市場(chǎng)銷售合同管理考核試卷
- 通用BIQS培訓(xùn)資料課件
- (完整版)物主代詞和名詞所有格專項(xiàng)練習(xí)
- (精選課件)蝸牛爬井的故事
- 天翼云從業(yè)者認(rèn)證考前模擬題庫(含答案)
- 關(guān)于小學(xué)五年級(jí)硬筆書法寫字課教案全冊(cè)
- 閱讀指導(dǎo)《我爸爸》導(dǎo)讀課件
- 垃圾清運(yùn)轉(zhuǎn)運(yùn)車輛安全管理制度
- 保安部崗位設(shè)置圖
- DB31T 1295-2021 立體花壇技術(shù)規(guī)程
- “西學(xué)中”考試試卷及答案
- 部編版《道德與法治》五年級(jí)上冊(cè)第10課《傳統(tǒng)美德 源遠(yuǎn)流長》優(yōu)質(zhì)課件
評(píng)論
0/150
提交評(píng)論