版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、資工三甲 計算機程式設計Textbook: C/C+ 程式設計範例教本 課本範例檔、課本投影片、課本習題解答 (pdf) 、課本勘誤 表 (pdf)課本提供之 DEV-C+ 用法課本提供之 C 語言標準函式庫解說Primary Programming Paradigms (程式設計模式簡介 ) 基本結構化程式設計簡介關於流程圖 (flowchart)Pseudo Code ExampleDev C+ IDE download Dev C+ 用法C+ Operator Precedence (優先順序 ; 優先權 ) andAssociativity ( 結合性 )Escape Sequence
2、作業繳交練習Additional Notes:Source Program (原始程式 ) 也就是你所寫的應用程式 (application) 的單一統稱。一個 Source Program 可能含有很多 (但至少一個 ) Source Files (原始程式檔 )所謂 Source File 就是一個 xxx.c 或 xxx.cpp ( 若是 Java 則 為 xxx.java) 的原始程式檔, Source File 中的程式碼被稱為 source codes (原始程式碼 ; 源碼 )。一個 Source File 也可被稱作 translation unit ( 翻譯單元 ) 或 co
3、mpilation unit ( 編譯單元 )。也就是說, Source File 是編譯 器 (C/C+ compiler 或 Java compiler) 可處理的最小編譯單 元。如何將 C 的原始程式檔編譯成組合語言程式碼 (assembly codes) ?請在 MS-DOS 模式下,鍵入 c:dev-cppbingcc.exe -S xxx.c 之後,就會產生 xxx.s 的組合語言程式檔。請注意路徑的問題,可以的話,適當的在任何檔名之前,加 入完整路徑。否則會產生無法找到檔案的錯誤。你可以用記事本來打開此一組合語言程式檔,觀察由編譯器 所生的組合語言程式是長怎樣。若你要組譯一個組合
4、語言程式檔,則也可利用 gcc.exe 來幫 你組譯, 請在 MS-DOS 模式下, 鍵入 c:dev-cppbingcc.exe -o myexe xxx.s 之後,就會產生 myexe.exe 的執行檔 。選項 -o myexe 是用來指定要產生的執行檔的檔名用的。雖說 gcc 是一個編譯器, 但其實它是一個集各種系統程式於 一身的程式。 它含有 preprocessor、compiler 、assembler、linker 等功能,但 compiler 還是它的主要角色。在 C 中, 何謂一個識別字的壽命 (lifetime) ?何謂儲存空間類別 (storage class) ?Ext
5、ernal linkageInternal linkageNo linkage 識別字的有效範圍與其可視性 (Scope and Visibility)Lifetime 與 Visibility 的總結C/C+ 語言的所有前置處理指令 (Preprocessor Directives) #define 前置處理指令用法EOF (end-of-file)標記:在C語言中,EOF是一個標記用以 代表一個檔案結束的情況,它是一個整數常數值,用前置處 理指令 #define EOF (-1) 來定義,且大部份編譯系統上 EOF 即代表 -1。 通常 EOF 被用在 I/O 系統函式呼叫上面,例 如檔案
6、讀取與鍵盤輸入上。當鍵盤讀取上產生錯誤、或檔案 讀取讀到了檔尾時,就會回傳 EOF 值。不過,若是用在鍵 盤輸入上,有另外一種情況也會回傳 EOF 值,即從鍵盤上 按下 Ctrl-z 時 (DOS 作業系統 )、或者是從鍵盤上按下Ctrl-z 時 (UNIX 作業系統 )。三維陣列範例遞迴函式 (recursive function) 解說 ( 階層 : 以課本程式範例 ch7-5-2.c 為例) | (河內塔 : 以課本程式範例 ch7-5-3.c 為例) | ( 以費伯納西數列 (Fibonacci Numbers) 為例 ) 程式中任何需要條件運算式的地方(註 : 也就是需要其判斷結果為
7、真值或假值的地方 ),其可為單一關係運 算式,例如: (a >= 10) ,或者組合多個關係運算式, 例如: ( (a > 5) | (b < 20) ) 。所以,你可以利用邏輯運算子 | (也 就是OR)及&&(也就是 AND)來組合成一個邏輯運算式 ,進而形成了一個具多條件判斷的條件運 算式。它們最後的結果一定要為真或假 。另再次強 調,在標準 C中,並沒有所謂真 (true)與假(false) 的資料值,取而代之的是,以數值 0代表假值 ,且以非 0的數值代表真值 ; 例如,以下所列出的數值 若用以代表邏輯值的話,
8、 都會被看作真值 : 123 、 -100 、 999、 0.456 、 -9.123等。但若要主動地請執行中的程 式告訴你什麼是真值的話,它會告訴你,就是1。如何看待 x+ 與 +x ? 請先觀察下列原始程式檔 : (+ 與 - 可應用在整數、浮點數、或字元上 ) * 若使用在字 元上則代表其 ASCIl 碼遞增或遞減 *執行結果 :基本上, x+ 與 +x 若是自成一個敘述,則 + 擺在變 數 x 的前面或後面皆無妨( 一樣是變數 x 內容加 1 ),例如 :x+; 、 +x; 。但是,若是 x+ 或 +x 只是一個大敘 述中的一小部份, 例如上圖中的 11、13、15 行,此時,+ 的位
9、置在前或在後會影響運算結果。 +的位置在前的, 代表本身的動作先看(先運算, 即自己加 1 ),然後再看 (或再運算 ) 整個大敘述 (亦即指被取值 ); 相反的,若是+ 的位置在後的,代表整個大敘述先看(即先運算,指被取值 ),然後再看 (即再運算 ) 本身的動作 (即自己加 1 )。所 以,X+代表x先被取值,然後才x本身加1; +X代表x 本身加 1 ,然後 x 才被取值。 當 x+ 或 +x 在其所處的 敘述中無關取不取值時,則 + 在前或在後皆無妨。 舉例來說,在上圖第 11 行中,因為 C 語言中早已規定了 函式裡的參數傳遞順序為由右至左 ,故系統函式 printf() 中的第三個
10、參數 + +x 會先傳入給 printf() ,然後第二個參 數x再傳入給 printf(),最後才是字串"d, %dn"傳 給printf() o但是因為第三個參數+x中,其+是 放在變數 x 的前面,因此在考慮整體大敘述的運算意義之 前,變數 x 本身要先運算 (即本身加 1),也就是說, 此刻 x 已變為11 了,並把11傳入給函式printf() o再來,緊接著 第 2 個參數準備要傳給系統函式 printf() 了,因為之前第 3 個參數在傳入 printf() 之前, x 已被加 1 ,故這時準備將第 2 個參數傳入時, 是傳入 11 給 printf() 。所
11、以, 最後印出來 的結果是 11, 11。同樣地,在上圖第 13 行中,系統函式 printf() 中的第三個 參數y會先傳入給 printf(),然後第二個參數+y再 傳入給printf(),最後才是"d, %dn"傳給 printf()。 第 三個參數傳入時,y為10。接著,第2個參數+y 傳入時,因為 +是放在變數 y 的前面,因此在考慮整 體大敘述的運算意義之前, 變數 y 本身要先運算 (即本身加 1) ,也就是說,此刻 y 已變為 11 了,並把 11 傳入給函式 printf() 。最後,才是第 3 個參數要傳給系統函式 printf() 。 所以,最後印出來
12、的結果是11, 10。再來,在上圖第 15 行 z = (+a) + (b+); 中,整個敘述的 意義為將 什+a) + (b+)的結果指定給變數z,但是,因為(+a) 中的 +放在變數 a 的前面,所以,在考慮整體敘 述運算之前,變數 a 本身會先加 1。至於 (b+) 的部份, 由於 (b+) 中的 +放在變數 b 的後面,所以,在整體 敘述運算之後,變數 b 本身才會加 1 。綜合上述,所以變 數 z 的值為 21 + 30 = 51 。最後要注意的是, 在一個指定運算式 (assignment expression) 中, +與 -運算子最好是只出現在等號右邊,如上 圖第 15 行所示
13、。若出現在等號左邊, 則會顯得毫無意義(等 號 "=" 為指定運算子,其左方運算式結果一定要是左值 "Lvalue") 。例如 +x = 100; ,這裡的變數 x 將會永遠被指 定成 100,即使 x 本身是先被加 1,但最後 x 還是被指定 成 100。此外, x+ = 100; 則為錯誤寫法。總而言之,應 避免在等號的左邊出現 "+" 與 "-" 。何謂左值 (left value; location value; L-value) 與右值 (right value; R-value) ?一個運算式 (exp
14、ression) 是由一些連續的運算子 (operator) 與運算元 (operand) 所組成,並形成一個計算後的結果。一 個指定運算式 (assignment expression) 有下列的格式 : e1 = e2,其中el和e2是運算式。指定運算子"等號"的右邊運算元 e2 可以是任何的運算式。 但是,左邊的運算元 e1 則 必需是 Lvalue 運算式,也就是說,它必需是一個可參考到 某一個物件個體的運算式 (亦即可參考到一個用以儲存資料 的記憶體位址 )。這裡的 "L" 代表 "left" ,也就是指 "指定運
15、 算子的左邊 "。 例: int n;宣告了一個型態為 int 的物件個體 (即變數 )。若:n = 3;其中 n 為一個運算式 (即整個指定運算式的一個子運算式 ) 並參考到了一個物件個體。 在這裡運算式 n 為一個 Lvalue 。另一方面,若 :3 = n; 這會產生一個編譯錯誤,因為它會試著去改變一個整數常數 (這不合常理 !)。雖然指定運算子的左邊運算元3 是個運算式,但是它並不是一個左值( 它無法代表一個記憶體位置 ),事實上它是一個右值(Rvalue) 。簡單地說,右值是一個非左值的運算式,它並不會參考到任何一個物件個體(記憶體位置),它只是單純代表一個資料值。指定運算
16、子並非唯一需要 Lvalue 的運算子,單元運算子 (unary operator) & ( 稱作 address-of 運算子 ) 也是需要 一個左值來做為其唯一的運算元, 亦即,唯有當 n 是 Lvalue 時, &n 才成為正確的寫法,而且其運算結果也是一個 Lvalue 。因此,一個運算式,例如&3 ,這是一個錯誤的寫法,因為常數 3 並沒有參考到任何一個物件個體 (記憶 體位置 ),故它是無法被用來定址的。還有,二元運算子 (binary operator) "+" 的運算結果則會產生一個Rvalue。 故 :m +
17、 1 = n;是一個錯誤寫法,運算子 "+" 擁有比運算子 "=" 還高的優 先順序(precedence),因此這個運算式相當於: (m + 1) = n;這也是個錯誤的寫法,因為 (m + 1) 的結果是一個 Rvalue 。 另一方面, 一個運算子也有可能接受 Rvalue 做為其運算元,而且產生一個 Lvalue 的運算結果。 例如單元運算子 是如此 浮點數 (floating-point; 即具有小數的數值 ) 使用上的一些注 意事項 :浮點數根據 IEEE 754 的標準,具有 3 種儲存格式 : float precision 格式 (亦稱
18、 single precision; 單精準度 ; 即 C 中的 float 資料型態 ): 利用 32 位元來儲存浮點數。 double precision 格式 ( 倍精準度 ; 即 C 中的 double 資料 型態 ): 利用 64 位元來儲存浮點數。double-extended precision 格式 (延伸倍精準度 ; 即 C 中的 long double 資料型態 ): 利用至少 80 位元來儲存浮點數。 下 圖為 float precision 的儲存格式 (32 bits): 其中, bit 31 為符 號位元 (sign bit) ,0代表正號,1代表負號。 bit 2
19、3 到 bit 30 為指數欄位 (exponent field) ,總共 8 個位元。這個欄位 使用 excess-127 碼來儲存以 2 為底的指數,也就是說, 先將真正的指數再加上 127 之後,才會存入此欄位中。例 如,若指數為 0,則將 0+127 = 127 (也就是二進位的 01111111) 存入此欄位中。下圖中列出了一些原始指數值經 過轉換變成了 excess-127 碼的例子。bit 0 到 bit 22 為尾數欄位 (mantissa field; 亦稱為significand field; 有效數欄位、或 fraction field; 小數欄位 ),總共 23 個位元。資料存入這個欄位之前,需經過正規化的 運算。舉例來說, 將十進位浮點數 +2.25 存入 float precision 的浮點數格式時, 會先將 +2.25 轉換成二進制的浮點數表示 法,變成 +10.01 (見下圖 )。下圖列舉出一些二進制小數 點之下,每一位位元所代表的十進位值之轉換 : 然後將此表 示法 +10.01 予以正規化 (normalozation) 使變成小數點 左方只有且必需有一個位元值 1,例如,變成了 +1.001x 21。此時,因為此數值為正數,所以sign bit 為 1。然後,將 1.001中小數點與其左方的位元值 1 去除之後, 剩下的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 麦肯锡 -流动的劳动力:美国未来就业所需技能与发展路径 Workforce in motion Skills and pathways to future jobs in the United States
- 2026年校招:中国兵器工业试题及答案
- 传播试题及答案
- 2026山东事业单位财会岗2026面试易错题集
- 红色商务风行稳致远企业宣传介绍模板
- 2026云栖大会资料-「Agent 工程化」方向-企业级智能体构建和治理平台 AgentCore 发布 全生命周期赋能智能体规模化落地
- GB T 1 1 2020 标准化工作导则第 1 部分标准化文件的结构和起草规则 2025 宣贯版
- 三献工作方案
- 人工智能+开放体系智能仓储物流自动化研究报告
- 影视动画实训室建设方案
- 2026年全国法律硕士(法学)联考真题及答案
- 2026年湖南水利水电职业技术学院单招职业技能考试题库附答案
- SEMI F63-24 中文版 半导体工艺用超纯水标准指南(2024版)
- 2026-2027学年浙教版数学九上 第3章 圆的基本性质 单元综合知识梳理卷
- 新教科版三上科学学科教学计划-2026秋
- 重症营养支持中国指南(2026版)
- 2026年三力测试考试题库及答案
- 中考英语-阅读理解之推断题专题讲义
- 公路水运试验检测师《水运结构与地基》考试真题(2026年新版)
- 医共体信息中心工作制度
- 2025年高级育婴师实操考试试题及答案
评论
0/150
提交评论