教學課件-計算機程序設計基礎(第2版)喬林_第1頁
教學課件-計算機程序設計基礎(第2版)喬林_第2頁
教學課件-計算機程序設計基礎(第2版)喬林_第3頁
教學課件-計算機程序設計基礎(第2版)喬林_第4頁
教學課件-計算機程序設計基礎(第2版)喬林_第5頁
已閱讀5頁,還剩538頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

計算機程序設計基礎第零章C語言概述提綱0.1C語言簡介0.2程序設計的基本概念0.3簡單C程序介紹0.4程序設計的基本流程本章小結0.1C語言簡介C語言簡史Ritchie&Kernighan(BellLabs.)從B語言脫胎而來為開發(fā)UNIX而設計

C語言的標準化ANSIC標準化委員會:1983ANSIC:C89ISO/IEC9899:1990:C90C99C語言特點中級語言:介于高級語言與低級語言之間高級語言的結構化與模塊化低級語言的控制性與靈活性結構化順序結構、分支結構、循環(huán)結構模塊化函數(shù)、函數(shù)庫可移植性0.2程序設計的基本概念程序一系列遵循一定規(guī)則并能正確完成特定功能的代碼或指令序列通常包括數(shù)據(jù)結構與算法兩部分程序設計與程序設計語言程序設計:按照任務需要,設計數(shù)據(jù)結構與算法,編寫代碼并測試其正確性,得到正確運行結果的過程程序設計方法學:程序設計應遵循一定的方法與原則,養(yǎng)成良好的編程風格程序設計語言:編寫程序代碼的規(guī)范,具有特定的語法規(guī)則、意義與使用環(huán)境0.2程序設計的基本概念算法問題的求解方法與步驟不允許存在二義性算法設計過程是逐步求精的常使用流程圖描述算法數(shù)據(jù)與數(shù)據(jù)結構數(shù)據(jù):程序操作的對象數(shù)據(jù)結構:數(shù)據(jù)對象之間的相互關系及構造方法與算法關系密切,良好的數(shù)據(jù)結構可使算法更簡單,恰當?shù)乃惴墒箶?shù)據(jù)結構更易理解0.3簡單C程序介紹編寫程序,顯示字符串"HelloWorld!"#include<stdio.h>intmain(){printf("HelloWorld!\n");return0;}主函數(shù)的函數(shù)頭,全局惟一預編譯指令,包含標準頭文件函數(shù)體,花括號內為語句序列標準庫函數(shù),在輸出設備(一般為屏幕)上輸出一行文本函數(shù)調用,需要了解該函數(shù)原型,即函數(shù)如何使用的細節(jié)信息;printf函數(shù)原型位于"stdio.h"中,故需包含該頭文件雙引號內為字符串內容;‘\n’為轉義字符,表示換行分號表示語句結束函數(shù)結束執(zhí)行,程序退出0.3簡單C程序介紹編寫程序,計算用戶輸入的兩個整數(shù)之和#include<stdio.h>intmain(){inta,b,sum;printf("Theprogramaddstwointegers.\n");printf("Thefirstnumber:");scanf("%d",&a);printf("Thesecondnumber:");scanf("%d",&b);sum=a+b;printf("%d+%d=%d\n",a,b,sum);return0;}數(shù)據(jù)的輸入與存儲absum數(shù)據(jù)的輸入與存儲1absum數(shù)據(jù)的輸入與存儲12absum數(shù)據(jù)的輸入與存儲123absum程序設計思維戰(zhàn)略與戰(zhàn)術先關注戰(zhàn)略層面問題(程序邏輯)再關注戰(zhàn)術層面問題(程序細節(jié))細微之處邪魔藏也!程序流程框架程序代碼的三分天下:輸入、計算、輸出C程序結構特點由一個或多個函數(shù)組成具有惟一一個主函數(shù)main程序執(zhí)行由主函數(shù)開始,其他函數(shù)由主函數(shù)調用或間接調用程序執(zhí)行流程與函數(shù)定義順序無關每個函數(shù)包含函數(shù)頭與函數(shù)體兩部分C標準庫包含大量庫函數(shù),程序員可直接使用庫函數(shù)原型位于相應頭文件中,使用函數(shù)前必須包含該頭文件0.4程序設計的基本流程本章小結C語言的發(fā)展歷史與基本特點程序設計的基本概念程序、程序設計與程序設計語言、算法、數(shù)據(jù)與數(shù)據(jù)結構C程序的基本結構與特點程序設計的基本流程編輯、編譯、鏈接、測試(調試與執(zhí)行)作業(yè)第13頁:習題二第2、3小題計算機程序設計基礎第一章C語言基本語法元素提綱1.1數(shù)據(jù)類型1.2量與表達式1.3語句1.4基本輸入輸出函數(shù)1.5程序設計風格本章小結1.1數(shù)據(jù)類型整數(shù)類型使用int定義整數(shù)類型的數(shù)據(jù)對象整數(shù)類型具有取值范圍,僅能表示特定區(qū)間內整數(shù)值浮點數(shù)類型使用double或float表示小數(shù)同樣具有取值范圍首選double字符串類型字符序列以整體的形式作為數(shù)據(jù)對象使用本書配套zylib庫中的STRING類型表示字符串,易于使用整數(shù)類型整數(shù)類型定義a為整數(shù):inta;整數(shù)的符號:確定是否表示負數(shù)signed、unsigned定義b為無符號整數(shù):unsignedintb;整數(shù)的長短:確定整數(shù)取值范圍的大小long、short定義c為短整數(shù):shortintc;浮點數(shù)類型:double編寫程序,計算用戶輸入的兩個浮點數(shù)之和#include<stdio.h>intmain(){doublea,b,sum;printf("Theprogramaddstworealnumbers.\n");printf("Thefirstrealnumber:");scanf("%lf",&a);

//"lf"表示處理double類型的浮點數(shù)printf("Thesecondrealnumber:");scanf("%lf",&b);sum=a+b;printf("%lf+%lf=%lf\n",a,b,sum);return0;}浮點數(shù)類型:float編寫程序,計算用戶輸入的兩個浮點數(shù)之和#include<stdio.h>intmain(){floata,b,sum;printf("Theprogramaddstworealnumbers.\n");printf("Thefirstrealnumber:");scanf("%f",&a);

//"f"表示處理float類型的浮點數(shù)printf("Thesecondrealnumber:");scanf("%f",&b);sum=a+b;printf("%f+%f=%f\n",a,b,sum);return0;}字符串類型:STRING接受用戶輸入的用戶名,向用戶問好#include<stdio.h>#include"zylib.h"http://

使用雙引號而不是尖括號包含配套庫intmain(){STRINGname;printf("Theprogramreadsuser'sname,andprintsagreeting.\n");printf("Yourname:");name=GetStringFromKeyboard();/*配套庫已實現(xiàn)的函數(shù),獲取用戶輸入的字符串,以用戶輸入的文本行為單位*/printf("Hello,%s.\n",name);//

使用"s"輸出字符串return0;}工程項目的設置基本步驟創(chuàng)建新工程,設置好工程項目中文件的目錄,程序代碼可能位于工程項目目錄下的子目錄中將文件“zylib.h”與“zylib.c”拷貝到程序目錄下在工程項目中添加上述文件在程序代碼中使用雙引號包含頭文件“zylib.c”特別說明工程項目的意義:將程序組織成一個項目整體進行開發(fā)和管理,一般需要創(chuàng)建單獨的工程才能開發(fā)程序不同編譯器的工程項目設置并不相同1.2量與表達式表達式變量文字與常量賦值與初始化操作符與操作數(shù)混合運算與類型轉換表達式表達式的定義操作數(shù)與操作符序列,表達運算過程操作數(shù):文字、量、函數(shù)調用、括號操作符:運算邏輯表達式值:運算結果表達式求值:計算表達式值的過程類比:按普通四則運算理解表達式求值過程,逐一計算表達式中所有操作符,直至完成變量先定義再使用定義格式:變量類型變量名稱[,變量名稱];單獨定義例:inta;同時定義例:doubleb,c;變量名稱應既有惟一性:不允許重名變量的四大基本特征(VANT)變量總是具有值(value)變量總是與內存中的地址(address)相對應變量總是具有名稱(name)變量總是具有確定的類型(type)文字定義:程序中單獨出現(xiàn)的值例:3.14、100

等整數(shù)類型文字十進制、十六進制、八進制浮點類型文字字符串類型文字整數(shù)類型文字十進制表示:普通整數(shù)表示十六進制表示:逢十六進一,無正負號以“0x”或“0X”開頭的0~9、A/a~F/f序列例:0x55、0X1F、0x2a0x5516=8510八進制表示:逢八進一,無正負號以“0”開頭的0~7序列例:0550558=4510注意不要與十進制混淆!浮點數(shù)類型文字一般形式:小數(shù)表示法由整數(shù)部分、小數(shù)點與小數(shù)部分組成例:3.1416、–2.718281828指數(shù)形式:科學計數(shù)法由尾數(shù)部分、字符‘E’/‘e’與指數(shù)部分組成例:3.14e3=3.14103、–2.7E–2=–2.710–2字符串類型文字雙引號引起來的字符序列例:"ProgramminginC"、"HelloWorld!\n"雙引號是字符串文字的界定符,不是字符串的內容!轉義序列字符串不僅可以包含可打印字符,也可以包含表示特殊活動的特殊字符格式:使用反斜杠開始轉義序列,后跟一個或多個字符轉義序列整體作為單個字符進行處理,樣式固定例:"\n"、"\\"

C語言預定義的轉義序列轉義序列功能與意義\a響鈴\b退格\f換頁\n換行\(zhòng)r返回到當前行首\t水平制表鍵\v垂直制表鍵\0ASCII碼0\\反斜杠字符自身\’單引號字符(僅在字符常數(shù)中需要使用此方式)\"雙引號字符(僅在字符串常數(shù)中需要使用此方式)\ddd“ddd”表示八進制的該字符ASCII碼值\xhh“hh”表示十六進制的字符ASCII碼值,x為十六進制標志常量常量的定義:程序執(zhí)行期間其值不可改變的量格式:const數(shù)據(jù)類型常量名稱=初始值;例:constintzero=0;常量的意義解決直接出現(xiàn)的文字無法解釋其意義的問題文字?魔數(shù)也!常量與變量常量不可改變值,其他與變量同定義常量時必須進行初始化!常量初始值必須能夠在編譯期間計算出來賦值與初始化賦值表達式格式:變量名稱=表達式例:a=0賦值語句:賦值表達式加分號格式:變量名稱=表達式;例:a=b+c;變量的初始化在定義變量時直接設定初始值例:inta=0;賦值流程absummain賦值流程1absummaina=1;賦值流程12absummaina=1;b=2;賦值流程123absummaina=1;b=2;sum=a+b;操作符與操作數(shù)操作符分類一元操作符:只有單個操作數(shù),例如負號二元操作數(shù):帶有兩個操作數(shù),例如加減乘除等三元操作數(shù):帶有三個操作數(shù),例如條件表達式(僅在C語言中存在惟一一種)操作符的優(yōu)先級與結合性優(yōu)先級確定計算順序,結合性確定計算方向操作符的優(yōu)先級僅具有參考價值,C語言對于特殊表達式的計算有特別規(guī)定,并不完全遵照該規(guī)則!如果拿不準,使勁加括號混合運算與類型轉換編寫程序,詢問用戶姓名,向用戶問好,然后請求用戶輸入一整數(shù)和一實數(shù),輸出加法運算結果#include<stdio.h>#include"zylib.h"http://使用雙引號而不是尖括號包含配套庫intmain(){STRINGname;intn;doubled,sum;printf("Theprogramreadsuser'sname,andprintsagreeting,\n");printf("andaddsanintegerandarealnumber.\n");printf("Yourname:");name=GetStringFromKeyboard();/*獲取輸入字符串,以用戶輸入的文本行為單位*/printf("Hello,%s.\n",name);//輸出字符串printf("Pleaseinputaninteger:");n=GetIntegerFromKeyboard();/*獲取輸入整數(shù),以回車確認輸入*/printf("Pleaseinputarealnumber:");d=GetRealFromKeyboard();/*獲取輸入浮點數(shù),以回車確認輸入*/sum=n+d;printf("%d+%lf=%lf\n",n,d,sum);return0;}隱式類型轉換與顯式類型轉換隱式類型轉換程序自動進行,程序員不需要干預轉換原則:一般以不損失精度為前提賦值時右邊表達式值先轉換為變量類型后再進行顯式類型轉換程序員手工進行的類型轉換格式:(轉換后的數(shù)據(jù)類型)原表達式例:設inta;doubleg=9.80665;a=g;

//

進行隱式類型轉換,小數(shù)部分舍棄,a值為9a=(int)g*4;//

進行顯式類型轉換,a值為4*9=36a=(int)(g*4);

//

進行顯式類型轉換,a值為391.3語句簡單語句格式:表達式后跟分號例一:sum=n+d;例二:n=GetIntegerFromKeyboard();例三:printf("%d+%lf=%lf\n",n,d,sum);復合語句格式:花括號對括起來的語句序列例:{a=1;b=a+1;}空語句格式:單獨出現(xiàn)的分號目的:滿足程序特定語法規(guī)則的要求;作為未來添加程序代碼的占位標記1.4基本輸入輸出函數(shù)基本事實輸入輸出是語言與算法必須具備的功能C語言本身沒有輸入輸出語句或命令,輸入輸出需使用標準庫函數(shù)輸入輸出函數(shù)原型位于頭文件“stdio.h”中典型輸入輸出函數(shù)格式化輸出函數(shù)printf格式化輸入函數(shù)scanf格式化輸出函數(shù)printf格式化輸出函數(shù)printf

調用格式格式:printf("輸出格式規(guī)約字符串",輸出項列表);例一:printf("Theprogramprintsagreeting.\n");例二:printf("Hello,%s.\n",name);例三:printf("%f+%f=%f\n",a,b,sum);例四:printf("%d+%lf=%lf\n",n,d,sum);%y:格式描述符%d:十進制整數(shù)%f:float類型浮點數(shù);%lf:double類型浮點數(shù)%c:單個字符%s:字符串%u:無符號整數(shù)printf函數(shù)示例編寫程序,按照下列格式輸出截止2005年底的部分省市統(tǒng)計數(shù)據(jù)。所有數(shù)據(jù)均來自各地政府官方網(wǎng)站,面積僅包括陸域(單位:平方公里),人口僅包括戶籍人口(單位:萬人),其中部分數(shù)據(jù)為約數(shù)。場寬精度左右對齊場寬、精度與對齊輸出格式%[對齊標志][場寬][.精度]格式描述符對齊標志:確定每列左側還是右側對齊缺省右對齊,左對齊使用減號例:%-d

表示按照左對齊格式輸出整數(shù)場寬:確定每列占用多少字符寬度,數(shù)據(jù)輸出一般不會截斷確定輸出最小寬度,超出部分照常輸出例:%3d表示按照右對齊、占三位格式輸出整數(shù),若整數(shù)長度超出三位,則照常輸出數(shù)據(jù)場寬、精度與對齊精度:確定輸出多少位數(shù)據(jù)以保證其精度精度數(shù)字前有小數(shù)點標志,在場寬中占用一位!例:%-5.2f表示按照左對齊、整體占五位且小數(shù)點后兩位格式輸出浮點數(shù)數(shù)據(jù)的截斷例一:按%-5.2f格式輸出12.3456,結果為12.35,注意四舍五入例二:按%-5.2f格式輸出123.456,結果為123.46,注意截斷后的數(shù)據(jù)仍然超出了場寬,照常輸出字符串截斷輸出特例:%13.13s表示按照整體占13位且多余部分截斷的方式輸出字符串程序代碼#include<stdio.h>#include"zylib.h"intmain(){STRINGprovince1,province2,province3,province4,province5;doublearea1,area2,area3,area4,area5;doublepop1,pop2,pop3,pop4,pop5;province1="Anhui";area1=139600;pop1=6461;province2="Beijing";area2=16410.54;pop2=1180.70;province3="Chongqing";area3=82400;pop3=3144.23;province4="Shanghai";area4=6340.50;pop4=1360.26;province5="Zhejiang";area5=101800;pop5=4894;printf("-------------------------------------------\n");printf("ProvinceArea(km2)Population(10K)\n");printf("-------------------------------------------\n");printf("%-13.13s%9.2lf%-.2lf\n",province1,area1,pop1);printf("%-13.13s%9.2lf%-.2lf\n",province2,area2,pop2);printf("%-13.13s%9.2lf%-.2lf\n",province3,area3,pop3);printf("%-13.13s%9.2lf%-.2lf\n",province4,area4,pop4);printf("%-13.13s%9.2lf%-.2lf\n",province5,area5,pop5);printf("-------------------------------------------\n");return0;}格式化輸入函數(shù)scanf格式化輸入函數(shù)scanf調用格式格式:scanf("輸入格式規(guī)約字符串",輸入項列表);例:scanf("%d,%d",&a,&b);特別說明輸入格式碼與輸出格式碼基本相同用戶在終端輸入的數(shù)據(jù)逐一存放到輸入項列表中變量所在的地址空間;對于普通變量,變量名前需添加取址操作符“&”多個輸入項的分隔:格式描述串中其他字符需在輸入數(shù)據(jù)時一并輸入;無分隔字符的相連項在輸入時使用空格、Tab或回車鍵分隔不要使用scanf,使用zylib庫中的三個函數(shù)代替!整數(shù)輸入:GetIntegerFromKeyboard浮點數(shù)輸入:GetRealFromKeyboard字符串輸入:GetStringFromKeyboard1.5程序設計風格注釋命名規(guī)范宏與常量賦值語句的簡寫形式源代碼的排版注釋注釋的目的:增強程序的可讀性、可維護性注釋的格式格式一:“/*”與“*/”對,注釋其中的部分,可出現(xiàn)在程序代碼的任意地方例一:

int/*此處內容為注釋*/a;格式二:“//”,注釋從此字符序列開始直至本文本行結束例二:

inta;//

此處內容為注釋特別說明同一種注釋標記不可以嵌套“//”不跨行,“/*”與“*/”對可跨行命名規(guī)范字符集:ASCII字符集大小寫英文字母、數(shù)字、部分特殊符號標識符以下劃線或字母開頭,由下劃線、字母、數(shù)字組成,表示常量、變量、函數(shù)、類型等名稱,區(qū)分大小寫!關鍵字:系統(tǒng)專用的具有特定意義的標識符預定義標識符:編譯命令與庫函數(shù)名,具有特定意義,一般不能重新定義用戶定義標識符:用戶根據(jù)需要定義,主要是為了使程序容易閱讀、理解與維護宏與常量宏定義#define指令:預處理命令例:#definePI3.14一旦定義,可以代替常量使用宏定義不是常量!程序中應優(yōu)先使用常量而不是宏目的與意義增強程序可讀性使用有意義的名字命名增強程序的可維護性將值定義為符號常量,則程序中僅需要修改一次#include<stdio.h>#definePI3.14intmain(){doubler,area;r=3.0;area=PI*r*r;printf("%f",area);return0;}賦值語句的簡寫形式加賦:x+=a等價于x=x+a減賦:x-=a等價于x=x-a乘賦:x*=a等價于x=x*a除賦:

x/=a等價于x=x/a除法作用于整數(shù)上時,結果也為整數(shù)余賦:

x%=a等價于x=x%a%:兩個整數(shù)進行整數(shù)除法,結果為余數(shù)特別說明x*=a+b等價于x=x*(a+b)源代碼排版遞進層次應使用左縮進格式每行代碼不能過長,不超過80個字符函數(shù)代碼不超過60行使用空行區(qū)分不同功能代碼復合語句書寫格式要統(tǒng)一除非特別必要,否則不要在一行上書寫多條語句命名規(guī)范要一致無論采用什么標準,都一定要一直按照該標準執(zhí)行!本章小結數(shù)據(jù)類型確定數(shù)據(jù)對象的存儲格式、取值范圍、可實施的操作集量與表達式操作符、操作數(shù)、表達式、賦值與初始化語句簡單語句、復合語句與空語句基本輸入輸出函數(shù)printf與scanf不建議使用scanf,使用zylib庫中的替代函數(shù)程序設計風格作業(yè)第50頁:習題二第5、7小題計算機程序設計基礎第二章程序流程控制提綱2.1結構化程序設計基礎2.2布爾數(shù)據(jù)2.3if分支結構2.4switch分支結構2.5while循環(huán)結構2.6for循環(huán)結構2.7問題求解與結構化程序設計本章小結2.1結構化程序設計基礎程序的控制結構(黑箱)單入口單出口的控制結構易于理解三種基本控制結構順序結構分支結構循環(huán)結構復雜控制結構控制結構可以嵌套,以構成更復雜的控制結構順序結構順序結構由一組順序執(zhí)行的處理塊組成,每個處理塊可能包含一條或一組語句,完成一項任務順序結構是最基本的算法結構順序結構示例編寫程序,接受用戶輸入的兩個整數(shù),輸出其中較大者#include<stdio.h>#include"zylib.h"intmain(){inta,b,max;/*輸入部分*/printf("Theprogramgetstwonumbersandprintsthegreaterone.\n");printf("Thefirstnumber:");a=GetIntegerFromKeyboard();printf("Thesecondnumber:");b=GetIntegerFromKeyboard();/*計算部分*/

max=a>b?a:b;

/*三元表達式*//*輸出部分*/printf("Thegreateroneis%d.\n",max);return0;}三元表達式格式表達式1?表達式2:表達式3計算過程先計算表達式1的值,若為真,則結果為表達式2的值,否則為表達式3的值示例x=(a>b)?a:b;等價于:if(a>b)x=a;elsex=b;分支結構分支結構(選擇結構)的含義根據(jù)某一條件的判斷結果,確定程序的流程,即選擇哪一個程序分支中的處理塊去執(zhí)行最基本的分支結構是二路分支結構以條件判斷為起點,如果判斷結果為真,則執(zhí)行A處理塊的操作,否則執(zhí)行B處理塊的操作循環(huán)結構循環(huán)結構的含義根據(jù)某一條件的判斷結果,反復執(zhí)行某一處理塊的過程最基本的循環(huán)結構是當循環(huán)進入循環(huán)結構,判斷循環(huán)條件,如果循環(huán)條件的結果為真,則執(zhí)行A處理塊的操作,即循環(huán)一次,然后再次判斷循環(huán)條件,當循環(huán)條件為假時,循環(huán)結束2.2布爾數(shù)據(jù)枚舉類型用戶自定義數(shù)據(jù)類型關系表達式邏輯表達式邏輯表達式的求值枚舉類型枚舉類型的聲明格式:enum枚舉名{元素名1,元素名2,…,元素名n};例:enumMONTH{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};枚舉類型聲明中的元素為枚舉文字,不是變量枚舉類型變量的定義例:enumMONTHmonth;枚舉類型的意義將多個文字組織在一起,表達從屬于特定類型的性質取代魔數(shù),使源代碼更易理解用戶自定義類型自定義類型的格式格式:typedef原類型標識新類型名;例一:typedefintDWORD;例二:enumBOOL_TAG{FALSE,TRUE};typedefenumBOOL_TAGBOOL;自定義類型的性質新類型與原類型相同,并未產(chǎn)生新類型,重新命名的自定義類型使程序更易理解若整數(shù)可以用于表示兩類不同數(shù)據(jù)對象,使用自定義類型可以區(qū)分它們自定義類型不是簡單的類型替換,雖然它們確實等同布爾類型的定義enum__BOOL{FALSE,TRUE};布爾類型實現(xiàn)布爾類型:第一版定義類型:enumBOOL{FALSE,TRUE};使用布爾類型定義變量:enumBOOLbool;每次定義,都需要書寫enum,很不方便實現(xiàn)布爾類型:第二版定義枚舉類型:enum__BOOL{FALSE,TRUE};自定義布爾類型:typedefenum__BOOLBOOL;定義變量:

BOOLbool;實現(xiàn)布爾類型:第三版定義類型:typedefenum__BOOL{FALSE,TRUE}BOOL;關系表達式關系操作符大于(>)、等于(==)、小于(<)、不大于(<=)、不小于(>=)、不等于(!=)關系表達式關系操作符與兩個操作數(shù)構成的表達式多個關系表達式可連接起來構成復雜關系表達式運算結果為邏輯值:真或假邏輯值(布爾值)C語言以0表示假,以非0表示真(經(jīng)常以1表示)盡量使用BOOL類型表示邏輯值!示例例:x==y,a<b邏輯表達式邏輯操作符:邏輯與(&&)、邏輯或(||)、邏輯非(!)邏輯表達式邏輯操作符與一個或兩個操作數(shù)構成的表達式,結果仍為真或假x&&y:若x、y均為真,則結果為真,否則為假x||y:若x、y均為假,則結果為假,否則為真!x:若x為真,則結果為假,否則為真復雜邏輯表達式例:x>y||a!=b&&3<=2關系操作符與邏輯操作符的優(yōu)先級從高到低順序:邏輯非“!”;小于“<”、不小于“>=”、大于“>”、不大于“<=”(同級);等于“==”、不等于“!=”(同級);邏輯與“&&”;邏輯或“||”邏輯表達式的求值給定年份year,判斷是否為閏年,閏年規(guī)定為:能夠被400整除的年份一定是閏年其他能夠被100整數(shù)的年份一定不是閏年其他能夠被4整除的年份一定是閏年year%4==0&&year%100!=0||year%400==02.3if分支結構If分支結構的三種格式格式一:if(條件表達式){語句序列}格式二:if(條件表達式){語句序列1

}else{語句序列2

}格式三:if(條件表達式1){語句序列1

}elseif(條件表達式2){語句序列2

}…else{語句序列n

}特別說明條件表達式必須位于括號內,一般為關系或邏輯表達式先計算條件表達式值,若為真則執(zhí)行語句序列1,否則執(zhí)行語句序列2語句序列1與語句序列2可以為復合語句、單語句或空語句語句序列1與語句序列2只能有一個被執(zhí)行若僅用于確定某條語句是否執(zhí)行,else分支可以省略簡單if語句編寫程序,接受用戶輸入的整數(shù),如果該整數(shù)為奇數(shù)則將其乘3加1后輸出,偶數(shù)直接輸出#include<stdio.h>#include"zylib.h"intmain(){inta,result;

/*輸入部分*/printf("Theprogramgetsanumber.\nIfitisaneven,outputitdirectly,\n");printf("otherwisemultiplyitby3thenplus1.\n");printf("Thenumber:");a=GetIntegerFromKeyboard();

/*計算部分*/result=a;if(a%2==1)result=a*3+1;

/*輸出部分*/printf("Theresultis%d.\n",result);return0;}if-else語句編寫程序,接受用戶輸入的整數(shù),如果該整數(shù)為奇數(shù)則將其乘3加1后輸出,偶數(shù)除以2后輸出#include<stdio.h>#include"zylib.h"intmain(){inta,result;

/*輸入部分*/printf("Theprogramgetsanumber.\nIfitisaneven,divideitby2,\n");printf("otherwisemultiplyitby3thenplus1.\n");printf("Thenumber:");a=GetIntegerFromKeyboard();

/*計算部分*/result=a;if(a%2==1)result=a*3+1;elseresult=a/2;

/*輸出部分*/printf("Theresultis%d.\n",result);return0;}if-elseif-else語句已知2006年12月1日為星期五。編制程序,接受用戶輸入的1~31之間的整數(shù),按照下述格式將該日星期幾信息打印在對應欄下。例如,2006年12月1日打印在星期五“Fr”下面:程序代碼#include<stdio.h>#include"zylib.h"typedefenum{SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}WEEKDAY;intmain(){intdate;constWEEKDAYdate_1=FRIDAY;WEEKDAYweekday;/*輸入部分*/printf("Theprogramgetsadate(1~31),\n");printf("andprintsacalendarof2006-12(justthedate).\n");printf("Thedate:");date=GetIntegerFromKeyboard();if(date<1||date>31){/*日期輸入錯誤,給出錯誤信息,退出執(zhí)行*/printf("Dateerror!\n");return1;}程序代碼/*計算部分,得到該日的星期幾信息*/weekday=(WEEKDAY)((date+(int)date_1-1)%7);/*輸出部分*/printf("Calendar2006-12\n");printf("\n");printf("SuMoTuWeThFrSa\n");printf("\n");

/*在指定位置輸出該日的星期幾信息*/

if(weekday==SUNDAY) printf("%2d\n",date);

elseif(weekday==MONDAY) printf("%6d\n",date);

elseif(weekday==TUESDAY) printf("%10d\n",date);

elseif(weekday==WEDNESDAY) printf("%14d\n",date);

elseif(weekday==THURSDAY) printf("%18d\n",date);

elseif(weekday==FRIDAY) printf("%22d\n",date);

else printf("%26d\n",date);printf("\n");return0;}2.4switch分支結構計算過程先計算表達式的值依次與常數(shù)表達式比較若相同則執(zhí)行該分支(子句)否則轉向default分支最后退出switch語句特別說明switch后面的表達式必須為整型、字符型或枚舉型case后面必須為常量表達式,且各個case值必須不同若無default分支,且無case分支匹配,則不執(zhí)行case分支中的語句可以有多條,不需要花括號switch(表達式){case常數(shù)表達式1:語句序列1case常數(shù)表達式2:語句序列2┇case常數(shù)表達式n:語句序列ndefault:默認語句序列}switch語句的執(zhí)行流程switch示例/*輸出部分*/printf("Calendar2006-12\n");printf("\n");printf("SuMoTuWeThFrSa\n");printf("\n");

/*在指定位置輸出該日的星期幾信息*/

switch(weekday){

caseSUNDAY: printf("%2d\n",date); break;

caseMONDAY: printf("%6d\n",date); break;

caseTUESDAY: printf("%10d\n",date); break;

caseWEDNESDAY: printf("%14d\n",date); break;

caseTHURSDAY: printf("%18d\n",date); break;

caseFRIDAY: printf("%22d\n",date); break;

caseSATURDAY: printf("%26d\n",date); break;

default: ;/*沒有缺省情況需要處理*/

}printf("\n");return0;}break語句break語句的目的終止switch語句的執(zhí)行如果沒有break語句,則程序會從指定的case分支開始,并在該分支結束后繼續(xù)執(zhí)行下去除非switch語句結束,后面的其他case分支或default分支中的語句都會得到執(zhí)行原因:case子句中的常數(shù)表達式僅起到語句標號的作用,不是分支之間的分隔標記省略break語句的場合允許多個分支執(zhí)行同樣的代碼break示例編寫程序,接受用戶輸入的年份和月份,輸出該月天數(shù)#include<stdio.h>#include"zylib.h"intmain(){intyear,month,days_of_month; BOOLleapyear=FALSE;

/*輸入部分*/printf("Theprogramgetsayearandamonth,andprintsdaysofthemonth.\n");printf("Theyear:"); year=GetIntegerFromKeyboard();printf("Themonth:"); month=GetIntegerFromKeyboard();if(month<1||month>12){ printf("Montherror!\n"); return1; }

/*計算部分*/leapyear=year%4==0&&year%100!=0||year%400==0;

switch(month){case1:case3:case5:case7:case8:case10:case12:days_of_month=31;break;case4:case6:case9:case11:days_of_month=30;break;case2:days_of_month=28+(int)leapyear;break;}

/*輸出部分*/printf("Daysin%4d-%2.2dis%d.\n",year,month,days_of_month);return0;}分支結構的嵌套考慮表達某企業(yè)的工資晉級計劃。該計劃向在公司長期服務的老員工和雖然服務年限較短但年齡偏大的員工傾斜。計劃規(guī)定,若員工服務年限未達5年,則若年齡不小于28歲長一級工資;若服務年限已達5年,長兩級工資。那些服務年限短的小字輩不再此次調整工資之列。設age表示員工年齡,service_years表示服務年限,salary_level表示工資級別。分支結構的嵌套else與哪個if配對?if(service_years<5)if(age>=28)salary_level+=1;elsesalary_level+=2;else與if配對規(guī)則離它最近:距離最短同層次:排除底層嵌套if(service_years<5){if(age>=28)salary_level+=1;}elsesalary_level+=2;降低第二個if的層次,使else與第一個if配對2.5while循環(huán)結構while循環(huán)格式:while(表達式)循環(huán)體while循環(huán)執(zhí)行流程先判斷后執(zhí)行:表達式為真時,執(zhí)行一遍循環(huán)體(一次迭代),返回重新計算表達式的值以確定是否重復執(zhí)行循環(huán)體;若表達式為假,則終止循環(huán)為保證循環(huán)終止,循環(huán)體內應有能改變表達式值的語句while循環(huán)示例編寫程序,接受用戶輸入的多個整數(shù)求和,用戶輸入0時程序結束#include<stdio.h>

#include"zylib.h"intmain()

{

intn,sum=0;/*輸入與計算部分*/

printf("Theprogramgetssomeintegers,andoutputtheirsum.\n");

printf("Tostop,pleaseinput0.\n");

printf("Pleaseinputaninteger:"); n=GetIntegerFromKeyboard();

while(n){

sum+=n;

printf("Thenextinteger:");

n=GetIntegerFromKeyboard();

}/*輸出部分*/

printf("Thesumis%d.\n",sum);

return0;

}常見的程序結構無限循環(huán)發(fā)生無限循環(huán)的場合循環(huán)體內沒有改變循環(huán)變量值的語句即使改變循環(huán)變量值,也不能否定循環(huán)條件循環(huán)體內沒有能夠強制終止循環(huán)執(zhí)行的語句或命令無限循環(huán)的后果程序永遠不會結束,大多數(shù)時有害,編程時一般應避免例外情況:循環(huán)體內有專門控制循環(huán)終止的語句或命令命令格式:滿足某種條件下使用break語句,終止循環(huán)執(zhí)行哨兵:使循環(huán)滿足終止條件的循環(huán)變量值使用break語句終止循環(huán)/*輸入與計算部分*/

printf("Theprogramgetssomeintegers,andoutputtheirsum.\n");

printf("Tostop,pleaseinput0.\n");

while(TRUE){

printf("Pleaseinputaninteger:");n=GetIntegerFromKeyboard();if(n==0)break;

sum+=n;

}使用無限循環(huán)和哨兵的優(yōu)勢不再需要將首個數(shù)據(jù)處理過程提到循環(huán)體前單獨處理continue語句編寫程序,接受用戶輸入的多個整數(shù)求和。注意,僅累加正整數(shù),跳過所有負數(shù),用戶輸入0時程序結束#include<stdio.h>

#include"zylib.h"intmain()

{

intn,sum=0,count=0;/*count為輸入整數(shù)的個數(shù)*//*輸入與計算部分*/

printf("Theprogramgetssomeintegers,andoutputthesumofallpositivenumbers.\n");

printf("Tostop,pleaseinput0.\n");

while(TRUE){count+=1;printf("Number%d:",count);n=GetIntegerFromKeyboard();if(n==0)break;/*終止循環(huán)*/if(n<0)continue;/*僅終止循環(huán)的當前迭代,不累加負數(shù)值*/

sum+=n;

}/*輸出部分*/

printf("Thesumis%d.\n",sum);

return0;

}2.6for循環(huán)結構遞增遞減表達式for語句for與while的比較循環(huán)嵌套遞增遞減表達式遞增遞減表達式的優(yōu)先級非常高前綴遞增遞減格式:++變量名稱;--變量名稱;例一:設a為1,++a

等價于a=a+1,a結果為2例二:設a為1,--a

等價于a=a-1,a結果為0計算要訣:先遞增遞減,再參與運算例三:設a為1,b=++a*3

等價于a=a+1;b=a*3,a結果為2,b結果為

6例四:設a為1,b=--a*3

等價于a=a-1;b=a*3,a結果為0,b結果為

0遞增遞減表達式后綴遞增遞減格式:變量名稱++;變量名稱--;例一:設a為1,a++

等價于a=a+1,a結果為2例二:設a為1,a--

等價于a=a-1,a結果為0計算要訣:先參與運算,再遞增遞減例三:設a為1,b=a++*3

等價于b=a*3;a=a+1,a結果為2,b結果為

3例四:設a為1,b=a--*3

等價于b=a*3;a=a-1,a結果為0,b結果為

3注意事項操作數(shù)必須為變量,而不能為其他表達式不要在復雜表達式中使用遞增遞減操作符!for語句for循環(huán)格式for(初始化表達式;條件表達式;步進表達式)循環(huán)體for循環(huán)執(zhí)行流程先判斷后執(zhí)行:先執(zhí)行初始化表達式,再計算條件表達式,并根據(jù)其結果決定是否執(zhí)行一遍循環(huán)體(為真時執(zhí)行),計算步進表達式的值(循環(huán)再次“初始化”),返回重新計算條件表達式的值以確定循環(huán)是否終止for循環(huán)示例編寫程序,接受用戶輸入的整數(shù)n,求1~n的平方和#include<stdio.h>

#include"zylib.h"intmain()

{

intn,i,sum=0;printf("Theprogramgetsapositiveinteger,\n");printf("andprintsthesquaredsumfrom1tothenumber.\n");printf("Thenumber:");n=GetIntegerFromKeyboard();sum=0;for(i=0;i<=n;++i)sum+=i*i;printf("Thesumis%d.\n",sum);return0;}for與while的比較兩種循環(huán)結構可以互換使用while循環(huán)常用于不需要或很少需要初始化的場合for循環(huán)常用于需要簡單初始化和通過遞增遞減運算控制循環(huán)體執(zhí)行的場合for循環(huán)將所有循環(huán)控制因素都放在循環(huán)頭部,循環(huán)結構最清晰通過省略循環(huán)頭部的一個或多個表達式,for循環(huán)也可能非常復雜循環(huán)嵌套編寫程序,按下述格式打印九九乘法表程序代碼#include<stdio.h>

#include"zylib.h"intmain()

{

inti,j;

/*打印表頭*/printf("Nine-by-nineMultiplicationTable\n");printf("---------------------------------------\n");printf("");/*兩個空格,跳過最左列的豎排標志*/for(i=1;i<=9;++i)printf("%4d",i);/*橫排1~9

標志*/printf("\n");printf("---------------------------------------\n");

/*逐行打印*/

for(i=1;i<=9;++i){/*共打印9行,i為行號*/printf("%2d",i);/*最左列的豎排標志*//*共打印9列,j為列號,只打印上三角,下三角使用空格填充*/

for(j=1;j<=9;++j){if(j<i)printf("");elseprintf("%4d",i*j);

}printf("\n");/*結束一行打印,換行*/

}printf("---------------------------------------\n");return0;}2.7問題求解與結構化編程問題規(guī)模與程序結構化單入口單出口的程序容易理解滿足單入口單出口條件的語句稱為結構化語句問題規(guī)模增大時,合理控制程序結構非常重要程序框架結構:輸入、計算、輸出程序范型:程序中的通用計算模式自頂向下逐步求精先整體后局部首先從整體考慮問題,將其分割成多個邏輯上相互獨立的部分,分別一一實現(xiàn),最后再按照某種方法組裝起來功能分解并不總能一步到位,采用逐步求精方法,首先獲得一些相互獨立的部分,然后進行進一步的功能分解本章小結結構化的意義使程序結構更清晰,提高了程序的可靠性、可讀性與可維護性三種控制結構:順序結構、分支結構與循環(huán)結構順序結構:由一組順序執(zhí)行的語句序列構成分支結構:if語句與switch語句,break語句循環(huán)結構:while循環(huán)與for循環(huán),break語句與continue語句零碎知識點枚舉類型、用戶自定義類型、條件表達式、關系表達式、邏輯表達式和遞增遞減表達式結構化程序設計方法自頂向下逐步求精先整體后局部更易于把握事物的本質作業(yè)第84頁:習題二第2、3小題第85頁:習題二第9小題計算機程序設計基礎第三章函數(shù)提綱3.1函數(shù)聲明與調用3.2函數(shù)定義3.3函數(shù)調用規(guī)范3.4程序的結構化與模塊化3.5程序測試與代碼優(yōu)化本章小結3.1函數(shù)聲明與調用函數(shù)調用主調(客戶)函數(shù)與被調(服務器)函數(shù)函數(shù)調用時的參數(shù)與返回值例一:printf("%2d",i);例二:n=GetIntegerFromKeyboard();函數(shù)原型函數(shù)的實現(xiàn)與調用格式說明:作為函數(shù)接口一般出現(xiàn)在頭文件中格式:函數(shù)返回值類型函數(shù)名稱(形式參數(shù)列表);例一:intAdd(intx,inty);例二:voidSwap(intx,inty);例三:voidCompute();3.2函數(shù)定義函數(shù)實現(xiàn)函數(shù)定義,使用編程語言給出函數(shù)的執(zhí)行步驟函數(shù)返回值函數(shù)完成后帶回來的結果主調函數(shù)可以使用謂詞函數(shù)返回BOOL類型值的函數(shù)表達某項任務是否完成或某個條件是否滿足Add函數(shù)編寫函數(shù)Add,求兩個整數(shù)之和intAdd(intx,inty){intt;t=x+y;returnt;}Compare函數(shù)編寫函數(shù)Compare,比較兩個整型數(shù)據(jù)x、y的大小。若x等于y返回0,若x大于y返回1,若x小于y返回-1intCompare(intx,inty){intt;if(x==y)t=0;elseif(x>y)t=1;elset=-1;returnt;}Swap函數(shù)編寫函數(shù)Swap,互換兩個整型數(shù)據(jù)x、y的值void

Swap(intx,inty){intt;t=x;x=y;y=t;return;//

因函數(shù)沒有返回值,只需直接列寫return語句}多條return語句編寫函數(shù)Compare,比較兩個整型數(shù)據(jù)x、y的大小。若x等于y返回0,若x大于y返回1,若x小于y返回-1//

允許函數(shù)中包含多條return語句//函數(shù)在執(zhí)行到第一條return語句后終止intCompare(intx,inty){if(x==y)return0;elseif(x>y)

return1;elsereturn-1;}謂詞函數(shù)編寫函數(shù)IsLeapYear,判斷某個給定年份是否為閏年BOOLIsLeapYear(intyear){returnyear%4==0&&year%100!=0||year%400==0;}3.3函數(shù)調用規(guī)范函數(shù)調用示例參數(shù)傳遞機制函數(shù)調用??蚣芎瘮?shù)的嵌套調用函數(shù)調用示例編寫程序將用戶輸入的兩個整數(shù)相加,要求盡可能使用函數(shù)將程序中的操作獨立出來#include<stdio.h>#include"zylib.h"voidPrintWelcomeInfo();intGetInteger(STRINGprompt);intAdd(intx,inty);intmain(){inta,b,sum;PrintWelcomeInfo();

a=GetInteger("Thefirstnumber:");b=GetInteger("Thesecondnumber:");sum=Add(a,b);printf("Thesumis%d.\n",sum);return0;}函數(shù)調用示例voidPrintWelcomeInfo(){printf("Theprogramgetstwointegers,andprintstheirsum.\n");}intGetInteger(STRINGprompt){intt;printf("%s",prompt);t=GetIntegerFromKeyboard();returnt;}intAdd(intx,inty){intt;t=x+y;returnt;}參數(shù)傳遞機制形式參數(shù)在函數(shù)調用時才分配存儲空間,并接受實際參數(shù)的值實際參數(shù)可以為復雜的表達式,在函數(shù)調用前獲得計算形式參數(shù)與實際參數(shù)可同名,也可不同名參數(shù)較多時,實際參數(shù)值逐一賦值,它們必須保持數(shù)目、類型、順序的一致值的復制過程是單向不可逆的,函數(shù)內部對形式參數(shù)值的修改不會反映到實際參數(shù)中去函數(shù)參數(shù)一般為函數(shù)輸入集的一部分,函數(shù)輸出集一般使用返回值表示,只有使用特殊的手段才可以將函數(shù)參數(shù)作為函數(shù)輸出集的一部分函數(shù)調用??蚣躠bsummain首次調用GetInteger函數(shù)前函數(shù)調用??蚣?Thefirstnumber:"prompttGetInteger首次調用GetInteger函數(shù),數(shù)據(jù)輸入前函數(shù)調用棧框架"Thefirstnumber:"10prompttGetInteger首次調用GetInteger函數(shù),數(shù)據(jù)輸入后函數(shù)調用棧框架main"Thefirstnumber:"10prompttGetInteger首次調用GetInteger函數(shù),數(shù)據(jù)輸入后函數(shù)調用棧框架10absummain首次調用GetInteger函數(shù)結束函數(shù)調用??蚣躮ain"Thesecondnumber:"20prompttGetInteger再次調用GetInteger函數(shù),數(shù)據(jù)輸入后函數(shù)調用棧框架1020absummain再次調用GetInteger函數(shù)結束函數(shù)調用??蚣苷{用Add函數(shù)main1030xtAdd20y函數(shù)調用??蚣?02030absummain調用Add函數(shù)結束,結果為30整數(shù)互換示例第一版編寫程序將用戶輸入的兩個整數(shù)互換#include<stdio.h>#include"zylib.h"voidPrintWelcomeInfo();intGetInteger(STRINGprompt);voidSwap(intx,inty);intmain(){inta,b;

/*輸入部分*/PrintWelcomeInfo();a=GetInteger("Thefirstnumber:");b=GetInteger("Thesecondnumber:");

/*數(shù)據(jù)處理與輸出部分*/printf("Inmain():a:%d;b:%d\n",a,b);Swap(a,b);printf("Inmain():a:%d;b:%d\n",a,b);return0;}整數(shù)互換示例第一版voidPrintWelcomeInfo(){printf("Theprogramgetstwointegers,andtriestoswapthem.\n");}intGetInteger(STRINGprompt){intt;printf("%s",prompt);t=GetIntegerFromKeyboard();returnt;}voidSwap(intx,inty){intt;printf("InSwap():x:%d;y:%d\n",x,y);t=x;x=y;y=t;printf("InSwap():x:%d;y:%d\n",x,y);return;}整數(shù)互換程序??蚣?020abmain調用Swap函數(shù)前整數(shù)互換程序??蚣苷{用Swap函數(shù),數(shù)據(jù)互換前main10xtSwap20y整數(shù)互換程序??蚣苷{用Swap函數(shù),數(shù)據(jù)互換后main2010xtSwap10y整數(shù)互換程序棧框架1020abmain調用Swap函數(shù)后整數(shù)互換示例第二版編寫程序將用戶輸入的兩個整數(shù)互換#include<stdio.h>#include"zylib.h"inta,b;

/*全局數(shù)據(jù)對象聲明,以保證所有函數(shù)都可以訪問這兩個數(shù)據(jù)對象*/voidPrintWelcomeInfo();intGetInteger(STRINGprompt);voidSwap();

/*不再需要函數(shù)參數(shù)*/intmain(){/*輸入部分*/PrintWelcomeInfo();a=GetInteger("Thefirstnumber:");b=

溫馨提示

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

評論

0/150

提交評論