【课後评量】.docVIP

  • 1
  • 0
  • 约3.99千字
  • 约 5页
  • 2017-04-13 发布于天津
  • 举报
【课後评量】

第八章【課後評量】 一、問答題 1.何謂全域變數與區域變數?試簡述之。 解答:全域變數是宣告在程式區塊與函數之外,且在宣告指令以下的所有函數及程式區塊都可以使用到該變數。宣告在主函數或副函數中的變數稱之為「區域變數」(local variable),區域變數只限於函數之中存取,離開該函數之後就失去作用。 2.為何在主程式呼叫函數之前,必須先宣告函數原型? 解答:C的程式流程是由上而下的結構設計,而編譯器在主程式的部分並不認識函數,這時候就必須在程式尚未呼叫函數時,先宣告函數的原型,告訴編譯器有此函數的存在。 3.何謂形式參數(Formal Parameter)與實際參數(Actural Parameter)? 解答:形式參數(Formal Parameter)就是在函數定義標頭中所宣告的參數,或簡稱為參數。實際參數(Actural Parameter)則是實際呼叫函數時所提供的參數,或簡稱為引數。 4.請分別說明以下是函數指標的意義。 void (*ptr)(void); int (*ptr)(int); char* (*ptr)(char*); 解答: 第1行:ptr為函數指標,而此函數本身無傳回值與引數。 第2行:ptr為函數指標,本身傳回整數值,並接受整數引數 第3行:ptr為函數指標,本身傳回字元指標,並接受字元指標作為引數。 5.請問以下程式名稱lab1後方有幾個字串?試說明之。 lab1 this is a argument1 this,is.a.argument2 this is a argument3 解答:以上程式碼表示接在程式名稱lab1後方共有六個字串,所以argc的個數一共有7個。 6.以下是定義一個用來計算梯形面積的巨集函數,並且可傳遞上底、下底與高三個引數: #define RESULT(r1,r2,h) (r1+r2)*h/2.0 請問此函數是否為一正確的定義?試申述之。 解答:不是,當第傳遞 r1、r2和h變數都加上2時,由於運算子的優先順序問題(乘法高於加法),代入數值後,會造成與數學梯形面積計算的結果不符合。解決之道就是在巨集函數定義時,將函數運算式的變數都加上括號即可,如下所示: #define RESULT(r1,r2,h) ((((r1)+(r2))*(h))/2.0 7.我們知道在#include之後使用角括號,前置處理器將至預設的系統目錄中尋找指定的檔案。請問如果您將stdio.h寫成以下的形式,會有哪些不同? #include stdio.h 解答:使用雙引號來指定檔案,則前置處理器會先尋找目前程式檔案的工作目錄中是否有指定的檔案,如果找不到,再到系統目錄(Include目錄)中尋找,因此程式仍然可以執行,不過效率上會較差。 8.C中的函數可區分為哪兩種?試說明之。 解答:C的函數可區分為系統本身提供的標準函數及使用者自行定義的自訂函數。使用標準函數只要將所使用的相關函數表頭檔(header file)含括(include)進來即可。 9.下面這兩行程式碼有何不同? const float pi = 3.14159; #define PI 3.14159 解答:不同之處在於「取代」的差別,在這兩行程式碼中,前置處理器並不會理會第一行程式碼,pi只是一個變數名稱,然而前置處理器會將PI取代為3.14159。 10.請問以下程式碼的輸出結果為何?試說明原因。 #define MUL(a) a*a int i=5; printf(“%d”, MUL(++i)); 解答:輸出結果將會是42,而不是預期的25(5*5)。造成這樣的原因,在於C編譯器將MUL(++i)展開後,變成如下的格式: printf(%d, ++i*++i); 由於(++)運算子的優先權較高,輸出的結果將是6*7。類似這種巨集方式產生的問題,在除錯上是不容易發現的。 11.某位學生進行命令列引數的練習應用,但是程式編譯時出了問題,請幫忙找出問題的所在: 01 #include stdio.h 02 int main(int argc, char* argv[]) 03 { 04 int sum; 05 if (argc == 3) 06 sum = argv[1] + argv[2]; 07 printf(%d + %d = %d\n, argv[1], argv[2], sum); 08 return 0; 09 } 解答:由命令列引數所讀入的值為字串值,不能直接用來進行加法運算,您必須使用atoi()函數將之轉換為整數值。 12.試述下列二種將檔案引入的方式

文档评论(0)

1亿VIP精品文档

相关文档