




已閱讀5頁,還剩491頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C 語言基礎 鹽城工學院惠為君 1 C 概述 C 的特點發展歷史和未來 C C AT T Java SUN C MS 與其它語言比較 7點 面向對象的概念 數據的封裝和隱藏 繼承 多態VC上機過程 2 C 的字符集 C 語言使用下列基本字符來構成詞法單位 結束 3 第二章 數據類型運算符表達式 2 1VC 的數據類型計算機所處理的數據以一定形式存放在內存中 數據的存儲方式以及能夠進行的合法運算都與數據類型直接相關 C 的特點之一就是提供了豐富的數據類型 以便處理各種不同的數據 數據類型總是與運算封裝在一起 本質上是面向對象的 本章將簡要介紹C 中的數據類型及相關運算 以及常量 變量 表達式 語句等 最后介紹簡單的輸入輸出方法 4 2 1 1關鍵字 5 6 2 1 2標識符 標識符 Identifier ID 是程序員定義的 單詞 用來給變量 常量 數據類型 函數等命名 合法標識符由字母或下劃線開始 由字母 數字 下劃線組成 其有效長度為1 31個字符 長度超過31個字符者只識別前31個字符 VC 標識符長度為1 247個字符 建議使用有一定含義的英文單詞或拼音序列作標識符 以提高可讀性 另外盡量不用下劃線或雙下劃線打頭 以免與系統定義的關鍵字沖突 ok 7 標識符 例 判斷下面哪些是合法的標識符 MyFile Salary94 amount void 94Salary Salary94 amount f3 5 Num of Student 2 1 2結束 8 2 1 3標點符號 標點符號包括 等 標點符號的作用 有一定的語法意義 如字符和字符串常量分別用 和 引起來 對語法符號起分隔作用 如 等 2 1 3結束 9 2 1 5C 的基本數據類型 ok 10 C 對基本數據類型也分別進行了封裝 稱為內置數據類型 內置數據類型不僅定義了數據類型 還定義了常用操作 本節僅介紹各種基本數據類型的定義 常用操作將在后面介紹 C 為強類型語言 所有數據的使用嚴格遵從 先說明后使用 的原則 以便編譯器進行編譯 整型用來存放整數 整數 有符號的整數 在內存中存放的是它的補碼 無符號數沒有符號位 存放的就是原碼 整數占用的字節數與機型有關 32位機上占用4個字節 11 字符型用來保存字符 存儲的是該字符的ASCII碼 占用一個字節 如大寫字母A的ASCII碼為65 在對應的一個字節中存放的就是65 字符型數據從本質上說也是整數 可以是任何一個8位二進制整數 由于漢語系字符很多 用ASCII字符集處理遠遠不夠 因此又創立了雙字節字符集 DBCS double bytecharacterset 每個字符用兩個字節來編碼 為便于軟件的國際化 國際上一些知名公司聯合制定了新的寬字節字符標準 Unicode 該標準中所有字符都是雙字節的 不同的語言和字符集分別占用其中一段代碼 這種用統一編碼處理西文 中文及其它語言符號 就是unicode碼 C 同時也支持寬字符類型 wchar t 或稱雙字節字符型 12 實型和雙精度型都用來存放實數 兩者表示的實數精度不同 實數在內存中以規范化的浮點數存放 包括尾數 數符和階碼 數的精度取決于尾數的位數 32位機上實型為23位 因規范化數的數碼最高位恒為1 不必存儲 實際為24位 雙精度為52位 邏輯型也稱布爾型 其取值為true 邏輯真 和false 邏輯假 存儲字節數在不同編譯系統中可能有所不同 VC 6 0中為1個字節 布爾型在運算中可以和整型相互轉化 false對應為0 true對應為1或非0 無值型主要用來說明函數的返回值類型 將在函數一章中具體介紹 基本數據類型還可以加上一些修飾詞 包括 signed 有符號 unsigned 無符號 long 長 short 短 參見下表 13 2 2結束 VC 中所有基本數據類型 14 2 1 6常量 在程序的執行過程中 值保持不變的量稱為常量 字面常量 指程序中直接給出的量 常量的值在程序執行過程中保持不變 并且存儲在程序區 而非數據區 根據取值和表示方法的不同 可分為以下幾種 15 a 整形常量 d 字符串常量 c 字符型常量 b 實型常量 ok 16 a整型常量 十進制表示法 八進制表示法 十六進制表示法 其他表示法 即整數 可以有多種表示方法 ok 17 整數的十進制表示方法 十進制表示與我們熟悉的書寫方式相同 如15 24 ok 18 整數的八進制表示 八進制表示以0開始 由數字0 7組成 用來表示一個八進制數 如 012 八進制數12 即十進制數10 0655 八進制數 655 即十進制數 429 ok 19 整數的十六進制表示 十六進制以0X 大小寫均可 開始 由數字0 9和字母A F 大小寫均可 組成 用來表示一個十六進制數 以下是一些常整數的例子 0 x32A 十六進制數32A 即十進制數810 0 x2fe0 十六進制數 2fe0 即十進制數 12256 ok 20 整數的其他表示方法 整型常量還可以表示長整數和無符號整數 長整型常數以L或l結尾 無符號常整數以U或u結尾 以UL或LU 大小寫均可 結尾則可表示無符號長整型常數 例如 84L 十進制長整數 84026U 八進制表示的無符號整數260X32LU 十六進制表示的無符號長整型數32 整數結束 21 b實型常量 1 一般形式與平時書寫形式相同 由數字0 9和小數點組成 例如 0 23 125 760 0 46 35 2 指數形式 也稱為科學表示法 表示為尾數乘以10的次方形式 由尾數 E或e和階數組成 指數形式要求在E或e前面的尾數部分必須有數字 后面的指數部分必須為整數 例 判斷下列表示是否合法 123E12 34e 2 E4 1 43E3 5 包含小數點和10的冪的數為實型常量 有兩種表示方法 實數結束 22 c字符型常量 字符常量是用單引號引起來的單個字符 在內存中保存的是字符的ASCII碼值 在所有字符中 有些是可顯示字符 通常就用單引號引起來表示 a 字符a 字符 4 字符4 空格字符有些是特殊情況字符 如不可顯示的字符等 c 使用轉義序列表示方法 如 祥見表2 3 此處略 n 換行 字符 字符常結束 23 d 字符串常量 字符串常量與字符型常量的區別 字符串常量 a 占兩個字節 存放 a 和 0 值為0 x6100 字符型常量 a 占一個字節 存放 a 值為0 x61 2 3 2結束 用雙引號引起來的若干個字符稱為字符串常量 例如 IamaChinese 123 a 24 2標識符常量及常量說明符const 用常量說明符const給字面常量起個名字 標識符 這個標識符就稱為標識符常量 因為標識符常量的說明和引用形式很像變量 所以也稱常變量 例如 constfloatPI 3 14159 constintNumber of Student 100 常變量必須也只能在說明時進行初始化 常變量初始化之后 不允許再被賦值 常變量必須先說明后使用 常變量存儲在數據區 并且可以按地址訪問 編譯時系統對常變量進行類型檢查 C 建議使用常變量 而盡量不使用字面常量 2 3 3結束 25 2 1 7變量 1變量說明 2變量賦初值 變量 在程序中是指可以改變值的量 變量必須用標識符進行標識 稱為變量名 變量有類型之分 如整形變量 字符變量等 任何變量都必須先說明后使用 一是便于編譯程序為變量分配空間 二是便于編譯時進行語法檢查 變量使用的第一步 是給變量賦初始值 ok 26 變量說明 在C 中 變量說明的一般格式為 存儲類型 數據類型變量名1 變量名2 變量名n 下面是變量說明的幾個例子 inti j k 說明三個整型變量i j kfloatx y z 說明三個實型變量x y zcharc1 c2 說明兩個字符型變量c1 c2doubledx 說明一個雙精度型變量dx 變量說明結束 27 變量賦初值 1 變量說明時直接賦初值 例如 inta 3 b 4 c 5 floatx 3 0 2 用賦值語句賦初值 嚴格的說 只有前者可稱賦初值例如 floatx e x 3 5 e 2 71828 結束 給變量賦初值稱為初始化 有兩種方法 28 2 2基本運算符 對常量和變量進行運算是通過運算符來實現的 常量和變量通過運算符組成C 表達式 由表達式再組成C 語句 運算符是完成對常量和變量進行運算的符號 把參與運算的對象稱為操作數 按照要求的操作數的個數 運算符分為單目 一元 運算符 雙目 二元 運算符和三目 三元 運算符 單目運算符只對一個操作數運算 如負號運算符 等 雙目運算符要求有兩個操作數 如乘號運算符 等 三目運算符要求有三個操作數 三元運算符只有一個 29 1 算術運算符 ok 30 運算符重載 當兩個操作數均為整數時 和 重載為整乘和整除 結果為整數 除法運算后舍去小數取整 如 5 4 結果為1 整數 當兩個操作數均為整數 定義為求余運算 也稱求模運算 結果為兩個整數相除后的余數 如果兩個整數中有負數 則先用兩數絕對值求余 最后結果的符號與被除數相同 例如6 3 結果為06 7 結果為67 6 結果為1 31 C 中算術運算應注意數據溢出問題 即運算結果超出對應數據類型的表示范圍 編譯程序只會對除法運算時除數為0這種情況提示出錯 而特別容易溢出的整數的加 減和乘法運算產生溢出的情況 系統不作為錯誤處理 程序將繼續執行并產生錯誤的計算結果 因此 程序設計者必須在程序中解決檢查并處理整數溢出問題 只要有一個操作數是實數 兩個操作數均轉換為double型 和 重載為普通的乘和除 結果是實數 5 4 0 結果為1 25 實數 32 2 關系運算符和邏輯運算符 ok 關系運算符都是二元運算符 包括 大于 不小于 小于 不小于 等于 和 不等于 關系運算符完成兩個操作數大小的比較 結果為邏輯值true 真 或false 假 每種可比較大小的數據類型 都重載了關系運算符 不同類型 自動轉換為同一類型后 采用對應關系運算符進行比較 在C 中這兩個邏輯值與整數之間有一個對應關系 真對應1 假對應0 反過來 0對應假 非0整數對應真 所以關系運算結果可以作為整數參與算術運算 關系運算 邏輯運算及其他運算 33 2 關系運算符和邏輯運算符 設有定義floata 3 2 intb 5 則 3 a b 結果是 根據右結合原則其運算過程如下 a 5 b 3 2 3 F 即0 F即0 34 邏輯運算符 35 邏輯運算符用來進行邏輯運算 其操作數和運算結果均為邏輯量 運算結果同樣可以作為一個整數參與其他運算 由于邏輯值和整數之間的對應關系 也允許整型和字符型操作數進行邏輯運算 21 0 邏輯與 21與0 結果為假 021 0 邏輯或 21或0 結果為真 1 21 邏輯非 21的非 結果為假 0 邏輯運算符 36 位運算符 1 按位取反運算符 2 左移運算符 4 按位與運算符 5 按位或運算符 6 按位異或運算符 ok c 語言提供字位運算 它對操作數的各個位進行操作 37 1 按位取反運算符 將操作數的每個二進制位取反 即1變為0 0變為1 例如 整數a的值為10011011 則 a的值為01100100 2 左移運算符 運算一般格式為 a n其中a為整數 n為一個正整數常數 語義為將a的二進制數依次向左移動n個二進制位 并在低位補0 左移n位相當于乘以2的n次方 但移位運算的速度比乘法快 3 右移運算符 與左移運算符類同 將左操作數向右移動右操作數指定的二進制位數 忽略移位后的小數部分 并在高位補0 一個整數右移n位相當于除以2的n次方 但比除法快 在VC 6 0中有符號數右移時高位補符號位 嚴格對應除法 以上三種單目運算不影響數據本身的值 而是只產生一個中間量 這個中間量被引用后即不再存在 38 4 按位與運算符 將兩個操作數的對應位逐一進行按位邏輯與運算 運算規則為 對應位均為1時 該位運算結果為1 否則為0 例如 a01001101b00001111a b00001101該運算可用來將整數的某些位置0 而保留所需要的位 上例保留了低四位 5 按位或運算符 將兩個操作數的對應位逐一進行按位邏輯或運算 運算規則為 只要有一個數對應位為1 該位運算結果即為1 兩個數對應位均為0 該位結果為0 例如 a01001101b00001111a b01001111該運算符可用來將整數的某些位置1 上例高四位不變 低四位全1 39 6 按位異或運算符 將兩個操作數的對應位逐一進行按位異或運算 運算規則為 當對應位的值不同時 該位運算結果為1 否則為0 例如 a01001101b00001111a b01000010該運算符可用來將一個整數的某些位取反 或將整型變量的值置0 將整型變量與自身按位異或 上例低四位取反 高四位不變 需要說明的一點是 以上例子中的整數都只取了低8位一個字節 40 4 賦值運算符 ok 將數據存放到相應存儲單元中稱為賦值 如果該單元中已有值 賦值操作以新值取代舊值 從某個存儲單元中取出數據使用 稱為引用 引用不影響單元中的值 即一個量可以多次引用 常量只能引用 不能賦值 賦值通過賦值運算符 來完成 其意義是將賦值號右邊的值送到左邊變量所對應的單元中 賦值號不是等號 它具有方向性 41 C 將變量名代表的單元稱為 左值 而將變量的值稱為 右值 左值必須是內存中一個可以訪問且可以合法修改的對象 因此只能是變量名 而不能是常量或表達式 4 賦值運算符 例如下面的賦值運算是錯誤的 3 1415926 pi 左值不能是常數x y z 左值不能是表達式constintN 30 N 40 左值不能是常變量 42 5 自增自減運算 運算分前置和后置兩種 前置是先增減后引用 即先對變量自加或自減 用新的值參與其他運算 后置則是先引用后增減 即用變量原來的值參與其他運算 然后再對變量進行自加或自減 例如 inti 5 j 5 m n m i 后置 相當于m i i i 1 結果 i的值為6 m的值為5 n j 前置 相當于j j 1 n j 結果 j的值為6 n的值為6 意義 使變量當前值加1或減1 再賦給該變量 要求 操作數只能是變量 不能是常量或表達式 ok 43 sizeof 運算符 用于計算一個操作數類型或一個變量的字節數 一般格式為 sizeof 數據類型 或sizeof 變量名 例如 sizeof int 值為4sizeof float 值為4doublex sizeof x 值為8 結束 44 2 2 2表達式 1算術表達式 2關系表達式 3邏輯表達式和邏輯表達式求值的優化 4賦值表達式與復合賦值表達式 5逗號表達式 ok 45 1 算術表達式 使用時注意 1 表達式中每個變量都有確定的值時才能進行表達式求值 2 考慮到算術運算溢出和精度問題 應避免 1 兩個很接近的數直接相減 2 除數是一個很小的數 3 整數的連續乘運算 ok 由算術運算符連接的表達式稱為算術表達式 例如 a b 3 46 2 關系表達式 例如 a b c 等同于 a b c 先求a b的值 再將結果0或1與c比較大小 a b c d 等同于 a b c d 結果為0或1 y a b 計算a b的值0或1賦給y y的值為0或1 由關系運算符連接的表達式 值為true或false ok 47 3 邏輯表達式和邏輯表達式求值的優化 由邏輯運算符連接的表達式稱為邏輯表達式 邏輯表達式的值為true或false 這個值可對應整數1或0參與其他運算 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 得整個表達式的值為 1 48 3 邏輯表達式和邏輯表達式求值的優化 在求邏輯表達式值的過程中 一旦表達式的值能夠確定 就不再逐步進行下面的運算 稱為 求值優化 已知 inta 10 b 20 c 30 求 a b c 結果以及a b c的值 t1 1 整個表達式的值為1 可見 表達式c 已不需要計算所以 c不變仍為30 編程人員在使用邏輯運算時應當加以小心 優化計算固然提高了運算效率 但可能產生副作用 所謂副作用 就是出乎設計人員的意料 得到預想不到的結果 49 4 賦值表達式與復合賦值表達式 賦值表達式的格式為 變量 表達式例如 x 5 6 a b c d 1 在C 中 所有的雙目算術運算符和位運算符均可與賦值運算符組合成一個單一運算符 稱為復合運賦值算符 包括以下10個 復合賦值運算符的要求與格式與賦值運算符完全相同 表示為 變量復合賦值運算符表達式它等同于變量 變量運算符表達式例如 x 5等同于 x x 5 ok 50 逗號表達式 C 中 逗號既是分隔符 又是運算符 用逗號連接起來的表達式稱為逗號表達式 一般格式為 表達式1 表達式2 表達式n逗號表達式中的每一個表達式都會被運算 整個逗號表達式的值為最后一個表達式的值 例如 a x 3 x 6 5 6 a 11x 9 2 5 2結束 51 2 2 3不同類型數據的混合運算和賦值時的類型轉換 1不同類型數據的混合運算 2賦值類型轉換 ok 運算過程中 當某個二元運算符兩邊的操作數類型不同但屬于類型相容時 系統先將精度低的操作數變換到與另一操作數精度相同 而后再進行運算 所謂類型相容 指的就是類型不同但系統可以自動進行轉換 當賦值號的左值和右值類型不一致但屬于類型相容時 由系統自動進行類型轉換 52 具體規則如下 1 字符可以作為整數參與數值運算 整數值為其ASCII碼 2 操作數為字符或短整型時 系統自動變換成整型 3 操作數為實型時 系統自動變換成雙精度型 4 其余情況 當兩操作數類型不同時 將精度低 或表示范圍小 的操作數的數據類型變換到與另一操作數類型相同再進行運算 例如有變量 charc1 c2 inti1 i2 floatx1 x2 則表達式x2 c1 i1 c1 x1 c1 c2的求值過程為 將c1轉換成整型 完成c1 i1 結果表示為t1 將c1和x1均轉換成雙精度型 完成c1 x1 結果表示為t2 將c1和c2均轉換成整型 完成c1 c2 結果表示為t3 然后t1轉換成雙精度型 完成t1 t2 結果表示為t4 將t3轉換成雙精度型 完成t4 t3 最后結果轉為單精度型賦給x2 53 2 賦值類型轉換 2 5 3結束 系統自動進行類型轉換規則 1 實型數賦給整形變量 取整 注意溢出 2 整型數賦給實型變量 先轉換為實型數 3 字符型數賦給整形變量 ASCII碼為依據 分為兩種情況 符號位是0或1時不同 若符號位為1 則低位字節不變 高位字節全部置1再賦值 4 絕對值較大的數賦給表達范圍較小的數據類型時 注意溢出 54 2 5 4強制類型轉換運算符 ok 其格式為 形式一或 形式二 作用 將表達式強制轉換為類型 但表達式的值及其類型不變 任意數據類型 55 賦值運算中 當左值與右值類型不一致時 系統將按照左值的類型 自動進行強制轉換 例如 設有以下定義doublex 2 3 y inti 2 j 1 j 2 3 x 2 3 2 2 1 j x 2 y i 由系統按左值j y類型自動完成強制轉換功能 2 y 2 i 2 2 0 2 0 2 5 4強制類型轉換運算符 56 第三章 簡單輸入 輸出 3 1cincin用來在程序執行期間給變量輸入數據 一般格式為 cin 變量名1 變量名2 變量名n cout實現將數據輸出到顯示器的操作 一般格式為 cout 57 3 1 1十進制數據的輸入輸出 請看下例 inti j floatx y cout i j Dcin x y cout則程序輸出 i 10j 20 x y 13 1輸出時各數據間是無間隔的 因此應當有意輸出一些間隔符 ok 58 3 1 2輸入字符數據cin與cin get 的區別 1 cin例如 charc1 c2 c3 cin c1 Acin c2 c3 程序執行到A行時 等待用戶輸入數據 若輸入 Abc則cin分別將字符A b c賦給變量c1 c2 c3 cin自動跳過輸入的空白字符 包括空格 制表 backspace和回車等 59 2 cin get 例如 charc1 c2 c3 c4 cin get c1 Bcin get c2 cin get c3 程序執行到B行時 若輸入 Ab則執行結果是 字符 A 空格 字符 b 分別賦給變量c1 c2 c3 輸入行中仍保留回車符 cin get 把從鍵盤上輸入的所有字符 包括空白字符 都作為輸入字符賦給字符變量 60 關于字符的輸出 請看下例 假定字符c1 c2 c3的值分別為字符 a b 和 c 執行以下語句序列 cout c1 t c2 n cout c3 endl cout O k endl 屏幕上將輸出 abcOk輸出時字符之間是無間隔的 如果想讓字符間有間隔 必須輸出間隔符 61 補充 字符串輸入輸出 向一個字符數組中輸入字符串時 用函數getline getline 以用戶按下回車鍵作為結束 在此之前的所有輸入都放入字符數組中 cin getline char int 其中第一個參數是已經定義的字符數組名 第二個參數是讀入字符的最多個數n 包括字符串結束符 0 ok 常用cout輸出字符串 雙引號中的字符串常量照原樣輸出 程序中通常通過輸出字符串常量來輸出一些提示信息 字符數組將輸出串結束符前所有字符 62 補充 字符串輸入輸出 函數保證在執行時總會為字符串的結束符保留一個字節 當鍵盤的輸入字符 字節 數多于 n 1 時 后面的字符不會進入字符數組 字符串結束符自動加在字符數組的最后一個字節中 當輸入字符數少于該值時 字符串結束符自動加在輸入到字符數組中的最后一個字符的后面 請看下例 charcity 11 cin getline city 10 輸入城市名最多5個中文字cout 城市名 city endl ok 63 如果要求按八進制或十六進制輸入輸出 在cin或cout中必須指明相應的數據形式 oct為八進制 hex為十六進制 dec為十進制 例如 inti j k l cout oct i 輸入為八進制數cin hex j 輸入為十六進制數cin k 輸入仍為十六進制數cin dec l 輸入為十進制數cout hex i hex i endl cout dec j dec j t cout k k endl cout oct l oct l cout dec endl 恢復十進制輸出狀態 ok 輸入輸出的格式控制 1 各種進制數據的輸入輸出 64 執行時輸出 Inputi oct j hex k hex l dec 此時從鍵盤輸入 0320 x3f0 xa017則輸出結果為 hex i 1adec j 63k 160oct l 21由于已經在cin中指明數制 因此從鍵盤輸入時 八進制和十六進制數可以省略其開頭的0和0 x標志 在cin或cout中指明數制后 該數制將一直有效 直到重新指明用其他數制 特別注意 輸入數據的格式 個數和類型必須與cin中的變量一一對應 否則不僅使輸入數據錯誤 而且影響后面其他數據的正確輸入 65 輸入輸出的格式控制 為了使數據間隔開 還可以用C 提供的函數setw 指定輸出數據項的寬度 例如 inti 2 j 3 floatx 2 6 y 1 8 cout ok 2 設置數據間隔 66 第4章流程控制語句 67 4 1選擇結構程序設計 對程序的運行流程進行控制 主要通過執行專門用來控制流程的語句來實現 流程控制語句也稱為過程化語句 分支語句是三種基本流程控制語句之一 C 提供以下三種分支語句 if語句條件運算符 swith語句 68 4 2 1if語句 if語句有兩種基本格式為 1 if 2 if else 69 if語句 例4 1 輸入一個年份 判斷是否閏年 算法分析 假定年份為year 閏年的條件是 year 4 0 ok 70 分析 讀入三個數 先求出兩個數中較大者 再將該大數與第三個數比較 求出最大數 includevoidmain inta b c max cout a b c coutb max a elsemax b if c max cout 最大數為 c endl elsecout 最大數為 max endl if語句 例4 2 從鍵盤上輸入三個整數 輸出其中的最大數 ok 71 if語句中 如果內嵌語句又是if語句 就構成了嵌套if語句 if語句可實現二選一分支 而嵌套if語句則可以實現多選一的多路分支情況 嵌套有兩種形式 第一種是嵌套在else分支中 if elseif 語句2 elseif else 第二種是嵌套在if分支中為 if if else if語句 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 最大數max max if語句 例3 3 用嵌套if語句完成 例3 2 的任務 ok 73 方法2 采用else中嵌套形式 includevoidmain inta b c max cout a b c coutb if語句 ok 74 要特別注意else和if的配對關系 C 規定了if和else的 就近配對 原則 即相距最近且還沒有配對的一對if和else首先配對 按上述規定 第二種嵌套形式中的else應與第二個if配對 如果根據程序的邏輯需要改變配對關系 則要將屬于同一層的語句放在一對 中 如第二種嵌套形式中 要讓else和第一個if配對 語句必須寫成 if 表達式1 if 表達式2 語句1 else語句2 第二種嵌套形式較容易產生邏輯錯誤 而第一種形式配對關系則非常明確 因此從程序可讀性角度出發 建議盡量使用第一種嵌套形式 75 請看以下兩個語句 語句1 if n 3 0 if n 5 0 cout n 是15的倍數 endl elsecout n 是3的倍數但不是5的倍數 endl 語句2 if n 3 0 if n 5 0 cout n 是15的倍數 endl elsecout n 不是3的倍數 兩個語句的差別只在于一個 但表達的邏輯關系卻完全不同 76 例4 4 某商場優惠活動規定 某種商品單價為80元 一次購買5件以上 包含5件 10件以下 不包含10件 打9折 一次購買10件以上 包含10件 打8折 設計程序根據客戶的購買量計算總價 if語句 77 算法 1 輸入購買件數count 設置單價price 80 元 2 根據count值確定折扣discount 3 實際售價amount price count discount 4 輸出amount的值 算法細化 2 1 if count 5 count 10 discount 0 8 ok 78 includevoidmain floatprice 80 discount amount 單價 折扣 總價intcount 購買件數cout count if count 5 discount 1 elseif count 10 discount 0 9 elsediscount 0 8 amount price count discount cout 購買件數 count endl cout 單價 price t 折扣 discount endl cout 總價 amount endl 請在VC 平臺上運行 輸入不同的件數 使程序所有分支都可以被執行一次 ok 79 例4 5 求一元二次方程ax2 bx c 0的根 其中系數a a 0 b c的值由鍵盤輸入 分析 輸入系數a a 0 b c后 令delta b2 4ac 結果有三種情況 若delta 0 方程有兩個相同實根 若delta 0 方程有兩個不同實根 若delta 0 方程無實根 if語句 80 算法 1 輸入系數a a 0 b c 2 令delta b2 4ac 3 根據delta的值求方程的根 4 輸出方程的根 算法細化 3 1 if delta 0 方程有兩個相同實根 計算 3 2 if delta 0 方程有兩個不同實根 計算 3 3 if delta 0 方程無實根 計算 ok 81 include includevoidmain floata b c floatdelta x1 x2 constfloatzero 0 0001 定義一個很小的常數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 方程有兩個不同實根 cout x1 x1 t x2 x2 endl else delta 0cout 方程無實根 endl 請在VC 平臺上運行 輸入不同的系數 使程序所有分支都可以被執行一次 83 3 1 2條件運算符 if語句在某些情況下可以用條件運算符 來簡化表達 是一個三元運算符 其構成的表達式格式為 執行邏輯 先計算表達式1 若其值為真 或非0 則計算表達式2 不計算表達式3 并將該值作為整個表達式的值 反之 即表達式1的值為假或為0 則計算表達式3 不計算表達式2 并將該值作為整個表達式的值 例如 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語句 用嵌套if語句可以實現多選一的情況 另外C 中還提供了一個switch語句 稱為開關語句 也可以用來實現多選一 switch 表達式 case常量表達式 語句序列 break case常量表達式n 語句序列n break default 語句序列 85 switch語句格式 1 各個case 包括default 分支出現的次序可以任意 通常將default放在最后 2 break語句可選 如果沒有break語句 每一個case分支都只作為開關語句的執行入口 執行完該分支后 還將接著執行其后的所有分支 因此 為保證邏輯的正確實現 通常每個case分支都與break語句聯用 3 每個常量表達式的取值必須各不相同 否則將引起歧義 86 4 允許多個常量表達式對應同一個語句序列 例如 charscore cin score switch score case A case a cout excellent break case B case b cout good break default cout fair 5 從形式上看 switch語句的可讀性比嵌套if語句好 但不是所有多選一的問題都可由開關語句完成 這是因為開關語句中限定了條件表達式的取值類型 ok 87 switch語句例子 例3 6 運輸公司對所運貨物實行分段計費 設運輸里程為s 則運費打折情況如下 s 250不打折扣250 s 5002 折扣500 s 10005 折扣1000 s 20008 折扣2000 s 300010 折扣3000 s15 折扣設每公里每噸的基本運費為p 貨物重量為w 折扣為d 則總運費f為 f p w s 1 d 設計程序 當輸入p w和s后 計算運費f 88 算法 1 輸入每噸運費p 貨物重量w 運輸里程s 2 根據運輸里程s計算折扣d 3 計算總運費f p w s 1 d 4 輸出計算結果 算法細化 2 根據運輸里程s計算折扣d分析 如果用switch語句 必須使表達式符合語法要求 分析發現 里程s的分段點均是250的倍數 因此 將里程s除以250 取整數商 便得到若干整數值 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 運輸單價為 p t 重量為 w t 里程為 s endl cout 折扣為 d endl cout 運費為 f endl 請在VC 平臺上運行 輸入不同的里程 使程序所有分支都可以被執行一次 ok 91 例3 7 設計一個計算器程序 實現加 減 乘 除運算 分析 讀入兩個操作數和運算符 根據運算符完成相應運算 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 是無效運算符 常量表達式采用字符型 上機運行一下 92 循環控制語句是三種基本流程控制語句之一 C 提供以下三種循環語句 while語句do while語句for語句 4 3循環結構程序設計 93 4 3 1while語句 while語句也稱為當循環 語句格式為 while 表達式 循環體語句 圖3 1while語句的執行流程圖 求表達式的值 表達式值為真 是 否 執行循環體語句 94 while語句 例4 8 求1 2 3 4的值 ok N個連續整數相加算法1 設置變量i用來放被加數 變量sum用來放和值 并初始化 2 從第一個數開始 依次將被加數賦給i 并進行操作sum sum i 3 輸出sum 細化算法2 while 還有被加數 i 當前被加數 sum i i準備接受下一個被加數 95 源程序如下 includevoidmain inti 1 sum 0 循環初始條件while i 4 sum i i 修改循環條件 cout sum sum endl 在VC 平臺上運行 試一試是否正確 ok 96 while語句 注意 在有循環語句的程序中 通常循環開始前對循環條件進行初始化 而在循環體語句中要包含修改循環條件的語句 否則循環將不能終止而陷入死循環 C 表達方式靈活 上例中的循環語句還可以寫成 while i n sum i 或者while sum i i n 循環體為空語句修改程序后在VC 平臺上運行 看是否正確 97 4 3 2do while語句 do while語句稱為直到循環 格式為 do循環體語句while 表達式 否 是 表達式的值為真 執行循環體語句 求表達式的值 圖3 2do while語句的執行流程圖 98 do while語句 do while語句和while語句的區別 多數情況下可以互相替代 區別是do while語句至少執行一次循環體后再判斷循環條件是否滿足 while語句先判斷條件是否滿足 然后才執行循環體 99 例4 9 輸入一段文本 統計文本的行數 單詞數及字符數 假定單詞之間以空格或跳格或換行符間隔 且文本開始沒有空行 算法分析 1 逐個讀入文本中的字符 直到讀到一個輸入結束符EOF為止 2 如何算行數 行結束標志為讀到字符 n 3 如何算單詞數 設一個變量isword 讀到字符時isword 1 讀到間隔符時isword 0 如果讀到一個間隔符而此時isword值為1 則說明剛讀完一個單詞 如果讀到一個字符而此時isword值為0 則說明剛開始讀一個單詞 4 如何算字符數 do while語句 ok 100 算法 1 設置變量line word ch分別代表行數 單詞數 非分隔字符數 并初始化 設置變量isword來輔助統計單詞數 2 do 從鍵盤讀入一個字符c if c n line if 是單詞開頭 word if c不是分隔符 ch while c EOF 3 輸出統計結果 將下面的程序在VC 平臺上運行 試一試是否正確 101 includevoidmain charc intline 0 word 0 ch 0 ch為非分隔字符數intisword 0 do c cin get if c n line 遇換行符行數 1if c 102 4 3 3for語句 for循環語句的格式為 for ok 103 for語句 while語句 do while語句實現相同的功能 1 2 3 4 inti 1 sum 0 循環初始條件while i 4 sum i i 修改循環條件 inti 1 sum 0 循環初始條件do sum i i 修改循環條件 while i 4 for inti 1 sum 0 i 4 i sum i 習慣上 表達式1 循環初始條件 表達式2 循環終止條件 表達式3 修改循環條件 ok 104 for語句的應用 for語句的幾點說明 1 是先判斷型的 同while語句 2 使用更為靈活 三個表達式可以是任意表達式 因此他們就可以實現循環初始化 計算 修改循環條件等任務 而不一定非在循環體中進行 105 for語句的應用 例4 11 設計程序輸出Fibonacii數列的前20項 要求每行輸出5個數據 Fibonacii數列定義如下 算法分析 除了第0項和第1項外 每一項都是由類似方法產生 即前兩項之和 所以求當前項時 只需要記住前兩項 程序不需要為每一項設置專用變量 屬遞推算法 106 算法 1 設置變量n表示第幾項 變量f1和f2用來記住當前項f3之前的兩項 變量初始化n 0 2 while 當前項不到第20項 if 當前項是第0項 f1 0 if 當前項是第1項 f2 1 if 當前項是第2項或更高項 f3 f1 f2 按要求輸出f3 f1 f2 f2 f3 記住最近兩項當前項后移一位 107 例3 11 設計程序輸出Fibonacii數列的前20項 要求每行輸出2個數據 Fibonacii數列定義如下 程序如下 文件名 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個數據fib0 fib1 fib1 fib2 108 for語句的應用 在VC 平臺上運行運行結果 01123581321345589144233377610987159725844181 109 例4 12 輸入一個不超過5位的整數 將其反向后輸出 例如輸入247 變成742輸出 算法分析 1 將整數的各個數位逐個位分開 用一個數組保存各個位的值 然后反向組成新的整數 2 將整數各位數字分開的方法是 通過求余得到個位數 然后將整數縮小十倍 再求余 并重復上述過程 分別得到十位 百位 直到整數的值變成0為止 for語句的應用 ok 110 數據 1 設置變量num表示輸入的整數 整型數組digit 5 用來存放num的各個位 變量i用來表示數組的當前下標 算法 1 輸入num 變量初始化 i 0 2 while num 0 num對10取余 得num的當前個位數digit i num整除10 即去掉個位數 十位變個位 百位變十位 i 數組digit準備記錄下一位 3 將數組元素按下標從高到低的順序輸出 111 程序如下 includevoidmain intnum subscript intdigit 5 cout num cout0 for inti 0 i subscript i 整數的反向組合num num 10 digit i cout 反向后整數為 num endl 在VC 平臺上運行 試一試是否正確 112 4 3 5循環的嵌套 例3 13 打印九九表 打印格式為 123456789112243369 991827364554637281 當循環語句中的循環體中又有循環語句時 就構成了嵌套循環 嵌套層次一般不超過3層 已保證可讀性 113 循環的嵌套 分析 1 計算機的輸出是按行進行的 因此可以先用一個循環語句輸出第一行表頭 2 表中各行數據的輸出可以用下面的算法描述 for i 1 i 10 i cout i 輸出行號輸出第i行數據 Acout endl 準備輸出下一行 114 3 第A行需要進一步細化 由于第i行數據是一組有規律的數列 每個數的值是其所在行與列的乘積 因此輸出第i行可以 for j 1 j 10 j cout setw 4 i j 4 按上述算法輸出的每一行都將有九列 即打印出的是矩形表而不是下三角形表 進一步分析發現每一行的列數與所在行數相關 因此要輸出三角形表 上面的循環語句需稍作修改 for j 1 j i j cout setw 4 i j 將此語句放到頂層算法的A行即可 循環的嵌套 115 算法 1 輸出表頭 用一個循環語句即可 2 輸出表體 for i 1 i 10 i cout i 輸出行號輸出第i行數據 Acout endl 準備輸出下一行 3 A行細化 for j 1 j i j cout setw 4 i j 循環的嵌套 116 在VC 平臺上運行下面的程序 include includevoidmain cout setw 3 setw 4 for inti 1 i 10 i cout setw 4 i 輸出表頭 乘數 cout endl endl for i 1 i 10 i cout setw 3 i setw 4 輸出行號 被乘數 for intj 1 j i j cout setw 4 i j 輸出表中數據 乘積 cout endl 準備輸出下一行 3 2 4循環嵌套 打印九九表 117 4 4轉向語句 4 4 1break語句 4 4 4return語句 4 4 3goto語句 4 4 2continue語句 118 4 4 1break語句 break語句只能用在switch語句和循環語句中 用來跳出switch語句或提前終止循環
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 拉丁舞培訓學校管理制度
- 日式冰箱存貨管理制度
- 施工企業結算管理制度
- 《二年級下冊語文第六單元古詩二首》課件
- 勞動法規定休假管理制度
- 【課件】細胞呼吸的原理和應用課件-2024-2025學年高一上學期生物人教版(2019)必修1
- 中班健康教育洗臉教案講課件
- 巷道掘進與支護 安全爆破 爆破安全
- 化痰藥機制講課件
- 亞健康教育講課件
- 304不銹鋼管材質證明書
- 預拌混凝土及原材料檢測理論考試題庫(含答案)
- 公開招聘社區居委專職工作人員考試筆試、面試題集及相關知識(11套試題含答案)
- 《植物生理學》課件第三章+植物的光合作用
- 游泳館網架翻新施工組織方案設計
- 有機化學所有的命名--超全.
- 引水罐的設計計算
- 三年級譯林版英語下學期按要求寫句子專項強化練習題
- 電纜接線工藝設計規范流程
- 中醫經絡減肥課件
- 5WHY分析法培訓
評論
0/150
提交評論