《C語(yǔ)言程序設(shè)計(jì) 》課件第1章_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì) 》課件第1章_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì) 》課件第1章_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì) 》課件第1章_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì) 》課件第1章_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第1章概述1.1程序設(shè)計(jì)概述1.2算法及其描述1.3C語(yǔ)言概述1.4C程序的基本結(jié)構(gòu)1.5C語(yǔ)言程序的運(yùn)行步驟1.6學(xué)習(xí)程序設(shè)計(jì)應(yīng)注意的幾個(gè)問(wèn)題

1.1程序設(shè)計(jì)概述

1.1.1程序、程序設(shè)計(jì)與程序設(shè)計(jì)語(yǔ)言

1.程序

計(jì)算機(jī)的每一個(gè)操作都是根據(jù)人們事先指定的指令進(jìn)行的。每一條指令執(zhí)行特定的操作。所謂程序,就是一組計(jì)算機(jī)能夠識(shí)別和執(zhí)行的指令,用以完成一定的功能。計(jì)算機(jī)執(zhí)行程序的過(guò)程就是“自動(dòng)地”執(zhí)行各條指令的過(guò)程。計(jì)算機(jī)軟件系統(tǒng)包括系統(tǒng)軟件和應(yīng)用軟件兩部分。系統(tǒng)軟件一般由計(jì)算機(jī)生產(chǎn)廠家提供,是為方便用戶使用、管理和維修計(jì)算機(jī)而編制的程序的總稱。應(yīng)用軟件一般是指用戶在各自的應(yīng)用領(lǐng)域中,為解決各類實(shí)際問(wèn)題而編制的程序。

2.程序設(shè)計(jì)

計(jì)算機(jī)的一切操作都是由程序來(lái)控制的。計(jì)算機(jī)本質(zhì)上是執(zhí)行程序的機(jī)器。只有懂得程序設(shè)計(jì),才能真正使用好計(jì)算機(jī)這一工具。

計(jì)算機(jī)作為一個(gè)工具,主要用來(lái)解決人類所面臨的各種問(wèn)題。只有最終在計(jì)算機(jī)上能夠運(yùn)行良好的程序才能為人們解決特定的實(shí)際問(wèn)題。因此,程序設(shè)計(jì)的過(guò)程就是利用計(jì)算機(jī)求解問(wèn)題的過(guò)程。

程序設(shè)計(jì)是設(shè)計(jì)、編制和調(diào)試程序的過(guò)程。程序設(shè)計(jì)往往以某種程序設(shè)計(jì)語(yǔ)言為工具,給出這種語(yǔ)言下的程序。程序設(shè)計(jì)過(guò)程應(yīng)當(dāng)包括分析、設(shè)計(jì)、編碼、測(cè)試、排錯(cuò)等不同階段。由于軟件的質(zhì)量主要是通過(guò)程序的質(zhì)量來(lái)體現(xiàn)的,因此程序設(shè)計(jì)在軟件研究中的地位就顯得非常重要,其內(nèi)容涉及有關(guān)的基本概念、規(guī)范、工具、方法以及方法學(xué)。

3.程序設(shè)計(jì)語(yǔ)言

程序設(shè)計(jì)是一個(gè)過(guò)程,需要借助程序設(shè)計(jì)語(yǔ)言來(lái)描述解決問(wèn)題的方法和步驟。人和人之間的交流需要通過(guò)語(yǔ)言。比如,中國(guó)人之間用漢語(yǔ)交流,英國(guó)人之間用英語(yǔ)交流。人和計(jì)算機(jī)交流信息,也要解決語(yǔ)言問(wèn)題。程序設(shè)計(jì)語(yǔ)言是為了方便描述計(jì)算過(guò)程而人為設(shè)計(jì)的符號(hào)語(yǔ)言,是人與計(jì)算機(jī)進(jìn)行信息交流的語(yǔ)言工具。1.1.2程序設(shè)計(jì)的一般過(guò)程

程序設(shè)計(jì)過(guò)程不能簡(jiǎn)單地理解為只編制一個(gè)程序。實(shí)際上程序設(shè)計(jì)包括多方面的內(nèi)容,具體編制程序只是其中的一個(gè)方面。有人將程序設(shè)計(jì)描述成如下的一個(gè)公式:

程序設(shè)計(jì)?=?算法?+?數(shù)據(jù)結(jié)構(gòu)?+?方法?+?工具

由此看出,在整個(gè)程序設(shè)計(jì)的過(guò)程中,要涉及算法的設(shè)計(jì)、方法的設(shè)計(jì)和設(shè)計(jì)工具的選擇等諸多方面。雖然人們用計(jì)算機(jī)求解某一問(wèn)題時(shí)可能編制出各種不同的程序,但是人們編制程序時(shí)一般都會(huì)按照共同的基本步驟進(jìn)行,對(duì)于大型或復(fù)雜程序更是如此。從這個(gè)概念出發(fā),一般來(lái)說(shuō),可以將程序設(shè)計(jì)的過(guò)程分為以下幾個(gè)步驟:(1)分析問(wèn)題;

(2)確定解題思路(建立數(shù)學(xué)模型);

(3)繪制流程圖或結(jié)構(gòu)圖(選擇或設(shè)計(jì)算法);

(4)編寫(xiě)源程序;

(5)上機(jī)調(diào)試;

(6)修改源程序,最后確定源程序。

無(wú)論是什么類型的實(shí)際問(wèn)題,要用計(jì)算機(jī)來(lái)求解,首先必須分析問(wèn)題,從具體問(wèn)題抽象出一個(gè)適當(dāng)?shù)臄?shù)學(xué)模型,用這個(gè)數(shù)學(xué)模型應(yīng)能得出該問(wèn)題的精確或近似解。然后確定數(shù)學(xué)模型的計(jì)算方法(即算法),根據(jù)問(wèn)題的具體要求,可在已知的各種算法中選擇一種合適的算法或另設(shè)計(jì)一種新的算法。接下來(lái)就是用某種程序設(shè)計(jì)語(yǔ)言為確定的算法編制計(jì)算機(jī)程序,同時(shí)準(zhǔn)備好作為程序處理對(duì)象的各種數(shù)據(jù)。再接下來(lái)就開(kāi)始程序的調(diào)試運(yùn)行,用一些典型的數(shù)據(jù)和描述邊界條件的數(shù)據(jù)對(duì)程序進(jìn)行測(cè)試,以便發(fā)現(xiàn)和糾正程序中的錯(cuò)誤。這一過(guò)程可能導(dǎo)致前面步驟的多次反復(fù)。最后,在調(diào)試達(dá)到所要求的質(zhì)量標(biāo)準(zhǔn)之后,程序就可正式投入運(yùn)行,最終在計(jì)算機(jī)上得出問(wèn)題的解。1.1.3程序設(shè)計(jì)語(yǔ)言發(fā)展

1.第一代程序設(shè)計(jì)語(yǔ)言——機(jī)器語(yǔ)言

最初的計(jì)算機(jī)編程語(yǔ)言是所謂的機(jī)器語(yǔ)言。一組機(jī)器指令就是程序,稱為機(jī)器語(yǔ)言程序。計(jì)算機(jī)可以理解并執(zhí)行的命令即為指令。每種計(jì)算機(jī)都有自己的指令集合。計(jì)算機(jī)能夠執(zhí)行的全部指令集合構(gòu)成計(jì)算機(jī)的指令系統(tǒng)。每條指令都是由二進(jìn)制代碼0、1組成的。因此機(jī)器語(yǔ)言程序是二進(jìn)制代碼0、1的集合。每種計(jì)算機(jī)的指令系統(tǒng)都是不同的,因此同一個(gè)題目在不同的計(jì)算機(jī)上計(jì)算時(shí),必須編寫(xiě)不同的機(jī)器語(yǔ)言程序。

機(jī)器語(yǔ)言是低級(jí)語(yǔ)言,是面向機(jī)器的語(yǔ)言。用機(jī)器語(yǔ)言編寫(xiě)程序相當(dāng)繁瑣,程序產(chǎn)生率很低,質(zhì)量難以保證,并且程序不能通用。另外,用機(jī)器語(yǔ)言編寫(xiě)程序易出錯(cuò),程序難以檢查和調(diào)試。

2.第二代程序設(shè)計(jì)語(yǔ)言——匯編語(yǔ)言

20世紀(jì)50年代出現(xiàn)了匯編語(yǔ)言,它使用助記符表示每條機(jī)器指令。用指令助記符及地址符號(hào)書(shū)寫(xiě)的指令稱為匯編指令,而用匯編指令編寫(xiě)的程序稱為匯編語(yǔ)言程序。例如在8086CPU的指令系統(tǒng)中,用MOV表示數(shù)據(jù)傳送,ADD表示加,DEC表示將數(shù)據(jù)減1,可以使用十進(jìn)制數(shù)和十六進(jìn)制數(shù)。

需要指出的是,計(jì)算機(jī)不能直接識(shí)別用匯編語(yǔ)言編寫(xiě)的程序,必須先由一種專門的翻譯程序?qū)R編語(yǔ)言程序翻譯成機(jī)器語(yǔ)言程序之后,計(jì)算機(jī)才能識(shí)別和執(zhí)行。這種翻譯的過(guò)程稱為“匯編”,負(fù)責(zé)翻譯的程序稱為匯編程序。匯編語(yǔ)言程序與硬件密切相關(guān),因此這種程序也不能通用。例如,為了計(jì)算表達(dá)式“5?+?3”的值,用匯編語(yǔ)言編寫(xiě)的程序與用機(jī)器語(yǔ)言(8086CPU的指令系統(tǒng))編寫(xiě)的程序如下:

PUSH BP 01010101

MOV BP,SP 1000101111101100

DEC SP 01001100

DEC SP 01001100

PUSH SI 01010110

PUSH DI 01010111

MOV DI,0005 101111110000010100000000

MOV SI,0003 101111110000001100000000

MOV AX,DI 1000101111000110

MOV AX,SI 0000001111000110

MOV [BP-02],AX 100010010100011011111110

POP DI 01011111

POP SI 01011110

MOV SP,BP 1000101111100101

POP BP 01011110

RET 11000011

3.第三代程序設(shè)計(jì)語(yǔ)言——高級(jí)語(yǔ)言

雖然匯編語(yǔ)言相對(duì)于機(jī)器語(yǔ)言有很大改進(jìn),但依然對(duì)機(jī)器依賴性大,用其開(kāi)發(fā)的程序通用性差。因此,匯編語(yǔ)言也是低級(jí)語(yǔ)言。在保證程序正確的前提下,程序設(shè)計(jì)的主要目標(biāo)是程序的可讀性、易維護(hù)性和可移植性。機(jī)器語(yǔ)言程序和匯編語(yǔ)言程序很難達(dá)到這樣的目標(biāo)。隨著計(jì)算機(jī)技術(shù)的發(fā)展以及計(jì)算機(jī)應(yīng)用領(lǐng)域的不斷擴(kuò)大,計(jì)算機(jī)用戶隊(duì)伍也不斷壯大。為了使廣大的計(jì)算機(jī)用戶也能勝任程序的開(kāi)發(fā)工作,從20世紀(jì)50年代中期開(kāi)始逐步發(fā)展了面向問(wèn)題的程序設(shè)計(jì)語(yǔ)言,稱為高級(jí)語(yǔ)言,如Fortran、Basic、Pascal、Java、C和C++等,其中C和C++?是當(dāng)今流行的高級(jí)語(yǔ)言。高級(jí)語(yǔ)言與具體的計(jì)算機(jī)硬件無(wú)關(guān),其表達(dá)方式接近于被描述的問(wèn)題,易為人們接受和掌握。用高級(jí)語(yǔ)言編寫(xiě)程序比用低級(jí)語(yǔ)言容易得多,并大大簡(jiǎn)化了程序的編制和調(diào)試,使編程效率大大提高。高級(jí)語(yǔ)言的顯著特點(diǎn)是獨(dú)立于具體的計(jì)算機(jī)硬件,通用性和可移植性較好。用高級(jí)語(yǔ)言編寫(xiě)的程序同自然英語(yǔ)語(yǔ)言非常接近,易于學(xué)習(xí)。同時(shí),一條高級(jí)語(yǔ)言程序的語(yǔ)句相當(dāng)于幾條機(jī)器語(yǔ)言的指令,用高級(jí)語(yǔ)言編寫(xiě)程序也不需要熟悉計(jì)算機(jī)硬件。要計(jì)算表達(dá)式“5?+?3”的值,如果使用高級(jí)語(yǔ)言來(lái)編程就簡(jiǎn)單得多。

用Basic語(yǔ)言編寫(xiě)的程序如下:

10I=5

20J=3

30K=I+J

用C語(yǔ)言編寫(xiě)的程序如下:

main()

{inti,j,k;

i=5;

j=3;

k=i+j;

}必須指出,用高級(jí)語(yǔ)言編寫(xiě)的程序(稱為源程序)都要翻譯成機(jī)器語(yǔ)言程序(稱為目標(biāo)程序)后才能被計(jì)算機(jī)執(zhí)行。

從程序設(shè)計(jì)語(yǔ)言的發(fā)展過(guò)程可以看出,程序設(shè)計(jì)語(yǔ)言越來(lái)越接近人們的自然語(yǔ)言。目前高級(jí)語(yǔ)言已經(jīng)形成了一個(gè)龐大的家族,包括結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言、面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言、可視化程序設(shè)計(jì)語(yǔ)言、網(wǎng)絡(luò)程序設(shè)計(jì)語(yǔ)言等。隨著計(jì)算機(jī)硬件性能的不斷提高,人們使用計(jì)算機(jī)解決問(wèn)題的能力不斷提高,用高級(jí)語(yǔ)言編寫(xiě)的計(jì)算機(jī)程序也越來(lái)越復(fù)雜,但同時(shí)也出現(xiàn)了一些問(wèn)題。1968年,荷蘭數(shù)學(xué)家迪杰斯特拉發(fā)表了論文《GOTO語(yǔ)句的害處》,指出調(diào)試和修改程序的難度與程序中包含GOTO語(yǔ)句的數(shù)量成正比。從此,結(jié)構(gòu)化程序設(shè)計(jì)理念逐漸確立起來(lái)。結(jié)構(gòu)化程序設(shè)計(jì)思想包括:整個(gè)程序由若干模塊搭接而成,每個(gè)模塊采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)作為程序設(shè)計(jì)的基本單元。這樣的程序有以下四個(gè)特征:只有一個(gè)入口;只有一個(gè)出口;無(wú)死語(yǔ)句;無(wú)死循環(huán)。

C語(yǔ)言是這種程序設(shè)計(jì)語(yǔ)言的典型代表。面向?qū)ο蟮某绦蛟O(shè)計(jì)最早是在20世紀(jì)70年代提出的,其出發(fā)點(diǎn)和基本原則是盡可能地模擬現(xiàn)實(shí)世界中人類的思維進(jìn)程,使程序設(shè)計(jì)的方法和過(guò)程盡可能接近人類解決現(xiàn)實(shí)問(wèn)題的方法和過(guò)程。隨著面向?qū)ο蟪绦蛟O(shè)計(jì)方法和工具的成熟,從20世紀(jì)90年代開(kāi)始,面向?qū)ο蟪绦蛟O(shè)計(jì)逐漸成為最流行的程序設(shè)計(jì)技術(shù)。Java、C++、C#?等都是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言。

可視化程序設(shè)計(jì)是在面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ)上發(fā)展起來(lái)的??梢暬绦蛟O(shè)計(jì)語(yǔ)言把圖形用戶界面設(shè)計(jì)的復(fù)雜性封裝起來(lái),編程人員只需用系統(tǒng)提供的工具在屏幕上畫(huà)出各種圖形對(duì)象,并設(shè)置這些圖像的屬性,就可以讓語(yǔ)言工具自動(dòng)生成代碼,這大大提高了編程效率。VisualBasic、VisualC++?等都是可視化程序設(shè)計(jì)語(yǔ)言。網(wǎng)絡(luò)程序設(shè)計(jì)是在網(wǎng)絡(luò)環(huán)境下進(jìn)行的程序設(shè)計(jì),包括服務(wù)器端程序設(shè)計(jì)和客戶端程序設(shè)計(jì)。常用的服務(wù)器端程序設(shè)計(jì)語(yǔ)言有JSP、ASP和PHP,常用的客戶端程序設(shè)計(jì)語(yǔ)言有JavaScript和VBScript。

4.第四代程序設(shè)計(jì)語(yǔ)言——非過(guò)程式語(yǔ)言

20世紀(jì)80年代初,隨著數(shù)據(jù)庫(kù)技術(shù)和微型計(jì)算機(jī)的發(fā)展,出現(xiàn)了面向問(wèn)題的非過(guò)程式程序設(shè)計(jì)語(yǔ)言。利用第四代語(yǔ)言工具開(kāi)發(fā)軟件只需考慮“做什么”,而不必考慮“如何做”,不涉及太多的算法細(xì)節(jié),編程效率大大提高。迄今為止,使用最廣泛的第四代程序設(shè)計(jì)語(yǔ)言是數(shù)據(jù)庫(kù)查詢語(yǔ)言,如Oracle、Sybase等都包含有第四代語(yǔ)言成分。

5.第五代程序設(shè)計(jì)語(yǔ)言——智能型語(yǔ)言

第五代程序設(shè)計(jì)語(yǔ)言是智能型的計(jì)算機(jī)語(yǔ)言。這代程序設(shè)計(jì)語(yǔ)言力求擺脫傳統(tǒng)語(yǔ)言的狀態(tài)轉(zhuǎn)換語(yǔ)義模式,以適應(yīng)現(xiàn)代計(jì)算機(jī)系統(tǒng)知識(shí)化、智能化的發(fā)展趨勢(shì),主要用于人工智能的研究。其代表語(yǔ)言是LISP語(yǔ)言和PROLOGE語(yǔ)言。LISP語(yǔ)言屬于函數(shù)型語(yǔ)言,以λ演算為基礎(chǔ)。PROLOGE語(yǔ)言屬于邏輯型語(yǔ)言,以形式邏輯和謂詞演算為基礎(chǔ)。

未來(lái),第四代和第五代程序設(shè)計(jì)語(yǔ)言會(huì)有很大發(fā)展,但目前它們還很不成熟,還有很多問(wèn)題。目前常用的程序設(shè)計(jì)語(yǔ)言仍然是第三代高級(jí)語(yǔ)言。同時(shí),由于匯編語(yǔ)言運(yùn)行效率較高,因此在實(shí)時(shí)控制、實(shí)時(shí)檢測(cè)等領(lǐng)域的應(yīng)用軟件中仍然較多地使用匯編語(yǔ)言程序。

1.2算法及其描述

(1)輸入:一個(gè)算法可以有零個(gè)(即算法可以沒(méi)有輸入)或多個(gè)輸入,這些輸入通常取自于某個(gè)特定的對(duì)象集合。

(2)輸出:一個(gè)算法有一個(gè)或多個(gè)輸出(即算法必須有輸出),通常輸出與輸入之間有某種特定的關(guān)系。

(3)有窮性:一個(gè)算法必須是在執(zhí)行有窮步之后結(jié)束(對(duì)任何合法的輸入),且每一步都在有窮時(shí)間內(nèi)完成。

(4)確定性:算法中每一條指令必須有確切的含義,不存在二義性,并且在任何條件下,對(duì)于相同的輸入只能得到相同的輸出。

(5)可行性:算法描述的操作可以通過(guò)已經(jīng)實(shí)現(xiàn)的基本操作執(zhí)行有限次來(lái)實(shí)現(xiàn)。1.2.2算法的表示

算法的表示可以有多種方法,常用的有自然語(yǔ)言、偽代碼、傳統(tǒng)流程圖、結(jié)構(gòu)化流程圖(NS流程圖)和PAD圖等。下面以求兩個(gè)自然數(shù)的最大公約數(shù)的問(wèn)題為例,分別用幾種不同的方法描述算法。

我們采用歐幾里得算法求兩個(gè)自然數(shù)的最大公約數(shù),該算法的基本思想是:

設(shè)兩個(gè)自然數(shù)是m和n,且m≥n。歐幾里得算法的基本思想是將m和n輾轉(zhuǎn)相除直到余數(shù)為0。例如,m?=?36,n?=?16,m除以n的余數(shù)用r表示,計(jì)算過(guò)程如下:

被除數(shù)m除數(shù)n余數(shù)r

36

164

16

40

當(dāng)余數(shù)r為0時(shí),除數(shù)n就是m和n的最大公約數(shù)。

1.自然語(yǔ)言

用自然語(yǔ)言描述算法,其優(yōu)點(diǎn)是容易理解,缺點(diǎn)是算法冗長(zhǎng)、繁瑣,容易出現(xiàn)二義性。歐幾里得算法的自然語(yǔ)言描述如下:

步驟1:將m除以n得到余數(shù)r;

步驟2:若r等于0,則n為最大公約數(shù),算法結(jié)束,否則執(zhí)行步驟3;

步驟3:將n的值放在m中,將r的值放在n中,重新執(zhí)行步驟1。

2.偽代碼

偽代碼是介于自然語(yǔ)言和程序設(shè)計(jì)語(yǔ)言之間的描述方法,它保留了程序設(shè)計(jì)語(yǔ)言的結(jié)構(gòu)、語(yǔ)句的形式和控制成分等,處理和條件部分允許使用自然語(yǔ)言來(lái)表達(dá)。至于算法中的自然語(yǔ)言的成分有多少,取決于算法的抽象級(jí)別。

歐幾里得算法的偽代碼描述如下:

step1:?r←m%n;

step2:當(dāng)r?≠?0時(shí),重復(fù)執(zhí)行下述操作;

step2.1:m←n;

step2.2:n←r;

step2.3:r←m%n;

step3:輸出n。

3.流程圖

人們?cè)诔绦蛟O(shè)計(jì)實(shí)踐的過(guò)程中,總結(jié)出了一套用圖形來(lái)描述問(wèn)題的處理方法,從而使流程更直觀,更易被一般人所接受。用圖形描述處理流程的工具稱為流程圖。目前用得比較普遍的是傳統(tǒng)流程圖和結(jié)構(gòu)化流程圖(NS圖)。

(1)傳統(tǒng)流程圖。傳統(tǒng)流程圖是使用一些約定的幾何圖形來(lái)描述算法的組合圖,比如用矩形框表示某種操作,用箭頭表示算法的執(zhí)行方向。傳統(tǒng)流程圖的主要優(yōu)點(diǎn)是對(duì)控制流程的描述很直觀,便于初學(xué)者掌握。表1-1所示的圖例就是美國(guó)標(biāo)準(zhǔn)化協(xié)會(huì)(ANSI)規(guī)定的一些常用的流程圖符號(hào),它們已被世界各國(guó)程序工作者普遍采用。圖1-1為歐幾里得算法的流程圖。圖1-1歐幾里得算法的流程圖

(2)結(jié)構(gòu)化流程圖(NS圖)。在結(jié)構(gòu)化程序設(shè)計(jì)中,經(jīng)常使用的工具是結(jié)構(gòu)化流程圖,即NS圖。

NS圖是一種不允許破壞結(jié)構(gòu)化原則的圖形算法描述工具,又稱盒圖。在NS圖中,去掉了傳統(tǒng)流程圖中容易引起麻煩的流程線,全部算法都寫(xiě)在一個(gè)框內(nèi),每一種基本結(jié)構(gòu)也被表示為一個(gè)框。用基本結(jié)構(gòu)的順序組合可以表示任何復(fù)雜的算法結(jié)構(gòu)。

NS圖比文字描述直觀、形象,便于理解,比傳統(tǒng)流程圖緊湊易畫(huà),尤其是它去除了流程線,結(jié)構(gòu)更清晰。圖1-2是歐幾里得算法的NS圖。圖1-2歐幾里得算法的NS圖 1.3C語(yǔ)言概述

1.3.1C語(yǔ)言的發(fā)展

C語(yǔ)言是目前國(guó)際上廣泛流行的一種基礎(chǔ)的結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,它不僅是很好的開(kāi)發(fā)系統(tǒng)軟件的工具,而且也是很好的開(kāi)發(fā)應(yīng)用軟件的程序設(shè)計(jì)語(yǔ)言。因此,它深受廣大程序設(shè)計(jì)者的歡迎。

C語(yǔ)言是在20世紀(jì)70年代初由美國(guó)貝爾實(shí)驗(yàn)室設(shè)計(jì)的,并首先在安裝UNIX操作系統(tǒng)的DECPDP-11計(jì)算機(jī)上實(shí)現(xiàn)。1973年,K.Thompson和DennisM.Ritchie把UNIX90%以上的內(nèi)容用C語(yǔ)言進(jìn)行了改寫(xiě),即大家熟知的UNIX第五版。因此,當(dāng)初的C語(yǔ)言是為開(kāi)發(fā)UNIX操作系統(tǒng)而研制的,它隨著UNIX而聞名于世。隨著微型計(jì)算機(jī)的普及,出現(xiàn)了較多的C語(yǔ)言系統(tǒng),其中多數(shù)系統(tǒng)接受的源程序都能高度兼容,但是因?yàn)闆](méi)有統(tǒng)一的標(biāo)準(zhǔn),再怎么兼容,也存在一定的差異。

隨著C語(yǔ)言被廣泛應(yīng)用,新的C語(yǔ)言版本不斷推出,其性能也越來(lái)越強(qiáng)。到了1975年,隨著UNIX第六版的推出和面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)的出現(xiàn),C語(yǔ)言的突出優(yōu)點(diǎn)引起了人們的普遍關(guān)注。為了克服多個(gè)C語(yǔ)言系統(tǒng)沒(méi)有統(tǒng)一標(biāo)準(zhǔn)的不利局面,ANSI(美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì))于1983年成立了專門定義C語(yǔ)言標(biāo)準(zhǔn)的委員會(huì),花了6年時(shí)間使C語(yǔ)言邁向了標(biāo)準(zhǔn)化。ANSIC標(biāo)準(zhǔn)于1989年被采用,該標(biāo)準(zhǔn)一般稱為ANSI/ISOStandardC,簡(jiǎn)稱為C89。其中詳細(xì)說(shuō)明了使用C語(yǔ)言書(shū)寫(xiě)程序的形式,規(guī)范了對(duì)這些程序的解釋。其主要內(nèi)容包括:

(1)?C語(yǔ)言程序的表示法;

(2)?C語(yǔ)言的語(yǔ)法和約束;

(3)解釋C語(yǔ)言程序的語(yǔ)義規(guī)則;

(4)?C語(yǔ)言程序輸入和輸出的表示;

(5)一份標(biāo)準(zhǔn)的實(shí)現(xiàn)的限定和約束。

1995年,出現(xiàn)了C的修訂版,其中增加了一些庫(kù)函數(shù),出現(xiàn)了初步的C++,在此基礎(chǔ)上,C89成為C++?的子集。此后,C語(yǔ)言不斷發(fā)展,在1999年又推出了C99。C99在基本保留C語(yǔ)言的特性的基礎(chǔ)上增加了一系列新的特性,隨后又幾經(jīng)修改和完善,從面向過(guò)程的編程語(yǔ)言發(fā)展到面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。1.3.2C語(yǔ)言的特點(diǎn)

C語(yǔ)言之所以能被推廣并被廣泛使用,概括地說(shuō)主要因其具有如下特點(diǎn):

(1)?C語(yǔ)言是一種表達(dá)能力非常強(qiáng)的程序設(shè)計(jì)語(yǔ)言。它既有高級(jí)語(yǔ)言面向用戶、容易記憶、便于閱讀和書(shū)寫(xiě)的優(yōu)點(diǎn),又有面向硬件和系統(tǒng)、像匯編語(yǔ)言那樣可以直接訪問(wèn)內(nèi)存物理地址,允許對(duì)位、字節(jié)和地址這些計(jì)算機(jī)功能中的基本成分進(jìn)行操作的功能。C語(yǔ)言集低級(jí)語(yǔ)言和高級(jí)語(yǔ)言的開(kāi)發(fā)于一體,因此常被稱為中級(jí)語(yǔ)言。

(2)?C語(yǔ)言代碼緊湊、高效,使用方便、靈活。其程序的目標(biāo)碼執(zhí)行效率僅比匯編語(yǔ)言低10%~20%。C語(yǔ)言僅有32個(gè)關(guān)鍵字和9種控制語(yǔ)句,語(yǔ)言規(guī)則也不復(fù)雜,核心小巧,所以學(xué)習(xí)C語(yǔ)言相對(duì)簡(jiǎn)單。

(3)?C語(yǔ)言數(shù)據(jù)類型豐富,具有現(xiàn)代程序設(shè)計(jì)語(yǔ)言的各種數(shù)據(jù)類型。C語(yǔ)言的數(shù)據(jù)類型主要有整型、實(shí)型、字符型、指針類型、數(shù)組類型、結(jié)構(gòu)類型等。用它們可以實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(如鏈表、樹(shù)、圖、棧等)。因此,C語(yǔ)言具有較強(qiáng)的數(shù)據(jù)處理能力。

(4)?C語(yǔ)言運(yùn)算符豐富。C語(yǔ)言的運(yùn)算符共有34種,括號(hào)、賦值、強(qiáng)制類型轉(zhuǎn)換等都被作為運(yùn)算符處理,從而使C語(yǔ)言的運(yùn)算類型極其豐富,表達(dá)式類型多樣化,可以靈活實(shí)現(xiàn)其他高級(jí)語(yǔ)言難以實(shí)現(xiàn)的運(yùn)算。

(5)?C語(yǔ)言是一種結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言。它具有諸如if-else、for、do-while、while、switch等結(jié)構(gòu)化語(yǔ)句,便于采用自頂向下、逐步求精的結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)。

(6)?C語(yǔ)言是便于模塊化軟件設(shè)計(jì)的程序語(yǔ)言。C語(yǔ)言程序可以分割成幾個(gè)源文件分別進(jìn)行編譯。C語(yǔ)言的函數(shù)結(jié)構(gòu)利于功能模塊的分解,并且為程序模塊間的相互調(diào)用以及數(shù)據(jù)傳遞提供了便利。這一特點(diǎn)也為大型軟件模塊化、由多人同時(shí)進(jìn)行集體開(kāi)發(fā)的軟件工程技術(shù)方法提供了強(qiáng)有力的支持。

(7)?C語(yǔ)言具有很好的可移植性。大部分代碼不用改動(dòng)就可以從一種機(jī)器移植到另一種機(jī)器上運(yùn)行。

(8)?C語(yǔ)言是C++?的基礎(chǔ),而C++?是目前最流行的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。從以上特點(diǎn)不難看出,用C語(yǔ)言編寫(xiě)出的程序,既可達(dá)到匯編級(jí)的效率,又有良好的程序結(jié)構(gòu)。因此,C語(yǔ)言不僅在各類程序設(shè)計(jì)中得到廣泛運(yùn)用,而且對(duì)于初學(xué)者來(lái)說(shuō),易學(xué)易用。

同時(shí),C語(yǔ)言也存在一些不足。C語(yǔ)言類型轉(zhuǎn)換比較隨便,對(duì)數(shù)值越界及變量類型的一致性不作語(yǔ)法上的嚴(yán)格檢查,這雖然給編程提供了較大的靈活性,但是也限制了編譯程序查錯(cuò)的能力。因此,不能過(guò)分依賴C編譯程序而要強(qiáng)調(diào)由程序員自己去保證程序的正確性。

1.4C程序的基本結(jié)構(gòu)

1.4.1簡(jiǎn)單的C語(yǔ)言程序例子

為了使讀者對(duì)C語(yǔ)言程序有個(gè)初步印象,下面介紹幾個(gè)例子,以便讀者了解C程序的基本結(jié)構(gòu)和組成。

【例1.1】編寫(xiě)顯示字符串“ThisismyfirstCprogram”的C語(yǔ)言程序。

程序如下:

#include<stdio.h>

main()

{

printf(“ThisismyfirstCprogram\n”);

}

這是一個(gè)最簡(jiǎn)單的C程序,它把字符串“ThisismyfirstCprogram”顯示在屏幕上。該程序由一個(gè)函數(shù)main(叫主函數(shù))構(gòu)成。任何一個(gè)程序都必須有此函數(shù)?;ɡㄌ?hào)所括的內(nèi)容是main的函數(shù)體。每個(gè)C語(yǔ)言程序的函數(shù)都至少有一對(duì){}。

“printf(?)”是C提供的標(biāo)準(zhǔn)庫(kù)函數(shù),它完成輸出功能。C語(yǔ)言的輸出不像有的高級(jí)語(yǔ)言那樣由語(yǔ)句完成,而是由函數(shù)來(lái)完成的,這是它的特點(diǎn)之一。為了順利調(diào)用函數(shù)庫(kù)中的函數(shù)printf,還需要嵌入stdio.h這個(gè)頭文件。C的系統(tǒng)中預(yù)定義了很多不同的頭文件,供用戶調(diào)用,以滿足基本要求。頭文件中定義了許多函數(shù)原型。在頭文件stdio.h中就定義了函數(shù)printf的原型,因此,這里要調(diào)用系統(tǒng)預(yù)定義函數(shù)printf,就必須在程序的最前面增加#include<stdio.h>?這個(gè)預(yù)處理命令;否則,printf函數(shù)將無(wú)法工作。printf()后的分號(hào)是語(yǔ)句結(jié)束符。C語(yǔ)言的每一個(gè)語(yǔ)句都以分號(hào)終止?!纠?.2】編寫(xiě)程序,計(jì)算三個(gè)實(shí)型數(shù)的平均值。

程序如下:

#include<stdio.h> /*嵌入頭文件*/

main() /*主函數(shù)入口*/

{

floata,b,c,aver; /*定義變量的數(shù)據(jù)類型為實(shí)型*/

printf(“請(qǐng)輸入三個(gè)實(shí)型數(shù)\n:”); /*輸出語(yǔ)句,作為提示*/

scanf(“%f,%f,%f”,&a,&b,&c);/*從鍵盤輸入a、b、c三個(gè)實(shí)型數(shù)*/

aver=(a+b+c)/3; /*求平均值*/

print("\naverage=%f\n",aver); /*輸出計(jì)算結(jié)果*/

}運(yùn)行該程序時(shí),首先提示用戶輸入三個(gè)實(shí)型數(shù)a、b和c,然后用戶輸入三個(gè)數(shù),例如1、2、3,計(jì)算機(jī)根據(jù)用戶輸入的三個(gè)數(shù)求出其平均值,然后把結(jié)果以如下形式顯示在屏幕上:

average=2.0000

在此程序中,“/**/”是注釋標(biāo)識(shí)符,其間的內(nèi)容是注釋內(nèi)容,它在程序的編譯過(guò)程中不產(chǎn)生任何執(zhí)行代碼,只是在編程中起到備忘錄的作用。“floata,b,c,aver”是數(shù)據(jù)類型說(shuō)明語(yǔ)句,它把a(bǔ)、b、c和aver定義為實(shí)型變量。值得注意的是,所有C語(yǔ)言程序中的變量,在使用之前都必須先定義其數(shù)據(jù)類型。“scanf(?);”是輸入語(yǔ)句,它是格式化的輸入函數(shù),是一個(gè)由系統(tǒng)提供的標(biāo)準(zhǔn)庫(kù)函數(shù),其原型也是在stdio.h這個(gè)頭文件中定義的。scanf函數(shù)的圓括弧內(nèi)為參數(shù)表,“%f,%f,%f”為格式串,%f表示實(shí)型數(shù)格式,指明賦給變量a、b和c的值的數(shù)據(jù)類型是實(shí)型。執(zhí)行該語(yǔ)句時(shí),數(shù)據(jù)從鍵盤上輸入。

“aver=(a+b+c)/3;”是一個(gè)計(jì)算表達(dá)式,表示把表達(dá)式右邊的運(yùn)算結(jié)果賦給aver?!皃rintf("\naverage=%f\n",aver);”為輸出語(yǔ)句,它首先在新的一行上輸出字符串“average=”,然后按實(shí)型數(shù)格式(%f)輸出變量aver的值,并使光標(biāo)移至下一行。【例1.3】編寫(xiě)程序,求兩個(gè)整型數(shù)中較大的那個(gè)數(shù)的值。

程序如下:

main() /*主函數(shù)*/

{

inta,b,c; /*定義變量*/

scanf("%d,%d",&a,&b);/*輸入變量a和b的值*/

c=max(a,b); /*調(diào)用max函數(shù),將值賦給c*/

printf("max=%d",c);

}

intmax(intx,inty) /*定義max函數(shù),對(duì)形式參數(shù)x,y

作類型說(shuō)明*/

{

if(x>y)

return(x); /*如果x?>?y,則返回x的值*/

else

return(y); /*否則返回y的值*/

}此程序由兩個(gè)函數(shù)組成,除了主函數(shù)main之外,還有計(jì)算最大值的函數(shù)max?!癷ntmax(intx,inty)”說(shuō)明函數(shù)的返回值類型為int(整型),函數(shù)的參數(shù)為整型數(shù)x、y,“return(y)”將求解結(jié)果返回給主函數(shù)。

該程序的執(zhí)行是從main函數(shù)開(kāi)始的(C語(yǔ)言中程序的運(yùn)行都是從main函數(shù)開(kāi)始的),當(dāng)主函數(shù)執(zhí)行到“c=max(a,b);”語(yǔ)句時(shí),控制被傳遞給max函數(shù),當(dāng)執(zhí)行“return(y);”語(yǔ)句時(shí),控制又被傳遞給main函數(shù),并把max函數(shù)的計(jì)算結(jié)果帶給main函數(shù)的c變量。當(dāng)主函數(shù)執(zhí)行結(jié)束時(shí),整個(gè)程序的執(zhí)行也就結(jié)束了。1.4.2C語(yǔ)言的基本結(jié)構(gòu)

從上述幾個(gè)簡(jiǎn)單例子可以看出,C程序是由函數(shù)構(gòu)成的。一個(gè)C程序至少包含一個(gè)主函數(shù)(main函數(shù)),還可以包含若干個(gè)其他函數(shù)。C語(yǔ)言程序的基本結(jié)構(gòu)如圖1-3所示。其特點(diǎn)如下:

(1)除主函數(shù)必須命名為main外,程序中的其他函數(shù)由用戶自行命名。

(2)各函數(shù)在程序中排列的位置并不十分重要,main函數(shù)也可以放在其他函數(shù)后面,但程序總是從main函數(shù)開(kāi)始執(zhí)行。

(3)在各函數(shù)之外,可以出現(xiàn)預(yù)處理命令和全局?jǐn)?shù)據(jù)描述。

(4)?C程序書(shū)寫(xiě)格式自由,一行內(nèi)可以寫(xiě)多個(gè)語(yǔ)句,一個(gè)語(yǔ)句可以分寫(xiě)在多行上。當(dāng)然,清晰易讀的書(shū)寫(xiě)格式是值得提倡的。

(5)每個(gè)語(yǔ)句和數(shù)據(jù)定義的最后必須有一個(gè)分號(hào),但是預(yù)處理命令和復(fù)合語(yǔ)句的花括號(hào)之后不能有分號(hào)。圖1-3C語(yǔ)言程序基本結(jié)構(gòu)

1.5C語(yǔ)言程序的運(yùn)行步驟

當(dāng)完成C語(yǔ)言程序的代碼編寫(xiě)之后,就可以在機(jī)器上運(yùn)行它了。C語(yǔ)言是一種程序設(shè)計(jì)語(yǔ)言,它很容易被人們看懂和接受;但是,計(jì)算機(jī)不能直接接受這種語(yǔ)言,而只能接受機(jī)器語(yǔ)言。為此必須首先把C語(yǔ)言程序翻譯成相應(yīng)的機(jī)器語(yǔ)言程序,這個(gè)工作叫編譯。

編寫(xiě)好的C語(yǔ)言程序叫C源程序。從只有C源程序,到在計(jì)算機(jī)上得到運(yùn)行結(jié)果,其操作過(guò)程如圖1-4所示。圖1-4C語(yǔ)言程序執(zhí)行過(guò)程

1.源文件的編輯

為了編譯C源程序,首先要用系統(tǒng)提供的編輯器建立一個(gè)C語(yǔ)言程序的源文件。一個(gè)C源文件是一個(gè)編譯單位,它是以文本格式保存的。源文件名可自定,文件的擴(kuò)展名(或后綴名)為?.c或?.cpp,例如a1.c、a1.cpp。

一個(gè)比較大的C語(yǔ)言程序往往可劃分為若干模塊,每個(gè)模塊由不同的開(kāi)發(fā)者或開(kāi)發(fā)小組負(fù)責(zé)編寫(xiě)。對(duì)每個(gè)模塊可建立一個(gè)源文件。因此,一個(gè)大的C程序可包含多個(gè)源文件,這些源文件都可以獨(dú)立進(jìn)行編譯。

2.編譯

源文件建立好后,經(jīng)檢查無(wú)誤后就可進(jìn)行編譯。編譯是由系統(tǒng)提供的編譯器完成的。編譯命令隨系統(tǒng)的不同而異,對(duì)于不同的編譯環(huán)境來(lái)說(shuō),一般通過(guò)編譯軟件界面的Compile菜單中的Compile命令進(jìn)行編譯,具體操作可參考相應(yīng)的系統(tǒng)手冊(cè)。編譯器在編譯時(shí)對(duì)源文件進(jìn)行語(yǔ)法和語(yǔ)義檢查,并給出所發(fā)現(xiàn)的錯(cuò)誤。用戶可根據(jù)錯(cuò)誤的情況,使用編輯器對(duì)源程序進(jìn)行修改,然后對(duì)修改后的源文件再度編譯。

3.連接

若在上述步驟中,用戶選擇Compile命令進(jìn)行編譯,則編譯所生成的目標(biāo)文件(*.obj)是相對(duì)獨(dú)立的模塊,還不能直接執(zhí)行,用戶還必須用連接程序把它和其他目標(biāo)文件以及系統(tǒng)所提供的庫(kù)函數(shù)進(jìn)行連接裝配,生成可執(zhí)行文件后才能執(zhí)行。可執(zhí)行文件的名字可自由指定,默認(rèn)的執(zhí)行文件的名字與源文件的名字一致,可執(zhí)行文件的擴(kuò)展名為?.exe。

4.執(zhí)行

執(zhí)行文件生成后,就可執(zhí)行它了。若執(zhí)行的結(jié)果達(dá)到預(yù)想的結(jié)果,則說(shuō)明程序編寫(xiě)正確。否則,就需進(jìn)一步檢查修改源程序,重復(fù)上述步驟,直至得到正確的運(yùn)行結(jié)果為止。

1.6學(xué)習(xí)程序設(shè)計(jì)應(yīng)注意的幾個(gè)問(wèn)題

1.學(xué)習(xí)過(guò)程中應(yīng)注意的問(wèn)題

初學(xué)C語(yǔ)言時(shí),可能會(huì)遇到有些問(wèn)題理解不透,或者不習(xí)慣其表達(dá)方式(如運(yùn)算符等),此時(shí)應(yīng)多問(wèn)多想,鼓足勇氣繼續(xù)學(xué)習(xí),待學(xué)完后面的章節(jié)知識(shí),前面的問(wèn)題也就迎刃而解了。學(xué)習(xí)C語(yǔ)言要經(jīng)過(guò)幾個(gè)反復(fù),才能融會(huì)貫通,真正掌握所學(xué)知識(shí)。

(1)學(xué)好C語(yǔ)言的運(yùn)算符和表達(dá)式。C語(yǔ)言的運(yùn)算符非常靈活多樣,功能十分豐富,表達(dá)式較其他程序設(shè)計(jì)語(yǔ)言更簡(jiǎn)潔,但初學(xué)者往往會(huì)覺(jué)得表達(dá)式難讀,主要原因就是對(duì)運(yùn)算符和運(yùn)算順序理解不透、不全。當(dāng)多種運(yùn)算符組成一個(gè)運(yùn)算表達(dá)式時(shí),對(duì)運(yùn)算的優(yōu)先順序和結(jié)合規(guī)則的把握顯得十分重要。在學(xué)習(xí)中對(duì)有些運(yùn)算符在理解后要牢記心中,以便將來(lái)用起來(lái)得心應(yīng)手,而有些可暫時(shí)放棄不記,等用到時(shí)再記不遲。

(2)學(xué)好C語(yǔ)言的三種基本結(jié)構(gòu),理解模塊化程序設(shè)計(jì)的基本思想。

順序結(jié)構(gòu)程序設(shè)計(jì)是最簡(jiǎn)單的,只要按照解決問(wèn)題的順序?qū)懗鱿鄳?yīng)的語(yǔ)句就行,它的執(zhí)行順序是自上而下,依次執(zhí)行。

對(duì)于要先做判斷再選擇的問(wèn)題就要使用選擇結(jié)構(gòu)。選擇結(jié)構(gòu)是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語(yǔ)句出現(xiàn)的物理順序來(lái)執(zhí)行的。選擇結(jié)構(gòu)程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的選擇條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)倪x擇語(yǔ)句。

循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書(shū)寫(xiě)的工作量,用來(lái)描述重復(fù)執(zhí)行某段算法的問(wèn)題,這是程序設(shè)計(jì)中最能發(fā)揮計(jì)算機(jī)特長(zhǎng)的程序結(jié)構(gòu)。三種結(jié)構(gòu)并不彼此孤立,在循環(huán)結(jié)構(gòu)中可以有選擇、順序結(jié)構(gòu),在選擇結(jié)構(gòu)中也可以有循環(huán)、順序結(jié)構(gòu),其實(shí)不管哪種結(jié)構(gòu),均可廣義地把它們看成一條語(yǔ)句。

實(shí)際編程過(guò)程中常將這三種結(jié)構(gòu)相互結(jié)合以實(shí)現(xiàn)各種算法,設(shè)計(jì)出相應(yīng)程序,但是如果編程的問(wèn)題較大,編寫(xiě)出的程序往往很長(zhǎng),

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論