版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第1章程序設(shè)計(jì)概述1.1程序工作原理1.2程序設(shè)計(jì)語(yǔ)言1.3算法概述1.4C語(yǔ)言程序設(shè)計(jì)習(xí)題
1.1程序工作原理
1.1.1馮·諾伊曼原理
一臺(tái)計(jì)算機(jī)由硬件系統(tǒng)和軟件系統(tǒng)兩大部分組成,硬件是計(jì)算機(jī)的物質(zhì)基礎(chǔ),而軟件是計(jì)算機(jī)的靈魂。沒有軟件,計(jì)算機(jī)只是一臺(tái)“裸機(jī)”,有了軟件,計(jì)算機(jī)才能成為一臺(tái)真正的“電腦”。而所有的軟件,都是用計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言編寫的。程序是指計(jì)算機(jī)可以直接或間接執(zhí)行的指令的集合。計(jì)算機(jī)系統(tǒng)通過運(yùn)行程序來實(shí)現(xiàn)各種不同的應(yīng)用。程序設(shè)計(jì)語(yǔ)言(ProgrammingLanguage)是一組用來定義計(jì)算機(jī)程序的語(yǔ)法規(guī)則。一種程序設(shè)計(jì)語(yǔ)言能夠準(zhǔn)確地定義計(jì)算機(jī)所需要使用的數(shù)據(jù),并精確地定義在不同情況下所應(yīng)當(dāng)采取的行動(dòng)。當(dāng)今的計(jì)算機(jī)模型是由數(shù)學(xué)家馮·諾依曼(vonNeumann)提出來的,我們稱其為馮·諾依曼模型(vonNeumannModel)或馮·諾依曼機(jī)(vonNeumannMachine)。直到今天,幾乎所有的計(jì)算機(jī)都是沿用這一模型設(shè)計(jì)的。馮·諾依曼機(jī)概念基于一個(gè)存儲(chǔ)器(用來存儲(chǔ)指令和數(shù)據(jù))、一個(gè)控制器(負(fù)責(zé)從存儲(chǔ)器中逐條取出指令)和一個(gè)處理器(通過算術(shù)或邏輯操作來處理數(shù)據(jù)),最后的結(jié)果必須送回存儲(chǔ)器中??梢园堰@些特點(diǎn)歸結(jié)為以下幾條:
(1)數(shù)據(jù)或指令以二進(jìn)制形式存儲(chǔ)(數(shù)據(jù)和指令在外形上沒有什么區(qū)別,但每一位二進(jìn)制數(shù)字有不同的含義)。
(2)“存儲(chǔ)程序”的工作方式(事先要編好程序,執(zhí)行之前先將程序存放到存儲(chǔ)器某個(gè)可知的地方)。
(3)程序順序執(zhí)行(可強(qiáng)行改變執(zhí)行順序)。
(4)存儲(chǔ)器的內(nèi)容可以被修改(存儲(chǔ)器的某個(gè)單元一旦進(jìn)入新的數(shù)據(jù),則該單元原來的數(shù)據(jù)立即消失,被新數(shù)據(jù)代替)。馮·諾依曼體系結(jié)構(gòu)的作用體現(xiàn)在命令式語(yǔ)言的下述三大特性上:
(1)變量存儲(chǔ)器由大量的存儲(chǔ)單元(MemoryCell,MemoryLocation)組成,數(shù)據(jù)就存放在這些單元中。匯編語(yǔ)言通過對(duì)存儲(chǔ)單元的命名來訪問數(shù)據(jù)。在命令式語(yǔ)言中,存儲(chǔ)單元及它的名稱由變量(Variable)的概念代替。變量代表一個(gè)(或一組)命名的存儲(chǔ)單元,單元可存放值,值可以被修改。
(2)賦值使用存儲(chǔ)概念的另一個(gè)后果是每一計(jì)算結(jié)果必須存儲(chǔ),即賦值于某個(gè)存儲(chǔ)單元,從而改變?cè)搯卧闹怠?/p>
(3)重復(fù)語(yǔ)句按順序執(zhí)行,指令存儲(chǔ)在有限的存儲(chǔ)器中,要完成任何復(fù)雜的計(jì)算,唯一的辦法是重復(fù)執(zhí)行某些指令序列。
馮·諾依曼型計(jì)算機(jī)的兩大特征是“程序存儲(chǔ)”和“采用二進(jìn)制”。具體地說,在上述計(jì)算機(jī)中,要實(shí)現(xiàn)機(jī)器的自動(dòng)計(jì)算,必須先根據(jù)題目的要求,編制出求解該問題的計(jì)算程序,并通過輸入設(shè)備將該程序存入計(jì)算機(jī)的存儲(chǔ)器中,稱之為“程序存儲(chǔ)”。在計(jì)算機(jī)中,計(jì)算程序及數(shù)據(jù)是用二進(jìn)制代碼表示的,計(jì)算機(jī)只能存儲(chǔ)并識(shí)別二進(jìn)制代碼表示的計(jì)算程序和數(shù)據(jù),稱之為“采用二進(jìn)制”。
馮·諾伊曼思想實(shí)際上是電子計(jì)算機(jī)設(shè)計(jì)的基本思想,奠定了現(xiàn)代電子計(jì)算機(jī)的基本結(jié)構(gòu),開創(chuàng)了程序設(shè)計(jì)的時(shí)代。1.1.2計(jì)算機(jī)的構(gòu)成原理
電子計(jì)算機(jī)硬件通常由5大功能部件組成:存儲(chǔ)器、運(yùn)算器、控制器、輸入設(shè)備和輸出設(shè)備,5大部件通過總線有機(jī)地連接在一起組成計(jì)算機(jī)的硬件系統(tǒng)。
運(yùn)算器用來實(shí)現(xiàn)算術(shù)、邏輯等各種運(yùn)算。
存儲(chǔ)器用來存放計(jì)算程序及參與運(yùn)算的各種數(shù)據(jù)。存儲(chǔ)器可以分為內(nèi)存儲(chǔ)器(內(nèi)存)和外存儲(chǔ)器(外存)。
控制器實(shí)現(xiàn)對(duì)整個(gè)運(yùn)算過程的有規(guī)律的控制。
輸入設(shè)備實(shí)現(xiàn)計(jì)算程序和原始數(shù)據(jù)的輸入。
輸出設(shè)備實(shí)現(xiàn)計(jì)算結(jié)果的輸出。隨著制造計(jì)算機(jī)的器件的發(fā)展,特別是微機(jī)的發(fā)展,產(chǎn)生了中央處理器(CPU)。CPU中包括運(yùn)算器和控制器。
計(jì)算機(jī)工作時(shí)要預(yù)先把指揮計(jì)算機(jī)如何進(jìn)行操作的指令序列(通常稱為程序)和原始數(shù)據(jù)通過輸入設(shè)備輸入到計(jì)算機(jī)的內(nèi)部存儲(chǔ)器中。每一條指令中明確規(guī)定了計(jì)算機(jī)從哪個(gè)地址取數(shù),進(jìn)行什么操作,然后送到什么地址等步驟。計(jì)算機(jī)在運(yùn)行時(shí),先從內(nèi)存中取出第一條指令,通過控制器的譯碼,按指令的要求,從存儲(chǔ)器中取出數(shù)據(jù)進(jìn)行指定的運(yùn)算和邏輯操作,然后再按地址把結(jié)果送到內(nèi)存中去。接下來,再取出第二條指令,在控制器的指揮下完成規(guī)定的操作。依此進(jìn)行下去,直至遇到停止指令。簡(jiǎn)而言之,即將程序與數(shù)據(jù)一樣存儲(chǔ),按程序編排的順序,一步一步地取出指令,自動(dòng)地完成指令規(guī)定的操作。
我們把按照馮·諾依曼原理構(gòu)造的計(jì)算機(jī)叫馮·諾依曼計(jì)算機(jī),其體系結(jié)構(gòu)稱為馮·諾依曼結(jié)構(gòu)。目前計(jì)算機(jī)已發(fā)展到了第五代,基本上仍然遵循著馮·諾依曼原理和結(jié)構(gòu)。
1.2程序設(shè)計(jì)語(yǔ)言
1.2.1程序設(shè)計(jì)語(yǔ)言的發(fā)展
語(yǔ)言是人們交流思想的工具。人類在長(zhǎng)期的歷史發(fā)展過程中,為了交流思想、表達(dá)感情和交換信息,逐步形成了語(yǔ)言。這類語(yǔ)言,如漢語(yǔ)和英語(yǔ),通常稱為自然語(yǔ)言。另一方面,人們?yōu)榱四撤N專門用途,創(chuàng)造出種種不同的語(yǔ)言,這類語(yǔ)言通常稱為人工語(yǔ)言。專門用于編制計(jì)算機(jī)程序的各種人工語(yǔ)言稱為程序設(shè)計(jì)語(yǔ)言(ProgramingLanguage)。程序設(shè)計(jì)語(yǔ)言按照語(yǔ)言級(jí)別可以分為低級(jí)語(yǔ)言和高級(jí)語(yǔ)言。低級(jí)語(yǔ)言包括機(jī)器語(yǔ)言和匯編語(yǔ)言。低級(jí)語(yǔ)言與特定的機(jī)器有關(guān),其功效高,但使用復(fù)雜、繁瑣、費(fèi)時(shí)、易出差錯(cuò)。機(jī)器語(yǔ)言是表示成數(shù)碼形式的機(jī)器基本指令集。匯編語(yǔ)言是機(jī)器語(yǔ)言部分符號(hào)化的結(jié)果。高級(jí)語(yǔ)言的表示方法要比低級(jí)語(yǔ)言更接近于待解問題的表示方法,其特點(diǎn)是在一定程度上與具體機(jī)器無關(guān),易學(xué)、易用、易維護(hù)。
計(jì)算機(jī)的每一個(gè)動(dòng)作、每一個(gè)步驟都是按照已經(jīng)編好的程序來執(zhí)行的,而程序需要用人們能掌握的語(yǔ)言來編寫,于是出現(xiàn)了程序設(shè)計(jì)語(yǔ)言。計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言的發(fā)展經(jīng)歷了從機(jī)器語(yǔ)言、匯編語(yǔ)言到高級(jí)語(yǔ)言的歷程。
1.機(jī)器語(yǔ)言
電子計(jì)算機(jī)所使用的是由“0”和“1”組成的二進(jìn)制數(shù),二進(jìn)制是計(jì)算機(jī)語(yǔ)言的基礎(chǔ)。計(jì)算機(jī)發(fā)明之初,人們只能用計(jì)算機(jī)的語(yǔ)言去命令計(jì)算機(jī)工作,也就是寫出一串串由“0”和“1”組成的指令序列交由計(jì)算機(jī)執(zhí)行,這種語(yǔ)言就是機(jī)器語(yǔ)言。使用機(jī)器語(yǔ)言編寫程序是一件十分繁瑣的工作,特別是在程序有錯(cuò)需要修改時(shí)更加困難,而且編出的程序不便于記憶、閱讀和書寫,還容易出錯(cuò)。由于每臺(tái)計(jì)算機(jī)的指令系統(tǒng)往往各不相同,因此在一臺(tái)計(jì)算機(jī)上執(zhí)行的程序要想在另一臺(tái)計(jì)算機(jī)上執(zhí)行,必須另編程序,可移植性較差,造成了重復(fù)工作。但由于使用的是針對(duì)特定型號(hào)計(jì)算機(jī)的語(yǔ)言,故而機(jī)器語(yǔ)言運(yùn)算效率是所有語(yǔ)言中最高的。機(jī)器語(yǔ)言是第一代計(jì)算機(jī)語(yǔ)言。
2.匯編語(yǔ)言
為了克服機(jī)器語(yǔ)言難讀、難編、難記和易出錯(cuò)的缺點(diǎn),人們用與代碼指令實(shí)際含義相近的英文縮寫詞、字母和數(shù)字等符號(hào)取代指令代碼,例如用ADD代表加法,用MOV代表數(shù)據(jù)傳遞等。這樣,人們能較容易讀懂并理解程序,使得糾錯(cuò)及維護(hù)變得方便了。這種程序設(shè)計(jì)語(yǔ)言稱為匯編語(yǔ)言,即第二代計(jì)算機(jī)語(yǔ)言。然而計(jì)算機(jī)是不認(rèn)識(shí)這些符號(hào)的,這就需要一個(gè)專門的程序負(fù)責(zé)將這些符號(hào)翻譯成二進(jìn)制數(shù)的機(jī)器語(yǔ)言,這種翻譯程序稱為匯編程序。匯編語(yǔ)言仍然是面向機(jī)器的語(yǔ)言,使用起來還是比較繁瑣,通用性也差。匯編語(yǔ)言是低級(jí)語(yǔ)言。但是,用匯編語(yǔ)言編寫的程序,其目標(biāo)程序占用內(nèi)存空間少,運(yùn)行速度快,有著高級(jí)語(yǔ)言不可替代的用途。
3.高級(jí)語(yǔ)言
不論是機(jī)器語(yǔ)言還是匯編語(yǔ)言,都是面向硬件具體操作的,對(duì)機(jī)器過分依賴,要求使用者必須對(duì)硬件結(jié)構(gòu)及其工作原理都十分熟悉,這對(duì)非計(jì)算機(jī)專業(yè)人員來說是難以達(dá)到的,對(duì)計(jì)算機(jī)的推廣應(yīng)用不利。計(jì)算機(jī)事業(yè)的發(fā)展促使人們尋求一些與人類自然語(yǔ)言相接近且能為計(jì)算機(jī)所接受的通用易學(xué)的計(jì)算機(jī)語(yǔ)言。這種與自然語(yǔ)言相近并被計(jì)算機(jī)接受和執(zhí)行的計(jì)算機(jī)語(yǔ)言稱為高級(jí)語(yǔ)言。高級(jí)語(yǔ)言是面向用戶的語(yǔ)言。無論何種機(jī)型的計(jì)算機(jī),只要配備上相應(yīng)高級(jí)語(yǔ)言的編譯或解釋程序,則用該高級(jí)語(yǔ)言編寫的程序就可以運(yùn)行。
1954年,第一個(gè)完全脫離機(jī)器硬件的高級(jí)語(yǔ)言FORTRAN問世了,自此之后,共有幾百種高級(jí)語(yǔ)言出現(xiàn),其中有重要意義的有幾十種,影響較大、使用較普遍的有FORTRAN、ALGOL、COBOL、BASIC、LISP、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、Java等。高級(jí)語(yǔ)言的出現(xiàn)使得計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言不再過度地依賴某種特定的機(jī)器或環(huán)境。這是因?yàn)楦呒?jí)語(yǔ)言在不同的平臺(tái)上會(huì)被編譯成不同的機(jī)器語(yǔ)言,而不是直接被機(jī)器執(zhí)行的。計(jì)算機(jī)并不能直接地接受和執(zhí)行用高級(jí)語(yǔ)言編寫的源程序。高級(jí)語(yǔ)言源程序在輸入計(jì)算機(jī)時(shí),通過“翻譯程序”翻譯成機(jī)器語(yǔ)言形式的目標(biāo)程序,計(jì)算機(jī)才能識(shí)別和執(zhí)行。這種“翻譯”通常有兩種方式,即編譯方式和解釋方式。編譯方式是指在源程序執(zhí)行之前,就將程序源代碼“翻譯”成目標(biāo)代碼(機(jī)器語(yǔ)言),因此目標(biāo)程序可以脫離其語(yǔ)言環(huán)境獨(dú)立執(zhí)行,使用比較方便、效率較高。但應(yīng)用程序一旦需要修改,必須先修改源代碼,再重新編譯生成新的目標(biāo)文件(*.obj)才能執(zhí)行。
解釋方式是應(yīng)用程序源代碼一邊由相應(yīng)語(yǔ)言的解釋器“翻譯”成目標(biāo)代碼(機(jī)器語(yǔ)言),一邊執(zhí)行,因此效率比較低,而且不能生成可獨(dú)立執(zhí)行的可執(zhí)行文件,應(yīng)用程序不能脫離其解釋器。但這種方式比較靈活,可以動(dòng)態(tài)地調(diào)整、修改應(yīng)用程序。高級(jí)語(yǔ)言的發(fā)展經(jīng)歷了從早期語(yǔ)言到結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,從面向過程到非過程化程序語(yǔ)言的過程。20世紀(jì)60年代中后期,軟件越來越多,規(guī)模越來越大,而軟件的生產(chǎn)基本上是各自為政,缺乏科學(xué)規(guī)范的系統(tǒng)規(guī)劃與測(cè)試、評(píng)估標(biāo)準(zhǔn)。其結(jié)果是大批耗費(fèi)巨資建立起來的軟件系統(tǒng),由于含有錯(cuò)誤而無法使用,甚至帶來巨大損失,軟件給人的感覺是越來越不可靠,以致幾乎沒有不出錯(cuò)的軟件。這一切,極大地震動(dòng)了計(jì)算機(jī)界,歷史上稱之為“軟件危機(jī)”。人們認(rèn)識(shí)到:大型程序的編制不同于小程序,它應(yīng)該是一項(xiàng)新的技術(shù),應(yīng)該像處理工程一樣處理軟件研制的全過程。1969年,提出了結(jié)構(gòu)化程序設(shè)計(jì)方法;1970年,第一個(gè)結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言Pascal出現(xiàn),標(biāo)志著結(jié)構(gòu)化程序設(shè)計(jì)時(shí)期的開始。
4.面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言
20世紀(jì)80年代初開始,在軟件設(shè)計(jì)思想上,又產(chǎn)生了一次革命,其成果就是面向?qū)ο蟮某绦蛟O(shè)計(jì)。在此之前的高級(jí)語(yǔ)言,幾乎都是面向過程的,程序的執(zhí)行是流水線式的,在一個(gè)模塊被執(zhí)行完成前,計(jì)算機(jī)不能干別的事,也無法動(dòng)態(tài)地改變程序的執(zhí)行方向。這和人們?nèi)粘L幚硎挛锏姆绞绞遣灰恢碌?。?duì)人而言,希望發(fā)生一件事就處理一件事,也就是說,不能面向過程,而應(yīng)是面向具體的應(yīng)用功能,也就是面向?qū)ο?Object)。面向?qū)ο蟪绦蛟O(shè)計(jì)(ObjectOrientedProgramming)語(yǔ)言與以往各種編程語(yǔ)言的根本區(qū)別是程序設(shè)計(jì)思維方法不同。面向?qū)ο蟪绦蛟O(shè)計(jì)可以更直接地描述客觀世界存在的事物(即對(duì)象)及事物之間的相互關(guān)系。面向?qū)ο蠹夹g(shù)強(qiáng)調(diào)的基本原則是直接面對(duì)客觀事物本身進(jìn)行抽象并在此基礎(chǔ)上進(jìn)行軟件開發(fā),將人類的思維方式與表達(dá)方式直接應(yīng)用在軟件設(shè)計(jì)中。1.2.2典型高級(jí)語(yǔ)言
目前有各種高級(jí)程序設(shè)計(jì)語(yǔ)言,其中以下幾種應(yīng)用非常廣泛。
FORTRAN,全稱為FormulaTranslator,意即公式翻譯。它是一種適用于科學(xué)計(jì)算的高級(jí)程序設(shè)計(jì)語(yǔ)言。
COBOL,全稱為CommonBusinessOrientedLanguage,意即通用商業(yè)語(yǔ)言。它是適用于數(shù)據(jù)處理的高級(jí)程序設(shè)計(jì)語(yǔ)言。
BASIC,全稱為Beginner’sAll-purposeSymbolicInstructionCode,意即初學(xué)者通用符號(hào)指令代碼。這是一種簡(jiǎn)單易學(xué),具有會(huì)話功能的,適用于科學(xué)計(jì)算、數(shù)據(jù)處理和實(shí)時(shí)處理的程序設(shè)計(jì)語(yǔ)言。1964年由美國(guó)達(dá)爾摩斯學(xué)院的基米尼和科茨完成設(shè)計(jì)并提出了BASIC語(yǔ)言的第一個(gè)版本,后經(jīng)過不斷豐富和發(fā)展,從基本的BASIC發(fā)展到GWBASIC、QuickBASIC、TrueBASIC、TurboBASIC、VisualBasic等。VisualBasic是一個(gè)基于Windows操作系統(tǒng)的面向?qū)ο蟮目梢暬砷_發(fā)環(huán)境和程序設(shè)計(jì)語(yǔ)言,它既有傳統(tǒng)BASIC易學(xué)、易懂、易記、易用的特點(diǎn),又有面向?qū)ο?、可視化設(shè)計(jì)、事件驅(qū)動(dòng)、動(dòng)態(tài)數(shù)據(jù)交換等特點(diǎn)。
Pascal是一種結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,由瑞士蘇黎世聯(lián)邦工業(yè)大學(xué)的沃斯教授研制,于1971年正式發(fā)表。它是以ALGOL語(yǔ)言為基礎(chǔ),按照結(jié)構(gòu)化程序設(shè)計(jì)原則設(shè)計(jì)出來的,它的優(yōu)點(diǎn)是小巧、簡(jiǎn)潔、結(jié)構(gòu)清晰、表達(dá)能力強(qiáng)、實(shí)現(xiàn)效能高。Pascal既重視數(shù)據(jù)結(jié)構(gòu),又重視程序的結(jié)構(gòu),具有大量的控制結(jié)構(gòu),充分反映了結(jié)構(gòu)化程序設(shè)計(jì)的思想和要求,直觀易懂,使用靈活,既可用于科學(xué)計(jì)算,又能用來編寫系統(tǒng)軟件。它適用于科學(xué)計(jì)算、數(shù)據(jù)處理和描述系統(tǒng)軟件。
C語(yǔ)言是由美國(guó)貝爾實(shí)驗(yàn)室提出的。1973年首先用于編寫UNIX操作系統(tǒng)。C程序易讀,程序效率很高,適于描述操作系統(tǒng)、編譯程序和各種軟件工具,已得到廣泛的應(yīng)用。C語(yǔ)言的主要特色是兼顧了高級(jí)語(yǔ)言和匯編語(yǔ)言的特點(diǎn),簡(jiǎn)潔、豐富、可移植。C語(yǔ)言提供了結(jié)構(gòu)式編程所需要的各種現(xiàn)代化的控制結(jié)構(gòu)。C語(yǔ)言是一種通用編程語(yǔ)言,使用C語(yǔ)言編寫程序,既能感覺到使用高級(jí)語(yǔ)言的自然,也能體會(huì)到利用計(jì)算機(jī)硬件指令的直接。
LISP是一種表處理語(yǔ)言,是20世紀(jì)50年代末60年代初為解決人工智能問題而發(fā)展起來的一種高級(jí)程序設(shè)計(jì)語(yǔ)言。LISP的理論基礎(chǔ)是數(shù)理邏輯,它很簡(jiǎn)單又有很強(qiáng)的表達(dá)能力。
Java是Sun公司推出的一種編程語(yǔ)言。它是一種通過解釋方式來執(zhí)行的語(yǔ)言,語(yǔ)法規(guī)則和C++?類似。同時(shí),Java也是一種跨平臺(tái)的程序設(shè)計(jì)語(yǔ)言。Java非常適合于企業(yè)網(wǎng)絡(luò)和Internet環(huán)境,現(xiàn)在已成為Internet中最受歡迎、最有影響的編程語(yǔ)言之一。Java有許多優(yōu)點(diǎn):簡(jiǎn)單、面向?qū)ο蟆⒎植际?、解釋性、可靠、安全、結(jié)構(gòu)中立性、可移植性、高性能、多線程、動(dòng)態(tài)性等。1.2.3程序設(shè)計(jì)語(yǔ)言發(fā)展趨勢(shì)
程序設(shè)計(jì)語(yǔ)言是軟件的重要方面。它的發(fā)展趨勢(shì)是可視化、智能化和構(gòu)件化。
1.可視化程序設(shè)計(jì)技術(shù)
隨著Windows操作系統(tǒng)的廣泛推廣與應(yīng)用,它的可視化圖形界面與所見即所得的視覺效果越來越成為編程語(yǔ)言效仿的典范。典型的可視化程序設(shè)計(jì)語(yǔ)言集成環(huán)境有Microsoft公司提供的VisualStudio系列等。Windows系統(tǒng)本身就提供了相應(yīng)的接口功能與系統(tǒng)調(diào)用供程序開發(fā)者使用,所以可視化程序設(shè)計(jì)技術(shù)成為程序設(shè)計(jì)語(yǔ)言發(fā)展的一個(gè)趨勢(shì)。
2.智能化程序設(shè)計(jì)技術(shù)
程序設(shè)計(jì)技術(shù)的智能化主要體現(xiàn)在第4代程序設(shè)計(jì)語(yǔ)言中,它改變了傳統(tǒng)的完全手工的編程工作方式,而將編程變成了提問式與填空式的工作方式。在系統(tǒng)給出部分甚至大部分代碼以后,由程序員填入適當(dāng)?shù)钠渌麅?nèi)容而完成整個(gè)編程工作,這樣的工作方式不僅提高了編程工作效率,而且避免了很多在傳統(tǒng)手工方式中存在或容易出現(xiàn)的錯(cuò)誤。
3.構(gòu)件化程序設(shè)計(jì)技術(shù)
以面向?qū)ο蟪绦蛟O(shè)計(jì)為基礎(chǔ),在可視化程序設(shè)計(jì)語(yǔ)言集成環(huán)境的支持下,還出現(xiàn)了構(gòu)件化程序設(shè)計(jì)的趨勢(shì)。程序設(shè)計(jì)過程中以標(biāo)準(zhǔn)的構(gòu)件為基本單位來構(gòu)造一個(gè)完整的程序,這種工作類似于房屋建筑過程中以磚和瓦為基本單位,只需將它們放置到合適的位置并固定就可以了。而構(gòu)件就相當(dāng)于程序設(shè)計(jì)過程中的磚和瓦,完成對(duì)構(gòu)件屬性的定義和操作的說明就完成了所有編程工作。
1.3算法概述
著名計(jì)算機(jī)科學(xué)家沃思提出一個(gè)公式:
程序?=?數(shù)據(jù)結(jié)構(gòu)?+?算法
其中,數(shù)據(jù)結(jié)構(gòu)是對(duì)程序中數(shù)據(jù)的描述,主要是數(shù)據(jù)的類型和數(shù)據(jù)的組織形式;算法是對(duì)程序中操作的描述,即操作步驟。數(shù)據(jù)是操作的對(duì)象,操作的目的是對(duì)數(shù)據(jù)進(jìn)行加工處理,以得到期望的結(jié)果。算法是靈魂,數(shù)據(jù)結(jié)構(gòu)是加工對(duì)象。
1.算法的基本概念
在日常生活中,人們處理問題都有一定的步驟。例如考大學(xué)就要有這樣的步驟:要填報(bào)名單,交報(bào)名費(fèi),拿到準(zhǔn)考證,再參加考試,填報(bào)志愿,得到錄取通知書。這些步驟都按一定的次序進(jìn)行,缺一不可,次序錯(cuò)了也不行。廣義地說,為解決一個(gè)問題而采取的方法和步驟,就稱為算法。算法解決“做什么”和“怎么做”的問題。計(jì)算機(jī)算法是用計(jì)算機(jī)求解一個(gè)具體問題或執(zhí)行特定任務(wù)的一組有序的操作步驟(或指令)。解決一個(gè)問題,可以有不同的方法和步驟。一般來說,希望采用簡(jiǎn)單的和運(yùn)算步驟少的方法。不僅要保證算法正確,還要考慮算法的質(zhì)量,選擇合適的算法。算法是根據(jù)問題定義中的信息得來的,是對(duì)問題處理過程的進(jìn)一步細(xì)化,但它不是計(jì)算機(jī)可以直接執(zhí)行的,只是編制程序代碼前對(duì)處理思想的一種描述,因此它是獨(dú)立于計(jì)算機(jī)的,但它的具體實(shí)現(xiàn)是在計(jì)算機(jī)上進(jìn)行的。
2.算法的特性
一個(gè)算法應(yīng)該具有以下5個(gè)重要的特征。
(1)有窮性:一個(gè)算法必須保證執(zhí)行有限步之后結(jié)束。在執(zhí)行有限步之后,計(jì)算必須終止,并得到解答。也就是說,一個(gè)算法的實(shí)現(xiàn)應(yīng)該在有限的時(shí)間內(nèi)完成。
(2)確切性:算法的每一步驟必須有確切的定義。算法中對(duì)每個(gè)步驟的解釋是唯一的。
(3)零個(gè)或多個(gè)輸入:輸入指在執(zhí)行算法時(shí)需要從外界取得的必要的信息。一個(gè)算法有零個(gè)(即沒有)或多個(gè)輸入,以刻畫運(yùn)算對(duì)象的初始情況。
(4)一個(gè)或多個(gè)輸出:輸出是算法的執(zhí)行結(jié)果。一個(gè)算法有一個(gè)或多個(gè)輸出,以反映對(duì)輸入數(shù)據(jù)加工后的結(jié)果。沒有輸出的算法是毫無意義的。
(5)有效性:又稱可行性。算法中的每一個(gè)步驟能夠精確地運(yùn)行,并得到確定的結(jié)果,即用筆和紙通過有限次運(yùn)算可完成。
3.算法的描述
算法的常用表示方法有如下幾種:
(1)使用自然語(yǔ)言描述算法;
(2)使用流程圖描述算法;
(3)使用N-S結(jié)構(gòu)圖表示算法;
(4)使用偽代碼描述算法。
下面以求解n!=1×2×3×4×5×…×(n-1)×n為例說明算法的3種描述方法。第1種:使用自然語(yǔ)言描述求n!的算法。
①確定一個(gè)n的值;
②假設(shè)等號(hào)右邊的算式項(xiàng)中的初始值i為1;
③假設(shè)變量f中存放n!的值,且初始值為1;
④?i≤n時(shí),執(zhí)行⑤,否則轉(zhuǎn)出執(zhí)行⑧;
⑤計(jì)算f乘以i的值后,重新賦值給f;
⑥計(jì)算i加1,然后將值重新賦值給i;
⑦轉(zhuǎn)去執(zhí)行④;
⑧輸出f的值,即n!?的值,算法結(jié)束。從上面的這個(gè)描述的求解過程中不難發(fā)現(xiàn),使用自然語(yǔ)言描述算法的方法雖然比較容易掌握,但是存在著很大的缺陷。例如,當(dāng)算法中含有多分支或循環(huán)操作時(shí)很難表述清楚。另外,使用自然語(yǔ)言描述算法還很容易造成歧義(稱之為二義性),可能使他人對(duì)相同的一句話產(chǎn)生不同的理解。
第2種:使用流程圖描述求n!的算法,如圖1-1所示。圖1-1求n!的算法流程圖從圖1-1中,可以比較清晰地看出求解問題的執(zhí)行過程。流程圖用一些圖框表示各種操作。用圖形表示算法,直觀形象,易于理解。在進(jìn)一步學(xué)習(xí)使用流程圖描述算法之前,有必要對(duì)流程圖中的一些常用符號(hào)做一個(gè)解釋。流程圖的符號(hào)如表1-1所示。表1-1流程圖的符號(hào)流程圖的缺點(diǎn)是在使用標(biāo)準(zhǔn)中沒有規(guī)定流程線的用法,因?yàn)榱鞒叹€能夠轉(zhuǎn)移、指出流程控制方向,即算法中操作步驟的執(zhí)行次序。在早期的程序設(shè)計(jì)中,曾經(jīng)由于濫用流程線的轉(zhuǎn)移而導(dǎo)致了可怕的“軟件危機(jī)”,震動(dòng)了整個(gè)軟件業(yè),并展開了關(guān)于“轉(zhuǎn)移”用法的大討論。
第3種:使用N-S結(jié)構(gòu)圖描述求n!?的算法。
針對(duì)傳統(tǒng)流程圖存在的問題,美國(guó)學(xué)者I.Nassi和B.Shneiderman于1973年提出一種新的結(jié)構(gòu)化流程圖形式,即N-S結(jié)構(gòu)圖。Chapin在1974年對(duì)其進(jìn)行了進(jìn)一步擴(kuò)展,因此,N-S結(jié)構(gòu)圖又稱為Chapin圖或盒狀圖。
N-S結(jié)構(gòu)圖的主要特點(diǎn)是完全取消了流程線,不允許有隨意的控制流,全部算法寫在一個(gè)矩形框內(nèi),該矩形框以3種基本結(jié)構(gòu)(順序、選擇、循環(huán))描述符號(hào)為基本復(fù)合而成。
無論是使用自然語(yǔ)言還是使用流程圖描述算法,都僅僅是表述了編程者解決問題的一種思路,無法被計(jì)算機(jī)直接接受并操作。由此引進(jìn)了第4種非常接近于計(jì)算機(jī)編程語(yǔ)言的算法描述方法——偽代碼。第4種:使用偽代碼描述求n!?的算法。
算法開始:
輸入n的值;
置i的初值為1;
置f的初值為1;
當(dāng)i<=?n時(shí),執(zhí)行下面的操作
使f=?f*i;
使i=i+1;
(循環(huán)體到此結(jié)束)
輸出f的值;
算法結(jié)束也可以寫成以下形式:
BEGIN /*算法開始*/
輸入n的值;
i←1; /*為變量i賦初值*/
f←1; /*為變量f賦初值*/
whilei<=n
/*當(dāng)變量i<=n時(shí),執(zhí)行下面的循環(huán)體語(yǔ)句*/
{f←f*i;
i←i+1;}
輸出f的值;
END /*算法結(jié)束*/偽代碼是一種在書寫程序或描述算法時(shí)使用的非正式、透明的表述方法,它并非是一種編程語(yǔ)言。這種方法針對(duì)的是一臺(tái)虛擬的計(jì)算機(jī)。偽代碼通常采用自然語(yǔ)言、數(shù)學(xué)公式和符號(hào)來描述算法的操作步驟,同時(shí)采用計(jì)算機(jī)高級(jí)語(yǔ)言(如C、Pascal、VB、C++、Java等)的控制結(jié)構(gòu)來描述算法步驟的執(zhí)行順序。偽代碼書寫格式比較自由,容易表達(dá)出設(shè)計(jì)者的思想,寫出的算法很容易修改。但是用偽代碼寫的算法不如流程圖直觀,可能會(huì)出現(xiàn)邏輯上的錯(cuò)誤。
4.算法分析
對(duì)于同一個(gè)問題可以設(shè)計(jì)出不同的算法,各種算法之間肯定有是否適合和“好”“差”之分。衡量一個(gè)適合的、“好”的算法,在其必須是正確的基礎(chǔ)上,還應(yīng)遵循下列幾個(gè)方面:
(1)易讀性:算法應(yīng)易于閱讀和理解,以便于調(diào)試、修改和擴(kuò)充。
(2)高效性:算法應(yīng)具有較高的時(shí)間效率和空間效率,即占用較短的執(zhí)行時(shí)間和較少的存儲(chǔ)空間。當(dāng)然,這兩者都和問題的規(guī)模有關(guān)。
(3)健壯性:正確的輸入能得到正確的輸出,這是算法必須具有的特性之一。但當(dāng)遇到非法輸入時(shí),算法應(yīng)能做出反應(yīng)或處理(如提示信息等),而不會(huì)產(chǎn)生不需要的或不正確的結(jié)果。
例如,在算法中總是采用較簡(jiǎn)單的方法以及模塊化函數(shù)以增強(qiáng)算法的易讀性;采用步驟較少的求解方法以提高算法的時(shí)間效率;對(duì)可能發(fā)生的各種現(xiàn)象及輸入形式給出應(yīng)對(duì)措施以提高算法的健壯性。要確定一個(gè)算法是適合的、“好”的算法,就需要進(jìn)行算法分析。算法分析的兩個(gè)主要方面是分析算法的時(shí)間效率和空間效率,目的是以求改進(jìn)算法或?qū)Σ煌乃惴ㄟM(jìn)行比較。鑒于目前情況下運(yùn)算空間較為充足,我們把算法的時(shí)間效率分析作為主要內(nèi)容。
算法運(yùn)行的時(shí)間分析和程序運(yùn)行的時(shí)間分析是有區(qū)別的。同一算法由不同的程序員所編寫的程序有優(yōu)劣之分,程序運(yùn)行的時(shí)間也就有所不同;程序在不同的機(jī)器上運(yùn)行的速度又和機(jī)器本身的速度有關(guān)。而我們感興趣的是對(duì)解決問題的算法作時(shí)間上的度量分析,或?qū)鉀Q同一問題的兩種或兩種以上的算法運(yùn)行時(shí)間加以比較。
1.4C語(yǔ)言程序設(shè)計(jì)
1.4.1C語(yǔ)言的發(fā)展歷史
C語(yǔ)言是國(guó)際上流行的、很有發(fā)展前途的計(jì)算機(jī)高級(jí)語(yǔ)言。C語(yǔ)言適合作為“系統(tǒng)描述語(yǔ)言”。它既可以用來編寫系統(tǒng)軟件,也可以用來編寫應(yīng)用程序。以前操作系統(tǒng)等系統(tǒng)軟件主要采用匯編語(yǔ)言編寫。匯編語(yǔ)言依賴于計(jì)算機(jī)硬件,程序的可讀性、可移植性都比較差。為了提高可讀性和可移植性,人們希望采用高級(jí)語(yǔ)言編寫這些軟件,但是一般的高級(jí)語(yǔ)言難以實(shí)現(xiàn)匯編語(yǔ)言的某些操作,特別是針對(duì)硬件的一些操作(如內(nèi)存地址的讀寫,直接硬件、二進(jìn)制位的操作)。人們?cè)O(shè)法尋找一種既具有一般高級(jí)語(yǔ)言特性,又具有低級(jí)語(yǔ)言特性的語(yǔ)言,C語(yǔ)言就在這種情況下應(yīng)運(yùn)而生。
C語(yǔ)言的發(fā)展如下:
ALGOL60→CPL→BCPL→B→C→標(biāo)準(zhǔn)C→ANSIC→ISOC
ALGOL60:一種面向問題的高級(jí)語(yǔ)言。ALGOL60離硬件較遠(yuǎn),不適合編寫系統(tǒng)程序。
CPL(CombinedProgrammingLanguage,組合編程語(yǔ)言):CPL是一種在ALGOL60基礎(chǔ)上發(fā)展出來的更接近硬件的語(yǔ)言。CPL規(guī)模大,實(shí)現(xiàn)困難。
BCPL(BasicCombinedProgramminglanguage,基本的組合編程語(yǔ)言):BCPL是對(duì)CPL進(jìn)行簡(jiǎn)化后的一種語(yǔ)言。
B語(yǔ)言:B語(yǔ)言是對(duì)BCPL進(jìn)一步簡(jiǎn)化所得到的一種很簡(jiǎn)單的接近硬件的語(yǔ)言。B語(yǔ)言取BCPL語(yǔ)言的第一個(gè)字母。B語(yǔ)言精練、接近硬件,但過于簡(jiǎn)單,數(shù)據(jù)無類型。B語(yǔ)言誕生后,UNIX開始用B語(yǔ)言改寫。
C語(yǔ)言:C語(yǔ)言是在B語(yǔ)言基礎(chǔ)上增加數(shù)據(jù)類型而設(shè)計(jì)出的一種語(yǔ)言。C語(yǔ)言取BCPL的第二個(gè)字母。C語(yǔ)言誕生后,UNIX很快用C語(yǔ)言改寫,并被移植到其他計(jì)算機(jī)系統(tǒng)。
標(biāo)準(zhǔn)C、ANSIC、ISOC:標(biāo)準(zhǔn)化的C語(yǔ)言。
最初UNIX操作系統(tǒng)是采用匯編語(yǔ)言編寫的,B語(yǔ)言版本的UNIX是第一個(gè)用高級(jí)語(yǔ)言編寫的UNIX。在C語(yǔ)言誕生后,UNIX很快用C語(yǔ)言改寫,C語(yǔ)言良好的可移植性很快使UNIX從PDP計(jì)算機(jī)移植到其他計(jì)算機(jī)平臺(tái),隨著UNIX的廣泛應(yīng)用,C語(yǔ)言也得到推廣。從此C語(yǔ)言和UNIX像一對(duì)孿生兄弟,在發(fā)展中相輔相成,UNIX和C很快風(fēng)靡全球。從C語(yǔ)言的發(fā)展歷史可以看出,C語(yǔ)言是一種既具有一般高級(jí)語(yǔ)言特性(ALGOL60帶來的高級(jí)語(yǔ)言特性),又具有低級(jí)語(yǔ)言特性(BCPL帶來的接近硬件的低級(jí)語(yǔ)言特性)的程序設(shè)計(jì)語(yǔ)言。C語(yǔ)言從一開始就是用于編寫大型、復(fù)雜系統(tǒng)軟件的,當(dāng)然C語(yǔ)言也可以用來編寫一般的應(yīng)用程序。也就是說,C語(yǔ)言是程序員的語(yǔ)言。
IBMPC微機(jī)DOS、Windows平臺(tái)上常見的C語(yǔ)言版本有Borland公司的TurboC、TurboC++、BorlandC++,C++Builder(Windows版本),以及Microsoft公司的MicrosoftC,VisualC++(Windows版本)等。1.4.2C語(yǔ)言的特點(diǎn)
C語(yǔ)言具有下列特點(diǎn)(其中(1)~(6)屬于高級(jí)語(yǔ)言特性,(7)、(8)屬于低級(jí)語(yǔ)言特性):
(1)?C語(yǔ)言的語(yǔ)言成分簡(jiǎn)潔、緊湊,書寫形式自由。
將C語(yǔ)言程序段與實(shí)現(xiàn)同樣功能的Pascal語(yǔ)言程序段進(jìn)行比較,如表1-2所示。表1-2C語(yǔ)言程序段與Pascal語(yǔ)言程序段的比較
(2)?C語(yǔ)言擁有豐富的數(shù)據(jù)類型。C語(yǔ)言具有整型、實(shí)型、字符型、數(shù)組類型、指針類型、結(jié)構(gòu)體類型、共同體類型等數(shù)據(jù)類型,能方便地構(gòu)造更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(如使用指針構(gòu)造鏈表、樹、棧)。
(3)?C語(yǔ)言的運(yùn)算符豐富,功能更強(qiáng)大。
①C語(yǔ)言具有復(fù)合的賦值運(yùn)算符“+[-*/%]=”(加等、減等、乘等、除等),“>>=”“<<=”(右移等、左移等),“&[||!]=”(與等、或等、非等)。
x+=5等價(jià)于x=x+5
②C語(yǔ)言有條件運(yùn)算符“?:”,可代替簡(jiǎn)單的if/else語(yǔ)句。如果需要表示:“如果x小于或等于0,則y為0;否則y為1”可以采用:
y=x<=0?0:1;
如果用一般的程序設(shè)計(jì)語(yǔ)言表示,就應(yīng)該像下面這樣表示:
if(x<=0)y=0;
elsey=1;
C語(yǔ)言避免了一切可能的啰嗦。③C語(yǔ)言中連賦值這種操作都定義為運(yùn)算符,也就是說賦值操作本身可以作為表達(dá)式的一部分,參與運(yùn)算。如:
if((p=malloc(sizeof(int)))==NULL){printf(“Error!”);exit(1);}
改寫為一般形式:
p=malloc(sizeof(int));
if(p==NULL){printf(“Error!”);exit(1);}
又如下面算式是正確的:
x=y=z=6;
改寫為一般形式:
z=6;y=6;x=6;
(4)?C語(yǔ)言是結(jié)構(gòu)化的程序設(shè)計(jì)語(yǔ)言。C語(yǔ)言具有結(jié)構(gòu)化的控制語(yǔ)句(if/else,switch/case,for,while,do…while)。函數(shù)是C語(yǔ)言程序的模塊單位。
(5)?C語(yǔ)言對(duì)語(yǔ)法限制不嚴(yán)格,程序設(shè)計(jì)靈活。
C語(yǔ)言不檢查數(shù)組下標(biāo)越界,不限制對(duì)各種數(shù)據(jù)的轉(zhuǎn)化(編譯系統(tǒng)可能對(duì)不合適的轉(zhuǎn)化進(jìn)行警告,但不限制),不限制指針的使用,程序正確性由程序員保證。實(shí)踐中,C語(yǔ)言程序編譯時(shí)會(huì)提示“警告錯(cuò)”或“嚴(yán)重錯(cuò)誤”。警告錯(cuò)表示使用的語(yǔ)法可能有問題,但有時(shí)可以忽略,程序仍然可以完成編譯工作,然后運(yùn)行。(但是一般情況下警告錯(cuò)往往意味著程序真的有問題,應(yīng)該認(rèn)真地檢查。)“嚴(yán)重錯(cuò)誤”是不能忽略的,編譯系統(tǒng)發(fā)現(xiàn)嚴(yán)重錯(cuò)誤,就不會(huì)產(chǎn)生目標(biāo)代碼。靈活和安全是一對(duì)矛盾,對(duì)語(yǔ)法限制的不嚴(yán)格可能也是C語(yǔ)言的一個(gè)缺點(diǎn),比如黑客可能使用越界的數(shù)組攻擊計(jì)算機(jī)系統(tǒng)。Java語(yǔ)言是優(yōu)秀的網(wǎng)絡(luò)應(yīng)用程序開發(fā)語(yǔ)言,它絕對(duì)不允許數(shù)組越界。此外Java不使用指針,不能直接操作客戶計(jì)算機(jī)上的文件,語(yǔ)法檢查相當(dāng)嚴(yán)格,程序正確性容易保證,但是Java在編程時(shí)卻缺乏靈活性。
(6)?C語(yǔ)言編寫的程序具有良好的可移植性。用C語(yǔ)言編制的程序基本上不需要修改或只需要少量修改就可以移植到其他的計(jì)算機(jī)系統(tǒng)或其他的操作系統(tǒng)。
(7)?C語(yǔ)言可以實(shí)現(xiàn)匯編語(yǔ)言的大部分功能。C語(yǔ)言可以直接操作計(jì)算機(jī)硬件,如寄存器、各種外設(shè)I/O端口等。C語(yǔ)言的指針可以直接訪問內(nèi)存物理地址。C語(yǔ)言類似匯編語(yǔ)言的位操作可以方便地檢查系統(tǒng)硬件的狀態(tài)。C語(yǔ)言適合編寫系統(tǒng)軟件。
(8)?C語(yǔ)言編譯后生成的目標(biāo)代碼小,質(zhì)量高,程序的執(zhí)行效率高。有資料顯示,C語(yǔ)言編譯后生成的目標(biāo)代碼只比匯編代碼效率低10%~20%。1.4.3C語(yǔ)言程序基本結(jié)構(gòu)
1.C語(yǔ)言字符集
字符是C語(yǔ)言最基本的元素。C語(yǔ)言字符集由字母、數(shù)字、空白、標(biāo)點(diǎn)和特殊字符組成(在字符串常量和注釋中還可以使用漢字等其他圖形符號(hào))。由字符集中的字符可以構(gòu)成C語(yǔ)言進(jìn)一步的語(yǔ)法成分(如標(biāo)識(shí)符、關(guān)鍵詞、運(yùn)算符等)。
(1)字母:A~Z,a~z。
(2)數(shù)字:0~9。
(3)空白符:空格、制表符(跳格)、換行符(空行)的總稱??瞻追嗽谧址?、字符串中有意義外,編譯系統(tǒng)忽略其他位置的空白??瞻追诔绦蛑兄皇瞧鸬介g隔作用。在程序的恰當(dāng)位置使用空白將使程序更加清晰,增強(qiáng)程序的可讀性。
(4)標(biāo)點(diǎn)符號(hào)、特殊字符。
(5)標(biāo)識(shí)符(名字):用來標(biāo)識(shí)變量名、符號(hào)常量名、函數(shù)名、數(shù)組名、類型名等實(shí)體(程序?qū)ο?的有效字符序列。標(biāo)識(shí)符由用戶自定義(取名字)。
2.C語(yǔ)言標(biāo)識(shí)符定義規(guī)則
(1)標(biāo)識(shí)符只能由字母、數(shù)字和下劃線三種字符組成,且第一個(gè)字符必須為字母或下劃線。例如:
合法的標(biāo)識(shí)符:Sum,average,_total,Class,day,stu_name,p4050
不合法的標(biāo)識(shí)符:M.D.John,$123,#33,3D64,a>b
(2)大小寫敏感。C程序員習(xí)慣變量名小寫,常量名大寫。例如:sum不同于Sum,BOOK不同于book。
(3)?ANSIC沒有限制標(biāo)識(shí)符長(zhǎng)度,但各個(gè)編譯系統(tǒng)都有自己的規(guī)定和限制(TC為32個(gè)字符,MSC為8個(gè)字符)。例如:student_name和student_number,如果取8個(gè)字符,則這兩個(gè)標(biāo)識(shí)符是相同的。
(4)標(biāo)識(shí)符不能與“關(guān)鍵詞”同名,也不能與系統(tǒng)預(yù)先定義的“標(biāo)準(zhǔn)標(biāo)識(shí)符”同名。
建議標(biāo)識(shí)符命名應(yīng)當(dāng)有一定的意義,做到見名知義。
3.關(guān)鍵詞(保留字)
關(guān)鍵詞是C語(yǔ)言規(guī)定的具有特定意義的字符串。
4.運(yùn)算符
運(yùn)算符將常量、變量、函數(shù)連接起來組成表達(dá)式,表示各種運(yùn)算。運(yùn)算符可以由一個(gè)或多個(gè)字符組成。運(yùn)算符根據(jù)參與運(yùn)算的操作數(shù)的個(gè)數(shù)分為單目、雙目和三目運(yùn)算符。
5.分隔符
分隔符包括逗號(hào)和空格,起分隔、間隔作用。
6.注釋符
“/*”和“*/”構(gòu)成一組注釋符。編譯系統(tǒng)將“/*”和“*/”之間的所有內(nèi)容看做注釋。編譯時(shí)編譯系統(tǒng)忽略注釋。
(1)注釋在程序中的作用是提示或解釋。
注釋與軟件的文檔同等重要,要養(yǎng)成使用注釋的良好習(xí)慣,這對(duì)軟件的維護(hù)相當(dāng)重要。程序是要給別人看的,自己也許還會(huì)看自己幾年前編制的程序(相當(dāng)于別人看程序),清晰的注釋有助于他人理解程序、算法的思路。
(2)在軟件開發(fā)過程中,還可以將注釋用于程序的調(diào)試——暫時(shí)屏蔽一些語(yǔ)句。
例如,在調(diào)試程序時(shí)暫時(shí)不需要運(yùn)行某段語(yǔ)句,而又不希望從程序中刪除它們,則可以使用注釋符將這段程序框起來,暫時(shí)屏蔽這段程序,在以后可以方便地恢復(fù)。7.程序基本組成
下面通過一些簡(jiǎn)單例子來說明C程序的基本組成。
/*源程序1-1*/
main()
{
printf(“ThisisaCprogram.\n”);
}
說明:本程序的功能是輸出一行信息:
ThisisaCprogram.
main表示“主函數(shù)”。每個(gè)C語(yǔ)言程序都必須有一個(gè)main函數(shù),它是每一個(gè)C語(yǔ)言程序的執(zhí)行起始點(diǎn)(入口點(diǎn))。main()表示“主函數(shù)”main的函數(shù)頭。
用{}括起來的是“主函數(shù)”main的函數(shù)體。main函數(shù)中的所有操作(或語(yǔ)句)都在這一對(duì){}之間。也就是說,main函數(shù)的所有操作都在main函數(shù)體中。
“主函數(shù)”main中只有一條語(yǔ)句,它是C語(yǔ)言的庫(kù)函數(shù),功能是用于程序的輸出(顯示在屏幕上)。本例用于將一個(gè)字符串“ThisisaCprogram.\n”的內(nèi)容輸出,即在屏幕上顯示如下內(nèi)容:
ThisisaCprogram.
_(回車/換行)
注意:每條語(yǔ)句都要用“;”號(hào)結(jié)束。
/*源程序1-2*/
main() /*計(jì)算兩數(shù)之和*/
{
inta,b,sum; /*這是定義變量*/
a=123;b=456; /*以下3行為C語(yǔ)句*/
sum=a+b;
printf(“sum=%d\n”,sum);
}說明:本程序計(jì)算兩數(shù)之和,并輸出結(jié)果。
同樣,此程序也必須包含一個(gè)main函數(shù)作為程序執(zhí)行的起點(diǎn)。{}之間為main函數(shù)的函數(shù)體,main函數(shù)所有操作均在main函數(shù)體中。
/*?和?*/?括起來的部分是一段注釋,注釋只是為了改善程序的可讀性,在編譯、運(yùn)行時(shí)不起作用(事實(shí)上編譯時(shí)會(huì)跳過注釋,目標(biāo)代碼中不會(huì)包含注釋)。注釋可以放在程序任何位置,并允許占用多行,只是需要注意“/*”和“*/”匹配,一般不要嵌套注釋。
inta,b,sum;是變量聲明,聲明了3個(gè)具有整數(shù)類型的變量a、b、sum。C語(yǔ)言的變量必須先聲明再使用。
a=123;b=456;是兩條賦值語(yǔ)句。將整數(shù)123賦給整型變量a,將整數(shù)456賦給整型變量b。a、b兩個(gè)變量分別為123、456。
注意這是兩條賦值語(yǔ)句,每條語(yǔ)句均用“;”結(jié)束。
也可以將這兩條語(yǔ)句寫成兩行,即:
a=123;
b=456;
由此可見,C語(yǔ)言程序的書寫相當(dāng)隨意,但是為了保證容易閱讀,要遵循一定的規(guī)范。
sum=a+b;是將a、b兩變量?jī)?nèi)容相加,然后將結(jié)果賦值給整型變量sum。此時(shí)sum的內(nèi)容為579。
printf(“sum=%d\n”,sum);是調(diào)用庫(kù)函數(shù)輸出sum的結(jié)果。%d為格式控制,表示sum的值以十進(jìn)制整數(shù)形式輸出。
程序運(yùn)行后,輸出(顯示)如下內(nèi)容:
sum=579
_(回車/換行)
/*源程序1-3*/
main() /*主函數(shù)*/
{ /*main函數(shù)體開始*/
inta,b,c;/*聲明部分定義變量*/
scanf(“%d,%d”,&a,&b);
c=max(a,b);/*調(diào)用max,將調(diào)用結(jié)果賦給c*/printf("max=%d",c);
} /*main函數(shù)體結(jié)束*/
intmax(intx,inty) /*計(jì)算兩數(shù)中較大的數(shù)*/
{ /*max函數(shù)體開始*/
intz; /*聲明部分,定義變量*/
if(x>y)z=x;
elsez=y;
returnz; /*將z值返回,通過max帶回調(diào)用處*/
} /*max函數(shù)體結(jié)束*/說明:輸入兩個(gè)整數(shù),計(jì)算兩者較大的數(shù),并輸出。
本程序包括兩個(gè)函數(shù)。其中主函數(shù)main仍然是整個(gè)程序執(zhí)行的起點(diǎn)。函數(shù)max計(jì)算兩數(shù)中較大的數(shù)。
主函數(shù)main調(diào)用scanf函數(shù)獲得兩個(gè)整數(shù),存入a、b兩個(gè)變量,然后調(diào)用函數(shù)max獲得兩個(gè)數(shù)字中較大的值,并賦給變量c。最后輸出變量c的值(結(jié)果)。
intmax(intx,inty)是函數(shù)max的函數(shù)頭。函數(shù)max的函數(shù)頭表明此函數(shù)獲得兩個(gè)整數(shù),返回一個(gè)整數(shù)。
函數(shù)max同樣也用{}將函數(shù)體括起來。max的函數(shù)體是函數(shù)max的具體實(shí)現(xiàn)。從參數(shù)表獲得數(shù)據(jù),處理后得到結(jié)果z,然后將z返回調(diào)用函數(shù)main。本例還表明:除了可以調(diào)用庫(kù)函數(shù)外,還可以調(diào)用用戶自己定義、編制的函數(shù)。
綜合上述三個(gè)例子,我們對(duì)C語(yǔ)言程序的基本組成和形式(程序結(jié)構(gòu))有了一個(gè)初步了解:
(1)?C程序由函數(shù)構(gòu)成(C是函數(shù)式的語(yǔ)言,函數(shù)是C程序的基本單位)。
一個(gè)C源程序至少包含一個(gè)main函數(shù),也可以包含一個(gè)main函數(shù)和若干個(gè)其他函數(shù)。函數(shù)是C程序的基本單位。
被調(diào)用的函數(shù)可以是系統(tǒng)提供的庫(kù)函數(shù),也可以是用戶根據(jù)需要自己編寫設(shè)計(jì)的函數(shù)。C是函數(shù)式的語(yǔ)言,程序的全部工作都是由各個(gè)函數(shù)完成的。編寫C程序就是編寫一個(gè)個(gè)函數(shù)。
C函數(shù)庫(kù)非常豐富,ANSIC提供100多個(gè)庫(kù)函數(shù),TurboC提供300多個(gè)庫(kù)函數(shù)。
(2)?main函數(shù)(主函數(shù))是每個(gè)程序執(zhí)行的起始點(diǎn)。
一個(gè)C程序總是從main函數(shù)開始執(zhí)行的,而不論main函數(shù)在程序中的位置如何。可以將main函數(shù)放在整個(gè)程序的最前面,也可以放在整個(gè)程序的最后,或者放在其他函數(shù)之間。
(3)一個(gè)函數(shù)由函數(shù)首部和函數(shù)體兩部分組成。
①函數(shù)首部:一個(gè)函數(shù)的第一行。
返回值類型函數(shù)名([函數(shù)參數(shù)類型1函數(shù)參數(shù)名1]
?
[,…,函數(shù)參數(shù)類型2,函數(shù)參數(shù)名2])注意:函數(shù)可以沒有參數(shù),但是后面的一對(duì)()不能省略,這是格式的規(guī)定。
②函數(shù)體:函數(shù)首部下用一對(duì){}括起來的部分。如果函數(shù)體內(nèi)有多個(gè){},則最外層是函數(shù)體的范圍。函數(shù)體一般包括聲明部分和執(zhí)行部分兩部分。
{
[聲明部分]:在這部分定義本函數(shù)所使用的變量。
[執(zhí)行部分]:由若干條語(yǔ)句組成命令序列(可以在其中調(diào)用其他函數(shù))。
}
(4)?C程序書寫格式自由,一行可以寫幾個(gè)語(yǔ)句,一個(gè)語(yǔ)句也可以寫在多行上。
C程序沒有行號(hào),也沒有FORTRAN、COBOL那樣嚴(yán)格規(guī)定的書寫格式(語(yǔ)句必須從某一列開始)。
C語(yǔ)言每條語(yǔ)句的最后必須有一個(gè)分號(hào)“;”表示語(yǔ)句的結(jié)束。
可以使用?/*?…?*/?對(duì)C程序中的任何部分作注釋。注釋可以提高程序可讀性,使用注釋是編程人員的良好習(xí)慣。實(shí)踐中,編寫好的程序往往需要修改、完善,事實(shí)上沒有一個(gè)應(yīng)用系統(tǒng)是不需要修改、完善的。很多人會(huì)發(fā)現(xiàn)自己編寫的程序在經(jīng)歷了一些時(shí)間以后,由于缺乏必要的文檔和注釋,最后連自己都很難再讀懂,需要花費(fèi)大量時(shí)間重新思考、理解原來的程序。這浪費(fèi)了大量的時(shí)間。如果一開始編程就對(duì)程序進(jìn)行注釋,雖然剛開始麻煩一些,但日后可以節(jié)省大量的時(shí)間。
一個(gè)實(shí)際的系統(tǒng)往往由多人合作開發(fā),程序文檔和注釋是其中重要的交流工具。
8.輸入/輸出
C語(yǔ)言本身不提供輸入/輸出語(yǔ)句,輸入/輸出的操作是通過調(diào)用庫(kù)函數(shù)(scanf,printf)完成的。
輸入/輸出操作涉及具體計(jì)算機(jī)硬件,把輸入/輸出操作放在函數(shù)中處理,可以簡(jiǎn)化C語(yǔ)言和C的編譯系統(tǒng),便于C語(yǔ)言在各種計(jì)算機(jī)上實(shí)現(xiàn)。不同的計(jì)算機(jī)系統(tǒng)需要對(duì)函數(shù)庫(kù)中的函數(shù)做不同的處理,以便實(shí)現(xiàn)同樣或類似的功能。
不同的計(jì)算機(jī)系統(tǒng)除了提供函數(shù)庫(kù)中的標(biāo)準(zhǔn)函數(shù)外,還按照硬件的情況提供一些專門的函數(shù)。因此不同計(jì)算機(jī)系統(tǒng)提供的函數(shù)數(shù)量和功能會(huì)有一定差異。1.4.4C語(yǔ)言程序的開發(fā)環(huán)境
由高級(jí)語(yǔ)言編寫的程序稱為源程序。由于CPU只能直接理解機(jī)器語(yǔ)言,不能直接理解源程序,因此由高級(jí)語(yǔ)言編寫的源程序必須經(jīng)編譯或解釋加工以后才能被計(jì)算機(jī)理解。把源程序“翻譯”為機(jī)器語(yǔ)言的過程稱為“編譯(compile)”,使用稱為“編譯程序(compiler)”的程序完成編譯任務(wù)。編譯程序把程序員編寫的類自然語(yǔ)言的源程序文件翻譯為機(jī)器指令,并以目標(biāo)文件(*.obj)的形式存放在磁盤上。目標(biāo)文件不能裝入內(nèi)存運(yùn)行,必須使用“連接程序(如link.exe)”連接為可執(zhí)行程序文件(*.exe)后才能被執(zhí)行。高級(jí)語(yǔ)言編程步驟如圖1-2所示。圖1-2高級(jí)語(yǔ)言編程步驟下面以源程序1-3為例說明C程序的上機(jī)方法。程序文件名為2.C,C程序開發(fā)環(huán)境為VisualC++6.0。
1.啟動(dòng)VisualC++6.0開發(fā)環(huán)境
從“開始”菜單中選擇“程序\MicrosoftVisualStudio6.0\
MicrosoftVisualC++6.0”,啟動(dòng)VC++,顯示VisualC++6.0開發(fā)環(huán)境窗口,如圖1-3所示。圖1-3VisualC++6.0開發(fā)環(huán)境窗口
2.創(chuàng)建一個(gè)新項(xiàng)目
(1)單擊“文件(File)”菜單中的“新建(New)”選項(xiàng),顯示“新建”對(duì)話框,如圖1-4所示。選擇對(duì)話框中的“工程(Project)”選項(xiàng)卡,以便生成新的工程。在產(chǎn)生新工程時(shí),系統(tǒng)自動(dòng)生成一個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)天然礦砂禮品畫數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)雙套螺旋管冷卻器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)2-氟苯甲醚數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年中國(guó)摩托車座架市場(chǎng)調(diào)查研究報(bào)告
- 2025至2031年中國(guó)阻爆燃管道阻火器行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)營(yíng)養(yǎng)保濕啫喱水行業(yè)投資前景及策略咨詢研究報(bào)告
- CS公司聚醚多元醇庫(kù)存管理優(yōu)化研究
- 二零二五年度綠色有機(jī)農(nóng)產(chǎn)品批量收購(gòu)專項(xiàng)合同3篇
- 二零二五年度宗教場(chǎng)所害蟲防治滅四害服務(wù)合同4篇
- 二零二五年度農(nóng)產(chǎn)品代理采購(gòu)合同范本16篇
- 開展課外讀物負(fù)面清單管理的具體實(shí)施舉措方案
- 2025年云南中煙工業(yè)限責(zé)任公司招聘420人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025-2030年中國(guó)洗衣液市場(chǎng)未來發(fā)展趨勢(shì)及前景調(diào)研分析報(bào)告
- 2024解析:第三章物態(tài)變化-基礎(chǔ)練(解析版)
- 北京市房屋租賃合同自行成交版北京市房屋租賃合同自行成交版
- 《AM聚丙烯酰胺》課件
- 系統(tǒng)動(dòng)力學(xué)課件與案例分析
- 《智能網(wǎng)聯(lián)汽車智能傳感器測(cè)試與裝調(diào)》電子教案
- 客戶分級(jí)管理(標(biāo)準(zhǔn)版)課件
- GB/T 32399-2024信息技術(shù)云計(jì)算參考架構(gòu)
- 人教版數(shù)學(xué)七年級(jí)下冊(cè)數(shù)據(jù)的收集整理與描述小結(jié)
評(píng)論
0/150
提交評(píng)論