资工三甲 计算机程式设计.docx
- 文档编号:28403140
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:8
- 大小:20.65KB
资工三甲 计算机程式设计.docx
《资工三甲 计算机程式设计.docx》由会员分享,可在线阅读,更多相关《资工三甲 计算机程式设计.docx(8页珍藏版)》请在冰豆网上搜索。
资工三甲计算机程式设计
資工三甲計算機程式設計
---------------------------------------------------------------------------------------------------------------------------------------------------
Textbook:
C/C++程式設計範例教本
課本範例檔、課本投影片、課本習題解答(pdf)、課本勘誤表(pdf)
課本提供之DEV-C++用法
課本提供之C語言標準函式庫解說
PrimaryProgrammingParadigms(程式設計模式簡介)
基本結構化程式設計簡介
關於流程圖(flowchart)
PseudoCodeExample
DevC++IDEdownloadDevC++用法
C++OperatorPrecedence(優先順序;優先權)andAssociativity(結合性)
EscapeSequence
作業繳交練習
--------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------
AdditionalNotes:
SourceProgram(原始程式)也就是你所寫的應用程式(application)的單一統稱。
一個SourceProgram可能含有很多(但至少一個)SourceFiles(原始程式檔)
所謂SourceFile就是一個xxx.c或xxx.cpp(若是Java則為xxx.java)的原始程式檔,SourceFile中的程式碼被稱為sourcecodes(原始程式碼;源碼)。
一個SourceFile也可被稱作translationunit(翻譯單元)或compilationunit(編譯單元)。
也就是說,SourceFile是編譯器(C/C++compiler或Javacompiler)可處理的最小編譯單元。
如何將C的原始程式檔編譯成組合語言程式碼(assemblycodes)?
請在MS-DOS模式下,鍵入「c:
\dev-cpp\bin\gcc.exe-Sxxx.c」之後,就會產生xxx.s的組合語言程式檔。
請注意路徑的問題,可以的話,適當的在任何檔名之前,加入完整路徑。
否則會產生無法找到檔案的錯誤。
你可以用記事本來打開此一組合語言程式檔,觀察由編譯器所生的組合語言程式是長怎樣。
若你要組譯一個組合語言程式檔,則也可利用gcc.exe來幫你組譯,請在MS-DOS模式下,鍵入「c:
\dev-cpp\bin\gcc.exe-omyexexxx.s」之後,就會產生myexe.exe的執行檔。
選項-omyexe是用來指定要產生的執行檔的檔名用的。
雖說gcc是一個編譯器,但其實它是一個集各種系統程式於一身的程式。
它含有preprocessor、compiler、assembler、linker等功能,但compiler還是它的主要角色。
在C中,
何謂一個識別字的壽命(lifetime)?
何謂儲存空間類別(storageclass)?
Externallinkage
Internallinkage
Nolinkage識別字的有效範圍與其可視性(ScopeandVisibility)
Lifetime與Visibility的總結
C/C++語言的所有前置處理指令(PreprocessorDirectives)
#define前置處理指令用法
EOF(end-of-file)標記:
在C語言中,EOF是一個標記用以代表一個檔案結束的情況,它是一個整數常數值,用前置處理指令#defineEOF(-1)來定義,且大部份編譯系統上EOF即代表-1。
通常EOF被用在I/O系統函式呼叫上面,例如檔案讀取與鍵盤輸入上。
當鍵盤讀取上產生錯誤、或檔案讀取讀到了檔尾時,就會回傳EOF值。
不過,若是用在鍵盤輸入上,有另外一種情況也會回傳EOF值,即從鍵盤上按下Ctrl-z時(DOS作業系統)、或者是從鍵盤上按下Ctrl-z時(UNIX作業系統)。
三維陣列範例
遞迴函式(recursivefunction)解說(階層:
以課本程式範例ch7-5-2.c為例)|(河內塔:
以課本程式範例ch7-5-3.c為例)|(以費伯納西數列(FibonacciNumbers)為例)
程式中任何需要「條件運算式」的地方(註:
也就是需要其判斷結果為「真值」或「假值」的地方),其可為單一關係運算式,例如:
(a>=10),或者組合多個關係運算式,例如:
((a>5)||(b<20))。
所以,你可以利用邏輯運算子「||(也就是OR)」及「&&(也就是AND)」來組合成一個「邏輯運算式」,進而形成了一個具多條件判斷的「條件運算式」。
它們最後的結果一定要為「真」或「假」。
另再次強調,在標準C中,並沒有所謂「真(true)」與「假(false)」的資料值,取而代之的是,以數值「0」代表「假值」,且以「非0」的數值代表「真值」;例如,以下所列出的數值若用以代表邏輯值的話,都會被看作「真值」:
「123」、「-100」、「999」、「0.456」、「-9.123」等。
但若要主動地請執行中的程式告訴你什麼是真值的話,它會告訴你,就是「1」。
如何看待「x++」與「++x」?
請先觀察下列原始程式檔:
(++與--可應用在整數、浮點數、或字元上)*若使用在字元上則代表其ASCIl碼遞增或遞減*
執行結果:
基本上,x++與++x若是自成一個敘述,則「++」擺在變數x的前面或後面皆無妨(一樣是變數x內容加1),例如:
「x++;」、「++x;」。
但是,若是x++或++x只是一個大敘述中的一小部份,例如上圖中的11、13、15行,此時,「++」的位置在前或在後會影響運算結果。
「++」的位置在前的,代表本身的動作先看(先運算,即自己加1),然後再看(或再運算)整個大敘述(亦即指「被取值」);相反的,若是「++」的位置在後的,代表整個大敘述先看(即先運算,指「被取值」),然後再看(即再運算)本身的動作(即自己加1)。
所以,x++代表x先被取值,然後才x本身加1;++x代表x本身加1,然後x才被取值。
當x++或++x在其所處的敘述中無關取不取值時,則++在前或在後皆無妨。
舉例來說,在上圖第11行中,因為C語言中早已規定了函式裡的參數傳遞順序為「由右至左」,故系統函式printf()中的第三個參數「++x」會先傳入給printf(),然後第二個參數「x」再傳入給printf(),最後才是字串「"%d,%d\n"」傳給printf()。
但是因為第三個參數「++x」中,其「++」是放在變數x的前面,因此在考慮整體大敘述的運算意義之前,變數x本身要先運算(即本身加1),也就是說,此刻x已變為11了,並把11傳入給函式printf()。
再來,緊接著第2個參數準備要傳給系統函式printf()了,因為之前第3個參數在傳入printf()之前,x已被加1,故這時準備將第2個參數傳入時,是傳入11給printf()。
所以,最後印出來的結果是「11,11」。
同樣地,在上圖第13行中,系統函式printf()中的第三個參數「y」會先傳入給printf(),然後第二個參數「++y」再傳入給printf(),最後才是「"%d,%d\n"」傳給printf()。
第三個參數傳入時,「y」為10。
接著,第2個參數「++y」傳入時,因為「++」是放在變數y的前面,因此在考慮整體大敘述的運算意義之前,變數y本身要先運算(即本身加1),也就是說,此刻y已變為11了,並把11傳入給函式printf()。
最後,才是第3個參數要傳給系統函式printf()。
所以,最後印出來的結果是「11,10」。
再來,在上圖第15行「z=(++a)+(b++);」中,整個敘述的意義為將(++a)+(b++)的結果指定給變數z,但是,因為(++a)中的「++」放在變數a的前面,所以,在考慮整體敘述運算之前,變數a本身會先加1。
至於(b++)的部份,由於(b++)中的「++」放在變數b的後面,所以,在整體敘述運算之後,變數b本身才會加1。
綜合上述,所以變數z的值為21+30=51。
最後要注意的是,在一個指定運算式(assignmentexpression)中,「++」與「--」運算子最好是只出現在等號右邊,如上圖第15行所示。
若出現在等號左邊,則會顯得毫無意義(等號"="為指定運算子,其左方運算式結果一定要是左值"Lvalue")。
例如「++x=100;」,這裡的變數x將會永遠被指定成100,即使x本身是先被加1,但最後x還是被指定成100。
此外,「x++=100;」則為錯誤寫法。
總而言之,應避免在等號的左邊出現"++"與"--"。
何謂「左值(leftvalue;locationvalue;L-value)」與「右值(rightvalue;R-value)」?
一個運算式(expression)是由一些連續的運算子(operator)與運算元(operand)所組成,並形成一個計算後的結果。
一個指定運算式(assignmentexpression)有下列的格式:
e1=e2,其中e1和e2是運算式。
指定運算子"等號"的右邊運算元e2可以是任何的運算式。
但是,左邊的運算元e1則必需是Lvalue運算式,也就是說,它必需是一個可參考到某一個物件個體的運算式(亦即可參考到一個用以儲存資料的記憶體位址)。
這裡的"L"代表"left",也就是指"指定運算子的左邊"。
例:
intn;
宣告了一個型態為int的物件個體(即變數)。
若:
n=3;
其中n為一個運算式(即整個指定運算式的一個子運算式)並參考到了一個物件個體。
在這裡運算式n為一個Lvalue。
另一方面,若:
3=n;
這會產生一個編譯錯誤,因為它會試著去改變一個整數常數(這不合常理!
)。
雖然指定運算子的左邊運算元3是個運算式,但是它並不是一個左值(它無法代表一個記憶體位置),事實上它是一個右值(Rvalue)。
簡單地說,右值是一個非左值的運算式,它並不會參考到任何一個物件個體(記憶體位置),它只是單純代表一個資料值。
指定運算子並非唯一需要Lvalue的運算子,單元運算子(unaryoperator)&(稱作address-of運算子)也是需要一個左值來做為其唯一的運算元,亦即,唯有當n是Lvalue時,&n才成為正確的寫法,而且其運算結果也是一個Lvalue。
因此,一個運算式,例如&3,這是一個錯誤的寫法,因為常數3並沒有參考到任何一個物件個體(記憶體位置),故它是無法被用來定址的。
還有,二元運算子(binaryoperator)"+"的運算結果則會產生一個Rvalue。
故:
m+1=n;
是一個錯誤寫法,運算子"+"擁有比運算子"="還高的優先順序(precedence),因此這個運算式相當於:
(m+1)=n;
這也是個錯誤的寫法,因為(m+1)的結果是一個Rvalue。
另一方面,一個運算子也有可能接受Rvalue做為其運算元,而且產生一個Lvalue的運算結果。
例如單元運算子"*"即是如此。
浮點數(floating-point;即具有小數的數值)使用上的一些注意事項:
浮點數根據IEEE754的標準,具有3種儲存格式:
floatprecision格式(亦稱singleprecision;單精準度;即C中的float資料型態):
利用32位元來儲存浮點數。
doubleprecision格式(倍精準度;即C中的double資料型態):
利用64位元來儲存浮點數。
double-extendedprecision格式(延伸倍精準度;即C中的longdouble資料型態):
利用至少80位元來儲存浮點數。
下圖為floatprecision的儲存格式(32bits):
其中,bit31為符號位元(signbit),「0」代表正號,「1」代表負號。
bit23到bit30為指數欄位(exponentfield),總共8個位元。
這個欄位使用「excess-127碼」來儲存以2為底的指數,也就是說,先將真正的指數再加上127之後,才會存入此欄位中。
例如,若指數為0,則將0+127=127(也就是二進位的01111111)存入此欄位中。
下圖中列出了一些原始指數值經過轉換變成了excess-127碼的例子。
bit0到bit22為尾數欄位(mantissafield;亦稱為significandfield;有效數欄位、或fractionfield;小數欄位),總共23個位元。
資料存入這個欄位之前,需經過正規化的運算。
舉例來說,將十進位浮點數+2.25存入floatprecision的浮點數格式時,會先將+2.25轉換成二進制的浮點數表示法,變成「+10.01」(見下圖)。
下圖列舉出一些二進制小數點之下,每一位位元所代表的十進位值之轉換:
然後將此表示法「+10.01」予以正規化(normalozation)使變成小數點左方只有且必需有一個位元值「1」,例如,變成了「+1.001x21」。
此時,因為此數值為正數,所以signbit為「1」。
然後,將「1.001」中小數點與其左方的位元值1去除之後,剩下的「001」就是mantissa欄位值。
最後,因為其為2的1次方,故以2為底的指數值為1,但因為要用excess-127碼來存入,故要先將1加上127(=128;即10000000),再將128(10000000)存入exponent欄位。
經由上述的運算之後,浮點數+2.25以floatprecision格式(單精準)來儲存時的32位元內容值即為:
01000000000100000000000000000000關於正規化的解說,請往下看:
其他的一些轉換成浮點數格式的例子,如下圖所示:
至於其他兩種浮點數格式的儲存方式,與上述floatprecision格式相似,但欄位長度不同,如下表所示:
(其中的bias(偏)即為要額外加到真正指數的一個數值)floating-pointformat
Signfield
Exponentfield
Fractionfield
BiasSinglePrecision
1[bit31]
8[bit30到bit23]
23[bit22到bit00]
127(excess-127碼)DoublePrecision
1[bit63]
11[bit62到bit52]
52[bit51到bit00]
1023(excess-1023碼)Double-extendedPrecision
1[bit79]
15[bit78到bit64]
64[bit63到bit00]
16383(excess-16383碼)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 资工三甲 计算机程式设计 计算机 程式 设计