第5章函数与巨集解读.docx
- 文档编号:29699567
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:12
- 大小:18.76KB
第5章函数与巨集解读.docx
《第5章函数与巨集解读.docx》由会员分享,可在线阅读,更多相关《第5章函数与巨集解读.docx(12页珍藏版)》请在冰豆网上搜索。
第5章函数与巨集解读
第5章:
函數與巨集
1.請說明什麼是由上而下分析法?
A.模組化是一種解決問題的方法,把一件大型工作切割成無數的小工作,切割工作屬於一種結構化分析的範疇,我們最常使用的是「由上而下設計方法」(Top-downDesign),其主要是使用程序為單位來切割工作,也就是所謂的「程序式程式設計」(ProceduralDesign)。
由上而下的設計方法是在面對問題時,先考慮將整個解決問題的方法分解成數個大「模組」(Modules),然後針對每一個大模組,一一分割成數個小模組,如此一直細分,最後等細分小問題的小模組完成後,再將它們組合起來,一層層的向上爬,完成整個軟體系統或應用程式的設計。
例如:
玩拼圖遊戲一定會先將整個拼圖粗分為數個區域,等每一個區域都拼好後,整張拼圖也就完成了。
由上而下設計方法在處理問題的過程中,應該注意幾個事項,如下所示:
☐獨立性:
每一個分割模組間的關聯性愈少,處理起來就愈快。
所謂獨立性,是指當處理某一個子問題時,無需考慮其他子問題。
換一句話說,獨立性是將每一個問題都定義成一件簡單且明確的問題。
☐結合問題:
小心控制子問題間的結合方法,而且要注意結合這些子問題的邏輯順序,避免語焉不詳的結果。
☐子問題間的溝通:
雖然獨立性可以減少問題間的關聯性,但是並無法避免掉全部的溝通。
因此問題間如何溝通的問題(即函數的參數傳遞)也是十分重要的考量。
由上而下設計方法是結構化程式設計一種相當實用的方法,它並不是一些嚴格規則,而是讓我們能夠循序漸進的了解問題,進而發展出解決問題的方法。
2.請說明函數正式參數(FormalParameters)和實際參數(ActualParameters)的差異?
如果函數沒有指定傳回型態,預設傳回型態為__________。
A.函數定義的參數稱為「正式參數」(FormalParameters)或「假參數」(DummyParameters),參數列的正式參數是識別字,其角色如同變數,需要指定資料型態,並且可以在函數的程式碼區塊中使用,如果參數不只一個,請使用「,」符號分隔。
呼叫函數的參數稱為「實際參數」(ActualParameters),參數可以是常數值、變數或運算式,其運算結果的值需要和正式參數宣告的資料型態相同(編譯程式會強迫型態轉換成相同資料型態),函數的每一個正式參數都需要對應一個相同資料型態的實際參數。
int
3.請說明什麼是函數的傳值或傳址參數呼叫?
C語言如何執行函數的傳址呼叫?
A.C語言的函數參數共有兩種不同的參數傳遞方式,如下表所示:
傳遞方式
說明
傳值呼叫(CallbyValue)
將變數值傳入函數,函數另外需要配置記憶體儲存參數值,所以並不會變更呼叫變數的值
傳址呼叫(CallbyReference)
將變數實際儲存的記憶體位址傳入,所以在函數變更參數值,也會同時變動原呼叫的變數值
C語言並沒有提供內建的傳址呼叫,而是使用指標變數傳遞參數,換句話說,C語言的傳址呼叫就是傳遞指標變數。
4.請舉例說明C語言變數範圍的區域變數和全域變數範圍?
A.C語言的有效範圍影響變數值的存取,C語言的變數依照有效範圍可以分為兩種,如下所示:
☐區域變數(LocalVariables):
程式區塊範圍的變數是一種區域變數,例如:
函數宣告的變數或參數,變數只能在宣告的函數中使用,在函數外的程式碼並無法存取此變數。
☐全域變數(GlobalVariables):
程式檔案範圍的變數是一種全域變數,例如:
在函數外宣告的變數,在整個程式檔案都可以存取此變數,如果全域變數沒有指定初值,其預設值是0。
5.請說明什麼是儲存類型(StorageClass)?
C語言擁有哪兩種儲存類型?
A.在C語言的變數分成兩種「儲存類型」(StorageClass),這是變數配置記憶體的方式,也就是變數的壽命(Lifetime)屬性,除了自動變數,另一種就是靜態變數。
6.請說明C語言auto、static和register關鍵字宣告變數的差異?
A.在程式區塊範圍宣告的變數也稱為「自動變數」(AutoVariables),自動變數是使用堆疊配置記憶體空間(堆疊是一種先進後出的資料結構),自動變數是直到程式執行到程式區塊或函數後才配置變數的記憶體空間,當離開程式區塊就釋放變數的記憶體空間。
「靜態變數」(StaticVariables)是一種在函數或程式檔案宣告的永久變數,在其它函數或程式檔案並無法存取這些靜態變數。
「暫存器變數」(RegisterVariables)是針對程式中存取十分頻繁的變數,可以直接將變數置於CPU的暫存器,以便加速程式的執行,通常是使用在迴圈的計數器變數。
7.請寫出下列3個函數的原型宣告,如下所示:
voidtest1(intx,inty,intz){
printf(“x=%d\n”,x);
printf(“y=%d\n”,y);
printf(“z=%d\n”,z);
}
voidtest2(floatx,inty,charc){
printf(“x=%fy=%d\n”,x,y);
printf(“c=%c\n”,c);
}
floattest3(floatx){
return(float)(x*3.1415926);
}
A.三個函數的原型宣告,如下所示:
voidtest1(int,int,int);
voidtest2(float,int,char);
floattest3(float);
8.請設計printStars()函數傳入顯示幾列的參數,即可顯示星號符號表示的三角形圖形,如下圖所示:
*
**
***
****
*****
******
*******
A.顯示星號符號表示的三角形圖形,如下所示:
#include
main(){
inti,j,k,t;
t=1;
for(i=7;i>=1;i--){
for(j=1;j<=i;j++){
if(j==i){
for(k=1;k<=t;k++)
printf("*");
}
elseprintf("");
}
t+=1;
printf("\n");
}
getchar();
}
9.請寫出下列C程式的執行結果,如下所示:
#include
intmain(void){
inta=2,b=2;
printf(“%d%d\n”,a,b);{
inta=10;
printf(”%d%d\n”,a,b);
}
printf(“%d%d\n”,a,b);
}
A.下列C程式的執行結果,如下所示:
#include
intmain(void){
inta=2,b=2;
printf(“%d%d\n”,a,b);{
inta=10;
printf(”%d%d\n”,a,b);
}
printf(“%d%d\n”,a,b);
}
22
102
22
10.費式數列(Fibonacci)是第一個和第二個數字為1,F0=F1=1,其它是前兩個數字的合Fn=Fn-1+Fn-2,n>=2,請設計fibonacci()函數顯示費式數列,參數是顯示數字的個數。
A.fibonacci()函數如下所示:
#include
intcount=0;
intfibonacci(intnum){
intt1,t2;
if(num<=1){
if(count==num){
count++;
printf("F%d=%d",num,1);
}
return1;
}
t1=fibonacci(num-2);
t2=fibonacci(num-1);
if(count==num){
count++;
printf("F%d=%d",num,t1+t2);
}
returnt1+t2;
}
intmain(void){
fibonacci(5);
printf("\n");
system("PAUSE");
return0;
}
F0=1F1=1F2=2F3=3F4=5F5=8
請按任意鍵繼續...
11.請寫出下列函數showMeMoney(5)的執行結果,如下所示:
voidshowMeMoney(intlevel){
if(level==0)printf("$");
else{
printf("<");
showMeMoney(level-1);
printf(">");
}
}
A.showMeMoney(5)函數的執行結果,如下所示:
#include
voidshowMeMoney(intlevel){
if(level==0)printf("$");
else{
printf("<");
showMeMoney(level-1);
printf(">");
}
}
intmain(void){
showMeMoney(5);
printf("\n");
system("PAUSE");
return0;
}
<<<<<$>>>>>
請按任意鍵繼續...
12.請設計遞迴函數計算Xn的值,例如:
57、85等。
A.遞迴函數如下所示:
#include
floatXpower(intx,intn){
if(n==0)return1.0f;
elsereturnx*Xpower(x,n-1);
}
intmain(void){
printf("5^7=%f\n",Xpower(5,7));
printf("8^5=%f\n",Xpower(8,5));
system("PAUSE");
return0;
}
5^7=78125.000000
8^5=32768.000000
請按任意鍵繼續...
13.請寫遞迴函數sum(int),計算1到參數值的和,例如:
sum(5),就計算5+4+3+2+1。
A.遞迴函數sum(int)如下所示:
#include
intsum(intn){
if(n==1)returnn;
elsereturnn+sum(n-1);
}
intmain(void){
printf("sum(5)=%d\n",sum(5));
system("PAUSE");
return0;
}
sum(5)=15
請按任意鍵繼續...
14.現在有一個遞迴版本的最大公因數(GreaterCommonDivisor),如下所示:
intgcd(inta,intb){
intc;
if((c=a%b)==0)returnb;
elsereturngcd(b,c);
}
請寫一個主程式測試上述遞迴函數,並且試著改寫成迴圈版本的gcd()函數。
A.遞迴版本最大公因數,如下所示:
#include
intgcd(inta,intb){
intc;
if((c=a%b)==0)returnb;
elsereturngcd(b,c);
}
intmain(void){
printf("10,15的最大公因數=%d\n",gcd(10,15));
system("PAUSE");
return0;
}
10,15的最大公因數=5
請按任意鍵繼續...
迴圈版本的gcd()函數,如下所示:
intgcd(inta,intb){
intc;
for(;;){
if((c=a%b)==0)returnb;
else{
a=b;
b=c;
}
}
}
15.請使用巨集定義MAX(a,b)和MIN(a,b)函數,可以分別取得2個參數的最大和最小值(提示:
使用C語言的條件運算子)。
A.巨集定義MAX(a,b)函數,如下所示:
#include
#defineMAX(a,b)(a>=b)?
a:
b
intmain(void){
printf("10,15的最大值=%d\n",MAX(10,15));
system("PAUSE");
return0;
}
16.請使用巨集定義平方和三次方的函數SQUARE(a)和CUBE(a)。
A.巨集定義函數SQUARE(a)和CUBE(a),如下所示:
#include
#defineSQUARE(a)a*a
#defineCUBE(a)a*a*a
intmain(void){
printf("10的平方=%d\n",SQUARE(10));
printf("10的三次方=%d\n",CUBE(10));
system("PAUSE");
return0;
}
17.請舉例說明什麼是C語言的模組化程式設計?
A.C語言的模組化程式設計(ModularProgramming)是建立相關資料和函數集合的模組,模組可以分成兩個部分:
介面與實作,如下所示:
☐模組介面(ModuleInterface):
模組介面定義模組函數和使用的資料,即定義讓使用此模組的程式可以呼叫的函數和存取的變數資料,通常C語言是使用標頭檔.h來定義模組介面。
☐模組實作(ModuleImplementations):
模組的實作部分是模組函數和資料的實際程式碼,程式設計者需要定義哪些函數屬於公開介面,哪些只能在模組程式檔使用。
C語言的程式檔案.c可以實作模組的程式碼,以extern和static關鍵字來區分公開或內部使用的函數與變數,如下所示:
•在標頭檔宣告成extern的變數和函數:
可供其他程式使用的外部函數和變數。
•在模組程式檔宣告成static的變數和函數:
只能在模組程式檔中使用。
18.請執行附錄C的程式範例來測試模組化程式設計的執行結果。
A.請自行參閱附錄C的程式範例。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 巨集 解读
![提示](https://static.bdocx.com/images/bang_tan.gif)