




已閱讀5頁,還剩430頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計請大家邊動手邊觀看 第一章計算機語言與C語言概述 1 1計算機語言概念 計算機語言定義計算機能夠識別和接受的語言 要使計算機按自己的意圖工作 必須使用計算機所能接受 理解和執行的指令指揮計算機工作 計算機語言的種類機器語言低級語言匯編語言 面向計算機 BASIC入門語言F77科學計算高級語言Foxpro數據庫管理 面向問題 C多用途 計算機語言 機器語言最早問世 用二進制代碼構成指令 如 100000 110000 用機器語言編程的缺點 繁瑣 不直觀 不易調試 如計算y 2x2 3x 1需要七八條指令 移植性差 依賴于計算機 匯編語言用符號構成指令 如 MOV ADD用匯編語言編程 相對直觀 但仍繁瑣 仍是面向計算機的語言 匯編語言是計算機間接接受的語言 高級語言與低級語言相比 有根本性的區別 是面向問題的語言 高級語言的一條指令 語句 y 2 x x 3 x 1 對應于 y 2x2 3x 1y sin x 對應于 y sinx用高級語言編程 直觀 易懂 移植性好 不依賴于具體計算機 上機運行高級語言程序需經過編譯 編譯執行要上機完成一個計算問題 主要的任務就是用高級語言編寫出相應的源程序 即至少要學會一種計算機語言 高級語言源程序 機器指令目的程序 結果 編譯程序 1 2C語言的特點集高級語言和低級語言的優點于一身 能實現低級語言的大部分功能 如直接訪問內存物理地址 進行位操作等 圖形功能強 運算符和數據結構豐富 語法限制不太嚴格 程序設計自由度大 生成目標代碼質量高 程序執行效率高 1 3簡單的C程序介紹例1 main 主函數說明 程序框架printf abcdef 函數體 語句程序的功能是輸出字符串 abcdef 例2 求兩數之和 main inta b c aa 100 b 50 bc a b cprintf nc d c 程序運行結果 c 150 例3 求兩數中的最大值 函數類型函數名形參main intmax intx inty inta b c intz scanf d d axbycz 兩個函數組成 3 5 3 5 5 5 總結上例可知 1 C程序由函數構成 2 函數由兩部分組成 函數說明部分 函數名 函數類型 形參名 形參類型 函數體 實現函數的具體操作 由語句構成 3 程序總是從main函數開始執行 4 書寫格式自由 5 語句必須有分號 第二章算法2 1算法的概念要利用計算機處理問題 光學習語言的語法規則還不夠 最重要的是要學會針對各類型的問題 擬定出有效的解題方法和步驟 解題方法和步驟就是算法 算法 為了解決一個問題而采取的有限步驟 計算機算法 如何使計算機一步一步地工作的具體過程 利用計算機處理問題的步驟 1 設計好算法 算法設計 2 用計算機語言實現算法 程序設計 算法必須是 有效 的 算法設計還要充分考慮算法的好壞 衡量算法好壞的主要標準 程序簡練 執行速度快 占空間少 例 考慮的算法 算法 直接表達 直接用語句s 1 2 3 4 5 6 7 8 9 10 當項數較多時該算法不適用 s i 1 10 算法 迭代法 累加求和法 s 1 2 3 4 5 6 7 8 9 10算法步驟 si 使s 0 使i 1累加器記數器 s i s i 1 i 若i 10轉 否則轉 輸出s 0 1 1 2 3 3 6 4 10 5 該算法通用 是好算法 2 2算法的表示算法需要有統一的表示方法常用的表示方法有 自然語言流程圖結構化流程圖N S流程圖 1 自然語言對于計算s 1 2 3 4 5 6 7 8 9 10用自然語言表示為 使s 0 s為累加器 使i 1 i為計數器 s i s 累加求和公式 i 1 i 計數器加1 若i 10轉 否則轉 輸出s的值特點 通俗易懂 文字冗長 含義不大嚴格 2 流程圖用流程圖符號表示算法 常用的流程圖符號起止框輸入輸出框處理框流程線判斷框 對于計算s 1 2 3 4 5 6 7 8 9 10用流程圖表示為 s i s i 1 i S i s S i s i 10 輸出s 0 s 1 i 直觀形象 易于理解 次序清楚 Y N 3 結構化流程圖傳統的流程圖有一個弊端 對流程線沒有嚴格的限制 對于較復雜的算法可能會變成亂麻一般 BS型算法 為克服這一弊端 提出了由三個基本結構組成算法流程圖的思想 結構化流程圖 三個基本結構 順序結構按固定順序 從上到下或從左到右 執行的結構 A B a b 選擇結構根據條件P選擇執行哪一個分支 成立不成立 p A B a b 成立 不成立 例 計算y 1 x當x 0時y 10000當x 0時的算法流程圖圖 選擇結構 輸入x X 0 10000 y 1 x y 輸出y Y N 循環結構重復執行某些操作的結構 分為兩種 當型循環和直到型循環 當型循環直到型循環 P1 A A P2 a a b b Y Y N N 可以看出 每個基本結構都只有一個入口和一個出口 因此 用三個基本結構構成的流程圖不會象亂麻一般 用三個基本結構構成的流程圖就成為結構化流程圖 用結構化流程圖描述的算法稱為結構化算法 相應的程序設計就稱為結構化程序設計 觀察前例 0 s 1 i S i s i 1 i i 10 輸出s 順序結構 循環結構 y n 4N S流程圖N S流程圖的三個基本結構 A B P 成立 不成立 A B A B 當P1 直到P2 順序結構 選擇結構 循環結構 例 計算y 1 x當x 0時y 10000當x 0時的N S流程圖 輸入x X 0 是 否 10000 y1 x y 輸出y 例 計算s 1 2 3 4 5 6 7 8 9 10的N S流程圖 i 10直到i 10直到型當型 0 s 1 i 輸出s 1 i 0 s s i s i 1 i s i s i 1 i 輸出s 第三章數據類型 運算符與表達式3 1C的數據類型 基本類型 整型 實型 字符型 枚舉型 構造類型 略 指針類型 略 空類型各類型包含常量與變量 3 2常量與變量 常量與符號常量常量在程序運行過程中其值保持不變的量 符號常量用來代表一個常量的標識符 definePI3 1415926 例 definePI3 1415926main floatr 2 c c 2 PI r printf f c 變量其值可以改變的量 變量的三要素 變量名每個變量有一個名字 作為識別該變量的標識符 變量的值每個變量有一個值 變量的值是隨時可以改變的 變量的存儲單元每個變量占據一個內存單元 用于存放變量的值 變量名a變量值存儲單元 3 變量的命名規則 由字母 數字和下劃線組成以字母或下劃線開頭a x1 y 2 b1 1c合法1x a 2 不合法變量必須先定義后使用 程序中何時使用常量 何時使用變量 3 3整型數據 整型常量即整常數 c的整常數有三種形式 十進制整數與數學中的整數一致 如 100 123 15等 八進制整數以0開頭的整數 如 010 07 020等 十六進制整數以0 x開頭的整數 如 0 x10 0 xff 0 x2a等 整型變量用于存放整數的變量 分4種類型 基本型 inta16位 可表示的數值范圍 32768 32767 短整型 shortintb16位 可表示的數值范圍 32768 32767 長整型 longintc32位 數值范圍 2147483648 2147483647 無符號型 加上unsigned只存放正數 如 unsignedintx變量x為無符號整數 16位全表示數碼 數值范圍 0 65535在程序設計中 如果要使用整型變量 必須首先選擇以上類型符來定義變量 然后才能使用 例 main 定義 inta b c a 100 b 50 使用c a b printf d c 一般根據什么原則選擇變量的類型 3 4實型數據 實型常量可使用兩種形式表示 小數形式 如1 23 3 141592615 48 指數形式 如1e 201 23e5 實型變量用于存放實數的變量分單精度和雙精度兩種 floata b定義a和b為單精度型變量32位 7位有效數字 10 38 1038doublex y定義x和y為雙精度型變量64位 15位有效數字 10 308 10308 例 main floatr c doubler c r 5 c 2 3 1415926 r printf f c 3 5字符型數據 字符常量用單引號括起來的一個字符 a x 1 等除此外 以 開頭的字符如 n t 等稱為轉義字符 祥見書表3 3 字符型變量用于存放字符的變量 charc1 c2定義c1和c2為字符型變量c1 a c2 b 字符賦值字符型變量存放一個字符 占據一個字節 字符型數據的存儲形式存放ASCII碼不是而是如字符 a 在內存中存放97 b 存放98 與整數的存儲形式一致 它們之間可以通用一個字符數據既可以作字符用 也可以作整數用 取其ASCII代碼 如 32 a 相當于32 97若intx charc 則x a c 97 x 97 c a 都允許 a 97 字符串常量用雙引號括起來的字符序列 如 abcde china a 也屬字符串 注意 a 與 a 的區別 對于 charc c a 用法錯誤 字符串中每個字符各占一個字節 并且在字符串結尾加上一個結束標記 0 如 china 在內存中占6個字節 china 0C語言中專門的字符串變量 可用字符數組存放 以后介紹 3 6變量賦初值在定義變量的同時給相應的變量賦初值 如 inta 3 afloatb 5 2 charc a intx y z 6 效果 在給變量分配內存單元的同時在相應的單元中存放初值 3 3 7各數值型數據間的混合運算整型 實型 字符型數據間可以進行混合運算 如 10 a 1 5運算時 參加運算的兩個數據如果類型不同 則首先將其類型轉換成一致再運算 轉換規則是 將優先級低的類型轉換到優先級高的類型 數據類型的優先級 高doublefloatlongunsignde低intchar 3 8算術運算符與算術表達式 基本的算術運算符 算術表達式用算術運算符將運算對象連接起來的式子用于表達數學公式的式子如 2 x y 1 a表達式經過運算最終得到一個值 算術表達式的值 運算符的優先級與結合性優先級 在對表達式求值時 如果存在多個運算符 則運算的先后次序按運算符的優先級別從高到底進行 運算符的優先級關系為 高 低 如 a 2 x先算 2 a 2 有括號的情況 結合性 如果在一個運算對象兩邊的運算符的優先級相同 則按規定的 結合方向 處理 如 a b cb與 結合是從左到右 稱 左結合性 b與 結合是從右到左 稱 右結合性 每個運算符都有相應的優先級和結合性 基本算術運算符都是左結合性 計算表達式例 2 A 1 2 01 3 2 1構造表達式例2x2 3x 1 a ba b a ba bx yx y a b a b a b a b 2 x x 3 x 1 不能省 a b a b x y x y a b a b x y x y a b a b x y x y 強制類型轉換可以用強制類型轉換運算符將一個表達式的值轉換成所需類型 如 int x y float 7 3 應用舉例 inta 200 b 300 c c a b 100 可知 有自動轉換和強制轉換 當自動轉換達不到目的時 可用強制轉換 c long a b 100 c long a b 100 自增 自減運算符自增運算符 使變量值加1自減運算符 使變量值減1兩種用法 i i先加 減 后用i i 先用后加 減 兩種用法對i效果一樣 但表達式的值不同 例 假設i的原值為5 j i j j i j 注意 和 只能用于變量 如 3 和 a 1 不合法 和 為右結合性 i i i 若i的原值是5 則該表達式的值是多少 例 分析執行下列語句后的結果 a 5 abcdb a c a b d a b c 5 5 6 5 0 6 7 2 6 1 兩種特殊情況 k i i i i j是i j 還是 i j i 雖然與i i 1等效 但使用自增自減運算符的代碼優化程度好 因而經常使用 但用時需特別小心 3 9賦值運算符和賦值表達式 賦值運算符 稱賦值運算符 其作用是將一個數據賦給一個變量 如 a 5不要理解為 等號 執行賦值運算的結果 是將右邊的數據存入左邊變量所對應的內存單元中 賦值規則如果賦值運算符兩側的類型不一致 則在賦值時要進行類型轉換 轉換規則為 實型 整變量舍去小數部分 inta 5 5 a中為5 整型 實變量數值不變 以浮點形式存儲 字符型 整變量放在整形變量低8位 保持原值不變原則 inta A 復合賦值運算符在賦值運算符前加上其它運算符 可以構成復合賦值運算符 a 3 a a 3b x 5 b b x 5 x c 6 x x c 6 y a 4 y y a 4 k b 2 k k b 2 屬于高效率運算符 賦值表達式主要實現賦值運算的表達式 一般形式 如 a 5y 2 x 3a a 1不是衡等作用 將右邊表達式的值賦給左邊的變量 賦值表達式的值取左邊變量的值 賦值表達式右邊的可以是任何表達式 如 a b 5 賦值表達式中包含賦值表達式賦值運算符的優先級低于所有算術運算符 且是右結合性 a b 5 與a b 5等效 例 計算以下表達式的值 a b c 5a 5 c 6 a b 4 c 6 a b 4 5 c 6 5 a b c為整型變量 a a a a 設a的原值為3 賦值表達式是C語言中的一個重要成分 在賦值表達式后加一分號就成為常用的賦值語句 如y 2 x 1 賦值表達式作為表達式的一種 可以出現在任何表達式中 如 x 2 b 3 a k 5 b 3 10逗號表達式逗號也是一種運算符 用它對兩個表達式實現連接運算 3 5 6 8稱逗號表達式 逗號表達式的一般形式 表達式1 表達式2取表達式2的值作為整個逗號表達式的值 如 a 3 5 a 4逗號表達式的值為 60 一個逗號表達式又可以與另一個表達式組成一個新的逗號表達式 如 a 3 5 a 4 a 5因此 逗號表達式的一般形式可以擴展為 表達式1 表達式2 表達式3 表達式n取表達式n的值作為整個逗號表達式的值 逗號運算符的優先級最低 且是左結合性 逗號運算符只起到連接作用 沒有實際操作 第四章最簡單的C程序設計 C程序最基本的成分是語句目前我們已掌握的語句 變量說明語句 inta b c 表達式語句 x y 特別地 a 5 賦值語句 可以編寫簡單程序如 main intx y x 5 y 2 x x 3 x 1 該程序語法上完整 但還缺少輸出 數據的輸出用輸出函數實現 其中的兩種輸出函數 1 putchar函數 字符輸出函數 用于輸出一個字符 如 putchar a putchar 100 charc b putchar c 例 輸出單詞Boy的完整程序 include stdio h 注意該語句的作用main chara b c a B b o c y putchar a putchar b putchar c 2 printf函數 格式輸出函數 任意類型 任意格式 任意個數 例如 inta 100 b 56 printf a d b d a b 普通字符格式說明格式控制輸出表列輸出結果 a 100 b 56 后的字符稱格式字符 不同格式字符對應不同的數據類型 d格式符 按整數格式輸出幾種用法 d不指定寬度 按實際寬度輸出 md按指定寬度輸出 m為寬度 ld用于輸出長整型數 例 inta 125 b 453 longc 65535 printf a d b 5d c ld a b c 輸出結果 a 125 b 453 c 65535 ld也可以按指定寬度輸出 printf c 8ld c 輸出結果 c 65535注意 格式字符的類型要與對應的輸出對象的類型一致 c格式符 用于輸出字符charc A printf c c c c B 輸出結果 c A B輸出對象既可以是字符變量 字符常量 還可以是整型表達式 如 inta 100 charb A printf n d c a a printf n c d b b 輸出結果 100 dA 65 s格式符 用于輸出字符串 s不指定寬度 ms指定寬度 左靠齊 ms指定寬度 右靠齊 m ns指定寬度m 只取左端n個字符 右靠齊 m ns指定寬度m 只取左端n個字符 左靠齊 例 printf 1 s abcd printf 2 8s abcd printf 3 8s abcd printf 4 8 3s abcd printf 5 8 3s abcd 1 abcd2 abcd3 abcd4 abc5 abc f格式符 按小數形式輸出實數 f由系統指定寬度 6位小數 m nf指定寬度m 小數位數n 右靠齊 m nf指定寬度m 小數位數n 左靠齊注意 寬度包括符號和小數點 例 floata 3 141592654 b 14 326795 c 125 2468 printf na f b 8 3f c 10 2f a b c 輸出結果 a 3 141592 b 14 326 c 125 24 完整前面的程序 main intx y x 5 y 2 x x 3 x 1 printf ny d y 程序設計例 編寫程序計算如圖中的電流I 假設U 220 R1 30 R2 60 R3 45 U I R1 R2 R3 算法設計 I U R1 U R2 U R3程序設計 main I U R1 U R2 U R3 intU 220 R1 30 R2 60 R3 45 floatI printf nI f I 正確的程序 main intU 220 R1 30 R2 60 R3 45 floatI I float U R1 float U R2 float U R3 printf nI f I 考慮通用 main intU R1 R2 R3 floatI 輸入U R1 R2 R3I float U R1 float U R2 float U R3 printf nI f I 數據的輸入getchar函數 字符輸入 include stdio h main charc c getchar 等待鍵盤輸入putchar c scanf函數 格式輸入 與printf函數相反 用于輸入若干任意類型的數據 scanf d d d 格式控制地址列表 scanf d d d 執行此函數時 等待從鍵盤輸入三個整數給a b c若從鍵盤輸入358則系統即從鍵盤緩沖區取出這三個數分別賦給a b c注意與printf的區別 注意格式的匹配 如 scanf 3d 2d 4d 在鍵盤輸入時 用分隔符把每個數據隔開 標準的分隔符是空格 如 12315023若想用逗號作分隔符 則 scanf d d d 不要隨便使用普通字符 如使用 scanf a d b dc d a b c 對應數據輸入 a 123 b 150 c 23 前面的歐姆定律 main intU R1 R2 R3 floatI scanf d d d d 求三角形面積 include math h main floata b c area s scanf f f f 使用數學函數 使用三角函數 include math h main floatx y scanf f 第五章選擇結構程序設計 對于如下的函數計算 算法上屬于一個選擇結構 y 用于實現選擇結構的主要是if語句 1 x當x 0時 10000當x 0時 if語句的最常見形式為 if 關系表達式 語句1 else語句2 如 if x 0 y 1 x elsey 10000 其中x 0就是一個關系表達式 就是一個關系運算符 5 1關系運算符和關系表達式1 關系運算符用于進行比較運算的運算符 共有六種 優先級與結合性 前4種大于后兩種 低于算術運算符而高于賦值運算符 左結合性 2 關系表達式一般形式 表達式 關系運算符 表達式 如 a ba b b c經過關系運算后最終有一個值 關系表達式的值 關系表達式的值只有0 假 或1 真 例 設a 2 b 4 c 1計算以下關系表達式的值 a ba b b c a b 可以是字符表達式 x 2 y 5 可以是賦值表達式 a b c 甚至可以是關系表達式a b b c 例 假設x 3 y 5 z 1 計算以下關系表達式的值 x z yxz x zy x z x y 2 x 1 5 2邏輯運算符和邏輯表達式有時 只用一個簡單的關系表達式無法完整地表達一個條件 如 y 其中的條件需要用邏輯表達式來表達 x 0 a 0 就是一種邏輯運算符 1 x 1 a當x 0 a 0時 10000其它 1 邏輯運算符 邏輯與兩個操作數都為真時 運算結果為真 邏輯或兩個操作數之一為真時即為真 邏輯非 單目運算 操作數為真 假 時為假 真 如 若a 2 b 3 c 0則 a b b c0a b b c1 a b 0 優先級 由高到低 邏輯非算術運算符關系運算符 邏輯與 邏輯或賦值運算符 結合性 左結合性 2 邏輯表達式實際上 前面所舉例子即為邏輯表達式 a b b ca b b c a b 邏輯表達式的值同樣只有1和0 但參加邏輯運算的操作數可以是任意類型的數據 可以是任意大小 例 a b b c是合法的邏輯表達式 此時以0代表假 非0代表真 例 設a 2 b 3 c 0 計算以下表達式的值 a bb ca c a c b c c a b bc 10 對于邏輯表達式的兩種基本技能 邏輯表達式的計算 邏輯表達式的構造 邏輯表達式的構造舉例 a b ca和b之一為0 但不同時為0 a b c5 4 3 a b b c a 0 b 0 a 0 b 0 a b 0 a b 0 a b 0 對于a 0 b 0 a 0 b 0a 0可以用 a代替a 0可以直接用a a b a b但必須是運算結果作為邏輯量的情況下 y a 0 與y a不等效 5 3if語句1 if語句的三種形式 if 表達式 語句 有一分支為空 scanf d if 表達式 語句1 else語句2 if x 0 y 1 x elsey 10000 if 表達式1 語句1 elseif 表達式2 語句2 elseif 表達式3 語句3 else語句n if score 100 printf A elseif score 90 printf B elseif score 80 printf C elseif score 70 printf D elseif score 60 printf E elseprintf F 對于 1 x當x 0時 10000當x 0時 一般用 if x 0 y 1 x elsey 10000 也可用 y 10000 if x 0 y 1 x y y 1 x if x 0 y 10000 例 習題5 5 x x 1 2x 1 1 x 10 3x 11 x 10 y main floatx y scanf f 說明 語句中的表達式可以是任意表達式 if x y 1 x elsey 10000 一個if結構不可分割 if x y 1 x z 10 elsey 10000 一個分支中包含多個語句時 要用 if a 0 x 1 y 2 else x 10 y 20 分支程序設計舉例 基本技巧和算法 例 從鍵盤輸入三個整數到變量a b c 輸出其中最大的數 兩種典型算法 枚舉法 將各種可能性枚舉出來 選擇法 先假設后判斷更新 選擇法main inta b c max scanf d d d 例 從鍵盤輸入三個整數到變量a b c 要求按從大到小的順序輸出 兩種典型算法 枚舉法 將各種可能的排列枚舉出來 換位法 將a b c中的數據換位 換位法main inta b c t scanf d d d 3 5 8 5 3 8 5 5 3 a b c 2 if語句的嵌套在if語句中 又包含一個或多個if語句 if score 80 if score 90 printf A elseprintf B elseif score 60 printf C elseprintf D 注意else與if的匹配 3 條件運算符如果兩個分支的內容都是給同一個變量賦值 則可用簡單的條件運算符處理 if a b max a elsemax b 可用 max a b a b 賦值運算符右邊為一條件表達式 條件表達式的一般形式 表達式1 表達式2 表達式3 條件表達式的執行過程 a b a b優先級 低于關系運算符 高于賦值運算符 結合性 右結合性 表達式1 條件表達式取表達式3的值 條件表達式取表達式2的值 非0 0 例 求a b c中的最大值 max a b a c a c b c b c 5 4switch語句 多分支 適用于根據一個表達式的值就可確定走哪個分支的情況 switch 表達式 常量表達式1 語句1常量表達式2 語句2 常量表達式n 語句ndefault 語句n 1 例 成績分檔 switch score 10 case10 printf A case9 printf B case8 printf C case7 printf E case6 printf F default printf G 注 應使用break switch score 10 case10 printf A break case9 printf B break case8 printf C break case7 printf E break case6 printf F break default printf G 5 5程序舉例 習題5 10 有4個圓塔 圓心分別為 2 2 2 2 2 2 2 2 圓半徑為1 這4個塔的高度為10m 塔以外無建筑物 今輸入任一點的坐標 求該點的建筑高度 塔外的高度為0 算法設計 條件 在某一圓內 在圓1內或在圓2內或在圓3內或在圓4內 若設變量c1 c2 c3 c4分別代表是否在相應的圓內 則以上條件為 c1 c2 c3 c4 10在某一圓內 0在圓外 x y h c1 x 2 2 y 2 2 1c2 x 2 2 y 2 2 1c3 x 2 2 y 2 2 1c4 x 2 2 y 2 2 1 main inth c1 c2 c3 c4 floatx y scanf f f 第六章循環控制6 1概述所謂循環控制 就是如何實現循環結構的控制問題 有4種方法 用goto語句和if構成循環 用while語句 用do while語句 用for語句 6 2用goto語句和if語句構成循環例 對于計算s 1 2 3 4 5 6 7 8 9 10 0s 1i s i s i 1 i i 10 輸出s y n s 0 i 1 lable s i i if i 10 gotolable printf d s 語句標號 無條件轉向語句 goto語句可以構造循環 但不主張用 因為它容易破壞結構化程序設計 goto語句可以構造循環 但不主張用 因為它容易破壞結構化程序設計 6 3while語句while語句是專門用于實現循環控制的語句之一 其一般形式為 while 表達式 語句含義 當表達式的值為非0時 執行循環體 否則執行后續語句 語句關鍵 表達循環條件的表達式 循環體 語句關鍵字 執行過程 while 表達式 語句 表達式 循環體 0 非0 i 10 s 0i 1 s s ii i 1 例 用while語句實現前面算法 main inti 1 s 0 while i 10 s s i i printf n d s 注意與if語句的區別 循環體中要有使循環條件趨于成立的條件 y n while i 10 s s i i 可簡寫為 while i 10 s i 非0 真 0 假 表達式 循環體 6 4do while語句do while語句主要用于實現直到型循環 其一般形式為 do循環體while 表達式 執行過程 真 s 0i 1 i 10 s s ii i 1 假 例 用do while語句實現前面算法 main inti 1 s 0 dos i while i 10 printf n d s 注意與while語句的區別 假 表達式2 求解表達式1 循環體 求解表達式3 真 6 5for語句for語句是一種使用最為靈活 并且是用得最多的循環控制語句 其一般形式為 for 表達式1 表達式2 表達式3 循環體大體含義 對于 的情況執行循環體內容 例 用for語句實現前面的算法 s 0 for i 1 i 10 i s i 標準形式 表達式1 表達式2 表達式3 循環體 可以理解 循環變量i從初值1開始到終值10 步長為1 重復執行循環體 for語句的常見變化 s 0 i 1 for i 10 i s i s 0 for i 1 i 10 s i s 0 i 1 for i 10 s i 省略表達式1 省略表達式3 省略表達式1和3 s 0 i 1 for s i if i 10 break s 10 i 10 for i s i 省略表達式2 表達式2是任意表達式 s 0 for i 1 j 10 i j i j s i j 12345678910在程序設計中不要過分追求它的多變性 i j 用逗號表達式 例 求n n 1 2 3 n 1 n參照累加求和main inti n 5 s 1 for i 1 i n i s i printf ns d s 注意s的初值 注意當n較大時的情況 求和與連乘都是最常用的算法 要熟練掌握 例 求自然數1 100中能被3整除的數之和 main inti s 0 printf n d s 求能被3整除但不被7整除的數之和 for i 1 i 100 i s i for i 1 i 100 i if i 3 0 s i for i 3 i 100 i 3 s i for i 3 i 100 i 3 if i 7 s i 例 求任意100個數中的最大值 main inti a max max for i 1 imax max a printf nmax d max 循環體中沒有引用循環變量 i的作用 求任意個數中的最大值 for i 1 i if a 9999 break max 32768 外重循環 內重循環 執行200次 要掌握多重循環執行的全過程 6 6循環的嵌套循環體內又包含另一個完整的循環結構 多重循環 for i 1 i 10 i for j 1 j 20 j s i j 以上多重循環結構可以簡寫為 for i 1 i 10 i for j 1 j 20 j s i j 例 找出行號乘以列號等于100的座位 main inti j for i 1 i 30 i for j 1 j 20 j if i j 100 printf n d d i j 注意循環的關系 例 百錢買百雞問題 給定100塊錢 要求正好買100只雞 已知公雞5元 只 母雞3元 只 小雞1元 3只 問公雞 母雞和小雞應各買多少只 若考慮用方程組 x y z 1005x 3y z 3 100是一多解問題 用測試法求解的程序 main intx y z for x 1 x 100 x for y 1 y 100 y for z 1 z 100 z if x y z 100 程序可進一步簡化為 main intx y z for x 1 x 20 x for y 1 y 33 y z 100 x y if 5 x 3 y z 3 0 100 printf n d d d x y z 用測試法求解問題的典型例子 測試法求解的程序設計有兩個要點 通過循環列出所有可能的解 對所有列出的可能的解進行條件測試 例 判斷一個數m是否為素數 main inti m scanf d 用測試法求解 例 習題6 6 打印出所有的 水仙花數 所謂 水仙花數 是指一個三位數 其各位數字的立方和等于該數本身 如 153是一水仙花數 因為153 13 53 33 main inti j k n for n 100 n 999 n i j k if i i i j j j k k k n printf n d n 通過循環列出n的所有可能的范圍 i n 100 k n 10 j n 10 10 main inti j k n for i 1 i 9 i for j 0 j 9 j for k 0 k 9 k n i 100 j 10 k if i i i j j j k k k n printf n d n 通過循環列出i j k的所有可能的范圍 例 習題6 4 求S i 1 2 3 4 19 20 20 i 1 main inti j floatt s 0 for i 1 i 20 i s printf ns f s 用兩重循環實現 s t t 1 for j 1 j i j t j 用遞推法 遞推公式 ti ti 1 i 求S i 1 2 3 4 19 20 20 i 1 1 i 1 i 1 ti 1 i 20 i 2 20 i 2 main inti j floatt 1 s t for i 2 i 20 i t t i s t printf ns f s 例 遞推公式 s i 1 1 20 1 2 3 4 20 11111 ti ti 1 i main inti j floatt 1 s t for i 2 i 20 i t t i s t printf ns f s t t i 習題6 3 s a aa aaa aaaa aaaaa2 22 222 2222 22222遞推公式 ti ti 1 ti ti 1 10 a main inti j a 2 floatt a s t for i 2 i 5 i t t 10 a s t printf ns f s 例 求方程2x3 3x2 4x 1 0的根 簡單迭代法基本思想 將原方程f x 化為 x2 g x1 x2 2x13 3x12 1 4迭代公式 迭代過程 假定一個x1 x2 g x1 不成立 x2 x1 x1 x2 輸出x2 成立 main floatx1 x2 scanf f x1 x2 牛頓迭代法基本思想 牛頓迭代公式f x1 f x1 x1 x2 x2 x1 f x1 f x1 x1 x2 y x f x1 f x2 main floatx1 x2 f1 f scanf f 例 求定積分 數值積分 f x a b x sinx x dx a b 等分n h b a n 第i個矩形 x x a i 1 h include math h main intn i floata b x y h s 0 scanf f f d 第七章數組7 1數據結構與數組的概念影響程序設計的因素除算法外還有數據結構 數據結構概念編寫一個程序除了重視算法的設計外 還需重視數據類型的選擇 即選擇合適的數據類型來存放要處理的數據 在程序設計中 數據類型就稱為數據結構 選擇合適的數據類型實際上就是進行數據結構的設計 在程序設計中有格言 數據結構 算法 程序說明數據結構與算法同等重要 算法依賴于數據結構 對于同一個問題的求解 可以采用不同的數據結構和不同的算法 對不同的數據結構有不同的算法 其復雜程度也會不同 選擇合適的數據結構 可以降低算法的復雜程度 因此 在程序設計中應重視數據結構的設計 例 求任意100個數中的最大值 main inti a max max 32768for i 1 imax max a printf nmax d max 用一個簡單變量作為數據結構 合理 算法簡單 對于三個數的排序 main inta b c t scanf d d d 對于很多個數的排序用變量會很復雜而用數組會使算法很簡單 仍可用變量作為數據結構 數組的概念inta 10 a 0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 一組具有同樣類型的數據的集合統一用一個名字代表 數組名 代表一組數 數組元素 下標 數組名 數組中的各成員稱數組元素 由數組名加下標唯一地確定 將一組數用一個名字代表 便于管理 只有一個下標的數組稱為一維數組 可有二維數組 三維數組 七維數組 7 2一維數組的定義和引用 定義一般形式 類型符數組名 常量表達式 inta 10 floatb 10 類型符數組名長度作用 分配一組連續的內存單元 說明 數組必須先定義后使用 數組名的命名規則與變量相同 常量表達式表示元素的個數 長度 下標從0開始 常量表達式不能包含變量 即不允許作動態定義 引用逐個引用其元素 不能進行整體引用 引用的一般形式 數組名 下標 如 a 0 50 a 1 100 a 2 a 0 a 1 與a2 a0 a1有根本性的區別 下標可變 例 從鍵盤輸入10個數 用變量 不方便 scanf d d d d d d d d d d 用循環控制輸入個數和下標的變化 注意下標的變化范圍 初始化在定義數組的同時給數組賦初值 inta 10 0 1 2 3 4 5 6 7 8 9 inta 10 0 1 2 3 4 inta 0 1 2 3 4 應用舉例 1 對100個學生的分數統計最高分 最低分和平均分 兩種方法 用變量作為存放初始數據的數據結構用數組作為存放初始數據的數據結構 main inti a max min floataver 0 max 0 min 100 for i 0 imax max a if a min min a aver a aver 100 printf n d d f max min aver 用變量 main inti a 100 max min floataver 0 for i 0 imax max a i if a i min min a i aver a i aver 100 printf n d d f max min aver 用數組 找最大最小的位置 max 0 min 0 if a i a max max i if a i a min min i 2 統計高于平均分的人數 main inti a n floataver 0 for i 0 i 100 i scanf d n 0 for i 0 iaver n printf n d n 用變量 數據結構不合理 main inti a 100 n floataver 0 for i 0 iaver n printf n d n 用數組 1 3 對100個學生的分數統計出每分一檔人數 0 1 2 3 4 99 100 main inti a for i 1 i 100 i scanf d 輸出 inti a n 101 for i 0 i 101 i n i 0 n a 完整程序 main inti a n 101 for i 0 i 0 i printf n 3d 3d i n i 體會數組作為存放結果的數據結構時的優越性 按10分一檔統計 main inti a n 101 for i 0 i 101 i n i 0 for i 1 i 100 i scanf d inti a n 11 for i 0 i 11 i n i 0 n a 10 4 對10個學生的分數按從小到大的順序排序后輸出 兩種典型的排序算法 選擇法和起泡法 選擇法基本思想 首先選擇最小的數放在0位置 再在剩下的數中選擇最小的數放在下一位置 依次類推 共進行9次選擇 5874390126 每次選擇都要與其后的所有數進行比較換位 5874390126 i j main inta 10 i j t for i 0 ia j t a i a i a j a j t for j 0 j 10 j printf 3d a j 5874390126 5874390126 i j 先找最小值所在的位置 最后再換位 main inta 10 i j t k for i 0 i 10 i scanf d 起泡法基本思想 首先將所有數中的最大值 冒泡 到最后位置 再將剩下的數中的最大值 冒泡 到上一位置 依次類推 共進行9次 冒泡 每次 冒泡 都是一種翻滾過程 即相鄰兩個數進行比較換位 5874390126 main inta 10 i j t for i 0 ia i 1 t a i a i a i 1 a i 1 t for j 0 j 10 j printf 3d a j 要特別注意兩個循環的范圍 5 循環移位對一數列中的每個數向后移3個位置 最后3個數移到最前面 58743901261265874390 用循環移位實現 5874390126main inti j k a 10 for i 0 i 10 i scanf d for i 1 i 10 i a i a i 1 for i 9 i 0 i a i a i 1 k a 9 a 0 k for j 1 j 3 j k a 9 6 狐貍找兔子問題繞圍繞著山頂有10個洞 一只兔子和一只狐貍分別住在洞里 狐貍總想吃掉兔子 一天 兔子對狐貍說 你想吃掉我有一個條件 先把洞順序編號 你從最后一個洞出發 第一次先到第一個洞找我 第二次隔一個洞找 第三次隔兩個洞找 依次類推 尋找次數不限 我躲在一個洞里不動 只要找到我你就可以飽餐一頓 狐貍一想只有10個洞 尋找次數又不限 那有找不到的呢 馬上答應了條件 結果狐貍跑斷了腿也沒找到 請問兔子躲在哪個洞里 1 2 3 4 6 7 8 9 10 5 算法思想 開辟數組 每個元素代表一個洞 并賦初值0 表示各個洞都還未找 然后按規律找 每找一個洞 對應的數組元素就賦值1 表示已找過 最后根據數組元素值1與0來識別各洞是否已找過 main inti k 10 inta 10 0 0 0 0 0 0 0 0 0 0 for i 1 i 10000 i k k i 10 if k 0 k 10 a k 1 1 for i 0 i 10 i if a i 0 printf 3d i 1 7 3二維數組的定義和引用 定義一般形式 類型符數組名 常量表達式 常量表達式 inta 3 4 floatb 5 10 行列 二維數組的邏輯結構就如同一張表格 a 0 0 a 0 1 a 0 2 a 0 3 a 1 0 a 1 1 a 1 2 a 1 3 a 2 0 a 2 1 a 2 2 a 2 3 存放形式 按行存放 a 0 a 1 a 2 二維數組可以看作是一個特殊的一維數組 它的元素又是一個一維數組 C語言這樣的處理方法在很多情況下顯得很方便 與一維數組相比 二維數組的定義多一個長度 其元素多一個下標 在應用中 如果要處理的數據如同一數列 則可定義一維數組來存放 而如果要處理的數據如同一張表格 則應定義二維數組來存放 引用引用形式 數組名 下標 下標 如 a 0 3 a 1 2 a 2 3 其元素有兩個下標 例 從鍵盤輸入12個數到二維數組中 inta 3 4 i j for i 0 i 3 i for j 0 j 4 j scanf d 需要用兩重循環來控制兩個下標的變化 如果鍵盤輸入的數據是 123456789101112 則在數組中如何存放 兩個循環換
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025金融機構貸款合同書范本2
- 2025標準個人投資合伙企業合同樣本
- 2025地基加固錨桿施工合同
- 《2025甲乙雙方委托貸款借款合同協議》
- 礦山安全監管與執法考核試卷
- 2025福建省智能產業發展科技項目(課題)合同書
- 2025簡化農業生產技術推廣項目合同模板
- 2025退休人員勞動合同模板
- 2025建筑工程合同管理法規詳解
- 2025電工勞務承包合同示范文本
- 教師專業發展制度教師專業發展的保障制度
- 學校德育管理體系
- XX文化產業投資公司二零二五年度股東退股及文化創意協議
- 青年博物館文創產品消費研究:一個社會實踐分析視角
- 2025版學校學生食堂餐具清洗消毒服務合同2篇
- 跟著電影去旅游知到智慧樹章節測試課后答案2024年秋山東大學(威海)
- 《有機硅乳液防水劑》文本及編制說明
- 學?;饡馁Y金籌集與運用策略
- 2021年高考物理試卷(江蘇)(解析卷)
- 調度室副主任安全生產職責模版(3篇)
- 2025年中電科太力通信科技限公司招聘高頻重點提升(共500題)附帶答案詳解
評論
0/150
提交評論