C 程式設計教程第2章過程的組織和管理

2021-09-14 10:06:48 字數 3862 閱讀 1802

乙個大型的程式一般可以分成一系列「單一功能模組」的集合。在c++中,單一功能模組通常設計成乙個函式。因而c++程式可以設計成一系列函式的組合,這是面向過程程式設計的一般方法。

乙個完整的c++程式一般包含乙個主函式和若干個子函式,主函式可以呼叫子函式,子函式也可以呼叫其它的子函式。利用函式可以大大降低程式設計的工作量,使程式更加清晰可靠。很多編譯系統本身就帶有很多預定義的函式,並把它們以庫函式的形式提供給使用者,這大大方便了程式設計人員。

函式定義的一般形式如下:

型別識別符號函式名(形參列表)

型別識別符號為函式的返回型別,可以是整型、浮點型等c++的合法型別,也可以是無值型(void型)。

函式名是函式的標識,可以是乙個有效的c++識別符號。

形參列表是括在圓括號內的0個或多個以逗號分隔的形式引數。它定義了函式將從呼叫函式中接收幾個資料及它們的型別,所以稱為形式引數。所謂形式引數的含義是指僅當函式被呼叫時,系統才為其分配儲存空間。

與之相應,主調程式傳遞過來的引數稱之為實在引數。通常,形式引數和實在引數簡稱為形參和實參。

函式的返回值由返回語句return來實現。

例2.1.1

// filename:ex211.cpp

// 判斷乙個數是否素數

#include

char prime(unsigned int number);

int main()

char prime(unsigned int number)

return f;

}函式名過載就是多個函式使用同乙個函式名。

例2.1.2

// filename:ex212.cpp

// 判斷兩數較大者

#include

int max(int x,int y);

double max(double x,double y);

int main()

int max(int x,int y)

double max(double x,double y)

函式過載的好處是主調函式會根據引數自動選擇正確的子函式,這大大提高了程式的通用性和可讀性。

程式在執行過程中,每呼叫一次函式,就要在呼叫與返回過程中付出一定的時間和空間代價用於處理現場,通常是用堆疊進行保護,返回時退棧恢復現場。但當函式較小,又反覆使用時,處理現場的開銷會急劇增大。若把函式嵌入函式呼叫處,便可以大大提高執行速度。

這當然是以犧牲儲存空間作為代價的。內嵌函式在程式編譯時直接將**嵌入到呼叫處,這增加了**的長度,但執行速度大大加快。

例2.1.3

/// filename:ex213.cpp

// 判斷兩數較大者

#include

inline double max(double x,double y);

int main()

return 0;

}double max(double x,double y)

內嵌函式有如下限制:

(1) 內嵌函式中不能有迴圈結構或switch結構及goto語句;

(2) 內嵌函式中不能含有任何靜態資料及資料宣告。

由於有以上限制,使用起來不是太方便。因此,除非必要,一般盡量不使用內嵌函式。

乙個函式直接或間接呼叫自身,便構成了函式的遞迴呼叫。遞迴在程式設計中經常用到,它可以大大簡化程式的設計。

例2.1.4 遞迴計算n!的函式。

int ***ct(int n)

else

if(n==1) return 1;

else

return n****ct(n-1);

}遞迴過程不應無限制地進行下去,應當能在呼叫有限次以後,就到達遞迴呼叫的中點得到乙個確定值,然後進行回代。回代的過程是從乙個已知推出下乙個值的過程。任何有意義的遞迴總是由兩部分組成,遞迴形式與遞迴終止條件。

本例的演算法就是基於如下的遞迴數學模型:

例漢諾塔問題(tower of hanoi)。

// filename:hanio.cpp

// tower of hanoi

#include

int hanoi(int number,char a,char b,char c);

int main()

int hanoi(int number,char a,char b,char c)

return 0;

} c++語言的核心部分很小,其外殼卻十分豐富。這個外殼中提供豐富的庫函式。程式設計師使用庫函式無須再自行定義,只要注意以下三點便可:

(1) 了解函式的功能

(2) 了解函式的原型

(3) 庫函式按功能分為不同的庫,每個庫都有相應的標頭檔案,給出了該庫中各個函式的原型宣告等有關資訊。程式設計師使用庫函式之前只需在程式中使用#include指令嵌入相應的標頭檔案而不必再進行函式的原型說明。

//filename:ex215.cpp

#include

#include

int main()

庫函式是一些被驗證的、高效率的函式,進行程式設計時,應優先選用庫函式。visual c++提供了大量的庫函式和巨集,在程式中可以呼叫它們來執行各種各樣的任務。它們包含有低階及高階的i/o、串及檔案的操作、儲存分配、程序控制、資料轉換、數**算等等。

visual c++的庫函式和巨集包含在lib子目錄和include子目錄中。我們知道,呼叫函式前需要函式定義與函式宣告。所有visual c++庫例程的原型在乙個或多個庫檔案中宣告。

使用庫函式時,用#include命令包含其相應的標頭檔案就包含了其原型宣告。使用標頭檔案比直接寫宣告語句的乙個好處是可以保證其正確性。系統標頭檔案在include子目錄中,系統函式定義在lib子目錄中,連線時,系統將會根據原型到相應的庫檔案中連線相應的庫例程,一般使用者不必關心。

visual c++常用的庫函式有以下一些:

字元分類函式 ctype.h

轉換函式ctype.h

目錄管理函式dir.h

圖形函式graphics.h

輸入輸出函式iostream.h、io.h、stdio.h、conio.h

介面函式dos.h

串和記憶體操作函式 mem.h、string.h

數學函式math.h、complex.h、bcd.h、float.h、stdlib.h

記憶體分配函式alloc.h、dos.h

雜類函式stdlib.h、dos.h、locate.h

程序控制函式process.h、signal.h

文字視窗顯示函式 conio.h

時間、日期函式 time.h、dos.h

其它程式實體也稱程式物件,對應著程式中的一塊記憶體空間。每個程式實體都有乙個識別符號,用以儲存程式中用到的各種變數、標號、引數和函式等等。每個程式實體都有一定的作用域和生存期,這反映了它的儲存屬性。

每個程式實體在程式執行中都有從建立到被撤消的一段時間,這段時間就稱為該程式實體的生存期。在生存期內程式實體的識別符號與它的儲存區相關聯。因此,程式實體的生存期由系統為其分配的記憶體方式所決定。

c++為程式實體提供了四種記憶體分配方式:靜態分配(編譯器預分配)、棧分配(自動分配)、堆分配(動態分配)、唯讀分配。

(1) 靜態分配

系統可以為每個程式開闢乙個固定的靜態資料區。存於這區域中的程式實體在編譯時即被預分配儲存空間,並且在程式開始執行時就被建立,一直到程式結束才被撤消,故稱為永久儲存。靜態分配的特點是與程式共存亡,具有靜態生存期。

這種分配適合於那些在程式中用得不多,但要為多個函式共用的程式實體。

(2) 棧分配

棧是系統為程式開闢的活動儲存區,它是程式使用最頻繁的儲存區。乙個實體,一旦在乙個函式內部或乙個塊內部被宣告,系統便在棧中建立它們;該塊或函式執行結束,遂將其彈出撤消。這種程式實體具有區域性生存期,即它與所在的塊共存亡。

這種分配適合於那些在程式中使用頻繁的程式實體,隨建隨撤,節省空間。

《C語言程式設計》第2章作業

布置日期 2012 2 17截止日期 2012 2 23 一 單選題 每小題5分,共100分 1 1.關於c程式的構成描述是不正確的。a 乙個源程式至少且僅包含乙個main函式,也可包含乙個main函式和若干個其他函式。b 函式由函式首部和函式體兩部分組成,二者缺一不可。c 函式首部通常是函式的第1...

財管第2章和第7章推導

股權現金流量 股東的現金流入 股東的現金流出 現金股利 認購公司增發的新股投入 公司回購 收回的資本 淨利潤 增加的留存收益 認購公司增發的新股投入 公司回購 收回的資本 淨利潤 增加的留存收益 增加的股權資本 現金股利 股權資本淨增加 淨利潤 股東權益的增加 債務現金流量 債權人的現金流入 債權人...

第2部分C程式設計的初步知識

一 選擇題 1 vc 中,short int型別變數所佔位元組數是 b a 1b 2 c 3d 4 2 不合法的八進位制數是 b a 0 b 028 c 077 d 01 3 不合法的十六進製制數是 a a oxff b 0xabc c 0x11 d 0x19 4 若有定義 long k 則能使k得...