《C語言程序設(shè)計(jì)-項(xiàng)目教學(xué)教程》課件-第1章_第1頁
《C語言程序設(shè)計(jì)-項(xiàng)目教學(xué)教程》課件-第1章_第2頁
《C語言程序設(shè)計(jì)-項(xiàng)目教學(xué)教程》課件-第1章_第3頁
《C語言程序設(shè)計(jì)-項(xiàng)目教學(xué)教程》課件-第1章_第4頁
《C語言程序設(shè)計(jì)-項(xiàng)目教學(xué)教程》課件-第1章_第5頁
已閱讀5頁,還剩142頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

項(xiàng)目一家庭財(cái)務(wù)管理系統(tǒng)任務(wù)1存款的原樣輸出任務(wù)2利息的計(jì)算本項(xiàng)目的主要任務(wù)是對“家庭財(cái)務(wù)管理系統(tǒng)”進(jìn)行規(guī)劃設(shè)計(jì)。學(xué)習(xí)本項(xiàng)目后,學(xué)生應(yīng)掌握C語言的基本概念,能正確畫出“家庭財(cái)務(wù)管理系統(tǒng)”的總體結(jié)構(gòu)圖。在本項(xiàng)目的學(xué)習(xí)中,學(xué)生要達(dá)到如下的知識目標(biāo)和能力目標(biāo)。

知識目標(biāo):

了解C語言的特點(diǎn)、C語言程序開發(fā)步驟。

初步了解C程序的組成結(jié)構(gòu)、主函數(shù)的作用。

初步掌握C語言流程圖、N-S圖的圖例特點(diǎn)與屬性。

能力目標(biāo):

能夠啟動(dòng)VisualC++6.0,并能正確進(jìn)入編程窗口。

學(xué)會與人打交道,完成調(diào)查任務(wù)。

能初步掌握“家庭財(cái)務(wù)管理系統(tǒng)”存款的原樣輸出。

任務(wù)1存款的原樣輸出

一、任務(wù)情境

月底發(fā)工資,張先生到銀行存款3000元人民幣,請輸出張先生本次存款金額。具體實(shí)現(xiàn)代碼如下:

#include(stdio.h)

voidmain()

{

printf("張先生存款3000元!\n");

}程序運(yùn)行結(jié)果如下:

張先生存款3000元!

“家庭財(cái)務(wù)管理系統(tǒng)”中的數(shù)據(jù)有常量和變量、簡單類型數(shù)據(jù)和復(fù)雜類型數(shù)據(jù)。這些變量有簡單類型變量,還有一些復(fù)雜類型變量,如數(shù)組、結(jié)構(gòu)體、共用體、指針等。以上就是C語言中存款的原樣輸出,下面我們深入認(rèn)識一下C語言的發(fā)展史、特點(diǎn)和結(jié)構(gòu)以及開發(fā)工具與運(yùn)行環(huán)境等。二、相關(guān)知識

1.?C語言發(fā)展史

從程序語言的發(fā)展過程可以看到,以前的操作系統(tǒng)等系統(tǒng)軟件主要是用匯編語言編寫的。但是由于匯編語言依賴于計(jì)算機(jī)硬件,程序的可讀性和可移植性都不是很好,所以為了提高程序的可讀性和可移植性,人們開始尋找一種語言,這種語言應(yīng)該既具有高級語言的特性,又不失低級語言的好處。于是,在這種需求下產(chǎn)生了C語言。

C語言是目前世界上十分流行、使用非常廣泛的高級程序設(shè)計(jì)語言。它既具有高級語言的特點(diǎn),又具有匯編語言的特點(diǎn)。它可以作為工作系統(tǒng)設(shè)計(jì)語言,編寫系統(tǒng)應(yīng)用程序,也可以作為應(yīng)用程序設(shè)計(jì)語言,編寫不依賴計(jì)算機(jī)硬件的應(yīng)用程序。它的應(yīng)用范圍廣泛,具備很強(qiáng)的數(shù)據(jù)處理能力。不僅僅在軟件開發(fā)上需要用到C語言,而且各類科研都需要用到C語言。它也適于編寫系統(tǒng)軟件以及三維、二維圖形和動(dòng)畫軟件。

C語言的發(fā)展頗為有趣。它的原型是ALGOL60語言(也稱為A語言)。

1963年,劍橋大學(xué)將ALGOL60語言發(fā)展成為CPL(CombinedProgrammingLanguage)語言。1967年,劍橋大學(xué)的MatinRichards對CPL語言進(jìn)行了簡化,于是產(chǎn)生了BCPL語言。

1970年,美國貝爾實(shí)驗(yàn)室的KenThompson將BCPL進(jìn)行了修改,并為它起了一個(gè)有趣的名字“B語言”。意思是將CPL語言煮干,提煉出它的精華。并且他用B語言寫了第一個(gè)UNIX操作系統(tǒng)。而在1973年,B語言也給人“煮”了一下,美國貝爾實(shí)驗(yàn)室的DennisM.?Ritchie在B語言的基礎(chǔ)上最終設(shè)計(jì)出了一種新的語言,他取了BCPL的第二個(gè)字母作為這種語言的名字,這就是C語言。為了使UNIX操作系統(tǒng)得到推廣,1977年DennisM.?Ritchie發(fā)表了不依賴于具體機(jī)器系統(tǒng)的C語言編譯文本《可移植的C語言編譯程序》。1978年BrianW.?Kernighian和DennisM.?Ritchie出版了名著《TheCProgrammingLanguage》,從而使C語言成為世界上應(yīng)用最廣泛的高級程序設(shè)計(jì)語言。

1988年,隨著微型計(jì)算機(jī)的日益普及,出現(xiàn)了許多C語言版本。由于沒有統(tǒng)一的標(biāo)準(zhǔn),這些C語言之間出現(xiàn)了一些不一致的地方。為了改變這種情況,美國國家標(biāo)準(zhǔn)研究所(ANSI)為C語言制定了一套ANSI標(biāo)準(zhǔn),成為現(xiàn)行的C語言標(biāo)準(zhǔn)3.C語言的主要特點(diǎn)。C語言發(fā)展迅速,而且成為最受歡迎的語言之一,主要是因?yàn)樗哂袕?qiáng)大的功能。許多著名的系統(tǒng)軟件,如DBASEⅢPLUS、DBASEⅣ?等都是由C語言編寫的。用C語言加上一些匯編語言子程序,就更能顯示C語言的優(yōu)勢,如PC-DOS、WORDSTAR等就是用這種方法編寫的。目前最流行的C語言有以下幾種:MicrosoftC或稱MSC;BorlandTurboC或稱TurboC;AT&TC。這些C語言版本不僅實(shí)現(xiàn)了ANSIC標(biāo)準(zhǔn),而且在此基礎(chǔ)上各自作了一些擴(kuò)充,使之更加方便、完美。在C語言的基礎(chǔ)上,1983年貝爾實(shí)驗(yàn)室的BjarneStrou-strup推出了C++。C++?進(jìn)一步擴(kuò)充和完善了C語言,成為一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。C++?目前流行的最新版本是BorlandC++4.5、SymantecC++6.1和MicrosoftVisualC++2.0。C++?提出了一些更為深入的概念,它所支持的這些面向?qū)ο蟮母拍钊菀讓栴}空間直接映射到程序空間,為程序員提供了一種與傳統(tǒng)結(jié)構(gòu)程序設(shè)計(jì)不同的思維方式和編程方法。因而也增加了整個(gè)語言的復(fù)雜性,掌握起來有一定的難度。

2.?C語言的特點(diǎn)

一種語言之所以能存在和發(fā)展,并且具有較強(qiáng)的生命力,總是有其不同于其他語言的特點(diǎn)。

C語言的主要特點(diǎn)如下:

(1)簡潔緊湊、靈活方便。C語言一共只有32個(gè)關(guān)鍵字、9種控制語句,程序書寫自由,主要用小寫字母表示。它把高級語言的基本結(jié)構(gòu)和語句與低級語言的實(shí)用性相結(jié)合。

(2)運(yùn)算符豐富。C語言的運(yùn)算符包含的范圍很廣泛,共有34個(gè)運(yùn)算符。C語言把括號、賦值、強(qiáng)制類型轉(zhuǎn)換等都作為運(yùn)算符處理,從而使C語言的運(yùn)算類型極其豐富,表達(dá)式類型多樣化。靈活使用C語言的各種運(yùn)算符可以實(shí)現(xiàn)在其他高級語言中難以實(shí)現(xiàn)的運(yùn)算。

(3)數(shù)據(jù)類型豐富。C語言的數(shù)據(jù)類型有整型、實(shí)型、字符型、數(shù)組類型、指針類型、結(jié)構(gòu)體類型、共用體類型等,能用來實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)類型的運(yùn)算。C語言引入了指針的概念,使程序效率更高。另外,C語言具有強(qiáng)大的圖形功能,支持多種顯示器和驅(qū)動(dòng)器,且計(jì)算功能、邏輯判斷功能強(qiáng)大。

(4)?C語言是結(jié)構(gòu)式語言。結(jié)構(gòu)式語言的顯著特點(diǎn)是代碼及數(shù)據(jù)的分隔化,即程序的各個(gè)部分除了必要的信息交流外,彼此獨(dú)立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦?,便于使用、維護(hù)以及調(diào)試。C語言是以函數(shù)形式提供給用戶的,這些函數(shù)可方便地被調(diào)用,并由多種循環(huán)、條件語句控制程序流向,從而使程序完全結(jié)構(gòu)化。

(5)?C語言的語法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。一般的高級語言語法檢查比較嚴(yán),能夠檢查出幾乎所有的語法錯(cuò)誤。而C語言允許程序編寫者有較大的自由度。

(6)?C語言允許直接訪問物理地址,可以直接對硬件進(jìn)行操作。C語言既具有高級語言的功能,又具有低級語言的許多功能,能夠像匯編語言一樣對位、字節(jié)和地址進(jìn)行操作,而這三者是計(jì)算機(jī)最基本的工作單元,可以用來編寫系統(tǒng)軟件。

(7)?C語言程序生成代碼質(zhì)量高,程序執(zhí)行效率高。用C語言編寫的代碼一般只比匯編程序生成的目標(biāo)代碼效率低10%~20%。

(8)?C語言適用范圍廣,可移植性好。C語言有一個(gè)突出的優(yōu)點(diǎn)就是適用于多種操作系統(tǒng),如DOS、UNIX、Windows等,也適用于多種機(jī)型。

3.?C程序的基本結(jié)構(gòu)分析

為了說明C語言源程序結(jié)構(gòu)的特點(diǎn),先看以下幾個(gè)程序。這幾個(gè)程序由簡到難,體現(xiàn)了C語言源程序在組成結(jié)構(gòu)上的特點(diǎn)。雖然有關(guān)內(nèi)容還未介紹,但可從這些例子中了解到組成一個(gè)C源程序的基本部分和書寫格式?!纠?.1.1】這是一個(gè)很簡單的C語言程序。main前面的void表示此主函數(shù)是“空類型”,void是“空”的意思,即執(zhí)行此函數(shù)后不產(chǎn)生一個(gè)函數(shù)值。每一個(gè)C語言程序都必須有一個(gè)main函數(shù)。每一個(gè)函數(shù)要有函數(shù)名,也要有函數(shù)體(即函數(shù)的實(shí)體)。函數(shù)體由一對花括號{}括起來。本例中函數(shù)體中只有一行語句。程序第04行是一個(gè)printf語句,圓括號中雙撇號內(nèi)的字符串按原樣輸出。“\n”是換行符,在執(zhí)行程序時(shí),輸出“GoodMorning!”,然后執(zhí)行回車換行。語句最后有一個(gè)分號。在使用標(biāo)準(zhǔn)函數(shù)庫中的輸入、輸出函數(shù)時(shí),編譯系統(tǒng)要求程序提供有關(guān)的信息(例如對這些輸入、輸出函數(shù)的聲明),程序第01行“#include<stdio.h>”的作用就是用來提供這些信息的。stdio.h是C編譯系統(tǒng)提供的一個(gè)文件名,stdio是“standardinput&output”的縮寫,即有關(guān)“標(biāo)準(zhǔn)輸入輸出”的信息。在開始時(shí)對此可暫不深究,以后會有詳細(xì)介紹。在此只需記?。涸诔绦蛑杏玫较到y(tǒng)提供的標(biāo)準(zhǔn)函數(shù)庫中的輸入、輸出函數(shù)時(shí),應(yīng)在程序的開頭寫這樣一行:

#include<stdio.h>例1.1.2中程序的功能是由用戶輸入兩個(gè)整數(shù),程序執(zhí)行后輸出其中較大的數(shù)。本程序由兩個(gè)函數(shù)組成,即主函數(shù)main和max函數(shù)。這兩個(gè)函數(shù)之間是并列關(guān)系。當(dāng)然,主函數(shù)還可以調(diào)用其他函數(shù)。本例中的主函數(shù)體又分為兩部分:一部分為說明部分(第03~04行),另一部分為執(zhí)行部分(第05~08行)。在程序的說明部分中,不僅可以有變量說明,還可以有函數(shù)說明。

max函數(shù)的功能是比較兩個(gè)數(shù),然后把較大的數(shù)返回給主函數(shù)。程序第04行是在主函數(shù)中對被調(diào)用函數(shù)max的聲明。由于在主函數(shù)中要調(diào)用max函數(shù),而max函數(shù)的定義卻在main函數(shù)之后,為了使編譯系統(tǒng)能夠正確識別和調(diào)用max函數(shù),必須在調(diào)用max函數(shù)之前對max函數(shù)進(jìn)行聲明,以通知編譯系統(tǒng):“在main函數(shù)中,max是一個(gè)函數(shù)名”。關(guān)于函數(shù)的詳細(xì)內(nèi)容將在項(xiàng)目三的任務(wù)2中介紹。在程序的每行后用?/*?和?*/?括起來的內(nèi)容為注釋部分,程序不執(zhí)行注釋部分。例1.1.2中程序的執(zhí)行過程是,首先在屏幕上顯示提示串,請用戶輸入兩個(gè)數(shù),回車后由scanf函數(shù)語句接收這兩個(gè)數(shù)送入變量x、y中,然后調(diào)用max函數(shù),并把x、y的值(稱為實(shí)際參數(shù))傳送給max函數(shù)的參數(shù)a、b(稱為形式參數(shù))。在max函數(shù)中比較a、b的大小,把大者返回給主函數(shù)的變量z,最后在屏幕上輸出z的值。

程序運(yùn)行結(jié)果如下:

inputtwonumbers:

8,5↙

max=8為了在分析運(yùn)行結(jié)果時(shí)便于區(qū)別輸入和輸出的信息,本書對輸入的信息加了下劃線,如上面的運(yùn)行結(jié)果的第2行表示:從鍵盤輸入8和5,然后按Enter鍵。第3行是從計(jì)算機(jī)輸出的信息,顯示在屏幕上。

本例用到了函數(shù)調(diào)用、實(shí)際參數(shù)和形式參數(shù)等概念,在此只做了很簡單的解釋。讀者如對此不大理解,可以先不予以深究,在以后的章節(jié)中會學(xué)到這部分知識。在此主要是使讀者對C程序的組成和形式有—個(gè)初步的了解。通過以上兩個(gè)例子,可以看到C語言源程序的結(jié)構(gòu)特點(diǎn):

(1)一個(gè)C語言源程序可以由一個(gè)或多個(gè)源文件組成。

(2)每個(gè)源文件可由一個(gè)或多個(gè)函數(shù)組成。

(3)一個(gè)源程序不論由多少個(gè)函數(shù)組成,都有一個(gè)且只能有一個(gè)main函數(shù),即主函數(shù)。

(4)源程序中可以有預(yù)處理命令(include命令僅為其中的一種),預(yù)處理命令通常應(yīng)放在源文件或源程序的最前面。

(5)每一個(gè)說明、每一個(gè)語句都必須以分號結(jié)尾,但預(yù)處理命令、函數(shù)頭和花括號“}”之后不能加分號。

(6)標(biāo)識符、關(guān)鍵字之間必須至少加一個(gè)空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。

4.程序設(shè)計(jì)時(shí)的算法描述

1)程序的三種基本結(jié)構(gòu)

一個(gè)程序包含一系列的執(zhí)行指令,每一個(gè)指令使計(jì)算機(jī)完成一種操作。程序中的指令不是任意書寫的。1966年,Bohra和Jacopini提出了三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循序結(jié)構(gòu)。用這三種基本結(jié)構(gòu)作為表示一個(gè)良好算法的基本單元。因此,任何一個(gè)復(fù)雜程序都可以由這三種基本結(jié)構(gòu)組成,它們的含義如下:

(1)順序結(jié)構(gòu):一條語句接一條語句順序地往下執(zhí)行。順序結(jié)構(gòu)的程序是最簡單的程序。圖1-1-1所示為順序結(jié)構(gòu)圖。

(2)選擇結(jié)構(gòu):若在程序執(zhí)行過程中,程序的流程可由多路分支組成,則可根據(jù)不同的條件去執(zhí)行不同的任務(wù)。圖1-1-2所示為選擇結(jié)構(gòu)圖。圖1-1-1順序結(jié)構(gòu)圖1-1-2選擇結(jié)構(gòu)

(3)循環(huán)結(jié)構(gòu):若在程序中需要根據(jù)某項(xiàng)條件重復(fù)地執(zhí)行某項(xiàng)任務(wù)若干次或直到滿足或不滿足某條件為止,則構(gòu)成了循環(huán)結(jié)構(gòu)。圖1-1-3所示為循環(huán)結(jié)構(gòu)圖。圖1-1-3循環(huán)結(jié)構(gòu)

2)程序的算法描述

(1)算法的概念。

計(jì)算機(jī)所進(jìn)行的一切操作都是由程序決定的,而程序是人事先編寫好并輸入給計(jì)算機(jī)的。從前面的程序中可知,一個(gè)程序包括以下兩方面的內(nèi)容:

①對數(shù)據(jù)的描述。在程序中要指定數(shù)據(jù)的類型和數(shù)據(jù)的組織形式,即數(shù)據(jù)結(jié)構(gòu)(datastructure)。②對操作的描述,即操作步驟,也就是算法(algorithm)。

數(shù)據(jù)是操作的對象,操作的目的是對數(shù)據(jù)進(jìn)行加工處理,以得到期望的結(jié)果。打個(gè)比方,廚師制作菜肴,需要有菜譜,菜譜一般應(yīng)包括:配料,指出應(yīng)使用哪些原料;操作步驟,指出如何使用這些原料按規(guī)定的步驟加工成所需的菜肴。沒有原料是無法加工成所需菜肴的。但是用同一些原料可以加工出不同的菜肴。作為程序設(shè)計(jì)人員,必須認(rèn)真考慮和設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)和操作步驟(即算法)。著名計(jì)算機(jī)科學(xué)家沃思(NikildausWirth)提出一個(gè)公式:

數(shù)據(jù)結(jié)構(gòu)?+?算法?=?程序

那么什么是算法呢?做任何事情都有一定的內(nèi)容和步驟。我們從事各種工作和活動(dòng),都必須事先想好進(jìn)行的步驟,然后按部就班地進(jìn)行,才能避免產(chǎn)生錯(cuò)亂。廣義地說,為解決一個(gè)問題而采取的方法和步驟,就稱為“算法”。對同一個(gè)問題,可以有不同的解題方法和步驟。例如,求1?+?2?+?3?+?…?+?100,即,有人可能先進(jìn)行1?+?2,再加3,再加4,一直加到100,而有的人則采取這樣的方法:還可以有其他方法。當(dāng)然,方法有優(yōu)劣之分。有的方法只需進(jìn)行很少的步驟,而有些方法則需要較多的步驟。一般來說,希望采用簡單、運(yùn)算步驟少的方法。因此,為了有效地進(jìn)行解題,不僅需要保證算法正確,還要考慮算法的質(zhì)量,選擇合適的算法。

(2)算法的表示。

構(gòu)思好一個(gè)算法后,可以選擇不同的方式表示。

①用自然語言表示。自然語言就是人們?nèi)粘J褂玫恼Z言,可以是漢語、英語或其他語言。用自然語言表示通俗易懂,但文字冗長,容易出現(xiàn)歧義。自然語言表示的含義往往不太嚴(yán)格,要根據(jù)上下文才能判斷其正確含義。假如有這樣一句話:“張先生對李先生說他的孩子考上了大學(xué)”。請問:是張先生的孩子考上大學(xué)呢還是李先生的孩子考上大學(xué)呢?光從這句話本身難以判斷。此外,用自然語言來描述包含分支和循環(huán)的算法,不是很方便。因此,除了那些很簡單的問題以外,一般不用自然語言描述算法。②用傳統(tǒng)流程圖表示算法。流程圖用一些圖框來表示各種操作。用圖形表示算法,直觀形象,易于理解。美國國家標(biāo)準(zhǔn)化協(xié)會(AmericanNationalStandardInstitute,ANSI)規(guī)定了一些常用的流程圖符號(見圖1-1-4),已被世界各國程序設(shè)計(jì)者普遍采用起止框處理框輸入輸出框流程線

判斷框

連接點(diǎn)圖1-1-4流程圖符號【例1.1.3】任意輸入兩個(gè)數(shù),求兩個(gè)數(shù)中較大的那個(gè)數(shù)。

說明:用傳統(tǒng)流程圖表示此題的算法見圖1-1-5。圖1-1-5例1.1.3流程圖③用N-S流程圖表示算法。1973年美國學(xué)者I.Nassi和B.Shneiderman提出了一種新的流程圖形式。在這種流程圖中,完全去掉了帶箭頭的流程線。全部算法寫在一個(gè)矩形框內(nèi),在該框內(nèi)還可以包含其他的從屬于它的框,或者說,由一些基本的框組成一個(gè)大的框。這種流程圖又稱N-S結(jié)構(gòu)化流程圖(N和S是兩位美國學(xué)者的英文姓氏的首字母)。這種流程圖適于結(jié)構(gòu)化程序設(shè)計(jì),而且作圖簡單,占用面積小。N-S流程圖使用如圖1-1-6~圖1-1-8所示的流程圖符號。圖1-1-6順序結(jié)構(gòu)圖1-1-7選擇結(jié)構(gòu)圖1-1-8循環(huán)結(jié)構(gòu)【例1.1.4】將例1.1.3的算法用N-S流程圖來表示。圖1-1-9例1.1.3的N-S流程圖④用偽代碼表示算法。用傳統(tǒng)的流程圖和N-S圖表示算法直觀易懂,但畫起來比較費(fèi)事。在設(shè)計(jì)一個(gè)算法時(shí),可能要反復(fù)修改,而修改流程圖是比較麻煩的。為了使設(shè)計(jì)算法時(shí)方便,常用一種稱為偽代碼(pseudocode)的工具。

偽代碼用介于自然語言和計(jì)算機(jī)語言之間的文字和符號來描述算法。它如同一篇文章一樣,自上而下地寫下來,每一行(或幾行)表示一個(gè)基本操作。它不用圖形符號,因此書寫方便,格式緊湊,也比較好懂,也便于向計(jì)算機(jī)語言算法(即程序)過渡?!纠?.1.5】將例1.1.3的算法用偽代碼表示。

ifx>ythen

x→max

else

y→max

用偽代碼寫算法并無固定的、嚴(yán)格的語法規(guī)則,只要把意思表達(dá)清楚,并且書寫的格式清晰易讀即可。

總之,在以上幾種表示算法的方法中,具有熟練編程經(jīng)驗(yàn)的專業(yè)人士喜歡用偽代碼,初學(xué)者喜歡用傳統(tǒng)流程圖或N-S圖,因其比較形象,易于理解。至今為止,我們只是描述算法,即用不同的形式表示操作的步驟。而要得到運(yùn)算結(jié)果,就必須實(shí)現(xiàn)算法。我們的任務(wù)是用計(jì)算機(jī)解題,也就是要用計(jì)算機(jī)實(shí)現(xiàn)算法。計(jì)算機(jī)是無法識別流程圖和偽代碼的,也就是說用流程圖和偽代碼描述的算法是無法在計(jì)算機(jī)上實(shí)現(xiàn)的,只有用計(jì)算機(jī)語言編寫的程序才能被計(jì)算機(jī)執(zhí)行(當(dāng)然還要將程序編譯成目標(biāo)程序才能被計(jì)算機(jī)識別和執(zhí)行)。因此,在用流程圖或偽代碼描述出一個(gè)算法后。還要將它轉(zhuǎn)換成計(jì)算機(jī)語言程序。

用計(jì)算機(jī)語言表示算法必須嚴(yán)格遵循所用語言的語法規(guī)則,這是和偽代碼不同的地方。

三、任務(wù)實(shí)施

1.系統(tǒng)設(shè)計(jì)方法

系統(tǒng)設(shè)計(jì)是對整個(gè)管理系統(tǒng)功能進(jìn)行分析,并劃分和構(gòu)建系統(tǒng)功能模塊。模塊化程序設(shè)計(jì)就是把一個(gè)大程序按一個(gè)人能理解的規(guī)模進(jìn)行分解的一種方法。模塊化指的是把一個(gè)程序按功能分解成若干彼此具有一定獨(dú)立性同時(shí)也具有一定聯(lián)系的組成部分,這些組成部分稱為模塊。

系統(tǒng)設(shè)計(jì)是系統(tǒng)開發(fā)的重要階段,它直接影響到目標(biāo)系統(tǒng)的質(zhì)量,是整個(gè)開發(fā)工作的核心。系統(tǒng)設(shè)計(jì)階段的主要任務(wù)是:在系統(tǒng)分析提出的邏輯模型的基礎(chǔ)上,科學(xué)合理地進(jìn)行物理模型設(shè)計(jì)。

在家庭財(cái)務(wù)管理系統(tǒng)的設(shè)計(jì)過程中,充分考慮了系統(tǒng)的適應(yīng)性和效率性,符合系統(tǒng)設(shè)計(jì)的原則。

2.系統(tǒng)架構(gòu)

通過對家庭理財(cái)系統(tǒng)功能的分析,將本系統(tǒng)分為系統(tǒng)登錄界面、瀏覽成員財(cái)務(wù)信息、增加新的家庭成員、查詢成員收支信息、添加成員收支信息、修改成員收支信息、刪除成員收支信息、成員收支排行、更換家長、刪除家庭成員信息、修改密碼等模塊。系統(tǒng)結(jié)構(gòu)設(shè)計(jì)如圖1-1-10所示。圖1-1-10系統(tǒng)結(jié)構(gòu)設(shè)計(jì)

3.系統(tǒng)功能模塊細(xì)分

根據(jù)上述系統(tǒng)總體架構(gòu)思想的分析,可將系統(tǒng)分為以下三大部分:

(1)系統(tǒng)管理模塊:負(fù)責(zé)對家長和成員密碼等進(jìn)行管理;

(2)基礎(chǔ)數(shù)據(jù)管理模塊:負(fù)責(zé)對家庭成員和財(cái)務(wù)信息進(jìn)行管理;

(3)日常收支管理模塊:負(fù)責(zé)對日常收入和支出進(jìn)行管理。系統(tǒng)功能模塊如圖1-1-11所示。圖1-1-11系統(tǒng)功能模塊四、知識拓展

1.?C程序的編譯

在前面我們已經(jīng)了解了C語言的程序結(jié)構(gòu)。所謂程序,就是一組計(jì)算機(jī)能識別和執(zhí)行的指令。每一條指令使計(jì)算機(jī)執(zhí)行特定的操作。用高級語言編寫的程序稱為源程序。但是一個(gè)源程序文件只是可以存儲,并不能運(yùn)行,因?yàn)橛?jì)算機(jī)并不認(rèn)識源程序中的語句。要讓計(jì)算機(jī)運(yùn)行程序,還要將它翻譯成計(jì)算機(jī)可以直接辨認(rèn)并可以執(zhí)行的機(jī)器語言程序。這一過程稱為編譯。對于C語言程序來說,這一過程一般分為四步。第一步:編輯源程序。編輯源程序,就是用高級語言編寫并修改源程序。源程序的編輯要在編輯器中進(jìn)行。編輯器具有字符的修改、添加等功能。編輯好的源程序,可以先以源程序文件的形式保存起來。如前所述,C語言源程序的文件名后綴為?.c。源程序僅僅是按照C語言的詞法和語法編寫,并能被編輯器處理的文字字符的集合。它還不能被計(jì)算機(jī)執(zhí)行。

第二步:編譯。編譯就是把用C語言編寫的程序(或程序模塊)翻譯成計(jì)算機(jī)可以理解并執(zhí)行的機(jī)器語言命令組成的程序(或程序模塊)。C語言的編譯過程分為兩個(gè)階段:首先是編譯預(yù)處理,系統(tǒng)要先掃描程序,處理所有預(yù)處理命令,如把文件包含命令要求的文件包含(嵌入)到程序(或程序模塊)中(見圖1-1-12);然后才開始編譯。圖1-1-12文件包含的示意編譯后得到的文件稱為目標(biāo)文件,目標(biāo)文件就是用機(jī)器語言描述的文件。C語言的目標(biāo)文件的后綴為?.obj。目標(biāo)文件的主文件名一般與源程序文件名相同。

在編譯過程中,還要對源程序中的語法和邏輯結(jié)構(gòu)進(jìn)行檢查。編譯任務(wù)是由被稱做編譯器(compiler)的軟件完成的。程序在編譯過程中也可能發(fā)現(xiàn)錯(cuò)誤,這時(shí)要重新進(jìn)入編輯器進(jìn)行編輯。

第三步:連接。連接是將與當(dāng)前程序有關(guān)的、已經(jīng)存在的幾個(gè)目標(biāo)模塊連接在一起,形成一個(gè)完整的程序代碼文件。這些已經(jīng)存在的目標(biāo)模塊包括:

●庫函數(shù),如前面使用的printf;

●對于大的程序,常常分成幾個(gè)模塊,分別編寫、編輯和編譯,形成不同的目標(biāo)模塊。正確連接所生成的文件才是可執(zhí)行文件??蓤?zhí)行文件的文件名后綴為?.exe。程序在連接過程中也可能發(fā)現(xiàn)錯(cuò)誤,這時(shí)也要重新進(jìn)入編輯器進(jìn)行編輯。

第四步:執(zhí)行。對操作系統(tǒng)來說,連接后得到的可執(zhí)行文件名相當(dāng)于一條命令。在操作系統(tǒng)提供的命令界面上輸入這個(gè)命令,就可以開始執(zhí)行這個(gè)程序。

運(yùn)行C程序的流程圖如圖1-1-13所示。圖1-1-13運(yùn)行C程序的流程圖

2.C程序的運(yùn)行

為了編譯、連接和運(yùn)行C程序,必須有相應(yīng)的C編譯系統(tǒng)。目前使用的大多數(shù)C編譯系統(tǒng)都是集成開發(fā)環(huán)境(IDE)的,即把程序的編輯、編譯、連接和運(yùn)行等操作全部集中在一個(gè)界面上進(jìn)行,功能豐富,使用方便,直觀易用。

寫出源程序后可以用任何一種編譯系統(tǒng)對程序進(jìn)行編譯和連接工作,只要用戶感到方便、有效即可。不應(yīng)當(dāng)只會使用一種編譯系統(tǒng),而對其他的一無所知。無論用哪一種編譯系統(tǒng),都應(yīng)當(dāng)能舉一反三,在需要時(shí)應(yīng)會用其他編譯系統(tǒng)進(jìn)行工作。

目前學(xué)習(xí)C++?的人大多使用VisualC++6.0集成環(huán)境,因此不少人在學(xué)習(xí)C時(shí)也使用VisualC++?集成開發(fā)環(huán)境,這樣有利于今后方便地學(xué)習(xí)C++。本書中的程序都是在VisualC++6.0環(huán)境下調(diào)試和運(yùn)行的。

1)進(jìn)入VisualC++6.0集成開發(fā)環(huán)境

VisualC++6.0是在Windows環(huán)境下工作的。VisualC++6.0有英文版和中文版,二者使用方法相同。這里介紹的是VisualC++6.0中文版。

為了能使用VisualC++6.0集成環(huán)境,必須事先在所用的計(jì)算機(jī)上安裝VisualC++6.0系統(tǒng)。在安裝后最好在桌面上設(shè)立VisualC++6.0的快捷方式圖標(biāo),以方便使用。

雙擊桌面上VisualC++6.0圖標(biāo),就能進(jìn)入VisualC++6.0集成開發(fā)環(huán)境,屏幕上將出現(xiàn)VisualC++6.0的主窗口(見圖1-1-14)。圖1-1-14主窗口在VisualC++?主窗口的頂部是VisualC++?的主菜單欄。其中包含9個(gè)菜單項(xiàng):文件、編輯、查看、插入、工程、組建、工具、窗口、幫助。主窗口的左側(cè)是工程工作區(qū)窗口,右側(cè)是程序編輯窗口。工作區(qū)窗口用來顯示所設(shè)定的工作區(qū)的信息,程序編輯窗口用來輸入和編輯源程序。

2)輸入和編輯源程序

(1)新建一個(gè)源程序可采取以下的步驟:在VisualC++?主窗口的主菜單欄中選擇“文件”,然后選擇“新建”(見圖1-l-15)。圖1-1-15新建文件菜單屏幕上出現(xiàn)一個(gè)“新建”對話框(見圖1-l-16)。單擊此對話框上方的“文件”標(biāo)簽,在其下拉菜單中選擇C++SourceFile項(xiàng),表示要建立新的C++?源程序文件,然后在對話框右半部分的位置文本框中輸入準(zhǔn)備編輯的源程序文件的存儲路徑(此處假設(shè)為E:\ZC,表示準(zhǔn)備編輯的源程序文件將存放在E:\ZC子目錄下)。在其上方的文件名文本框中輸入準(zhǔn)備編輯的源程序文件的名字(此處輸入cl_1.c)。圖1-1-16創(chuàng)建源程序文件窗口這樣,即將進(jìn)行輸入和編輯的源程序就以c1_1.c為文件名存放在E盤的ZC目錄下。單擊“確定”按鈕后,回到VisualC++?主窗口,可以看到光標(biāo)在程序編輯窗口閃爍,表示程序編輯窗口已激活,可以輸入和編輯源程序了。輸入例1.1.1中的程序(見圖l-1-17)。在輸入過程中如發(fā)現(xiàn)有錯(cuò)誤,可以利用全屏幕編輯方法進(jìn)行修改編輯。圖1-1-17源程序編輯窗口如果經(jīng)檢查無誤,則將源程序保存在前面指定的文件cl_l.c中,方法是:在主菜單欄中選擇“文件”,并在其下拉菜單中選擇“保存”項(xiàng)(見圖l-1-18)。圖1-1-18保存文件窗口

(2)打開一個(gè)已有的程序。如果已經(jīng)編輯并保存過C源程序,而希望打開所需要的源程序文件,并對它進(jìn)行修改,方法是:

①在“我的電腦”中按路徑找到已有的C程序名(如cl_1.c);

②雙擊此文件名,則進(jìn)入VisualC++?集成開發(fā)環(huán)境,并打開該文件,程序顯示在編輯窗口中;

③修改后選擇“文件”→“保存”,保存在原來的文件中。

3)程序的編譯

在編輯和保存了源文件(如cl_l.c)以后,若需要對該源文件進(jìn)行編譯,則可選擇主菜單欄中的“組建”,在其下拉菜單中選擇“編譯[c1_1.c]”項(xiàng)(見圖1-l-19)。由于剛才建立(或保存)文件時(shí)已指定了源文件的名字c1_l.c,因此在“組建”菜單的“編譯[c1_1.c]”項(xiàng)中自動(dòng)顯示了現(xiàn)在要編譯的源文件名c1_1.c。圖1-1-19編譯菜單在選擇“編譯”命令后,屏幕上出現(xiàn)一個(gè)對話框,內(nèi)容是“Thisbuildcommandrequiresanactiveprojectworkspace,Wouldyouliketocreateadefaultprojectworkspace?”(此編譯命令要求一個(gè)有效的項(xiàng)目工作區(qū),你是否同意建立一個(gè)默認(rèn)的項(xiàng)目工作區(qū)),見圖l-1-20。單擊“是”按鈕,表示同意由系統(tǒng)建立默認(rèn)的項(xiàng)目工作區(qū),然后開始編譯。

也可以不用選擇菜單的方法,而直接按Ctrl?+?F7鍵來完成編譯。圖1-1-20編譯對話框在進(jìn)行編譯時(shí),編譯系統(tǒng)檢查源程序中有無語法錯(cuò)誤,然后在主窗口下部的調(diào)試信息窗口輸出編譯的信息。如果無錯(cuò),則生成目標(biāo)文件cl_1.obj;如果有錯(cuò),則會指出錯(cuò)誤的位置和性質(zhì),提示用戶改正錯(cuò)誤。

4)程序的連接

在得到后綴為?.obj的目標(biāo)程序后,還不能直接運(yùn)行,還要把程序和系統(tǒng)提供的資源(如函數(shù)庫、頭文件)建立連接。此時(shí)應(yīng)選擇“組建”→“組建[c1_1.exe]”(見圖1-1-21),表示要求連接并建立一個(gè)可執(zhí)行文件c1_1.exe。圖1-1-21組建菜單圖1-1-22生成可執(zhí)行文件窗口以上介紹的是如何分別進(jìn)行程序的編譯與連接,也可以選擇菜單“組建”→“組建”(或按F7鍵)一次完成編譯與連接。對于初學(xué)者來說,還是提倡分步進(jìn)行程序的編譯與連接,因?yàn)槌绦虺鲥e(cuò)的機(jī)會較多,最好等到上一步完全正確后再進(jìn)行下一步。對于有經(jīng)驗(yàn)的程序員來說,在對程序比較有把握時(shí),可以一步完成編譯與連接。

5)程序的執(zhí)行

在得到可執(zhí)行文件c1_1.exe后,就可以直接執(zhí)行c1_1.exe了。選擇“組建”→“!執(zhí)行[c1_1.exe]”(見圖1-1-23)。圖1-1-23執(zhí)行程序菜單在選擇“!執(zhí)行[c1_1.exe]”項(xiàng)后,即開始執(zhí)行c1_1.exe。也可以不通過選擇菜單,而直接按Ctrl?+?F5鍵來執(zhí)行程序。程序執(zhí)行后,屏幕切換到輸出結(jié)果的窗口,顯示出運(yùn)行結(jié)果(見圖1-1-24)。圖1-1-24輸出窗口可以看到,在輸出結(jié)果窗口中的第1行是程序的輸出:

GoodMorning!

然后換行。第2行“Pressanykeytocontinue”并非程序所指定的輸出,而是VisualC++?在輸出完運(yùn)行結(jié)果后由VisualC++6.0系統(tǒng)自動(dòng)加上的一行信息,通知用戶“按任何一鍵以便繼續(xù)”。當(dāng)你按下任何一鍵后,輸出窗口消失,回到VisualC++?的主窗口,你可以繼續(xù)對源程序進(jìn)行修改補(bǔ)充或進(jìn)行其他工作。

如果已完成對一個(gè)程序的操作,不再對它進(jìn)行其他處理,應(yīng)當(dāng)選擇“文件”→“關(guān)閉工作區(qū)”,以結(jié)束對該程序的操作。

五、任務(wù)小結(jié)

本任務(wù)主要介紹家庭財(cái)務(wù)管理系統(tǒng)的設(shè)計(jì)要點(diǎn)和主要模塊以及C語言程序設(shè)計(jì)中的一些基本概念和開發(fā)應(yīng)用程序的主要步驟。通過本任務(wù)的學(xué)習(xí),讀者應(yīng)該對用C語言開發(fā)程序有一個(gè)概括性的了解,并能夠模仿例題編寫一些簡單程序。

任務(wù)2利息的計(jì)算

一、任務(wù)情境

假設(shè)銀行整存整取存款不同期限的月息利率分別為:

0.63%?期限?=?1年

0.66%?期限?=?2年

0.69%?期限?=?3年

0.75%?期限?=?5年

0.84%?期限?=?8年

利息?=?本金*月息利率*12*存款年限。

現(xiàn)在劉爸爸手中有2000元錢,請通過計(jì)算選擇一種存錢方案,使得錢存入銀行20年后得到的利息最多(假定銀行對超過存款期限的那一部分時(shí)間不付利息)。

在本任務(wù)中,對C語言中的基本數(shù)據(jù)類型進(jìn)行了詳細(xì)的講解,同時(shí)對構(gòu)造型數(shù)據(jù)類型做了介紹,還介紹了C語言中豐富的運(yùn)算符,可以利用運(yùn)算符構(gòu)造表達(dá)式參與運(yùn)算。二、相關(guān)知識

這一部分主要包括C語言的數(shù)據(jù)類型、運(yùn)算符與表達(dá)式等。

1.?C語言的數(shù)據(jù)類型

一個(gè)計(jì)算機(jī)程序主要包括兩方面的內(nèi)容:一是關(guān)于程序?qū)崿F(xiàn)的算法的操作步驟描述,即動(dòng)作描述;二是關(guān)于算法操作對象的描述,即數(shù)據(jù)描述。程序設(shè)計(jì)就是考慮和設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)和算法。在高級語言中,引入數(shù)據(jù)類型的概念。數(shù)據(jù)類型反映兩方面的內(nèi)容:它的數(shù)據(jù)能被如何表示(它的所有表示構(gòu)成了數(shù)據(jù)類型的集合)和如何處理它的值(它的所有處理方法構(gòu)成了數(shù)據(jù)類型的操作集合)。例如,整型是系統(tǒng)預(yù)先設(shè)定的有限整數(shù)集和一個(gè)關(guān)于整數(shù)的運(yùn)算集。高級語言為便于編寫程序,預(yù)先設(shè)定了若干基本數(shù)據(jù)類型;又為了使程序能描述處理現(xiàn)實(shí)世界中各種復(fù)雜數(shù)據(jù)結(jié)構(gòu)的問題,提供了若干從基本數(shù)據(jù)類型出發(fā)構(gòu)造各種復(fù)雜數(shù)據(jù)類型的手段,且這種手段能被反復(fù)應(yīng)用。

C語言包含的基本數(shù)據(jù)類型有:整型(shortint、int、longint)、實(shí)型(float、double、longdouble)、字符型(char)和無值型。

能構(gòu)造復(fù)雜數(shù)據(jù)類型的構(gòu)造類型有:枚舉型、數(shù)組、結(jié)構(gòu)體、共用體。使用以上數(shù)據(jù)類型的構(gòu)造方式,從基本數(shù)據(jù)類型和指針類型出發(fā),可以構(gòu)造出各種復(fù)雜的數(shù)據(jù)類型。圖1-2-1C語言的數(shù)據(jù)類型

2.?C語言中的常量

在程序運(yùn)行過程中,其值不能改變或不允許改變的數(shù)據(jù)對象稱為常量。常量按其值的類型來區(qū)分它的類型。在C語言中,常量有數(shù)、字符和字符串三種。在程序中,常量不需要說明就可以直接使用。在C語言中還可以使用另一種形式的常量,叫符號常量。

1)數(shù)值

C語言中有整數(shù)和實(shí)數(shù)兩種數(shù)。

(1)整型常量。整型常量也稱為整型常數(shù)或整數(shù)。C整型常量按進(jìn)制分可分為十進(jìn)制整數(shù)、八進(jìn)制整數(shù)和十六進(jìn)制整數(shù)。

①十進(jìn)制整數(shù)。十進(jìn)制數(shù)以正負(fù)號開頭,后跟0~9的若干位數(shù)字。如123,-456,0等。②八進(jìn)制整數(shù)。八進(jìn)制數(shù)以正負(fù)號開頭,第一位數(shù)字一定是0,后面跟0~7的數(shù)字。如0123,054等。八進(jìn)制數(shù)0123相當(dāng)于十進(jìn)制數(shù)83;八進(jìn)制數(shù)?-012,相當(dāng)于十進(jìn)制數(shù)?-10。

③十六進(jìn)制整數(shù)。十六進(jìn)制數(shù)以正負(fù)號開頭,前兩位為0x,后面跟0~9和a~f。其中a代表10,b代表11,其余類推。如十六進(jìn)制數(shù)0x123,相當(dāng)于十進(jìn)制數(shù)291;十六進(jìn)制數(shù)?-0x12,相當(dāng)于十進(jìn)制數(shù)?-18。

(2)實(shí)型常量。實(shí)型常量有以下幾種形式:

①小數(shù)形式。一個(gè)實(shí)數(shù)可以由正負(fù)號開頭,有若干位0~9的整數(shù),后跟一個(gè)小數(shù)點(diǎn)(必須有),再有若干位小數(shù)部分。如123.456,-21.37。數(shù)12用實(shí)數(shù)表示必須寫成12.0或12.。

一個(gè)實(shí)數(shù)有數(shù)值范圍和有效位數(shù)的限制。實(shí)數(shù)的數(shù)值范圍是3.4?×?10-38≤x≤3.4?×?1038,當(dāng)小于3.4?×?10-38時(shí)按0對待(下溢),而大于3.4?×?1038時(shí)則上溢,一個(gè)溢出的數(shù)是無意義的。實(shí)數(shù)僅有七位有效數(shù)字,超過七位將是不精確的。如1.234?567?8,在計(jì)算機(jī)內(nèi)僅保留為1.234?567,第八位數(shù)無法保留而失去,并不是第八位向第七位四舍五入。當(dāng)上面的數(shù)要求用小數(shù)五位表示時(shí),則表達(dá)為1.234?57,即第七位向第六位四舍五入。②指數(shù)形式。實(shí)數(shù)的指數(shù)形式也稱為科學(xué)計(jì)數(shù)法。一個(gè)實(shí)數(shù)的指數(shù)形式分成尾數(shù)部分和指數(shù)部分。尾數(shù)部分可以是整數(shù)形式或小數(shù)形式,指數(shù)部分是一個(gè)字母“e”后跟一個(gè)整數(shù)。如123e?+?01,-456.78e?-?01,0e0等。由于實(shí)數(shù)僅有七位有效數(shù)字,因此在內(nèi)存中用三個(gè)字節(jié)來表示尾數(shù),用一個(gè)字節(jié)來表示指數(shù),所以指數(shù)部分用兩位整數(shù)來表示。在書寫時(shí)“e”與“E”完全等價(jià)。“e”前面必須有數(shù)字,“e”后面必須是整數(shù)。③雙精度實(shí)數(shù)。當(dāng)一個(gè)數(shù)用實(shí)數(shù)表達(dá)時(shí),僅有七位有效數(shù)字;用長整型表達(dá)時(shí),僅有十位有效數(shù)字。實(shí)數(shù)的數(shù)值范圍也只能小于3.4×1038。當(dāng)超過以上范圍時(shí),我們可以用雙精度常量來表達(dá)。

雙精度常量的取值范圍為1.7×10-308≤|x|≤1.7×10308,有效位可達(dá)16位左右。一個(gè)數(shù)當(dāng)超過長整型數(shù)表達(dá)范圍或超過實(shí)數(shù)表達(dá)范圍時(shí)均按雙精度常量對待。一個(gè)雙精度常量在內(nèi)存中占8個(gè)字節(jié)。

長雙精度常量取值范圍在10-4931~104932之間,有19位有效數(shù)字,在內(nèi)存中占16個(gè)字節(jié)。但它是由計(jì)算機(jī)系統(tǒng)決定的,在TurboC中,它與double型一致。③雙精度實(shí)數(shù)。當(dāng)一個(gè)數(shù)用實(shí)數(shù)表達(dá)時(shí),僅有七位有效數(shù)字;用長整型表達(dá)時(shí),僅有十位有效數(shù)字。實(shí)數(shù)的數(shù)值范圍也只能小于3.4×1038。當(dāng)超過以上范圍時(shí),我們可以用雙精度常量來表達(dá)。

雙精度常量的取值范圍為1.7×10-308≤|x|≤1.7×10308,有效位可達(dá)16位左右。一個(gè)數(shù)當(dāng)超過長整型數(shù)表達(dá)范圍或超過實(shí)數(shù)表達(dá)范圍時(shí)均按雙精度常量對待。一個(gè)雙精度常量在內(nèi)存中占8個(gè)字節(jié)。

長雙精度常量取值范圍在10-4931~104932之間,有19位有效數(shù)字,在內(nèi)存中占16個(gè)字節(jié)。但它是由計(jì)算機(jī)系統(tǒng)決定的,在TurboC中,它與double型一致。對于大多數(shù)可印刷的字符常量都能用以上方法來表示,但對于一些特殊字符,C語言約定用?'\'?開頭的字符或字符列來表示,我們稱之為轉(zhuǎn)義字符,主要用于控制信息。如前面多次用到的換行符,用?'\n'?來表示。采用這種方法就能表示特殊字符,它們的表示方法見表1-2-1。

(4)字符串常量。字符串常量是由一對雙引號(?“?”?)括起來的字符序列,簡稱為字符串。字符的個(gè)數(shù)稱為長度。例如:“howareyou”,“Cprogram”?都是字符串常量。

長度為n的字符串,在計(jì)算機(jī)存儲器中占n?+?1個(gè)字節(jié),前幾個(gè)字節(jié)存放字符的編碼,最后一個(gè)字節(jié)存放的是NULL字符(或叫空字符,編碼為0,在C語言中也用?'\0'?來表示,也就是說任何一個(gè)字符串的最后一個(gè)存儲字節(jié)都是?'\0'?)。例如?"hellow"?在計(jì)算機(jī)中的表示形式為:

(5)符號常量。在C語言中,可對常量命名,也就是可用符號代替常量。該符號稱為符號常量,一般用大寫字母表示。使用前要先用宏定義命令定義,后使用。

宏定義命令?#define用來定義一個(gè)標(biāo)識符和一個(gè)字符串,在程序中每次遇到該標(biāo)識符就用所定義的字符串替換它。這個(gè)標(biāo)識符叫做宏名,替換過程叫做宏替換或宏展開。宏定義命令?#define的一般形式是:

#define宏名字符串

例如:用PI表示數(shù)值3.14159,可以用宏定義?#define來說明,即

#definePI3.14159

這樣在編譯時(shí),每當(dāng)在源程序中遇到PI時(shí)系統(tǒng)就自動(dòng)用3.141?59代替,這就是宏展開。若定義了一個(gè)宏名,則這個(gè)名字還可以做為其他宏定義的一個(gè)部分來使用。例如:

#definePI3.14159

#definePI22*PI

則在程序中出現(xiàn)的“PI2”被“2*3.14159”替換。

使用符號常量有兩點(diǎn)好處:增加程序的可讀性和可維護(hù)性。

應(yīng)注意宏替換僅是簡單地用所說明的字符串來替換對應(yīng)的宏名,無實(shí)際的運(yùn)算發(fā)生,也不作語法檢查。例如:

#definePI3.14159;

area=PI*r*r;

經(jīng)過宏替換后,該語句展開為:

area=3.14159;*r*r;

然后經(jīng)編譯將出現(xiàn)語法錯(cuò)誤,因?yàn)樵诤甓x中不應(yīng)有分號出現(xiàn)。

3.C語言中的變量

在程序運(yùn)行過程中其值可以變化的量我們稱之為變量。每一個(gè)變量都對應(yīng)著計(jì)算機(jī)內(nèi)存中相應(yīng)的存儲單元。在該單元中存放變量的值。

每一個(gè)變量都有一個(gè)變量名來標(biāo)識,其命名規(guī)則同標(biāo)識符的命名規(guī)則。要注意區(qū)分變量名和變量值是兩個(gè)不同的概念。變量名實(shí)際上是一個(gè)符號地址,是在編譯連接時(shí)由系統(tǒng)分配給每一個(gè)變量的內(nèi)存地址。變量的值實(shí)際上是這個(gè)存儲單元中存放的數(shù)據(jù)。1)基本變量類型

C語言變量的基本數(shù)據(jù)類型的長度和值域如表1-2-2所示。字符型(char)變量用于存儲ASCII碼字符,也可存儲8位二進(jìn)制數(shù)。

整型(int)變量用于存儲整數(shù)。因其字長有限,故可表示的整數(shù)的范圍也有限。

單精度實(shí)型(float)和雙精度實(shí)型(double)變量用于存儲實(shí)數(shù),實(shí)數(shù)是具有整數(shù)和小數(shù)兩部分的數(shù)據(jù)或是帶指數(shù)的數(shù)據(jù)。表1-2-2中的值域用絕對值表示。

無值型(void)有兩種用途:第一是明確地表示一個(gè)函數(shù)不返回任何值;第二是產(chǎn)生同一類型的指針。除了無值類型外,基本數(shù)據(jù)類型可以帶有各種修飾前綴。修飾符用于明確基本數(shù)據(jù)類型的含義,以準(zhǔn)確地適應(yīng)不同情況下的要求。類型修飾符種類如下:

signed 有符號

unsigned 無符號

long 長

Short 短不同的計(jì)算機(jī)系統(tǒng)對各類數(shù)據(jù)所占內(nèi)存字節(jié)數(shù)有不同的規(guī)定,如int型有的系統(tǒng)占16位,有的占32位。longdouble型有的系統(tǒng)占128位,有的占64位。

有符號(signed)和無符號(unsigned)的整型量的區(qū)別在于它們的最高位的定義不同。如果定義的是有符號的整型(signedint),那么C編譯程序所產(chǎn)生的代碼就設(shè)定整型數(shù)的最高位為符號位,其余位表示數(shù)值大小。如最高位為0,則該整數(shù)為正;如最高位為1,則該整數(shù)為負(fù)。大部分計(jì)算機(jī)表示有符號數(shù)時(shí),都使用二進(jìn)制的補(bǔ)碼形式。補(bǔ)碼的求法很簡單:正數(shù)補(bǔ)碼即原碼;負(fù)數(shù)的補(bǔ)碼是將其對應(yīng)原碼的各位(除符號位外)按位求反,然后加1。下面四個(gè)有符號數(shù)用8位二進(jìn)制表示時(shí)計(jì)算機(jī)內(nèi)的補(bǔ)碼值如圖1-2-2所示。圖1-2-2補(bǔ)碼的求法有符號整數(shù)對于許多運(yùn)算都是很重要的。但是它所能表達(dá)的最大數(shù)的絕對值只是無符號數(shù)的一半。例如,32?767的有符號整數(shù)表示為:0111111111111111。如果最高位設(shè)為1,則該數(shù)就會被當(dāng)作?-1。然而,如將該數(shù)定義為無符號整數(shù)(unsignedint),那么當(dāng)最高位設(shè)為1時(shí),它就變成了65535。

2)變量的定義

變量的定義可以從以下幾個(gè)方面來說明:

(1)變量定義。

變量定義的一般形式如下:

類型變量名表;

這里,類型(type)必須是C語言的有效數(shù)據(jù)類型。變量名表可以是一個(gè)或多個(gè)標(biāo)識符名,中間用逗號分隔,最后以分號結(jié)束。以下是一些變量定義的例子:

inti,j,num;

floata,b,sum;

unsignedintui;

charc,ch,name;

doublex,total;

(2)變量定義的說明。

①變量名可以是C語言中允許的合法標(biāo)識符,用戶定義時(shí)應(yīng)遵循“見名知意”的原則,以便于程序的維護(hù)(今后所有標(biāo)識符均如此,不再重復(fù))。

②每一個(gè)變量都必須進(jìn)行類型說明,這樣就可以保證程序中變量的正確使用。未經(jīng)類型說明的變量在編譯時(shí)將被指出是錯(cuò)誤的。也就是說變量要先定義,后使用。

③當(dāng)一個(gè)變量被指定為某一確定類型時(shí),系統(tǒng)將為它分配若干相應(yīng)字節(jié)的內(nèi)存空間。如char型為1個(gè)字節(jié),int型為2個(gè)字節(jié),float為4個(gè)字節(jié),double為8個(gè)字節(jié)。當(dāng)然,不同的系統(tǒng)可能稍有差異。④變量可以在程序內(nèi)的三個(gè)地方定義:在函數(shù)內(nèi)部,在函數(shù)的參數(shù)(形參)定義中或在所有的函數(shù)外部。由此定義的變量分別稱為局部變量、形式參數(shù)和全局變量。在不同地方定義的變量,其作用范圍不同。在同一層次定義的變量,不能與數(shù)組、指針、函數(shù)和其他變量同名。

⑤變量是用來存放數(shù)據(jù)的,由于數(shù)據(jù)有不同的類型,因此要定義相應(yīng)類型的變量去存放它。這些數(shù)據(jù)稱為相應(yīng)變量的值。

(3)變量的初始化。

程序中常需要對一些變量預(yù)先設(shè)置初值。C語言規(guī)定,可以在定義變量時(shí),對變量進(jìn)行初始化。變量初始化只需定義變量時(shí)在變量名后面加一賦值號及一個(gè)常數(shù)即可。它的一般形式是:

類型變量名=常數(shù);

以下是幾個(gè)示例:

charch=‘a(chǎn)’;

intfirst=0;

floatx=123.45;

在書寫變量說明時(shí),應(yīng)注意以下幾點(diǎn):

①允許在一個(gè)類型說明符后說明多個(gè)相同類型的變量。各變量名之間用逗號間隔。類型說明符與變量名之間至少用一個(gè)空格間隔。

②最后一個(gè)變量名之后必須以分號結(jié)尾。

③變量說明必須放在變量使用之前,一般放在函數(shù)體的開頭部分。

3)變量類型的轉(zhuǎn)換

變量的數(shù)據(jù)類型是可以轉(zhuǎn)換的。轉(zhuǎn)換的方法有兩種:一種是隱式類型轉(zhuǎn)換,另一種是顯式(強(qiáng)制)類型轉(zhuǎn)換。

(1)顯式類型轉(zhuǎn)換。顯式類型轉(zhuǎn)換也就是采用強(qiáng)制手段進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。顯式類型轉(zhuǎn)換是通過類型轉(zhuǎn)換運(yùn)算來實(shí)現(xiàn)的。其一般形式為:

(類型說明符)(表達(dá)式)

其功能是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類型說明符所表示的類型。例如:(float)a是把a(bǔ)轉(zhuǎn)換為實(shí)型。(int)(x+y)是把x+y的結(jié)果轉(zhuǎn)換為整型。在使用顯式轉(zhuǎn)換時(shí)應(yīng)注意以下

問題:①類型說明符和表達(dá)式都必須加括號(單個(gè)變量可以不加括號),如把(int)(x+y)寫成(int)x+y則成了把x轉(zhuǎn)換成int型之后再與y相加了。

②無論是顯式轉(zhuǎn)換還是隱式轉(zhuǎn)換,都只是為了本次運(yùn)算的需要而對變量的數(shù)據(jù)長度進(jìn)行的臨時(shí)性轉(zhuǎn)換,而不改變數(shù)據(jù)說明時(shí)對該變量定義的類型。

【例1.2.1】

main(){

floatf=5.75;

printf(“(int)f=%d,f=%.2f\n”,(int)f,f);

}

運(yùn)行結(jié)果為:

(int)f=5,f=5.75

本例表明,f雖被強(qiáng)制轉(zhuǎn)換為int型,但只在運(yùn)算中起作用,是臨時(shí)的,而f本身的類型并不改變。因此,(int)f的值為5(刪去了小數(shù))而f的值仍為5.75。

(2)隱式類型轉(zhuǎn)換。隱式轉(zhuǎn)換發(fā)生在不同數(shù)據(jù)類型的量混合運(yùn)算中,由編譯系統(tǒng)自動(dòng)完成。自動(dòng)轉(zhuǎn)換遵循以下規(guī)則:

①若參與運(yùn)算的類型不同,則先轉(zhuǎn)換成同一類型,然后進(jìn)行運(yùn)算。

②轉(zhuǎn)換按數(shù)據(jù)長度增加的方向進(jìn)行,以保證不降低精度。如int型和long型運(yùn)算時(shí),先把int量轉(zhuǎn)成long型后再進(jìn)行運(yùn)算。

③所有的浮點(diǎn)運(yùn)算都是以雙精度進(jìn)行的,即使僅含float單精度量運(yùn)算的表達(dá)式,也要先轉(zhuǎn)換成double型,再作運(yùn)算。

④char型和short型參與運(yùn)算時(shí),必須先轉(zhuǎn)換成int型。⑤在賦值運(yùn)算中,賦值號兩邊量的數(shù)據(jù)類型不同時(shí),賦值號右邊量的類型將轉(zhuǎn)換為左邊量的類型。如果右邊量的數(shù)據(jù)類型長度左邊長,則將丟失一部分?jǐn)?shù)據(jù),這樣會降低精度,丟失的部分按四舍五入向前舍入。圖1-2-3表示了類型自動(dòng)轉(zhuǎn)換的規(guī)則。圖1-2-3類型自動(dòng)轉(zhuǎn)換的規(guī)則【例1.2.2】

main()

{

floatpi=3.14159;

ints,r=5;

s=r*r*pi;

printf(“s=%d\n”,s);

}

運(yùn)行結(jié)果為:

s=78

本例程序中,pi為實(shí)型;s,r為整型。在執(zhí)行s=r*r*pi語句時(shí),r和pi都被轉(zhuǎn)換成double型計(jì)算,結(jié)果也為double型。但由于s為整型,故賦值結(jié)果仍為整型,舍去了小數(shù)部分。

上述類型轉(zhuǎn)換是由系統(tǒng)自動(dòng)進(jìn)行的。

4.?C語言中的運(yùn)算符

C語言中運(yùn)算符和表達(dá)式數(shù)量之多,在高級語言中是很少見的。正是豐富的運(yùn)算符和表達(dá)式使C語言的功能十分完善。這也是C語言的主要特點(diǎn)之一。

C語言的運(yùn)算符不僅具有不同的優(yōu)先級,而且還有一個(gè)特點(diǎn),就是它的結(jié)合性。在表達(dá)式中,各運(yùn)算量參與運(yùn)算的先后順序不僅要遵守運(yùn)算符優(yōu)先級的規(guī)定,還要受運(yùn)算符結(jié)合性的制約,以便確定是自左向右進(jìn)行運(yùn)算還是自右向左進(jìn)行運(yùn)算。這種結(jié)合性是其他高級語言的運(yùn)算符所沒有的,因此也增加了C語言的復(fù)雜性。

C語言的運(yùn)算符可分為以下幾類:

(1)算術(shù)運(yùn)算符,用于各類數(shù)值運(yùn)算。包括加(?+?)、減(?-?)、乘(?*?)、除(?/?)、求余(或稱模運(yùn)算?%?)、自增(?++?)、自減(?--?)七種。

(2)關(guān)系運(yùn)算符,用于比較運(yùn)算。包括大于(?>?)、小于(?<?)、等于(?==?)、大于等于(?>=?)、小于等于(?<=?)和不等于(?!=?)六種。

(3)邏輯運(yùn)算符,用于邏輯運(yùn)算。包括與(&&)、或(?||?)、非(?!?)三種。

(4)位操作運(yùn)算符,參與運(yùn)算的量,按二進(jìn)制位進(jìn)行運(yùn)算。包括位與(&)、位或(?|?)、位非(?~?)、位異或(?^?)、左移(?<<?)、右移(?>>?)六種。

(5)賦值運(yùn)算符,用于賦值運(yùn)算。分為簡單賦值(?=?)、復(fù)合算術(shù)賦值(+=、-=、*=、/=、%=)和復(fù)合位運(yùn)算賦值(&=、|=、^=、>>=、<<=)三類,共11種。

(6)條件運(yùn)算符(???:?)。這是一個(gè)三目運(yùn)算符,用于條件求值。

(7)逗號運(yùn)算符(?,?)。用于把若干表達(dá)式組合成一個(gè)表達(dá)式。

(8)指針運(yùn)算符。用于取內(nèi)容(?*?)和取地址(&)兩種運(yùn)算。

(9)求字節(jié)數(shù)運(yùn)算符(sizeof)。用于計(jì)算數(shù)據(jù)類型所占的字節(jié)數(shù)。

(10)特殊運(yùn)算符。有括號(?()?)、下標(biāo)([])、成員(→,.?)等。三、任務(wù)實(shí)施

1.問題分析與算法設(shè)計(jì)

為了得到最多的利息,存入銀行的錢應(yīng)在到期時(shí)馬上取出來,然后立刻將原來的本金和利息加起來再作為新的本金存入銀行,這樣不斷地滾動(dòng)直到滿20年為止。由于存款的利率不同,所以不同的存款方法(年限)存20年得到的利息是不一樣的。

分析題意,設(shè)2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,則到期時(shí)存款人應(yīng)得到的本利合計(jì)為:

2000*(1?+?rate1)i1*(1?+?rate2)i2*(1?+?rate3)i3*(1?+?rate5)i5*(1?+?rate8)i8其中rateN為對應(yīng)存款年限的利率。根據(jù)題意還可得到以下限制條件:

0<=i8<=2

0<=i5<=(20-8*i8)/5

0<=i3<=(20-8*i8-5*i5)/3

0<=i2<=(20-8*i8-5*i5-3*i3)/2

0<=i1<=20-8*i8-5*i5-3*i3-2*i2

可以用窮舉法窮舉所有i8、i5、i3、i2和i1的組合,然后代入求本利的公式計(jì)算出最大值,就是最佳存款方案。2.程序說明與注釋

#include<stdio.h>

#include<math.h>

intmain()

{

inti8,i5,i3,i2,i1,n8,n5,n3,n2,n1;

floatmax=0,term;

for(i8=0;i8<3;i8++) /*窮舉所有可能的存款方式*/

for(i5=0;i5<=(20-8*i8)/5;i5++)

for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)

for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++)

{

i1=20-8*i8-5*i5-3*i3-2*i2;

term=2000.0*pow((double)(1+0.0063*12),(double)i1)*pow((double)(1+2*0.0063*12),(double)i2)

*pow((double)(1+3*0.0069*12),(double)i3)

*pow((double)(1+5*0.0075*12),(double)i5)

*pow((double)(1+8*0.0084*12),(double)i8);

/*計(jì)算到期時(shí)的本利合計(jì)*/

if(term>max)

{

max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;

}

}

printf("Formaxinumprofit,heshouldsosavehismoneyinabank:\n");

printf("madefixeddepositfor8year:%dtimes\n",n8);

printf(“madefixeddepositfor5year:%dtimes\n”,n5);

printf(“madefixeddepositfor3year:%dtimes\n”,n3);

printf(“madefixeddepositfor2year:%dtimes\n”,n2);

printf(“madefixeddepositfor1year:%dtimes\n”,n1);

printf(“Toal:%.2f\n”,max);

/*輸出存款方式*/

}

3.運(yùn)行結(jié)果

Formaxinumprofit,heshouldsosavehismoneyinabank:

madefixeddepositfor8year:0times

madefixeddepositfor5year:4times

madefixeddepositfor3year:0times

madefixeddepositfor2year:0times

madefixeddepositfor1year:0times

Total:8841.01

可見最佳的存款方案為連續(xù)4次存5年。四、知識拓展

1.算術(shù)運(yùn)算符和表達(dá)式

1)基本算術(shù)運(yùn)算符

①加法運(yùn)算符“+”。加法運(yùn)算符為雙目運(yùn)算符,即應(yīng)有兩個(gè)量參與加法運(yùn)算,如a+b、4+8等。具有右結(jié)合性。

②減法運(yùn)算符“-”。減法運(yùn)算符為雙目運(yùn)算符。但“-”也可作負(fù)值運(yùn)算符,此時(shí)為單目運(yùn)算,如?-x,-5等。具有左結(jié)合性。

③乘法運(yùn)算符“?*?”。雙目運(yùn)算,具有左結(jié)合性。

④除法運(yùn)算符“?/?”。雙目運(yùn)算,具有左結(jié)合性。參與運(yùn)算量均為整型時(shí),結(jié)果也為整型,舍去小數(shù)。如果運(yùn)算量中有一個(gè)是實(shí)型,則結(jié)果為雙精度實(shí)型?!纠?.2.3】

main()

{

printf(“\n\n%d,%d\n”,20/7,-20/7);

printf(“%f,%f\n”,20.0/7,-20.0/7);

}

運(yùn)行結(jié)果為:

2,-2

2.857143,-2.857143

本例中,20/7、-20/7的結(jié)果均為整型,小數(shù)全部舍去。而20.0/7和?-20.0/7由于有實(shí)數(shù)參與運(yùn)算,因此結(jié)果也為實(shí)型。⑤求余運(yùn)算符(模運(yùn)算符)“%”。雙目運(yùn)算,具有左結(jié)合性。要求參與運(yùn)算的量均為整型。求余運(yùn)算的結(jié)果等于兩數(shù)相除后的余數(shù)。

【例1.2.4】

main()

{

printf(“%d,%d,%d,%d\n”,7%4,7%-4,-7%4,-7%-4);

}

運(yùn)行結(jié)果為:

3,3,-3,-3。

本例說明參加求余運(yùn)算左側(cè)的數(shù)據(jù)為正則取余結(jié)果為正,左側(cè)的數(shù)據(jù)為負(fù)則取余結(jié)果為負(fù)。

2)運(yùn)算符優(yōu)先級

*、/、%?運(yùn)算的優(yōu)先級別相同,高于?+、-?運(yùn)算;+、-?優(yōu)先級相同;同一優(yōu)先級按從左到右順序計(jì)算。要改變運(yùn)算順序只需加括號即可,括號全部為圓括號,必須注意括號的配對。

例如:3+8%-3-2,先計(jì)算8%-3,結(jié)果為2,再計(jì)算3+2-2,按從左到右順序計(jì)算結(jié)果為3。

3)自增1、自減1運(yùn)算符

其作用是使變量的值增加或減少1。如:

i++、i--?為i參與運(yùn)算后,i的值再自增(減)1;

++i、--i為i參與運(yùn)算前,i的值自增(減)1。

自增1運(yùn)算符記為“++”,其功能是使變量的值自增1。自減1運(yùn)算符記為“--”,其功能是使變量值自減1。自增1、自減1運(yùn)算符均為單目運(yùn)算,都具有右結(jié)合性??捎幸韵聨追N形式:++i是i自增1后再參與其他運(yùn)算;--i是i自減1后再參與其他運(yùn)算。

在理解和使用上容易出錯(cuò)的是i++?和i--。特別是當(dāng)它們出現(xiàn)在較復(fù)雜的表達(dá)式或語句中時(shí),常常難于理解,因此應(yīng)仔細(xì)分析?!纠?.2.5】

main(){

inti=8;

printf(“%d\n”,++i);

printf(“%d\n”,--i);

printf(“%d\n”,i++);

printf(“%d\n”,i--);

printf(“%d\n”,-i++);

printf("%d\n",-i--);

}變量變化過程為:

i<--8

i<--i+1

i<--i-1

i<--i+1

i<--i-1

i<--i+1

i<--i-1

即i的初值為8;

第2行i加1后輸出,故為9;

第3行減1后輸出,故為8;

第4行輸出i為8之后再加1(為9);

第5行輸出i為9之后再減1(為8);

第6行輸出?-8之后再加1(為9);

第7行輸出?-9之后再減1(為8)?!纠?.2.6】

main(){

inti=5,j=5,p,q;

p=(i++)+(i++)+(i++);

q=(++j)+(++j)+(++j);

printf(“%d,%d,%d,%d”,p,q,i,j);

}

變量變化過程為:

i<--5,j<--5,p<--0,q<--0

i+i+i--->p,i+1-->i,i+1-->i,i+1-->i

j+1->j,j+1->j,j+1->j,j+j+j->q這個(gè)程序中,P=(i++)+(i++)+(i++)應(yīng)理解為三個(gè)i相加,故P值為15。然后i再自增1三次相當(dāng)于加3,故i的最后值為8。而對于q的值則不然,q=(++j)+(++j)+(++j)應(yīng)理解為j先自增1,再參與運(yùn)算,由于j自增1三次后值為8,三個(gè)8相加的和為24,j的最后值仍為8。注意:

(1)自增運(yùn)算符(?++?)和自減運(yùn)算符(?--?),只能用于變量,而不能用于常量和表達(dá)式。如6++,(x-y)--?都是不合法的。

(2)?++?和?--?結(jié)合方向是“自右至左”,而其他算術(shù)運(yùn)算符的結(jié)合方向是“自左至右”。

(3)自增運(yùn)算符(?++?)和自減運(yùn)算符(?--?)常用于數(shù)組下標(biāo)的改變和循環(huán)次數(shù)的控制。例如:

x=10;

i=5;

a[i++]=x;/*把10賦給a[5],然后i變?yōu)?*/

4)算術(shù)表達(dá)式

算術(shù)表達(dá)式是由算術(shù)運(yùn)算符和括號連接起來的式子,是由常量、變量、函數(shù)和運(yùn)算符組合起來的。一個(gè)表達(dá)式有一個(gè)值及其類型,它們等于計(jì)算表達(dá)式所得結(jié)果的值和類型。表達(dá)式求值按運(yùn)算符的優(yōu)先級和結(jié)合性規(guī)定的順序進(jìn)行。單個(gè)常量、變量、函數(shù)可以看做是表達(dá)式的特例。

算術(shù)表達(dá)式的形式如下:

<操作數(shù)><算術(shù)運(yùn)算符><操作數(shù)>

算術(shù)表達(dá)式中運(yùn)算對象(操作數(shù))是數(shù)值,也可以是字符(按其ASCII碼值進(jìn)行運(yùn)算)。運(yùn)算結(jié)果(即表達(dá)式的值)是數(shù)值。以下是算術(shù)表達(dá)式的例子:

a+b;(a*2)/c;(x+r)*8-(a+b)/7;sin(x)+sin(y);(++i)-(j++)+(k--);

5)有關(guān)表達(dá)式的常見問題說明

①C語言的運(yùn)算符和表達(dá)式使用靈活,利用它可以處理很多在其他語言中難以處理的問題。但要注意,ANSIC沒有規(guī)定具體表達(dá)式中的子表達(dá)式的求值順序,允許各編譯系統(tǒng)自主安排。

例如:對表達(dá)式b=f1()+f2();不同的編譯系統(tǒng)調(diào)用順序不同,在多數(shù)情況下,先調(diào)用f1()或f2()對程序運(yùn)行結(jié)果沒有影響。但在有些情況下,結(jié)果可能不同。

②要注意運(yùn)算符的結(jié)合性。如i+++j,是理解成(i++)+j,還是理解成i+(++j)呢?C編譯系統(tǒng)是盡可能地按自左向右將若干個(gè)操作數(shù)組成一個(gè)運(yùn)算符,i+++j將被理解成(i++)+j。

2.賦值運(yùn)算符和表達(dá)式

(1)簡單賦值運(yùn)算符即“=”,又稱為賦值號。賦值號左邊必須是變量、數(shù)組元素等有存儲單元的元素。賦值號的右邊可以是各類表達(dá)式,也可以是另一個(gè)賦值表達(dá)式。因此a=b=c=5是合法的,即相當(dāng)于a=(b=(c=5)),因?yàn)樗亲杂抑磷蠼Y(jié)合的,即5先賦給c,c值再賦給b,b=c賦值表達(dá)式的值為b的值,然后再賦給a,整個(gè)表達(dá)式的值即為a的值。

賦值表達(dá)式的求值順序是先計(jì)算賦值號右邊表達(dá)式的值,再將其轉(zhuǎn)換成表達(dá)式左邊變量的類型,再進(jìn)行賦值,此值即是賦值表達(dá)式的值。

(2)復(fù)合賦值符及表達(dá)式。在賦值符“=”之前加上其他雙目運(yùn)算符可構(gòu)成復(fù)合賦值符。如?+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=?等。

例如:a+=5等價(jià)于a=a+5,x*=y+7等價(jià)于x=x*(y+7),r%=p等價(jià)于r=r%p。復(fù)合賦值符這種寫法,對初學(xué)者可能不習(xí)慣,但十分有利于編譯處理,能提高編譯效率并產(chǎn)生質(zhì)量較高的目標(biāo)代碼。

由賦值運(yùn)算符將一個(gè)變量和一個(gè)表達(dá)式連起來的式子稱為賦值表達(dá)式。它是最常用的表達(dá)式,包括簡單賦值表達(dá)式和復(fù)合賦值表達(dá)式,其形式如下:

<變量><賦值運(yùn)算符><表達(dá)式>例如:

x=a+b;

溫馨提示

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

評論

0/150

提交評論