C++語(yǔ)言基礎(chǔ)PPT幻燈片課件_第1頁(yè)
C++語(yǔ)言基礎(chǔ)PPT幻燈片課件_第2頁(yè)
C++語(yǔ)言基礎(chǔ)PPT幻燈片課件_第3頁(yè)
C++語(yǔ)言基礎(chǔ)PPT幻燈片課件_第4頁(yè)
C++語(yǔ)言基礎(chǔ)PPT幻燈片課件_第5頁(yè)
已閱讀5頁(yè),還剩491頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C 語(yǔ)言基礎(chǔ) 鹽城工學(xué)院惠為君 1 C 概述 C 的特點(diǎn)發(fā)展歷史和未來(lái) C C AT T Java SUN C MS 與其它語(yǔ)言比較 7點(diǎn) 面向?qū)ο蟮母拍?數(shù)據(jù)的封裝和隱藏 繼承 多態(tài)VC上機(jī)過(guò)程 2 C 的字符集 C 語(yǔ)言使用下列基本字符來(lái)構(gòu)成詞法單位 結(jié)束 3 第二章 數(shù)據(jù)類(lèi)型運(yùn)算符表達(dá)式 2 1VC 的數(shù)據(jù)類(lèi)型計(jì)算機(jī)所處理的數(shù)據(jù)以一定形式存放在內(nèi)存中 數(shù)據(jù)的存儲(chǔ)方式以及能夠進(jìn)行的合法運(yùn)算都與數(shù)據(jù)類(lèi)型直接相關(guān) C 的特點(diǎn)之一就是提供了豐富的數(shù)據(jù)類(lèi)型 以便處理各種不同的數(shù)據(jù) 數(shù)據(jù)類(lèi)型總是與運(yùn)算封裝在一起 本質(zhì)上是面向?qū)ο蟮?本章將簡(jiǎn)要介紹C 中的數(shù)據(jù)類(lèi)型及相關(guān)運(yùn)算 以及常量 變量 表達(dá)式 語(yǔ)句等 最后介紹簡(jiǎn)單的輸入輸出方法 4 2 1 1關(guān)鍵字 5 6 2 1 2標(biāo)識(shí)符 標(biāo)識(shí)符 Identifier ID 是程序員定義的 單詞 用來(lái)給變量 常量 數(shù)據(jù)類(lèi)型 函數(shù)等命名 合法標(biāo)識(shí)符由字母或下劃線開(kāi)始 由字母 數(shù)字 下劃線組成 其有效長(zhǎng)度為1 31個(gè)字符 長(zhǎng)度超過(guò)31個(gè)字符者只識(shí)別前31個(gè)字符 VC 標(biāo)識(shí)符長(zhǎng)度為1 247個(gè)字符 建議使用有一定含義的英文單詞或拼音序列作標(biāo)識(shí)符 以提高可讀性 另外盡量不用下劃線或雙下劃線打頭 以免與系統(tǒng)定義的關(guān)鍵字沖突 ok 7 標(biāo)識(shí)符 例 判斷下面哪些是合法的標(biāo)識(shí)符 MyFile Salary94 amount void 94Salary Salary94 amount f3 5 Num of Student 2 1 2結(jié)束 8 2 1 3標(biāo)點(diǎn)符號(hào) 標(biāo)點(diǎn)符號(hào)包括 等 標(biāo)點(diǎn)符號(hào)的作用 有一定的語(yǔ)法意義 如字符和字符串常量分別用 和 引起來(lái) 對(duì)語(yǔ)法符號(hào)起分隔作用 如 等 2 1 3結(jié)束 9 2 1 5C 的基本數(shù)據(jù)類(lèi)型 ok 10 C 對(duì)基本數(shù)據(jù)類(lèi)型也分別進(jìn)行了封裝 稱(chēng)為內(nèi)置數(shù)據(jù)類(lèi)型 內(nèi)置數(shù)據(jù)類(lèi)型不僅定義了數(shù)據(jù)類(lèi)型 還定義了常用操作 本節(jié)僅介紹各種基本數(shù)據(jù)類(lèi)型的定義 常用操作將在后面介紹 C 為強(qiáng)類(lèi)型語(yǔ)言 所有數(shù)據(jù)的使用嚴(yán)格遵從 先說(shuō)明后使用 的原則 以便編譯器進(jìn)行編譯 整型用來(lái)存放整數(shù) 整數(shù) 有符號(hào)的整數(shù) 在內(nèi)存中存放的是它的補(bǔ)碼 無(wú)符號(hào)數(shù)沒(méi)有符號(hào)位 存放的就是原碼 整數(shù)占用的字節(jié)數(shù)與機(jī)型有關(guān) 32位機(jī)上占用4個(gè)字節(jié) 11 字符型用來(lái)保存字符 存儲(chǔ)的是該字符的ASCII碼 占用一個(gè)字節(jié) 如大寫(xiě)字母A的ASCII碼為65 在對(duì)應(yīng)的一個(gè)字節(jié)中存放的就是65 字符型數(shù)據(jù)從本質(zhì)上說(shuō)也是整數(shù) 可以是任何一個(gè)8位二進(jìn)制整數(shù) 由于漢語(yǔ)系字符很多 用ASCII字符集處理遠(yuǎn)遠(yuǎn)不夠 因此又創(chuàng)立了雙字節(jié)字符集 DBCS double bytecharacterset 每個(gè)字符用兩個(gè)字節(jié)來(lái)編碼 為便于軟件的國(guó)際化 國(guó)際上一些知名公司聯(lián)合制定了新的寬字節(jié)字符標(biāo)準(zhǔn) Unicode 該標(biāo)準(zhǔn)中所有字符都是雙字節(jié)的 不同的語(yǔ)言和字符集分別占用其中一段代碼 這種用統(tǒng)一編碼處理西文 中文及其它語(yǔ)言符號(hào) 就是unicode碼 C 同時(shí)也支持寬字符類(lèi)型 wchar t 或稱(chēng)雙字節(jié)字符型 12 實(shí)型和雙精度型都用來(lái)存放實(shí)數(shù) 兩者表示的實(shí)數(shù)精度不同 實(shí)數(shù)在內(nèi)存中以規(guī)范化的浮點(diǎn)數(shù)存放 包括尾數(shù) 數(shù)符和階碼 數(shù)的精度取決于尾數(shù)的位數(shù) 32位機(jī)上實(shí)型為23位 因規(guī)范化數(shù)的數(shù)碼最高位恒為1 不必存儲(chǔ) 實(shí)際為24位 雙精度為52位 邏輯型也稱(chēng)布爾型 其取值為true 邏輯真 和false 邏輯假 存儲(chǔ)字節(jié)數(shù)在不同編譯系統(tǒng)中可能有所不同 VC 6 0中為1個(gè)字節(jié) 布爾型在運(yùn)算中可以和整型相互轉(zhuǎn)化 false對(duì)應(yīng)為0 true對(duì)應(yīng)為1或非0 無(wú)值型主要用來(lái)說(shuō)明函數(shù)的返回值類(lèi)型 將在函數(shù)一章中具體介紹 基本數(shù)據(jù)類(lèi)型還可以加上一些修飾詞 包括 signed 有符號(hào) unsigned 無(wú)符號(hào) long 長(zhǎng) short 短 參見(jiàn)下表 13 2 2結(jié)束 VC 中所有基本數(shù)據(jù)類(lèi)型 14 2 1 6常量 在程序的執(zhí)行過(guò)程中 值保持不變的量稱(chēng)為常量 字面常量 指程序中直接給出的量 常量的值在程序執(zhí)行過(guò)程中保持不變 并且存儲(chǔ)在程序區(qū) 而非數(shù)據(jù)區(qū) 根據(jù)取值和表示方法的不同 可分為以下幾種 15 a 整形常量 d 字符串常量 c 字符型常量 b 實(shí)型常量 ok 16 a整型常量 十進(jìn)制表示法 八進(jìn)制表示法 十六進(jìn)制表示法 其他表示法 即整數(shù) 可以有多種表示方法 ok 17 整數(shù)的十進(jìn)制表示方法 十進(jìn)制表示與我們熟悉的書(shū)寫(xiě)方式相同 如15 24 ok 18 整數(shù)的八進(jìn)制表示 八進(jìn)制表示以0開(kāi)始 由數(shù)字0 7組成 用來(lái)表示一個(gè)八進(jìn)制數(shù) 如 012 八進(jìn)制數(shù)12 即十進(jìn)制數(shù)10 0655 八進(jìn)制數(shù) 655 即十進(jìn)制數(shù) 429 ok 19 整數(shù)的十六進(jìn)制表示 十六進(jìn)制以0X 大小寫(xiě)均可 開(kāi)始 由數(shù)字0 9和字母A F 大小寫(xiě)均可 組成 用來(lái)表示一個(gè)十六進(jìn)制數(shù) 以下是一些常整數(shù)的例子 0 x32A 十六進(jìn)制數(shù)32A 即十進(jìn)制數(shù)810 0 x2fe0 十六進(jìn)制數(shù) 2fe0 即十進(jìn)制數(shù) 12256 ok 20 整數(shù)的其他表示方法 整型常量還可以表示長(zhǎng)整數(shù)和無(wú)符號(hào)整數(shù) 長(zhǎng)整型常數(shù)以L或l結(jié)尾 無(wú)符號(hào)常整數(shù)以U或u結(jié)尾 以UL或LU 大小寫(xiě)均可 結(jié)尾則可表示無(wú)符號(hào)長(zhǎng)整型常數(shù) 例如 84L 十進(jìn)制長(zhǎng)整數(shù) 84026U 八進(jìn)制表示的無(wú)符號(hào)整數(shù)260X32LU 十六進(jìn)制表示的無(wú)符號(hào)長(zhǎng)整型數(shù)32 整數(shù)結(jié)束 21 b實(shí)型常量 1 一般形式與平時(shí)書(shū)寫(xiě)形式相同 由數(shù)字0 9和小數(shù)點(diǎn)組成 例如 0 23 125 760 0 46 35 2 指數(shù)形式 也稱(chēng)為科學(xué)表示法 表示為尾數(shù)乘以10的次方形式 由尾數(shù) E或e和階數(shù)組成 指數(shù)形式要求在E或e前面的尾數(shù)部分必須有數(shù)字 后面的指數(shù)部分必須為整數(shù) 例 判斷下列表示是否合法 123E12 34e 2 E4 1 43E3 5 包含小數(shù)點(diǎn)和10的冪的數(shù)為實(shí)型常量 有兩種表示方法 實(shí)數(shù)結(jié)束 22 c字符型常量 字符常量是用單引號(hào)引起來(lái)的單個(gè)字符 在內(nèi)存中保存的是字符的ASCII碼值 在所有字符中 有些是可顯示字符 通常就用單引號(hào)引起來(lái)表示 a 字符a 字符 4 字符4 空格字符有些是特殊情況字符 如不可顯示的字符等 c 使用轉(zhuǎn)義序列表示方法 如 祥見(jiàn)表2 3 此處略 n 換行 字符 字符常結(jié)束 23 d 字符串常量 字符串常量與字符型常量的區(qū)別 字符串常量 a 占兩個(gè)字節(jié) 存放 a 和 0 值為0 x6100 字符型常量 a 占一個(gè)字節(jié) 存放 a 值為0 x61 2 3 2結(jié)束 用雙引號(hào)引起來(lái)的若干個(gè)字符稱(chēng)為字符串常量 例如 IamaChinese 123 a 24 2標(biāo)識(shí)符常量及常量說(shuō)明符const 用常量說(shuō)明符const給字面常量起個(gè)名字 標(biāo)識(shí)符 這個(gè)標(biāo)識(shí)符就稱(chēng)為標(biāo)識(shí)符常量 因?yàn)闃?biāo)識(shí)符常量的說(shuō)明和引用形式很像變量 所以也稱(chēng)常變量 例如 constfloatPI 3 14159 constintNumber of Student 100 常變量必須也只能在說(shuō)明時(shí)進(jìn)行初始化 常變量初始化之后 不允許再被賦值 常變量必須先說(shuō)明后使用 常變量存儲(chǔ)在數(shù)據(jù)區(qū) 并且可以按地址訪問(wèn) 編譯時(shí)系統(tǒng)對(duì)常變量進(jìn)行類(lèi)型檢查 C 建議使用常變量 而盡量不使用字面常量 2 3 3結(jié)束 25 2 1 7變量 1變量說(shuō)明 2變量賦初值 變量 在程序中是指可以改變值的量 變量必須用標(biāo)識(shí)符進(jìn)行標(biāo)識(shí) 稱(chēng)為變量名 變量有類(lèi)型之分 如整形變量 字符變量等 任何變量都必須先說(shuō)明后使用 一是便于編譯程序?yàn)樽兞糠峙淇臻g 二是便于編譯時(shí)進(jìn)行語(yǔ)法檢查 變量使用的第一步 是給變量賦初始值 ok 26 變量說(shuō)明 在C 中 變量說(shuō)明的一般格式為 存儲(chǔ)類(lèi)型 數(shù)據(jù)類(lèi)型變量名1 變量名2 變量名n 下面是變量說(shuō)明的幾個(gè)例子 inti j k 說(shuō)明三個(gè)整型變量i j kfloatx y z 說(shuō)明三個(gè)實(shí)型變量x y zcharc1 c2 說(shuō)明兩個(gè)字符型變量c1 c2doubledx 說(shuō)明一個(gè)雙精度型變量dx 變量說(shuō)明結(jié)束 27 變量賦初值 1 變量說(shuō)明時(shí)直接賦初值 例如 inta 3 b 4 c 5 floatx 3 0 2 用賦值語(yǔ)句賦初值 嚴(yán)格的說(shuō) 只有前者可稱(chēng)賦初值例如 floatx e x 3 5 e 2 71828 結(jié)束 給變量賦初值稱(chēng)為初始化 有兩種方法 28 2 2基本運(yùn)算符 對(duì)常量和變量進(jìn)行運(yùn)算是通過(guò)運(yùn)算符來(lái)實(shí)現(xiàn)的 常量和變量通過(guò)運(yùn)算符組成C 表達(dá)式 由表達(dá)式再組成C 語(yǔ)句 運(yùn)算符是完成對(duì)常量和變量進(jìn)行運(yùn)算的符號(hào) 把參與運(yùn)算的對(duì)象稱(chēng)為操作數(shù) 按照要求的操作數(shù)的個(gè)數(shù) 運(yùn)算符分為單目 一元 運(yùn)算符 雙目 二元 運(yùn)算符和三目 三元 運(yùn)算符 單目運(yùn)算符只對(duì)一個(gè)操作數(shù)運(yùn)算 如負(fù)號(hào)運(yùn)算符 等 雙目運(yùn)算符要求有兩個(gè)操作數(shù) 如乘號(hào)運(yùn)算符 等 三目運(yùn)算符要求有三個(gè)操作數(shù) 三元運(yùn)算符只有一個(gè) 29 1 算術(shù)運(yùn)算符 ok 30 運(yùn)算符重載 當(dāng)兩個(gè)操作數(shù)均為整數(shù)時(shí) 和 重載為整乘和整除 結(jié)果為整數(shù) 除法運(yùn)算后舍去小數(shù)取整 如 5 4 結(jié)果為1 整數(shù) 當(dāng)兩個(gè)操作數(shù)均為整數(shù) 定義為求余運(yùn)算 也稱(chēng)求模運(yùn)算 結(jié)果為兩個(gè)整數(shù)相除后的余數(shù) 如果兩個(gè)整數(shù)中有負(fù)數(shù) 則先用兩數(shù)絕對(duì)值求余 最后結(jié)果的符號(hào)與被除數(shù)相同 例如6 3 結(jié)果為06 7 結(jié)果為67 6 結(jié)果為1 31 C 中算術(shù)運(yùn)算應(yīng)注意數(shù)據(jù)溢出問(wèn)題 即運(yùn)算結(jié)果超出對(duì)應(yīng)數(shù)據(jù)類(lèi)型的表示范圍 編譯程序只會(huì)對(duì)除法運(yùn)算時(shí)除數(shù)為0這種情況提示出錯(cuò) 而特別容易溢出的整數(shù)的加 減和乘法運(yùn)算產(chǎn)生溢出的情況 系統(tǒng)不作為錯(cuò)誤處理 程序?qū)⒗^續(xù)執(zhí)行并產(chǎn)生錯(cuò)誤的計(jì)算結(jié)果 因此 程序設(shè)計(jì)者必須在程序中解決檢查并處理整數(shù)溢出問(wèn)題 只要有一個(gè)操作數(shù)是實(shí)數(shù) 兩個(gè)操作數(shù)均轉(zhuǎn)換為double型 和 重載為普通的乘和除 結(jié)果是實(shí)數(shù) 5 4 0 結(jié)果為1 25 實(shí)數(shù) 32 2 關(guān)系運(yùn)算符和邏輯運(yùn)算符 ok 關(guān)系運(yùn)算符都是二元運(yùn)算符 包括 大于 不小于 小于 不小于 等于 和 不等于 關(guān)系運(yùn)算符完成兩個(gè)操作數(shù)大小的比較 結(jié)果為邏輯值true 真 或false 假 每種可比較大小的數(shù)據(jù)類(lèi)型 都重載了關(guān)系運(yùn)算符 不同類(lèi)型 自動(dòng)轉(zhuǎn)換為同一類(lèi)型后 采用對(duì)應(yīng)關(guān)系運(yùn)算符進(jìn)行比較 在C 中這兩個(gè)邏輯值與整數(shù)之間有一個(gè)對(duì)應(yīng)關(guān)系 真對(duì)應(yīng)1 假對(duì)應(yīng)0 反過(guò)來(lái) 0對(duì)應(yīng)假 非0整數(shù)對(duì)應(yīng)真 所以關(guān)系運(yùn)算結(jié)果可以作為整數(shù)參與算術(shù)運(yùn)算 關(guān)系運(yùn)算 邏輯運(yùn)算及其他運(yùn)算 33 2 關(guān)系運(yùn)算符和邏輯運(yùn)算符 設(shè)有定義floata 3 2 intb 5 則 3 a b 結(jié)果是 根據(jù)右結(jié)合原則其運(yùn)算過(guò)程如下 a 5 b 3 2 3 F 即0 F即0 34 邏輯運(yùn)算符 35 邏輯運(yùn)算符用來(lái)進(jìn)行邏輯運(yùn)算 其操作數(shù)和運(yùn)算結(jié)果均為邏輯量 運(yùn)算結(jié)果同樣可以作為一個(gè)整數(shù)參與其他運(yùn)算 由于邏輯值和整數(shù)之間的對(duì)應(yīng)關(guān)系 也允許整型和字符型操作數(shù)進(jìn)行邏輯運(yùn)算 21 0 邏輯與 21與0 結(jié)果為假 021 0 邏輯或 21或0 結(jié)果為真 1 21 邏輯非 21的非 結(jié)果為假 0 邏輯運(yùn)算符 36 位運(yùn)算符 1 按位取反運(yùn)算符 2 左移運(yùn)算符 4 按位與運(yùn)算符 5 按位或運(yùn)算符 6 按位異或運(yùn)算符 ok c 語(yǔ)言提供字位運(yùn)算 它對(duì)操作數(shù)的各個(gè)位進(jìn)行操作 37 1 按位取反運(yùn)算符 將操作數(shù)的每個(gè)二進(jìn)制位取反 即1變?yōu)? 0變?yōu)? 例如 整數(shù)a的值為10011011 則 a的值為01100100 2 左移運(yùn)算符 運(yùn)算一般格式為 a n其中a為整數(shù) n為一個(gè)正整數(shù)常數(shù) 語(yǔ)義為將a的二進(jìn)制數(shù)依次向左移動(dòng)n個(gè)二進(jìn)制位 并在低位補(bǔ)0 左移n位相當(dāng)于乘以2的n次方 但移位運(yùn)算的速度比乘法快 3 右移運(yùn)算符 與左移運(yùn)算符類(lèi)同 將左操作數(shù)向右移動(dòng)右操作數(shù)指定的二進(jìn)制位數(shù) 忽略移位后的小數(shù)部分 并在高位補(bǔ)0 一個(gè)整數(shù)右移n位相當(dāng)于除以2的n次方 但比除法快 在VC 6 0中有符號(hào)數(shù)右移時(shí)高位補(bǔ)符號(hào)位 嚴(yán)格對(duì)應(yīng)除法 以上三種單目運(yùn)算不影響數(shù)據(jù)本身的值 而是只產(chǎn)生一個(gè)中間量 這個(gè)中間量被引用后即不再存在 38 4 按位與運(yùn)算符 將兩個(gè)操作數(shù)的對(duì)應(yīng)位逐一進(jìn)行按位邏輯與運(yùn)算 運(yùn)算規(guī)則為 對(duì)應(yīng)位均為1時(shí) 該位運(yùn)算結(jié)果為1 否則為0 例如 a01001101b00001111a b00001101該運(yùn)算可用來(lái)將整數(shù)的某些位置0 而保留所需要的位 上例保留了低四位 5 按位或運(yùn)算符 將兩個(gè)操作數(shù)的對(duì)應(yīng)位逐一進(jìn)行按位邏輯或運(yùn)算 運(yùn)算規(guī)則為 只要有一個(gè)數(shù)對(duì)應(yīng)位為1 該位運(yùn)算結(jié)果即為1 兩個(gè)數(shù)對(duì)應(yīng)位均為0 該位結(jié)果為0 例如 a01001101b00001111a b01001111該運(yùn)算符可用來(lái)將整數(shù)的某些位置1 上例高四位不變 低四位全1 39 6 按位異或運(yùn)算符 將兩個(gè)操作數(shù)的對(duì)應(yīng)位逐一進(jìn)行按位異或運(yùn)算 運(yùn)算規(guī)則為 當(dāng)對(duì)應(yīng)位的值不同時(shí) 該位運(yùn)算結(jié)果為1 否則為0 例如 a01001101b00001111a b01000010該運(yùn)算符可用來(lái)將一個(gè)整數(shù)的某些位取反 或?qū)⒄妥兞康闹抵? 將整型變量與自身按位異或 上例低四位取反 高四位不變 需要說(shuō)明的一點(diǎn)是 以上例子中的整數(shù)都只取了低8位一個(gè)字節(jié) 40 4 賦值運(yùn)算符 ok 將數(shù)據(jù)存放到相應(yīng)存儲(chǔ)單元中稱(chēng)為賦值 如果該單元中已有值 賦值操作以新值取代舊值 從某個(gè)存儲(chǔ)單元中取出數(shù)據(jù)使用 稱(chēng)為引用 引用不影響單元中的值 即一個(gè)量可以多次引用 常量只能引用 不能賦值 賦值通過(guò)賦值運(yùn)算符 來(lái)完成 其意義是將賦值號(hào)右邊的值送到左邊變量所對(duì)應(yīng)的單元中 賦值號(hào)不是等號(hào) 它具有方向性 41 C 將變量名代表的單元稱(chēng)為 左值 而將變量的值稱(chēng)為 右值 左值必須是內(nèi)存中一個(gè)可以訪問(wèn)且可以合法修改的對(duì)象 因此只能是變量名 而不能是常量或表達(dá)式 4 賦值運(yùn)算符 例如下面的賦值運(yùn)算是錯(cuò)誤的 3 1415926 pi 左值不能是常數(shù)x y z 左值不能是表達(dá)式constintN 30 N 40 左值不能是常變量 42 5 自增自減運(yùn)算 運(yùn)算分前置和后置兩種 前置是先增減后引用 即先對(duì)變量自加或自減 用新的值參與其他運(yùn)算 后置則是先引用后增減 即用變量原來(lái)的值參與其他運(yùn)算 然后再對(duì)變量進(jìn)行自加或自減 例如 inti 5 j 5 m n m i 后置 相當(dāng)于m i i i 1 結(jié)果 i的值為6 m的值為5 n j 前置 相當(dāng)于j j 1 n j 結(jié)果 j的值為6 n的值為6 意義 使變量當(dāng)前值加1或減1 再賦給該變量 要求 操作數(shù)只能是變量 不能是常量或表達(dá)式 ok 43 sizeof 運(yùn)算符 用于計(jì)算一個(gè)操作數(shù)類(lèi)型或一個(gè)變量的字節(jié)數(shù) 一般格式為 sizeof 數(shù)據(jù)類(lèi)型 或sizeof 變量名 例如 sizeof int 值為4sizeof float 值為4doublex sizeof x 值為8 結(jié)束 44 2 2 2表達(dá)式 1算術(shù)表達(dá)式 2關(guān)系表達(dá)式 3邏輯表達(dá)式和邏輯表達(dá)式求值的優(yōu)化 4賦值表達(dá)式與復(fù)合賦值表達(dá)式 5逗號(hào)表達(dá)式 ok 45 1 算術(shù)表達(dá)式 使用時(shí)注意 1 表達(dá)式中每個(gè)變量都有確定的值時(shí)才能進(jìn)行表達(dá)式求值 2 考慮到算術(shù)運(yùn)算溢出和精度問(wèn)題 應(yīng)避免 1 兩個(gè)很接近的數(shù)直接相減 2 除數(shù)是一個(gè)很小的數(shù) 3 整數(shù)的連續(xù)乘運(yùn)算 ok 由算術(shù)運(yùn)算符連接的表達(dá)式稱(chēng)為算術(shù)表達(dá)式 例如 a b 3 46 2 關(guān)系表達(dá)式 例如 a b c 等同于 a b c 先求a b的值 再將結(jié)果0或1與c比較大小 a b c d 等同于 a b c d 結(jié)果為0或1 y a b 計(jì)算a b的值0或1賦給y y的值為0或1 由關(guān)系運(yùn)算符連接的表達(dá)式 值為true或false ok 47 3 邏輯表達(dá)式和邏輯表達(dá)式求值的優(yōu)化 由邏輯運(yùn)算符連接的表達(dá)式稱(chēng)為邏輯表達(dá)式 邏輯表達(dá)式的值為true或false 這個(gè)值可對(duì)應(yīng)整數(shù)1或0參與其他運(yùn)算 ok 已知 inta 10 b 20 c 30 floatx 1 8 y 2 4 ay ay a b c t1 1 t2 0 t4 0 t3 0 t5 b t6 1 得整個(gè)表達(dá)式的值為 1 48 3 邏輯表達(dá)式和邏輯表達(dá)式求值的優(yōu)化 在求邏輯表達(dá)式值的過(guò)程中 一旦表達(dá)式的值能夠確定 就不再逐步進(jìn)行下面的運(yùn)算 稱(chēng)為 求值優(yōu)化 已知 inta 10 b 20 c 30 求 a b c 結(jié)果以及a b c的值 t1 1 整個(gè)表達(dá)式的值為1 可見(jiàn) 表達(dá)式c 已不需要計(jì)算所以 c不變?nèi)詾?0 編程人員在使用邏輯運(yùn)算時(shí)應(yīng)當(dāng)加以小心 優(yōu)化計(jì)算固然提高了運(yùn)算效率 但可能產(chǎn)生副作用 所謂副作用 就是出乎設(shè)計(jì)人員的意料 得到預(yù)想不到的結(jié)果 49 4 賦值表達(dá)式與復(fù)合賦值表達(dá)式 賦值表達(dá)式的格式為 變量 表達(dá)式例如 x 5 6 a b c d 1 在C 中 所有的雙目算術(shù)運(yùn)算符和位運(yùn)算符均可與賦值運(yùn)算符組合成一個(gè)單一運(yùn)算符 稱(chēng)為復(fù)合運(yùn)賦值算符 包括以下10個(gè) 復(fù)合賦值運(yùn)算符的要求與格式與賦值運(yùn)算符完全相同 表示為 變量復(fù)合賦值運(yùn)算符表達(dá)式它等同于變量 變量運(yùn)算符表達(dá)式例如 x 5等同于 x x 5 ok 50 逗號(hào)表達(dá)式 C 中 逗號(hào)既是分隔符 又是運(yùn)算符 用逗號(hào)連接起來(lái)的表達(dá)式稱(chēng)為逗號(hào)表達(dá)式 一般格式為 表達(dá)式1 表達(dá)式2 表達(dá)式n逗號(hào)表達(dá)式中的每一個(gè)表達(dá)式都會(huì)被運(yùn)算 整個(gè)逗號(hào)表達(dá)式的值為最后一個(gè)表達(dá)式的值 例如 a x 3 x 6 5 6 a 11x 9 2 5 2結(jié)束 51 2 2 3不同類(lèi)型數(shù)據(jù)的混合運(yùn)算和賦值時(shí)的類(lèi)型轉(zhuǎn)換 1不同類(lèi)型數(shù)據(jù)的混合運(yùn)算 2賦值類(lèi)型轉(zhuǎn)換 ok 運(yùn)算過(guò)程中 當(dāng)某個(gè)二元運(yùn)算符兩邊的操作數(shù)類(lèi)型不同但屬于類(lèi)型相容時(shí) 系統(tǒng)先將精度低的操作數(shù)變換到與另一操作數(shù)精度相同 而后再進(jìn)行運(yùn)算 所謂類(lèi)型相容 指的就是類(lèi)型不同但系統(tǒng)可以自動(dòng)進(jìn)行轉(zhuǎn)換 當(dāng)賦值號(hào)的左值和右值類(lèi)型不一致但屬于類(lèi)型相容時(shí) 由系統(tǒng)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換 52 具體規(guī)則如下 1 字符可以作為整數(shù)參與數(shù)值運(yùn)算 整數(shù)值為其ASCII碼 2 操作數(shù)為字符或短整型時(shí) 系統(tǒng)自動(dòng)變換成整型 3 操作數(shù)為實(shí)型時(shí) 系統(tǒng)自動(dòng)變換成雙精度型 4 其余情況 當(dāng)兩操作數(shù)類(lèi)型不同時(shí) 將精度低 或表示范圍小 的操作數(shù)的數(shù)據(jù)類(lèi)型變換到與另一操作數(shù)類(lèi)型相同再進(jìn)行運(yùn)算 例如有變量 charc1 c2 inti1 i2 floatx1 x2 則表達(dá)式x2 c1 i1 c1 x1 c1 c2的求值過(guò)程為 將c1轉(zhuǎn)換成整型 完成c1 i1 結(jié)果表示為t1 將c1和x1均轉(zhuǎn)換成雙精度型 完成c1 x1 結(jié)果表示為t2 將c1和c2均轉(zhuǎn)換成整型 完成c1 c2 結(jié)果表示為t3 然后t1轉(zhuǎn)換成雙精度型 完成t1 t2 結(jié)果表示為t4 將t3轉(zhuǎn)換成雙精度型 完成t4 t3 最后結(jié)果轉(zhuǎn)為單精度型賦給x2 53 2 賦值類(lèi)型轉(zhuǎn)換 2 5 3結(jié)束 系統(tǒng)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換規(guī)則 1 實(shí)型數(shù)賦給整形變量 取整 注意溢出 2 整型數(shù)賦給實(shí)型變量 先轉(zhuǎn)換為實(shí)型數(shù) 3 字符型數(shù)賦給整形變量 ASCII碼為依據(jù) 分為兩種情況 符號(hào)位是0或1時(shí)不同 若符號(hào)位為1 則低位字節(jié)不變 高位字節(jié)全部置1再賦值 4 絕對(duì)值較大的數(shù)賦給表達(dá)范圍較小的數(shù)據(jù)類(lèi)型時(shí) 注意溢出 54 2 5 4強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符 ok 其格式為 形式一或 形式二 作用 將表達(dá)式強(qiáng)制轉(zhuǎn)換為類(lèi)型 但表達(dá)式的值及其類(lèi)型不變 任意數(shù)據(jù)類(lèi)型 55 賦值運(yùn)算中 當(dāng)左值與右值類(lèi)型不一致時(shí) 系統(tǒng)將按照左值的類(lèi)型 自動(dòng)進(jìn)行強(qiáng)制轉(zhuǎn)換 例如 設(shè)有以下定義doublex 2 3 y inti 2 j 1 j 2 3 x 2 3 2 2 1 j x 2 y i 由系統(tǒng)按左值j y類(lèi)型自動(dòng)完成強(qiáng)制轉(zhuǎn)換功能 2 y 2 i 2 2 0 2 0 2 5 4強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符 56 第三章 簡(jiǎn)單輸入 輸出 3 1cincin用來(lái)在程序執(zhí)行期間給變量輸入數(shù)據(jù) 一般格式為 cin 變量名1 變量名2 變量名n cout實(shí)現(xiàn)將數(shù)據(jù)輸出到顯示器的操作 一般格式為 cout 57 3 1 1十進(jìn)制數(shù)據(jù)的輸入輸出 請(qǐng)看下例 inti j floatx y cout i j Dcin x y cout則程序輸出 i 10j 20 x y 13 1輸出時(shí)各數(shù)據(jù)間是無(wú)間隔的 因此應(yīng)當(dāng)有意輸出一些間隔符 ok 58 3 1 2輸入字符數(shù)據(jù)cin與cin get 的區(qū)別 1 cin例如 charc1 c2 c3 cin c1 Acin c2 c3 程序執(zhí)行到A行時(shí) 等待用戶(hù)輸入數(shù)據(jù) 若輸入 Abc則cin分別將字符A b c賦給變量c1 c2 c3 cin自動(dòng)跳過(guò)輸入的空白字符 包括空格 制表 backspace和回車(chē)等 59 2 cin get 例如 charc1 c2 c3 c4 cin get c1 Bcin get c2 cin get c3 程序執(zhí)行到B行時(shí) 若輸入 Ab則執(zhí)行結(jié)果是 字符 A 空格 字符 b 分別賦給變量c1 c2 c3 輸入行中仍保留回車(chē)符 cin get 把從鍵盤(pán)上輸入的所有字符 包括空白字符 都作為輸入字符賦給字符變量 60 關(guān)于字符的輸出 請(qǐng)看下例 假定字符c1 c2 c3的值分別為字符 a b 和 c 執(zhí)行以下語(yǔ)句序列 cout c1 t c2 n cout c3 endl cout O k endl 屏幕上將輸出 abcOk輸出時(shí)字符之間是無(wú)間隔的 如果想讓字符間有間隔 必須輸出間隔符 61 補(bǔ)充 字符串輸入輸出 向一個(gè)字符數(shù)組中輸入字符串時(shí) 用函數(shù)getline getline 以用戶(hù)按下回車(chē)鍵作為結(jié)束 在此之前的所有輸入都放入字符數(shù)組中 cin getline char int 其中第一個(gè)參數(shù)是已經(jīng)定義的字符數(shù)組名 第二個(gè)參數(shù)是讀入字符的最多個(gè)數(shù)n 包括字符串結(jié)束符 0 ok 常用cout輸出字符串 雙引號(hào)中的字符串常量照原樣輸出 程序中通常通過(guò)輸出字符串常量來(lái)輸出一些提示信息 字符數(shù)組將輸出串結(jié)束符前所有字符 62 補(bǔ)充 字符串輸入輸出 函數(shù)保證在執(zhí)行時(shí)總會(huì)為字符串的結(jié)束符保留一個(gè)字節(jié) 當(dāng)鍵盤(pán)的輸入字符 字節(jié) 數(shù)多于 n 1 時(shí) 后面的字符不會(huì)進(jìn)入字符數(shù)組 字符串結(jié)束符自動(dòng)加在字符數(shù)組的最后一個(gè)字節(jié)中 當(dāng)輸入字符數(shù)少于該值時(shí) 字符串結(jié)束符自動(dòng)加在輸入到字符數(shù)組中的最后一個(gè)字符的后面 請(qǐng)看下例 charcity 11 cin getline city 10 輸入城市名最多5個(gè)中文字cout 城市名 city endl ok 63 如果要求按八進(jìn)制或十六進(jìn)制輸入輸出 在cin或cout中必須指明相應(yīng)的數(shù)據(jù)形式 oct為八進(jìn)制 hex為十六進(jìn)制 dec為十進(jìn)制 例如 inti j k l cout oct i 輸入為八進(jìn)制數(shù)cin hex j 輸入為十六進(jìn)制數(shù)cin k 輸入仍為十六進(jìn)制數(shù)cin dec l 輸入為十進(jìn)制數(shù)cout hex i hex i endl cout dec j dec j t cout k k endl cout oct l oct l cout dec endl 恢復(fù)十進(jìn)制輸出狀態(tài) ok 輸入輸出的格式控制 1 各種進(jìn)制數(shù)據(jù)的輸入輸出 64 執(zhí)行時(shí)輸出 Inputi oct j hex k hex l dec 此時(shí)從鍵盤(pán)輸入 0320 x3f0 xa017則輸出結(jié)果為 hex i 1adec j 63k 160oct l 21由于已經(jīng)在cin中指明數(shù)制 因此從鍵盤(pán)輸入時(shí) 八進(jìn)制和十六進(jìn)制數(shù)可以省略其開(kāi)頭的0和0 x標(biāo)志 在cin或cout中指明數(shù)制后 該數(shù)制將一直有效 直到重新指明用其他數(shù)制 特別注意 輸入數(shù)據(jù)的格式 個(gè)數(shù)和類(lèi)型必須與cin中的變量一一對(duì)應(yīng) 否則不僅使輸入數(shù)據(jù)錯(cuò)誤 而且影響后面其他數(shù)據(jù)的正確輸入 65 輸入輸出的格式控制 為了使數(shù)據(jù)間隔開(kāi) 還可以用C 提供的函數(shù)setw 指定輸出數(shù)據(jù)項(xiàng)的寬度 例如 inti 2 j 3 floatx 2 6 y 1 8 cout ok 2 設(shè)置數(shù)據(jù)間隔 66 第4章流程控制語(yǔ)句 67 4 1選擇結(jié)構(gòu)程序設(shè)計(jì) 對(duì)程序的運(yùn)行流程進(jìn)行控制 主要通過(guò)執(zhí)行專(zhuān)門(mén)用來(lái)控制流程的語(yǔ)句來(lái)實(shí)現(xiàn) 流程控制語(yǔ)句也稱(chēng)為過(guò)程化語(yǔ)句 分支語(yǔ)句是三種基本流程控制語(yǔ)句之一 C 提供以下三種分支語(yǔ)句 if語(yǔ)句條件運(yùn)算符 swith語(yǔ)句 68 4 2 1if語(yǔ)句 if語(yǔ)句有兩種基本格式為 1 if 2 if else 69 if語(yǔ)句 例4 1 輸入一個(gè)年份 判斷是否閏年 算法分析 假定年份為year 閏年的條件是 year 4 0 ok 70 分析 讀入三個(gè)數(shù) 先求出兩個(gè)數(shù)中較大者 再將該大數(shù)與第三個(gè)數(shù)比較 求出最大數(shù) includevoidmain inta b c max cout a b c coutb max a elsemax b if c max cout 最大數(shù)為 c endl elsecout 最大數(shù)為 max endl if語(yǔ)句 例4 2 從鍵盤(pán)上輸入三個(gè)整數(shù) 輸出其中的最大數(shù) ok 71 if語(yǔ)句中 如果內(nèi)嵌語(yǔ)句又是if語(yǔ)句 就構(gòu)成了嵌套if語(yǔ)句 if語(yǔ)句可實(shí)現(xiàn)二選一分支 而嵌套if語(yǔ)句則可以實(shí)現(xiàn)多選一的多路分支情況 嵌套有兩種形式 第一種是嵌套在else分支中 if elseif 語(yǔ)句2 elseif else 第二種是嵌套在if分支中為 if if else if語(yǔ)句 72 方法1 采用if中嵌套形式 includevoidmain inta b c max cout a b c coutb if a c max a a b且a celsemax c a b且ac max b acelsemax c a b且b ccout 最大數(shù)max max if語(yǔ)句 例3 3 用嵌套if語(yǔ)句完成 例3 2 的任務(wù) ok 73 方法2 采用else中嵌套形式 includevoidmain inta b c max cout a b c coutb if語(yǔ)句 ok 74 要特別注意else和if的配對(duì)關(guān)系 C 規(guī)定了if和else的 就近配對(duì) 原則 即相距最近且還沒(méi)有配對(duì)的一對(duì)if和else首先配對(duì) 按上述規(guī)定 第二種嵌套形式中的else應(yīng)與第二個(gè)if配對(duì) 如果根據(jù)程序的邏輯需要改變配對(duì)關(guān)系 則要將屬于同一層的語(yǔ)句放在一對(duì) 中 如第二種嵌套形式中 要讓else和第一個(gè)if配對(duì) 語(yǔ)句必須寫(xiě)成 if 表達(dá)式1 if 表達(dá)式2 語(yǔ)句1 else語(yǔ)句2 第二種嵌套形式較容易產(chǎn)生邏輯錯(cuò)誤 而第一種形式配對(duì)關(guān)系則非常明確 因此從程序可讀性角度出發(fā) 建議盡量使用第一種嵌套形式 75 請(qǐng)看以下兩個(gè)語(yǔ)句 語(yǔ)句1 if n 3 0 if n 5 0 cout n 是15的倍數(shù) endl elsecout n 是3的倍數(shù)但不是5的倍數(shù) endl 語(yǔ)句2 if n 3 0 if n 5 0 cout n 是15的倍數(shù) endl elsecout n 不是3的倍數(shù) 兩個(gè)語(yǔ)句的差別只在于一個(gè) 但表達(dá)的邏輯關(guān)系卻完全不同 76 例4 4 某商場(chǎng)優(yōu)惠活動(dòng)規(guī)定 某種商品單價(jià)為80元 一次購(gòu)買(mǎi)5件以上 包含5件 10件以下 不包含10件 打9折 一次購(gòu)買(mǎi)10件以上 包含10件 打8折 設(shè)計(jì)程序根據(jù)客戶(hù)的購(gòu)買(mǎi)量計(jì)算總價(jià) if語(yǔ)句 77 算法 1 輸入購(gòu)買(mǎi)件數(shù)count 設(shè)置單價(jià)price 80 元 2 根據(jù)count值確定折扣discount 3 實(shí)際售價(jià)amount price count discount 4 輸出amount的值 算法細(xì)化 2 1 if count 5 count 10 discount 0 8 ok 78 includevoidmain floatprice 80 discount amount 單價(jià) 折扣 總價(jià)intcount 購(gòu)買(mǎi)件數(shù)cout count if count 5 discount 1 elseif count 10 discount 0 9 elsediscount 0 8 amount price count discount cout 購(gòu)買(mǎi)件數(shù) count endl cout 單價(jià) price t 折扣 discount endl cout 總價(jià) amount endl 請(qǐng)?jiān)赩C 平臺(tái)上運(yùn)行 輸入不同的件數(shù) 使程序所有分支都可以被執(zhí)行一次 ok 79 例4 5 求一元二次方程ax2 bx c 0的根 其中系數(shù)a a 0 b c的值由鍵盤(pán)輸入 分析 輸入系數(shù)a a 0 b c后 令delta b2 4ac 結(jié)果有三種情況 若delta 0 方程有兩個(gè)相同實(shí)根 若delta 0 方程有兩個(gè)不同實(shí)根 若delta 0 方程無(wú)實(shí)根 if語(yǔ)句 80 算法 1 輸入系數(shù)a a 0 b c 2 令delta b2 4ac 3 根據(jù)delta的值求方程的根 4 輸出方程的根 算法細(xì)化 3 1 if delta 0 方程有兩個(gè)相同實(shí)根 計(jì)算 3 2 if delta 0 方程有兩個(gè)不同實(shí)根 計(jì)算 3 3 if delta 0 方程無(wú)實(shí)根 計(jì)算 ok 81 include includevoidmain floata b c floatdelta x1 x2 constfloatzero 0 0001 定義一個(gè)很小的常數(shù)cout a b c cout a a t b b t c c endl delta b b 4 a c 求一元二次方程的根源程序 82 if fabs delta 0 delta sqrt delta x1 b delta 2 a x2 b delta 2 a cout 方程有兩個(gè)不同實(shí)根 cout x1 x1 t x2 x2 endl else delta 0cout 方程無(wú)實(shí)根 endl 請(qǐng)?jiān)赩C 平臺(tái)上運(yùn)行 輸入不同的系數(shù) 使程序所有分支都可以被執(zhí)行一次 83 3 1 2條件運(yùn)算符 if語(yǔ)句在某些情況下可以用條件運(yùn)算符 來(lái)簡(jiǎn)化表達(dá) 是一個(gè)三元運(yùn)算符 其構(gòu)成的表達(dá)式格式為 執(zhí)行邏輯 先計(jì)算表達(dá)式1 若其值為真 或非0 則計(jì)算表達(dá)式2 不計(jì)算表達(dá)式3 并將該值作為整個(gè)表達(dá)式的值 反之 即表達(dá)式1的值為假或?yàn)? 則計(jì)算表達(dá)式3 不計(jì)算表達(dá)式2 并將該值作為整個(gè)表達(dá)式的值 例如 inta 6 b 7 min a b a b min 6min a b a b min 7a 7b 7min a b a b min 6a 7b 7 ok 84 3 1 3switch語(yǔ)句 用嵌套if語(yǔ)句可以實(shí)現(xiàn)多選一的情況 另外C 中還提供了一個(gè)switch語(yǔ)句 稱(chēng)為開(kāi)關(guān)語(yǔ)句 也可以用來(lái)實(shí)現(xiàn)多選一 switch 表達(dá)式 case常量表達(dá)式 語(yǔ)句序列 break case常量表達(dá)式n 語(yǔ)句序列n break default 語(yǔ)句序列 85 switch語(yǔ)句格式 1 各個(gè)case 包括default 分支出現(xiàn)的次序可以任意 通常將default放在最后 2 break語(yǔ)句可選 如果沒(méi)有break語(yǔ)句 每一個(gè)case分支都只作為開(kāi)關(guān)語(yǔ)句的執(zhí)行入口 執(zhí)行完該分支后 還將接著執(zhí)行其后的所有分支 因此 為保證邏輯的正確實(shí)現(xiàn) 通常每個(gè)case分支都與break語(yǔ)句聯(lián)用 3 每個(gè)常量表達(dá)式的取值必須各不相同 否則將引起歧義 86 4 允許多個(gè)常量表達(dá)式對(duì)應(yīng)同一個(gè)語(yǔ)句序列 例如 charscore cin score switch score case A case a cout excellent break case B case b cout good break default cout fair 5 從形式上看 switch語(yǔ)句的可讀性比嵌套if語(yǔ)句好 但不是所有多選一的問(wèn)題都可由開(kāi)關(guān)語(yǔ)句完成 這是因?yàn)殚_(kāi)關(guān)語(yǔ)句中限定了條件表達(dá)式的取值類(lèi)型 ok 87 switch語(yǔ)句例子 例3 6 運(yùn)輸公司對(duì)所運(yùn)貨物實(shí)行分段計(jì)費(fèi) 設(shè)運(yùn)輸里程為s 則運(yùn)費(fèi)打折情況如下 s 250不打折扣250 s 5002 折扣500 s 10005 折扣1000 s 20008 折扣2000 s 300010 折扣3000 s15 折扣設(shè)每公里每噸的基本運(yùn)費(fèi)為p 貨物重量為w 折扣為d 則總運(yùn)費(fèi)f為 f p w s 1 d 設(shè)計(jì)程序 當(dāng)輸入p w和s后 計(jì)算運(yùn)費(fèi)f 88 算法 1 輸入每噸運(yùn)費(fèi)p 貨物重量w 運(yùn)輸里程s 2 根據(jù)運(yùn)輸里程s計(jì)算折扣d 3 計(jì)算總運(yùn)費(fèi)f p w s 1 d 4 輸出計(jì)算結(jié)果 算法細(xì)化 2 根據(jù)運(yùn)輸里程s計(jì)算折扣d分析 如果用switch語(yǔ)句 必須使表達(dá)式符合語(yǔ)法要求 分析發(fā)現(xiàn) 里程s的分段點(diǎn)均是250的倍數(shù) 因此 將里程s除以250 取整數(shù)商 便得到若干整數(shù)值 ok 89 switch c s 250 case0 d 0 break case1 d 0 02 break case2 case3 d 0 05 break case4 case5 case6 case7 d 0 08 break case8 case9 case10 case11 d 0 1 break default d 0 15 s 250不打折扣250 s 5002 折扣500 s 10005 折扣1000 s 20008 折扣2000 s 300010 折扣3000 s15 折扣 90 include includevoidmain intc s floatp w d f cout p w s c s 250 switch c case0 d 0 break case1 d 0 02 break case2 case3 d 0 05 break case4 case5 case6 case7 d 0 08 break case8 case9 case10 case11 d 0 1 break default d 0 15 f p w s 1 d cout 運(yùn)輸單價(jià)為 p t 重量為 w t 里程為 s endl cout 折扣為 d endl cout 運(yùn)費(fèi)為 f endl 請(qǐng)?jiān)赩C 平臺(tái)上運(yùn)行 輸入不同的里程 使程序所有分支都可以被執(zhí)行一次 ok 91 例3 7 設(shè)計(jì)一個(gè)計(jì)算器程序 實(shí)現(xiàn)加 減 乘 除運(yùn)算 分析 讀入兩個(gè)操作數(shù)和運(yùn)算符 根據(jù)運(yùn)算符完成相應(yīng)運(yùn)算 includevoidmain floatnum1 num2 charop cout num1 op num2 switch op case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break default cout op 是無(wú)效運(yùn)算符 常量表達(dá)式采用字符型 上機(jī)運(yùn)行一下 92 循環(huán)控制語(yǔ)句是三種基本流程控制語(yǔ)句之一 C 提供以下三種循環(huán)語(yǔ)句 while語(yǔ)句do while語(yǔ)句for語(yǔ)句 4 3循環(huán)結(jié)構(gòu)程序設(shè)計(jì) 93 4 3 1while語(yǔ)句 while語(yǔ)句也稱(chēng)為當(dāng)循環(huán) 語(yǔ)句格式為 while 表達(dá)式 循環(huán)體語(yǔ)句 圖3 1while語(yǔ)句的執(zhí)行流程圖 求表達(dá)式的值 表達(dá)式值為真 是 否 執(zhí)行循環(huán)體語(yǔ)句 94 while語(yǔ)句 例4 8 求1 2 3 4的值 ok N個(gè)連續(xù)整數(shù)相加算法1 設(shè)置變量i用來(lái)放被加數(shù) 變量sum用來(lái)放和值 并初始化 2 從第一個(gè)數(shù)開(kāi)始 依次將被加數(shù)賦給i 并進(jìn)行操作sum sum i 3 輸出sum 細(xì)化算法2 while 還有被加數(shù) i 當(dāng)前被加數(shù) sum i i準(zhǔn)備接受下一個(gè)被加數(shù) 95 源程序如下 includevoidmain inti 1 sum 0 循環(huán)初始條件while i 4 sum i i 修改循環(huán)條件 cout sum sum endl 在VC 平臺(tái)上運(yùn)行 試一試是否正確 ok 96 while語(yǔ)句 注意 在有循環(huán)語(yǔ)句的程序中 通常循環(huán)開(kāi)始前對(duì)循環(huán)條件進(jìn)行初始化 而在循環(huán)體語(yǔ)句中要包含修改循環(huán)條件的語(yǔ)句 否則循環(huán)將不能終止而陷入死循環(huán) C 表達(dá)方式靈活 上例中的循環(huán)語(yǔ)句還可以寫(xiě)成 while i n sum i 或者while sum i i n 循環(huán)體為空語(yǔ)句修改程序后在VC 平臺(tái)上運(yùn)行 看是否正確 97 4 3 2do while語(yǔ)句 do while語(yǔ)句稱(chēng)為直到循環(huán) 格式為 do循環(huán)體語(yǔ)句while 表達(dá)式 否 是 表達(dá)式的值為真 執(zhí)行循環(huán)體語(yǔ)句 求表達(dá)式的值 圖3 2do while語(yǔ)句的執(zhí)行流程圖 98 do while語(yǔ)句 do while語(yǔ)句和while語(yǔ)句的區(qū)別 多數(shù)情況下可以互相替代 區(qū)別是do while語(yǔ)句至少執(zhí)行一次循環(huán)體后再判斷循環(huán)條件是否滿(mǎn)足 while語(yǔ)句先判斷條件是否滿(mǎn)足 然后才執(zhí)行循環(huán)體 99 例4 9 輸入一段文本 統(tǒng)計(jì)文本的行數(shù) 單詞數(shù)及字符數(shù) 假定單詞之間以空格或跳格或換行符間隔 且文本開(kāi)始沒(méi)有空行 算法分析 1 逐個(gè)讀入文本中的字符 直到讀到一個(gè)輸入結(jié)束符EOF為止 2 如何算行數(shù) 行結(jié)束標(biāo)志為讀到字符 n 3 如何算單詞數(shù) 設(shè)一個(gè)變量isword 讀到字符時(shí)isword 1 讀到間隔符時(shí)isword 0 如果讀到一個(gè)間隔符而此時(shí)isword值為1 則說(shuō)明剛讀完一個(gè)單詞 如果讀到一個(gè)字符而此時(shí)isword值為0 則說(shuō)明剛開(kāi)始讀一個(gè)單詞 4 如何算字符數(shù) do while語(yǔ)句 ok 100 算法 1 設(shè)置變量line word ch分別代表行數(shù) 單詞數(shù) 非分隔字符數(shù) 并初始化 設(shè)置變量isword來(lái)輔助統(tǒng)計(jì)單詞數(shù) 2 do 從鍵盤(pán)讀入一個(gè)字符c if c n line if 是單詞開(kāi)頭 word if c不是分隔符 ch while c EOF 3 輸出統(tǒng)計(jì)結(jié)果 將下面的程序在VC 平臺(tái)上運(yùn)行 試一試是否正確 101 includevoidmain charc intline 0 word 0 ch 0 ch為非分隔字符數(shù)intisword 0 do c cin get if c n line 遇換行符行數(shù) 1if c 102 4 3 3for語(yǔ)句 for循環(huán)語(yǔ)句的格式為 for ok 103 for語(yǔ)句 while語(yǔ)句 do while語(yǔ)句實(shí)現(xiàn)相同的功能 1 2 3 4 inti 1 sum 0 循環(huán)初始條件while i 4 sum i i 修改循環(huán)條件 inti 1 sum 0 循環(huán)初始條件do sum i i 修改循環(huán)條件 while i 4 for inti 1 sum 0 i 4 i sum i 習(xí)慣上 表達(dá)式1 循環(huán)初始條件 表達(dá)式2 循環(huán)終止條件 表達(dá)式3 修改循環(huán)條件 ok 104 for語(yǔ)句的應(yīng)用 for語(yǔ)句的幾點(diǎn)說(shuō)明 1 是先判斷型的 同while語(yǔ)句 2 使用更為靈活 三個(gè)表達(dá)式可以是任意表達(dá)式 因此他們就可以實(shí)現(xiàn)循環(huán)初始化 計(jì)算 修改循環(huán)條件等任務(wù) 而不一定非在循環(huán)體中進(jìn)行 105 for語(yǔ)句的應(yīng)用 例4 11 設(shè)計(jì)程序輸出Fibonacii數(shù)列的前20項(xiàng) 要求每行輸出5個(gè)數(shù)據(jù) Fibonacii數(shù)列定義如下 算法分析 除了第0項(xiàng)和第1項(xiàng)外 每一項(xiàng)都是由類(lèi)似方法產(chǎn)生 即前兩項(xiàng)之和 所以求當(dāng)前項(xiàng)時(shí) 只需要記住前兩項(xiàng) 程序不需要為每一項(xiàng)設(shè)置專(zhuān)用變量 屬遞推算法 106 算法 1 設(shè)置變量n表示第幾項(xiàng) 變量f1和f2用來(lái)記住當(dāng)前項(xiàng)f3之前的兩項(xiàng) 變量初始化n 0 2 while 當(dāng)前項(xiàng)不到第20項(xiàng) if 當(dāng)前項(xiàng)是第0項(xiàng) f1 0 if 當(dāng)前項(xiàng)是第1項(xiàng) f2 1 if 當(dāng)前項(xiàng)是第2項(xiàng)或更高項(xiàng) f3 f1 f2 按要求輸出f3 f1 f2 f2 f3 記住最近兩項(xiàng)當(dāng)前項(xiàng)后移一位 107 例3 11 設(shè)計(jì)程序輸出Fibonacii數(shù)列的前20項(xiàng) 要求每行輸出2個(gè)數(shù)據(jù) Fibonacii數(shù)列定義如下 程序如下 文件名 Ex3 11 cpp include includevoidmain intfib0 0 fib1 1 fib2 cout setw 5 fib0 setw 5 fib1 endl for intn 3 n 20 n fib2 fib0 fib1 cout setw 5 fib2 if n 5 0 cout endl 控制每行2個(gè)數(shù)據(jù)fib0 fib1 fib1 fib2 108 for語(yǔ)句的應(yīng)用 在VC 平臺(tái)上運(yùn)行運(yùn)行結(jié)果 01123581321345589144233377610987159725844181 109 例4 12 輸入一個(gè)不超過(guò)5位的整數(shù) 將其反向后輸出 例如輸入247 變成742輸出 算法分析 1 將整數(shù)的各個(gè)數(shù)位逐個(gè)位分開(kāi) 用一個(gè)數(shù)組保存各個(gè)位的值 然后反向組成新的整數(shù) 2 將整數(shù)各位數(shù)字分開(kāi)的方法是 通過(guò)求余得到個(gè)位數(shù) 然后將整數(shù)縮小十倍 再求余 并重復(fù)上述過(guò)程 分別得到十位 百位 直到整數(shù)的值變成0為止 for語(yǔ)句的應(yīng)用 ok 110 數(shù)據(jù) 1 設(shè)置變量num表示輸入的整數(shù) 整型數(shù)組digit 5 用來(lái)存放num的各個(gè)位 變量i用來(lái)表示數(shù)組的當(dāng)前下標(biāo) 算法 1 輸入num 變量初始化 i 0 2 while num 0 num對(duì)10取余 得num的當(dāng)前個(gè)位數(shù)digit i num整除10 即去掉個(gè)位數(shù) 十位變個(gè)位 百位變十位 i 數(shù)組digit準(zhǔn)備記錄下一位 3 將數(shù)組元素按下標(biāo)從高到低的順序輸出 111 程序如下 includevoidmain intnum subscript intdigit 5 cout num cout0 for inti 0 i subscript i 整數(shù)的反向組合num num 10 digit i cout 反向后整數(shù)為 num endl 在VC 平臺(tái)上運(yùn)行 試一試是否正確 112 4 3 5循環(huán)的嵌套 例3 13 打印九九表 打印格式為 123456789112243369 991827364554637281 當(dāng)循環(huán)語(yǔ)句中的循環(huán)體中又有循環(huán)語(yǔ)句時(shí) 就構(gòu)成了嵌套循環(huán) 嵌套層次一般不超過(guò)3層 已保證可讀性 113 循環(huán)的嵌套 分析 1 計(jì)算機(jī)的輸出是按行進(jìn)行的 因此可以先用一個(gè)循環(huán)語(yǔ)句輸出第一行表頭 2 表中各行數(shù)據(jù)的輸出可以用下面的算法描述 for i 1 i 10 i cout i 輸出行號(hào)輸出第i行數(shù)據(jù) Acout endl 準(zhǔn)備輸出下一行 114 3 第A行需要進(jìn)一步細(xì)化 由于第i行數(shù)據(jù)是一組有規(guī)律的數(shù)列 每個(gè)數(shù)的值是其所在行與列的乘積 因此輸出第i行可以 for j 1 j 10 j cout setw 4 i j 4 按上述算法輸出的每一行都將有九列 即打印出的是矩形表而不是下三角形表 進(jìn)一步分析發(fā)現(xiàn)每一行的列數(shù)與所在行數(shù)相關(guān) 因此要輸出三角形表 上面的循環(huán)語(yǔ)句需稍作修改 for j 1 j i j cout setw 4 i j 將此語(yǔ)句放到頂層算法的A行即可 循環(huán)的嵌套 115 算法 1 輸出表頭 用一個(gè)循環(huán)語(yǔ)句即可 2 輸出表體 for i 1 i 10 i cout i 輸出行號(hào)輸出第i行數(shù)據(jù) Acout endl 準(zhǔn)備輸出下一行 3 A行細(xì)化 for j 1 j i j cout setw 4 i j 循環(huán)的嵌套 116 在VC 平臺(tái)上運(yùn)行下面的程序 include includevoidmain cout setw 3 setw 4 for inti 1 i 10 i cout setw 4 i 輸出表頭 乘數(shù) cout endl endl for i 1 i 10 i cout setw 3 i setw 4 輸出行號(hào) 被乘數(shù) for intj 1 j i j cout setw 4 i j 輸出表中數(shù)據(jù) 乘積 cout endl 準(zhǔn)備輸出下一行 3 2 4循環(huán)嵌套 打印九九表 117 4 4轉(zhuǎn)向語(yǔ)句 4 4 1break語(yǔ)句 4 4 4return語(yǔ)句 4 4 3goto語(yǔ)句 4 4 2continue語(yǔ)句 118 4 4 1break語(yǔ)句 break語(yǔ)句只能用在switch語(yǔ)句和循環(huán)語(yǔ)句中 用來(lái)跳出switch語(yǔ)句或提前終止循環(huán)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論