C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件全套 第1-10章 程序設(shè)計(jì)的計(jì)算機(jī)基礎(chǔ) -文件讀寫和綜合應(yīng)用_第1頁
C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件全套 第1-10章 程序設(shè)計(jì)的計(jì)算機(jī)基礎(chǔ) -文件讀寫和綜合應(yīng)用_第2頁
C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件全套 第1-10章 程序設(shè)計(jì)的計(jì)算機(jī)基礎(chǔ) -文件讀寫和綜合應(yīng)用_第3頁
C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件全套 第1-10章 程序設(shè)計(jì)的計(jì)算機(jī)基礎(chǔ) -文件讀寫和綜合應(yīng)用_第4頁
C語言程序設(shè)計(jì)基礎(chǔ)(通識版 慕課版) 課件全套 第1-10章 程序設(shè)計(jì)的計(jì)算機(jī)基礎(chǔ) -文件讀寫和綜合應(yīng)用_第5頁
已閱讀5頁,還剩440頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

哈爾濱工業(yè)大學(xué)第1章程序設(shè)計(jì)的計(jì)算機(jī)基礎(chǔ)計(jì)算機(jī)與人工智能他是少年天才,曾享受與愛因斯坦同等的待遇(不須上課),是計(jì)算機(jī)史上著名的“101頁報(bào)告”的作者之一,被譽(yù)為“現(xiàn)代計(jì)算機(jī)之父”他是改變世界的第三個蘋果的締造者,是電腦業(yè)界與娛樂業(yè)界的標(biāo)志性人物,他為我們留下眾多傳世之作!他是個人PC時代當(dāng)之無愧的領(lǐng)軍人物,他的軟件產(chǎn)品遍布世界每一個角落,而他也當(dāng)仁不讓地長期霸占世界首富的桂冠!他曾協(xié)助軍方破解德國的著名密碼系統(tǒng)Enigma,他提出的著名模型為現(xiàn)代計(jì)算機(jī)的邏輯工作方式奠定了基礎(chǔ),被譽(yù)為“計(jì)算機(jī)科學(xué)之父”2計(jì)算機(jī)與人工智能3CanMachinesThink?計(jì)算機(jī)與人工智能人工智能(ArtificialIntelligence,簡稱AI)讓計(jì)算機(jī)具有執(zhí)行某些與人類智能活動有關(guān)的復(fù)雜功能(如判斷、推理、識別、理解、學(xué)習(xí)、規(guī)劃和問題求解等)的能力《變形金剛》《人工智能》《終結(jié)者》系列《黑客帝國》三部曲4人機(jī)大戰(zhàn)計(jì)算機(jī)與人工智能5IBM的”思考”成為第一臺能同人下棋的計(jì)算機(jī)19581988“深思”擊敗丹麥特級大師拉爾森1989“深思”在與世界棋王卡斯帕羅夫進(jìn)行的對陣中以0比2敗北1996“深藍(lán)”誕生,在與卡斯帕羅夫的挑戰(zhàn)賽中”深藍(lán)”以2比4失利1997“更深的藍(lán)”以3比2擊敗了卡斯帕羅夫2001“更弗里茨”擊敗了卡斯帕羅夫、阿南德以及除了克拉姆尼克之外的所有排名世界前十位的棋手2002“更弗里茨”與克拉姆尼克以4比4戰(zhàn)平2014年6月7日,聊天程序“尤金·古斯特曼”在英國皇家學(xué)會舉行的2014圖靈測試大會上冒充一個13歲烏克蘭男孩而騙過了33%的評委,從而“通過”了圖靈測試2012年6月底,在英國著名的布萊切利莊園舉行了一場國際人工智能機(jī)器測試競賽。由俄羅斯專家設(shè)計(jì)的“葉甫根尼”電腦程序脫穎而出,其29.2%的回答均成功“騙過”了測試者計(jì)算機(jī)與人工智能計(jì)算機(jī)很強(qiáng)大?2011年,IBM公司研制的可以參加智力問答比賽的“沃森(Watson)”軟件系統(tǒng)能以每秒翻100萬本書的速度從其存儲的2億頁百科全書、字典、文學(xué)作品中搜索答案,這種人類望塵莫及的事情計(jì)算機(jī)很笨?計(jì)算機(jī)去理解一個兒童故事這種連5歲小孩子都能做到的事情,卻困難重重6計(jì)算機(jī)系統(tǒng)計(jì)算機(jī)系統(tǒng)(ComputerSystem)一種能按照事先存儲的程序自動、高效地對數(shù)據(jù)進(jìn)行輸入、處理、存儲和輸出的系統(tǒng)由硬件(Hardware)和軟件(Software)兩部分組成7計(jì)算機(jī)系統(tǒng)硬件系統(tǒng):計(jì)算機(jī)的軀殼8存儲器輸入設(shè)備輸出設(shè)備控制器運(yùn)算器CPU計(jì)算機(jī)系統(tǒng)硬件系統(tǒng):計(jì)算機(jī)的軀殼9軟件系統(tǒng):計(jì)算機(jī)的靈魂計(jì)算機(jī)系統(tǒng)10操作系統(tǒng)應(yīng)用軟件支撐軟件人與計(jì)算機(jī)是如何通訊的站起來坐下跳舞啟動跑步1000100111110000自然語言機(jī)器語言機(jī)器語言機(jī)器語言(MachineLanguage)計(jì)算機(jī)能直接讀懂和執(zhí)行的語言機(jī)器代碼(MachineCode)用機(jī)器語言編寫的一組機(jī)器指令的集合12機(jī)器語言與高級語言100001100000011110001011000010101001011100000111MOVA,7ADDA,10MOV(7),AHLTResult=7+10Return編碼機(jī)器語言二進(jìn)制和編碼方式匯編語言用助記符號編寫程序高級語言用類似自然語言的語句編寫程序13高級語言的分類

語言典型代表特點(diǎn)過程式語言(Procedural)C命令驅(qū)動,面向動作(語句),即將計(jì)算看作是動作(語句)的序列,程序由一系列的語句組成函數(shù)式語言(Functional)LISP注重程序?qū)崿F(xiàn)的功能,程序的編寫過程是從已有函數(shù)出發(fā)構(gòu)造出更復(fù)雜的函數(shù),應(yīng)用這些函數(shù)直至計(jì)算求得最終結(jié)果面向?qū)ο笳Z言(Object-Oriented)SmallTalk、C++、Java程序的編寫過程是直接從問題本身出發(fā)分析問題,并把數(shù)據(jù)和操作封裝在一起構(gòu)成對象,用數(shù)據(jù)描述對象屬性,用對數(shù)據(jù)的操作描述對象行為邏輯式語言(Logical)PROLOG基于規(guī)則的具有推理功能的語言10大流行語言的流行趨勢和受歡迎程度C語言的設(shè)計(jì)者KenThompson江湖人稱kenDennisM.Ritchie江湖人稱dmr兩個骨灰級游戲玩家Ritchie漫畫像C語言的誕生始末1969年,ken夢想能遨游宇宙,設(shè)計(jì)了一款模擬在太陽系航行的電子游戲——“SpaceTravel”,1971年dmr加入游戲在PDP-7小型機(jī)上開發(fā),因?yàn)檫@臺機(jī)器免費(fèi),但免費(fèi)的機(jī)器沒有操作系統(tǒng)玩游戲前,先給PDP-7做個操作系統(tǒng),命名為UNIX20世紀(jì)60年代,Ritchie和Thompson在貝爾實(shí)驗(yàn)室開發(fā)UNIX操作系統(tǒng)C語言的誕生始末匯編編寫UNIX太慢,而一般的高級語言難以實(shí)現(xiàn)匯編語言的某些功能,怎么辦?dmr改造B語言,設(shè)計(jì)了一種新的高級語言,命名為“C語言”,把UNIX的90%以上代碼用C改寫1983年,因?yàn)閁NIX和C語言的巨大成功,ken和dmr共同獲得當(dāng)年度的計(jì)算機(jī)界最高獎——圖靈獎1999年接受美國國家技術(shù)勛章C語言標(biāo)準(zhǔn)1978年,DennisM.Richie和BrianW.Kernighan合著影響深遠(yuǎn)的名著《TheCProgrammingLanguage》1982年,美國國家標(biāo)準(zhǔn)化協(xié)會(AmericanNationalStandardsInstitute,ANSI)成立C標(biāo)準(zhǔn)委員會1989年,發(fā)布第一個完整的C語言標(biāo)準(zhǔn),簡稱C89習(xí)慣上也稱為ANSIC(標(biāo)準(zhǔn)C)1990年被國際標(biāo)準(zhǔn)化組織ISO采納,也稱為C901999年修正和完善之后,ISO發(fā)布了C9919/37馮.諾依曼機(jī)運(yùn)算器控制器存儲器輸入輸出存儲器輸入設(shè)備輸出設(shè)備控制器運(yùn)算器CPU計(jì)算機(jī)的基本工作原理C語言編程的基本步驟源文件目標(biāo)文件庫文件可執(zhí)行文件怎么學(xué)“編程”漢語和英語是人與人交流的工具,而程序設(shè)計(jì)語言是人與計(jì)算機(jī)交流的工具有著天生自學(xué)(漢語)的和后天訓(xùn)練(英語)的“語言學(xué)習(xí)”能力字母單詞詞性時態(tài)語態(tài)短語語氣句子成分句型結(jié)構(gòu)標(biāo)識符數(shù)據(jù)類型常量函數(shù)控制結(jié)構(gòu)變量數(shù)組字母指針AI輔助編程及其工具

AI編程工具是一種AI大語言模型驅(qū)動的工具,通過將其集成到現(xiàn)有的開發(fā)環(huán)境中提供代碼生成、智能補(bǔ)全、錯誤檢測、代碼優(yōu)化、代碼解釋、注釋生成等功能。

Cursor、GitHub?Copilot?國外主流的AI編程工具由阿里基于通義大模型研發(fā)的通義靈碼?(TONGYILingma)由文心大模型提供技術(shù)支持的文心快碼(Baidu?Comate?)字節(jié)跳動基于豆包大模型研發(fā)的豆包MarsCode騰訊云推出的騰訊云AI代碼助手……國內(nèi)主流的AI編程工具Thankyouforyourattention!Q&A24/37第2章基本IO和基本運(yùn)算哈爾濱工業(yè)大學(xué)2.1認(rèn)識C語言程序從HelloWorld開始【例2.1】向屏幕輸出"Helloworld!"分兩行輸出“Helloworld!”呢?#include<stdio.h>intmain(void){printf("Helloworld\n");

return0;}以#開頭,編譯預(yù)處理指令EveryCprogrammusthaveamainfunctionTheexecutionofCprogramstartsfrommain()function頭文件2.2變量及其數(shù)據(jù)類型常量(Constant)在程序中不能改變其值的量變量(Variable)其值在程序執(zhí)行過程中是可以改變的2.2.1變量的類型和變量的定義(1)聲明變量的同時為變量賦值(Assignment)

——變量的初始化(Initialize)未被初始化的變量的值會是什么?其值為隨機(jī)數(shù)(亂碼)

變量的聲明(VariableDeclaration)

類型關(guān)鍵字變量名;2.2.1變量的類型和變量的定義使用變量的基本原則變量必須先聲明,后使用一條聲明語句可聲明若干個同類型的變量inta,b,c;聲明的順序無關(guān)緊要占用內(nèi)存空間的大小數(shù)據(jù)的存儲形式合法的表數(shù)范圍可參與的運(yùn)算種類2.2.2變量的類型決定了什么?(1)不同數(shù)據(jù)類型可參與的運(yùn)算不同整型加、減、乘、除、求余實(shí)型加、減、乘、除字符型加、減(整數(shù))對ASCII碼值的運(yùn)算指針類型加、減(整數(shù))和比較運(yùn)算(2)不同類型數(shù)據(jù)占用的內(nèi)存大小不同如何計(jì)算變量或類型占內(nèi)存的大小計(jì)算變量占內(nèi)存空間的大小用sizeof運(yùn)算符一元運(yùn)算符用sizeof運(yùn)算符計(jì)算變量占內(nèi)存空間的大小的好處增加程序的可移植性編譯時執(zhí)行的運(yùn)算符,不會導(dǎo)致額外的運(yùn)行時間開銷語法形式運(yùn)算結(jié)果sizeof(類型)類型占用的內(nèi)存字節(jié)數(shù)

sizeof(變量或表達(dá)式)變量或表達(dá)式所屬類型占的內(nèi)存字節(jié)數(shù)整型數(shù)一個多字節(jié)的數(shù)據(jù)是如何存放到存儲單元中的呢?小端次序便于計(jì)算機(jī)從低位字節(jié)向高位字節(jié)運(yùn)算大端次序與人們從左到右的書寫順序相同,便于處理字符串(3)不同類型數(shù)據(jù)的存儲形式不同高位字節(jié)低位字節(jié)……低位字節(jié)高位字節(jié)小端次序(Little-endian)……高位字節(jié)低位字節(jié)大端次序(Big-endian)如何存儲實(shí)型數(shù)呢?關(guān)鍵:確定小數(shù)點(diǎn)的位置問題:如何表示實(shí)型數(shù)?小數(shù)形式指數(shù)形式——科學(xué)計(jì)數(shù)法(3)不同類型數(shù)據(jù)的存儲形式不同整數(shù)部分小數(shù)部分定點(diǎn)數(shù)(FixedPoint)小數(shù)點(diǎn)的位置固定定點(diǎn)整數(shù)定點(diǎn)小數(shù)定點(diǎn)數(shù)定點(diǎn)小數(shù)(純小數(shù))——小數(shù)點(diǎn)位于符號位和最高數(shù)值位之間定點(diǎn)整數(shù)——小數(shù)點(diǎn)位于數(shù)值位的最低位

(3)不同類型數(shù)據(jù)的存儲形式不同...符號位固定小數(shù)點(diǎn)數(shù)值部分...符號位固定小數(shù)點(diǎn)數(shù)值部分問題:如何表示實(shí)型數(shù)?小數(shù)形式指數(shù)形式——科學(xué)計(jì)數(shù)法(3)不同類型數(shù)據(jù)的存儲形式不同整數(shù)部分小數(shù)部分指數(shù)部分小數(shù)部分定點(diǎn)數(shù)(FixedPoint)小數(shù)點(diǎn)的位置固定浮點(diǎn)數(shù)(Floating-Point)小數(shù)點(diǎn)的位置不固定浮點(diǎn)數(shù)實(shí)現(xiàn)小數(shù)點(diǎn)位置可浮動的主要原因?qū)?shí)數(shù)拆分成了階碼(Exponent)和尾數(shù)(Mantissa)分別存儲對于同樣的尾數(shù),階碼的值越大,則浮點(diǎn)數(shù)所表示的數(shù)值的絕對值就越大(3)不同類型數(shù)據(jù)的存儲形式不同階碼E(指數(shù)部分)尾數(shù)M(小數(shù)部分)N=rE

M

r為基數(shù)通常取2決定實(shí)數(shù)的表數(shù)精度決定實(shí)數(shù)的表數(shù)范圍同樣是4個字節(jié)(32位)定點(diǎn)數(shù)表數(shù)范圍受其二進(jìn)制位數(shù)的限制——值域都是有限的在計(jì)算機(jī)中通常是用定點(diǎn)數(shù)來表示整數(shù)和純小數(shù)用浮點(diǎn)數(shù)表示既有整數(shù)部分、又有小數(shù)部分的實(shí)數(shù)(3)不同類型數(shù)據(jù)的存儲形式不同定點(diǎn)數(shù)-231~231-1單精度浮點(diǎn)數(shù)-3.402823466×1038~3.402823466×1038字符型數(shù)據(jù)(英文字母、數(shù)字、控制字符)以二進(jìn)制編碼方式存儲,一個字節(jié)保存一個字符字符編碼方式取決于計(jì)算機(jī)系統(tǒng)所使用的字符集ASCII(美國標(biāo)準(zhǔn)信息交換碼)字符集每個字符有一個編碼值(查ASCII碼表)字符常數(shù)就是一個普通整數(shù)(3)不同類型數(shù)據(jù)的存儲形式不同01001000‘H’72(4)不同數(shù)據(jù)類型的表數(shù)范圍不同(2)不同數(shù)據(jù)類型的表數(shù)范圍不同以2字節(jié)(16位)短整型為例有符號整數(shù)的最高位是符號位,使其數(shù)據(jù)位比無符號整數(shù)的數(shù)據(jù)位少了1位2.2.3標(biāo)識符的命名規(guī)則(1)標(biāo)識符由英文字母、數(shù)字和下畫線組成,且必須以英文字母或下畫線開頭。(2)不允許使用關(guān)鍵字作為標(biāo)識符,同時標(biāo)識符也不應(yīng)與系統(tǒng)預(yù)定義的庫函數(shù)重名。(3)C語言的標(biāo)識符可以是任意長度。一般也會有最大長度(與編譯器相關(guān))限制。(4)標(biāo)識符應(yīng)直觀、易于拼讀、易于記憶,即做到“見名知意”,最好使用英文單詞及其組合,切忌使用漢語拼音。2.2.3標(biāo)識符的命名規(guī)則(5)標(biāo)識符應(yīng)盡量與所采用的操作系統(tǒng)或開發(fā)工具的風(fēng)格保持一致。例如,Windows應(yīng)用程序的標(biāo)識符通常采用“大小寫混排”方式,如MaxValue,而UNIX應(yīng)用程序的標(biāo)識符通常采用“小寫加下畫線”方式,如max_value。不要將兩類風(fēng)格混在一起使用。(6)C語言的標(biāo)識符是區(qū)分大小寫(對大小寫敏感)的。在程序中不能改變其值的量包括:整型(如0,67,2,

123L,123u,

022,0x12)默認(rèn)為基本整型int實(shí)型(如2.3,1.2e-5,2.73F,2.73L)默認(rèn)為雙精度實(shí)型double字符型(如'z','3','$’)字符串(如"UKM","1","5a”)枚舉型2.3常量長整型無符號整型八進(jìn)制十六進(jìn)制單精度實(shí)型長雙精度實(shí)型十進(jìn)制小數(shù)指數(shù)形式十進(jìn)制2.2.1常量的表示2.2.1常量的表示48/532.3.2宏常量和const變量在程序中直接使用的常數(shù),稱為幻數(shù)(MagicNumber)

問題:使用幻數(shù)存在什么問題?程序的可讀性變差容易發(fā)生書寫錯誤,產(chǎn)生不一致性當(dāng)常數(shù)需要改變時,要修改所有引用它的代碼,繁瑣,還可能有遺漏良好的程序設(shè)計(jì)風(fēng)格建議把幻數(shù)定義為宏常量const常量優(yōu)點(diǎn)減少重復(fù)書寫常數(shù)的工作量提高程序的可讀性和可維護(hù)性宏常量(MacroConstant)用一個標(biāo)識符號來表示的常量宏定義

#define

標(biāo)識符字符串

編譯預(yù)處理命令:在源程序編譯之前,先對程序中的編譯預(yù)處理命令進(jìn)行處理然后將處理的結(jié)果和源程序一起進(jìn)行編譯,以得到目標(biāo)代碼2.3.2宏常量和const變量宏常量(MacroConstant)宏定義

#define

標(biāo)識符字符串

#definePI3.14159

符號常量(SymbolicConstant)宏名(MacroName),一般全大寫不區(qū)分?jǐn)?shù)據(jù)類型2.3.2宏常量和const變量宏常量存在的問題是什么?沒有數(shù)據(jù)類型,編譯器在宏替換時不進(jìn)行類型檢查只進(jìn)行簡單的字符串替換,極易產(chǎn)生意想不到的錯誤2.3.2宏常量和const變量constdoublepi=3.14159;const常量與宏常量相比的優(yōu)點(diǎn)是什么?const常量有數(shù)據(jù)類型,編譯器能對其進(jìn)行類型檢查某些集成化調(diào)試工具可以對const常量進(jìn)行調(diào)試2.4鍵盤輸入和屏幕輸出2.4.1單個字符的輸入輸出函數(shù)2.4.2格式化輸入輸出函數(shù)2.4.1單個字符的輸入輸出字符輸出函數(shù)putchar()putchar(ch)向屏幕輸出一個字符,字符型變量ch的值字符輸入函數(shù)getchar()ch=getchar()從鍵盤接收的字符作為getchar()的函數(shù)值無參數(shù)【例2.2】小寫英文字母轉(zhuǎn)換成大寫英文字母B↙b#include<stdio.h>intmain(void){ charch; ch=getchar();//從鍵盤輸入一個字符,按回車鍵結(jié)束輸入

ch=ch–('a'-'A');//將大寫字母轉(zhuǎn)換為小寫字母 putchar(ch);//在屏幕上顯示變量ch中的字符 putchar('\n');//輸出一個回車換行控制符

return0;}2.4.2數(shù)據(jù)的格式化屏幕輸出按指定格式和類型輸出變量的值,或者輸出一行字符串printf(格式控制字符串,輸出值參數(shù)表);printf("a=%db=%f",a,b);輸出值參數(shù)類型應(yīng)與格式轉(zhuǎn)換說明符相匹配可輸出多個任意類型的數(shù)據(jù)可變長度的輸出參數(shù)表與格式說明符一一對應(yīng)普通字符轉(zhuǎn)換說明指定輸出數(shù)據(jù)格式%ddecimal

輸出十進(jìn)制有符號int型%uunsigned

輸出十進(jìn)制無符號int型%ffloat

以小數(shù)形式(6位小數(shù))輸出float,double型%eexponent以標(biāo)準(zhǔn)指數(shù)形式輸出float,double型inta=10;printf("%d",a);10doubleb=10.3;printf("%f",b);10.300000floatb=10.3;printf("%e",b);1.030000e+0012.4.2數(shù)據(jù)的格式化屏幕輸出%ccharacter以字符形式輸出單個字符charc=‘A’;printf("%c",c);Acharc=‘A’;printf("%d",c);652.4.2數(shù)據(jù)的格式化屏幕輸出2.4.3數(shù)據(jù)的格式化鍵盤輸入

轉(zhuǎn)換說明可變長度輸入地址參數(shù)表格式

scanf(格式控制字符串,輸入地址表);

scanf("%d%f",&a,&b);

&是取地址運(yùn)算符格式

scanf(格式控制字符串,輸入地址表);

scanf("%d%f",&a,&b);如何分隔多個輸入數(shù)據(jù)?1)空格、Tab或回車2)達(dá)到輸入位寬3)遇非法字符遇以上情況都認(rèn)為一個數(shù)據(jù)輸入結(jié)束:2.4.3數(shù)據(jù)的格式化鍵盤輸入%d 輸入十進(jìn)制int型%f,%e 輸入float型(不能指定輸入數(shù)據(jù)的精度)%c 輸入一個字符(包括空白字符)常見錯誤scanf("%7.2f",&a);scanf("%f",

a);scanf("%f\n",

&a);2.4.3數(shù)據(jù)的格式化鍵盤輸入scanf()的格式修飾符m 輸入數(shù)據(jù)的位寬l 加d、u前輸入long型 加f、e前輸入double型L 加f、e前輸入longdouble型h 加d前輸入short型%ld 輸入longint型%hd 輸入shortint型%f 輸入float型%lf

輸入double型m 輸入數(shù)據(jù)的位寬l 加d、u前輸入long型 加f、e前輸入double型L 加f、e前輸入longdouble型h 加d前輸入short型* 輸入項(xiàng)在讀入后不賦給相應(yīng)的變量2.4.3數(shù)據(jù)的格式化鍵盤輸入2.5算術(shù)運(yùn)算算術(shù)表達(dá)式除法(Division)

a/b浮點(diǎn)數(shù)除法(FloatingDivision)aorborbotharefloats整數(shù)除法(IntegerDivision)aandbareintegers11/5=211.0/5=2.22.5算術(shù)運(yùn)算操作數(shù)必須是整數(shù),返回a與b相除之后的余數(shù)(Remainder)(1)提取數(shù)字的最低位。例如,123%10即可得到123的最低位3。(2)判斷一個數(shù)能否被另一個數(shù)整除。例如,若m%n的結(jié)果為0,則m能被n整除。(3)判斷一個數(shù)是否為偶數(shù)。例如,若m%2的結(jié)果為0,則m為偶數(shù)。(4)生成一個指定范圍內(nèi)的隨機(jī)數(shù)。求余(Modulus)——也稱a對b取模

a%b2.5算術(shù)運(yùn)算問題:輸出一個三位整數(shù)的個位、十位和百位數(shù)字關(guān)鍵:如何分離個位、十位、百位數(shù)字?153%10

=3153/100=1153-1*100=53

53/10=5153-1*100-5*10=3153%100

=53

53/10=5153/10

=

15

15%10=52.5算術(shù)運(yùn)算對p求模取余:H(k)=k%p將一個大范圍的自然數(shù)集合映射到一個只有p個元素的小集合上隨機(jī)函數(shù)rand()生成一個在0~32767之間的隨機(jī)數(shù)問題:如何生成一個指定范圍(如1~100)內(nèi)的隨機(jī)數(shù)?magic=rand()%100;//0~99magic=rand()%100+1;//1~1002.5算術(shù)運(yùn)算常用的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)#include<math.h>函數(shù)名功能exp(x)ex函數(shù)名功能exp(x)expow(x,y)xy函數(shù)名功能exp(x)expow(x,y)xysqrt(x)x的平方根,(x>=0)函數(shù)名功能exp(x)expow(x,y)xysqrt(x)x的平方根,(x>=0)fabs(x)|x|函數(shù)名功能exp(x)expow(x,y)xysqrt(x)x的平方根,(x>=0)fabs(x)|x|log(x)lnx,(x>0)函數(shù)名功能exp(x)expow(x,y)xysqrt(x)x的平方根,(x>=0)fabs(x)|x|log(x)lnx,(x>0)log10(x)lgx,(x>0)函數(shù)名功能exp(x)expow(x,y)xysqrt(x)x的平方根,(x>=0)fabs(x)|x|log(x)lnx,(x>0)log10(x)lgx,(x>0)sin(x)sinx,x為弧度值函數(shù)名功能exp(x)expow(x,y)xysqrt(x)x的平方根,(x>=0)fabs(x)|x|log(x)lnx,(x>0)log10(x)lgx,(x>0)sin(x)sinx,x為弧度值cos(x)cosx,x為弧度值2.5算術(shù)運(yùn)算2.6賦值運(yùn)算賦值運(yùn)算符和數(shù)學(xué)中的等號有何區(qū)別?有方向性左值和右值類型應(yīng)一致

(1)賦值表達(dá)式語句(

ExpressionStatement

變量

=

表達(dá)式

;

(2)定義變量的同時為變量賦值——初始化(Initialize)

類型變量=表達(dá)式;

2.6賦值運(yùn)算賦值運(yùn)算符的結(jié)合性?

(2)多重賦值(MultipleAssignment)

變量1=變量2=

表達(dá)式

賦值運(yùn)算符的優(yōu)先級?

(1)簡單賦值(SimpleAssignment)

變量=

表達(dá)式

一種簡寫的且執(zhí)行效率更高的賦值

(3)復(fù)合的賦值(CombinedAssignment)

變量1運(yùn)算符op=表達(dá)式

2.6賦值運(yùn)算增1運(yùn)算符(Increment)++使變量的值增加1個單位減1運(yùn)算符(Decrement)--使變量的值減少1個單位操作數(shù)只能是變量,不能是表達(dá)式,自增自減運(yùn)算一元運(yùn)算符前綴(prefix)++n--n后綴(postfix)n++n--

n=n+1

n=n–1

n=n+1

n=n–1作為前綴(prefix)運(yùn)算符時++n,--n先對n增1/減1,然后再使用n的值m=++n;n=n+1;

m=n;printf("%d",++n);n=n+1;

printf("%d",n);用增1和減1運(yùn)算生成的代碼運(yùn)行速度更快2.6賦值運(yùn)算作為后綴(postfix)運(yùn)算符時n++,n--先使用n的值,然后再對n增1/減1m=

n++;m=n;n=n+1;

printf("%d",n++);n=n+1;

printf("%d",n);2.7增1和減1運(yùn)算符i5j??46前綴與后綴對變量和表達(dá)式的影響mnm=++n-2;n=n+1;

m=n-2;m=

n++-2;m=n-2;n=n+1;

n5m??36操作數(shù)的值是相同的但表達(dá)式的值是不同的2.7增1和減1運(yùn)算符優(yōu)點(diǎn)增1和減1運(yùn)算生成的代碼效率更高一些問題:過多的增1和減1運(yùn)算混合會產(chǎn)生什么結(jié)果?可讀性差,例如(++n)+(++n),(n++)+(n++)不同編譯器產(chǎn)生的運(yùn)行結(jié)果不同良好的程序設(shè)計(jì)風(fēng)格提倡在一行語句中,一個變量只出現(xiàn)一次增1或減1運(yùn)算2.7增1和減1運(yùn)算符2.8.1自動類型轉(zhuǎn)換2.8.2強(qiáng)制類型轉(zhuǎn)換2.8混合數(shù)據(jù)類型運(yùn)算中的類型轉(zhuǎn)換算術(shù)表達(dá)式中問題:相同類型數(shù)據(jù)的運(yùn)算結(jié)果的類型是什么?還是該類型例如,整數(shù)除法2.8.1自動類型轉(zhuǎn)換11/5=2根據(jù)參與運(yùn)算的操作數(shù)類型從低級別向高級別自動轉(zhuǎn)換算術(shù)表達(dá)式中問題:不同類型數(shù)據(jù)的運(yùn)算結(jié)果的類型是什么?取值范圍較大的那種類型例如,浮點(diǎn)數(shù)除法C編譯器將所有操作數(shù)都轉(zhuǎn)換成取值范圍較大的操作數(shù)的類型——類型提升(TypePromotion)11.0/5=11.0/5.0=2.22.8.1自動類型轉(zhuǎn)換Example:

inttotal,number; floataver; … aver=total/number;

15/2

7total15number2aver??7.000000整數(shù)除法2.8.2強(qiáng)制類型轉(zhuǎn)換不同類型的數(shù)據(jù)的運(yùn)算結(jié)果的類型?

intnumber;

floattotal,aver; … aver=total/number;

15.000000/2

7.500000total15number2aver??7.500000浮點(diǎn)數(shù)除法2.8.2強(qiáng)制類型轉(zhuǎn)換不同類型的數(shù)據(jù)的運(yùn)算結(jié)果的類型?

intnumber;

floattotal,aver; … aver=total/number;

15.000000/2

7.500000total15number2aver??7.500000如何避免這種隱式的自動類型轉(zhuǎn)換,以顯式地表明程序員的意圖?2.8.2強(qiáng)制類型轉(zhuǎn)換Example:

inttotal,number; floataver; … aver=(float)total/number; total15number2aver??將一個表達(dá)式的類型強(qiáng)制轉(zhuǎn)換為用戶指定的類型

15.000000/2

7.5000007.500000(類型)表達(dá)式——一元運(yùn)算符2.8.2強(qiáng)制類型轉(zhuǎn)換Example:

inttotal,number; floataver; … aver=(float)total/number;

15.000000/2

7.500000total15number2aver??7.500000不改變total的類型和值2.8.2強(qiáng)制類型轉(zhuǎn)換Example:

inttotal,number; floataver; … aver=(float)total/number;

15/2=7

7.000000total15number2aver??7.000000(float)(total/number)結(jié)果如何? 2.8.2強(qiáng)制類型轉(zhuǎn)換1.明確需求2.撰寫指令3.生成代碼4.采納并運(yùn)行分析和梳理清楚你想要實(shí)現(xiàn)的項(xiàng)目需求用自然語言書寫Prompt:背景,角色和任務(wù),要求或示例,輸出格式AI根據(jù)你的指令生成代碼建議理解、評判、采納并運(yùn)行代碼,確認(rèn)是否符合需求2.9AI編程的基本流程本章思維導(dǎo)圖85/53Thankyouforyourattention!Q&A86/50第3章基本控制結(jié)構(gòu)哈爾濱工業(yè)大學(xué)3.1算法的概念和描述方法3.1.1算法的概念3.1.2算法的描述方法3.1.1算法的概念算法(Algorithm)為解決一個具體問題而采取的確定的有限的操作步驟,僅指計(jì)算機(jī)能執(zhí)行的算法計(jì)算機(jī)中的問題求解計(jì)劃通過程序員按照某種算法編寫的計(jì)算機(jī)程序(ComputerProgram)來實(shí)現(xiàn)的設(shè)計(jì)出正確的算法是編寫正確的計(jì)算機(jī)程序的前提條件程序設(shè)計(jì)是一門藝術(shù),主要體現(xiàn)在算法設(shè)計(jì)結(jié)構(gòu)設(shè)計(jì)揭示面向過程的程序本質(zhì)的公式算法+數(shù)據(jù)結(jié)構(gòu)=程序N.Wirth(圖靈獎1984)Pascal創(chuàng)始人定義待操作的數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中是如何存儲和組織的,選擇恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)可以提高程序的運(yùn)行或存儲效率對在數(shù)據(jù)上的操作的描述,不同的算法可能有不同的時間或空間效率3.1.1算法的概念算法的特性有窮性(Finiteness)在合理的時間內(nèi)完成確定性(Definiteness)無歧義,能有效執(zhí)行,且能得到確定的結(jié)果有效性(Effectiveness)允許沒有輸入或有多個輸入(Input)必須有一個或多個輸出(Output)3.1.1算法的概念常用的算法描述方法自然語言(NaturalLanguage)偽碼(Pseudocode)表示傳統(tǒng)的流程圖(Flowchart)N-S結(jié)構(gòu)化流程圖3.1.2算法的描述方法3.1.2算法的描述方法以買蘋果為例,已知單價每斤y元,問買x斤蘋果,需多少錢?step1:輸入x和y;step2:根據(jù)公式t=x*y計(jì)算總價;step3:輸出總價t。BeginInputx,yt=x*yOutputtEnd

自然語言描述偽碼描述通俗易懂,符合人的日常思維習(xí)慣,但不易直接轉(zhuǎn)化為程序書寫無固定格式和規(guī)范,靈活,介于自然語言和計(jì)算機(jī)語言之間,易于轉(zhuǎn)換為計(jì)算機(jī)程序3.1.2算法的描述方法3.2順序結(jié)構(gòu)順序結(jié)構(gòu):最簡單、最常用的程序結(jié)構(gòu)復(fù)合語句:以兩數(shù)交換為例3.3選擇結(jié)構(gòu)3.3.1選擇結(jié)構(gòu)的控制方式3.3.2條件語句3.3.3開關(guān)語句3.3.1選擇結(jié)構(gòu)的控制方式選擇結(jié)構(gòu)根據(jù)給定的判定條件,判斷結(jié)果,并根據(jù)判斷的結(jié)果來控制程序的流程選擇結(jié)構(gòu)(分支結(jié)構(gòu))單分支選擇結(jié)構(gòu)(SingleSelection)雙分支選擇結(jié)構(gòu)(DoubleSelection)多分支選擇結(jié)構(gòu)(MultipleSelection)單分支選擇結(jié)構(gòu)(SingleSelection)面臨的選擇是:要么執(zhí)行一個操作,要么跳過它3.3.1選擇結(jié)構(gòu)的控制方式雙分支選擇結(jié)構(gòu)(DoubleSelection)面臨的選擇是:在兩個不同的操作中選擇其中的一個來執(zhí)行多分支選擇結(jié)構(gòu)(MultipleSelection)3.3.1選擇結(jié)構(gòu)的控制方式if-else單分支雙分支多分支ifelse-if3.3.2條件語句【例3.1】計(jì)算最大值。從鍵盤輸入兩個整型數(shù),編程計(jì)算并輸出其最大值確定問題的輸入和輸出建立問題的數(shù)學(xué)模型算法描述3.3.2條件語句【例3.1】3.3.2條件語句#include<stdio.h>intmain(void){ inta,b,max; scanf("%d,%d",&a,&b); if(a>=b) { max=a; } else { max=b; } printf("max=%d\n",max);return0;}#include<stdio.h>intmain(void){ inta,b; scanf("%d,%d",&a,&b); if(a>=b) { printf("max=%d\n",a); } else { printf("max=%d\n",b); }return0;}【例3.1】3.3.2條件語句#include<stdio.h>intmain(void){ inta,b,max; scanf("%d,%d",&a,&b); max=a>=b?a:b;

printf("max=%d\n",max);return0;}#include<stdio.h>intmain(void){ inta,b; scanf("%d,%d",&a,&b); printf("max=%d\n",a>=b?a:b);//直接打印條件表達(dá)式的值

return0;}3.3.2條件語句如何表示真假值?真

1假

0如何判斷真假值?非0

真0

假3.3.2條件語句3.3.2條件語句邏輯非

算術(shù)

關(guān)系

邏輯與

邏輯或

賦值圓括號優(yōu)先級最高【例3.2】從鍵盤任意輸入一個年份year,編程判斷其是否為閏年,如果是閏年,則輸出“Yes!”,否則輸出“No!”。閏年需要滿足下列兩個條件中的任意一個。(1)能被4整除,但不能被100整除。(2)能被400整除。3.3.2條件語句#include<stdio.h>intmain(void){ intyear,leap; scanf("%d",&year); leap=((year%4==0)&&(year%100!=0))||(year%400==0); if(leap)//若leap的值為非0,即為真

{

printf("Yes!\n"); } else { printf("No!\n"); }return0;}【例3.2】從鍵盤任意輸入一個年份year,編程判斷其是否為閏年,如果是閏年,則輸出“Yes!”,否則輸出“No!”。3.3.2條件語句#include<stdio.h>intmain(void){ intyear; scanf("%d",&year); if(((year%4==0)&&(year%100!=0))||(year%400==0)) { printf("Yes!\n"); } else { printf("No!\n"); }return0;}【例3.3】簡單的計(jì)算器。要求用戶按如下格式從鍵盤輸入算式:操作數(shù)1運(yùn)算符op操作數(shù)2編程輸出其計(jì)算結(jié)果值,算術(shù)運(yùn)算符包括:加(+)、減(-)、乘(*)、除(/)。3.3.3開關(guān)語句3.3.3開關(guān)語句#include<stdio.h>intmain(void){ intdata1,data2; charop; scanf("%d%c%d",&data1,&op,&data2);//輸入算式,運(yùn)算符兩側(cè)不加空格

if(op=='+') //加法運(yùn)算

{

printf("%d+%d=%d\n",data1,data2,data1+data2); } elseif(op=='-') //減法運(yùn)算

{

printf("%d-%d=%d\n",data1,data2,data1-data2); } elseif(op=='*') //乘法運(yùn)算

{

printf("%d*%d=%d\n",data1,data2,data1*data2); } elseif(op=='/') //除法運(yùn)算

{

if(data2==0)//為避免除0錯誤,檢驗(yàn)除數(shù)是否為0 {

printf("Divisionbyzero!\n"); } else { printf("%d/%d=%d\n",data1,data2,data1/data2); } } else { printf("Invalidoperator!\n"); } return0;}3.3.3開關(guān)語句1.每個case后的常量的類型應(yīng)與switch后括號內(nèi)表達(dá)式的類型一致,并且switch后括號內(nèi)表達(dá)式的值只能為整型、字符型或枚舉類型的常量。2.switch語句與break語句配合使用,才能形成真正意義上的多分支3.改變case標(biāo)號出現(xiàn)的次序,不會影響程序的運(yùn)行結(jié)果3.3.3開關(guān)語句#include<stdio.h>intmain(void){ intdata1,data2; charop; scanf("%d%c%d",&data1,&op,&data2);//輸入算式,運(yùn)算符兩側(cè)不加空格

switch(op) //根據(jù)輸入的運(yùn)算符確定執(zhí)行的運(yùn)算

{

case'+'://加法運(yùn)算

printf("%d+%d=%d\n",data1,data2,data1+data2); break; case'-'://減法運(yùn)算

printf("%d-%d=%d\n",data1,data2,data1-data2); break; case'*'://乘法運(yùn)算

printf("%d*%d=%d\n",data1,data2,data1*data2); break; case'/'://除法運(yùn)算

if(data2==0)//為避免除0錯誤,檢驗(yàn)除數(shù)是否為0{

printf("Divisionbyzero!\n"); } else { printf("%d/%d=%d\n",data1,data2,data1/data2); } break; default://處理非法運(yùn)算符

printf("Invalidoperator!\n"); } return0;}3.4循環(huán)結(jié)構(gòu)3.4.1循環(huán)控制方式3.4.2計(jì)數(shù)控制的循環(huán)和for語句3.4.3條件控制的循環(huán)以及while和do-while語句3.4.4嵌套循環(huán)3.4.1循環(huán)的控制方式當(dāng)型循環(huán)是先測試循環(huán)條件,后執(zhí)行循環(huán)體直到型循環(huán)是先執(zhí)行循環(huán)體,然后測試循環(huán)條件3.4.2計(jì)數(shù)控制的循環(huán)實(shí)現(xiàn)計(jì)數(shù)控制的for語句

3.4.2計(jì)數(shù)控制的循環(huán)#include<stdio.h>intmain(void){intn;intsum=0;//累加和變量初始化為0

scanf("%d",&n);for(inti=1;i<=n;i++){sum=sum+i;//做累加運(yùn)算

}

printf("sum=%d\n",sum);return0;}【例3.4】從鍵盤輸入整型變量n的值,然后計(jì)算并輸出1+2+3+…+n的值。3.4.2計(jì)數(shù)控制的循環(huán)#include<stdio.h>intmain(void){ intn; scanf("%d",&n); intsum=(n%2==0)?0:(n+1)/2; for(inti=1,j=n;i<j;i++,j--) { sum=sum+i+j; } printf("%d\n",sum); return0;}【例3.5】累加求和計(jì)算的加速。4.5.2計(jì)數(shù)控制的循環(huán)#include<stdio.h>intmain(void){intn;longp=1;//因是累乘計(jì)算,故初始化為1

scanf("%d",&n);for(inti=1;i<=n;i++){p=p*i;//做累乘運(yùn)算

}

printf("%d!=%ld\n",n,p);

return0;}【例3.6】從鍵盤輸入整型變量n的值,然后計(jì)算并輸出1×2×3×…×n(即n!)的值。4.5.2計(jì)數(shù)控制的循環(huán)#include<stdio.h>intmain(void){intn;longsum=0;//累加求和變量初始化為0

longp=1;//累乘求積變量初始化為1

scanf("%d",&n);for(inti=1;i<=n;i++){p=p*i;//計(jì)算累加項(xiàng)(即通項(xiàng))

sum=sum+p;//將累乘后p的值即i!進(jìn)行累加求和

}

printf("sum=%ld\n",n,p);

return0;}【例3.7】編程從鍵盤輸入整型變量n的值,然后計(jì)算并輸出1~n所有數(shù)的階乘值(1!,2!,3!,…,n!)的累加和,即1!+2!+3!+…+n!。4.5.2計(jì)數(shù)控制的循環(huán)【例3.7】編程從鍵盤輸入整型變量n的值,然后計(jì)算并輸出1~n所有數(shù)的階乘值(1!,2!,3!,…,n!)的累加和,即1!+2!+3!+…+n!。3.3.3條件控制的循環(huán)循環(huán)次數(shù)未知、由條件或標(biāo)記值控制的循環(huán)結(jié)構(gòu),通常用while語句或do-while語句來實(shí)現(xiàn)。自底向上的程序設(shè)計(jì)——只猜一次intmain(void){intmagic;

intguess;

srand(time(NULL));

magic=rand()%100+1;

printf("Guessanumber:");scanf("%d",&guess);

if(guess>magic)

{printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("Wrong!Toosmall!\n");}else

{printf("Right!\n");}return0;}【例3.8】猜數(shù)游戲V1.0:先由計(jì)算機(jī)“想”一個數(shù),然后請用戶猜,若用戶猜對了,則計(jì)算機(jī)給出提示“正確!”,否則提示“錯誤!”,并告訴用戶所猜的數(shù)是大還是小。自底向上的程序設(shè)計(jì)——只猜一次intmain(void){...

scanf("%d",&guess);

if(guess>magic) {printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("Wrong!Toosmall!\n");}else { printf("Right!\n");}

return0;}do{

}while(guess!=magic);

counter++;printf("counter=%d\n",counter);intcounter=0;

printf("Try%d:",counter+1);【例3.9】猜數(shù)游戲V2.0:在例3.7的基礎(chǔ)上,將游戲升級為:直到猜對為止,同時記錄用戶猜的次數(shù),以此來反映用戶“猜”數(shù)的水平。自底向上的程序設(shè)計(jì)——只猜一次intmain(void){...

scanf("%d",&guess);

if(guess>magic) {printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("Wrong!Toosmall!\n");}else { printf("Right!\n");}

return0;}do{

}while(guess!=magic);

counter++;printf("counter=%d\n",counter);intcounter=0;

printf("Try%d:",counter+1);&&counter<10);

【例3.10】猜數(shù)游戲3.0:在例3.8的基礎(chǔ)上,將游戲升級為:每次猜數(shù)只允許用戶最多猜10次,即用戶猜對了或者猜了10次仍未猜對,都結(jié)束游戲。自底向上的程序設(shè)計(jì)——只猜一次intmain(void){……intcounter=0;

return0;}【例3.11】猜數(shù)游戲V4.0:猜多個數(shù)charreply;do{

counter=0;magic=rand()%100+1;...//輸出magic和counterprintf("Doyouwanttocontinue(Y/Nory/n)?");scanf("%c",&reply);}while(reply=='Y'||reply=='y');3.4.4嵌套循環(huán)4.5.2計(jì)數(shù)控制的循環(huán)【例4.8】利用單獨(dú)計(jì)算累加通項(xiàng)的方法,編程計(jì)算1!+2!+3!+…+n!。#include<stdio.h>intmain(void){intn;longsum=0;//累加求和變量初始化為0

longp=1;scanf("%d",&n);for(inti=1;i<=n;i++)//外層循環(huán)

{

p=1;//每次循環(huán)之前都要將累乘求積變量p重新初始化為1

for(intj=1;j<=i;j++)//內(nèi)層循環(huán)

{

p=p*j;//累乘求積

}

sum=sum+p;//將累乘后p的值即i!進(jìn)行累加求和

}

printf("sum=%ld\n",sum); //以長整型格式輸出n的階乘值

return0;}3.5結(jié)構(gòu)化程序設(shè)計(jì)與流程轉(zhuǎn)移控制一個比較流行的定義是:結(jié)構(gòu)化程序設(shè)計(jì)(StructuredProgramming)是一種程序設(shè)計(jì)的原則和方法它限制和避免使用goto語句,采用“自頂向下、逐步求精”方法進(jìn)行程序設(shè)計(jì)按照這種原則和方法設(shè)計(jì)出的程序的特點(diǎn)為:結(jié)構(gòu)清晰容易閱讀容易修改容易驗(yàn)證按照結(jié)構(gòu)化程序設(shè)計(jì)的要求設(shè)計(jì)出的語言——結(jié)構(gòu)化程序設(shè)計(jì)語言按照結(jié)構(gòu)化程序設(shè)計(jì)語言(或結(jié)構(gòu)化程序設(shè)計(jì)思想)設(shè)計(jì)的程序——結(jié)構(gòu)化程序結(jié)構(gòu)化程序設(shè)計(jì)的目標(biāo)為了得到一個好結(jié)構(gòu)的程序有無goto語句,并不是程序結(jié)構(gòu)好壞的標(biāo)志3.5結(jié)構(gòu)化程序設(shè)計(jì)與流程轉(zhuǎn)移控制結(jié)構(gòu)化程序設(shè)計(jì)StructuredProgrammingD.E.Knuth(圖靈獎1974)12限制和避免使用goto語句采用“自頂向下逐步求精”方法進(jìn)行程序設(shè)計(jì)采用順序、選擇和循環(huán)三種基本控制結(jié)構(gòu)作為程序設(shè)計(jì)的基本單元34嚴(yán)格遵循“單入口單出口”的原則,無死循環(huán),無死語句結(jié)構(gòu)清晰容易閱讀容易修改容易驗(yàn)證原則方法特點(diǎn)3.5結(jié)構(gòu)化程序設(shè)計(jì)與流程轉(zhuǎn)移控制1.goto語句的利與弊盡量避免使用goto語句,尤其是不要使用過多的goto語句標(biāo)號(最多1個),因?yàn)檫^多的goto語句標(biāo)號會破壞程序的“單入口、單出口”結(jié)構(gòu)。為避免使用過多goto語句標(biāo)號導(dǎo)致的程序結(jié)構(gòu)混亂,一般只允許在一個“單入口、單出口”的模塊內(nèi)部使用goto語句向下跳轉(zhuǎn),不允許回跳,尤其不允許交叉使用goto語句通常,僅如下兩種情形可以使用goto語句:(1)跳出多重循環(huán)。goto語句是快速跳出多重循環(huán)的一條捷徑。(2)跳向共同的出口位置,進(jìn)行退出前的錯誤處理工作。這樣,將所有錯誤都指向同一個標(biāo)號處的語句來處理,可以使程序結(jié)構(gòu)更清晰,且代碼更集中。3.5結(jié)構(gòu)化程序設(shè)計(jì)與流程轉(zhuǎn)移控制2.break語句的利與弊break語句只對包含它的最內(nèi)層循環(huán)語句起作用,不能跳出多重循環(huán)。3.5結(jié)構(gòu)化程序設(shè)計(jì)與流程轉(zhuǎn)移控制3.continue語句的利與弊3.5結(jié)構(gòu)化程序設(shè)計(jì)與流程轉(zhuǎn)移控制3.continue語句的利與弊在大多數(shù)情況下,for循環(huán)和while循環(huán)可進(jìn)行語義等價的相互轉(zhuǎn)換,但當(dāng)循環(huán)體中存在continue語句時,將for循環(huán)轉(zhuǎn)換為while循環(huán),二者有可能不等價。3.5結(jié)構(gòu)化程序設(shè)計(jì)與流程轉(zhuǎn)移控制3.6學(xué)習(xí)AI編程的首要任務(wù)——清晰地表達(dá)需求學(xué)習(xí)AI編程首先要學(xué)會清晰準(zhǔn)確地表達(dá)問題和需求。這個過程就像點(diǎn)外賣一樣,不能只是簡單地說:“我要點(diǎn)一個宮保雞丁,請送到xx學(xué)校門口”,這樣說就很模糊以計(jì)算你的課程平均分為例,可以將需求梳理成如下三個步驟:(1)輸入:從鍵盤輸入你的各門課程的成績。(2)處理:先計(jì)算總分,然后除以課程門數(shù),得到平均分。(3)輸出:將計(jì)算出的平均分輸出到屏幕上。本章思維導(dǎo)圖Thankyouforyourattention!Q&A第4章函數(shù)與模塊化程序設(shè)計(jì)哈爾濱工業(yè)大學(xué)4.1模塊化程序設(shè)計(jì)CBCCAB自底向上(Down-top)ABCCABA1A2B1B2C1C2自頂向下(Top-down)先寫出結(jié)構(gòu)簡單、清晰的主程序來表達(dá)整個問題在此問題中包含的復(fù)雜子問題用子程序或函數(shù)來實(shí)現(xiàn)若子問題中還包含復(fù)雜的子問題,再用子程序或函數(shù)實(shí)現(xiàn)直到每個細(xì)節(jié)都可用高級語言表達(dá)為止上:比較抽象的層面下:更具體的層面接近程序設(shè)計(jì)語言規(guī)模增大問題簡單規(guī)模較小構(gòu)造分解4.1模塊化程序設(shè)計(jì)逐步求精(StepwiseRefinement)對問題的全局做出決策,設(shè)計(jì)出對問題本身較為自然的、很可能是用自然語言表達(dá)的抽象算法由一些抽象數(shù)據(jù)及其上的操作(即抽象語句)組成,僅僅表示解決問題的一般策略和問題解的一般結(jié)構(gòu)對抽象算法進(jìn)一步求精,就進(jìn)入下一層抽象每求精一步,抽象語句和抽象數(shù)據(jù)都將進(jìn)一步分解和精細(xì)化如此繼續(xù)下去,直到最后的算法能為計(jì)算機(jī)所“理解”為止易于用某種高級語言表達(dá)4.1模塊化程序設(shè)計(jì)簡而言之先全局后局部、先整體后細(xì)節(jié)、先抽象后具體的自頂向下方法實(shí)際程序開發(fā)過程不是純粹的自頂向下和自底向上自頂向下的分解和自底向上的構(gòu)造兩個過程混合交織進(jìn)行由不斷的自底向上修正所補(bǔ)充的自頂向下的程序設(shè)計(jì)方法優(yōu)點(diǎn)得到的程序是有良好結(jié)構(gòu)的程序可簡化程序的正確性驗(yàn)證結(jié)合逐步求精過程,采取邊設(shè)計(jì)邊逐級驗(yàn)證的方法與寫完整個程序后再驗(yàn)證相比,可大大減少程序調(diào)試的時間4.1模塊化程序設(shè)計(jì)模塊分解應(yīng)遵循的基本原則是保證每個模塊的相對獨(dú)立性(ModuleIndependence),衡量模塊獨(dú)立性程度的標(biāo)準(zhǔn)主要是看如下兩個標(biāo)準(zhǔn):(1)內(nèi)聚度(Cohesion):內(nèi)聚度,也稱聚合度或聚合性,是指每個模塊內(nèi)各個元素(例如語句、程序段等)之間聯(lián)系的緊密程度,它是模塊內(nèi)的元素之間的關(guān)聯(lián)程度或聚合能力的度量。模塊內(nèi)各個元素之間的聯(lián)系越緊密,則其內(nèi)聚度越大,模塊獨(dú)立性就越強(qiáng),系統(tǒng)就越容易理解和維護(hù)。(2)耦合度(Coupling):耦合度,也稱關(guān)聯(lián)度或耦合性,是指不同模塊之間相互聯(lián)系的緊密程度,它是模塊之間關(guān)聯(lián)程度(即依賴關(guān)系,或者說接口復(fù)雜性)的一種度量。模塊之間的依賴關(guān)系包括控制關(guān)系、調(diào)用關(guān)系、數(shù)據(jù)傳遞關(guān)系。耦合度是從模塊外部考察模塊的獨(dú)立性程度。耦合度的強(qiáng)弱取決于模塊間接口的復(fù)雜性、調(diào)用模塊的方式以及通過接口傳送數(shù)據(jù)的多少。【例4.1】按照模塊化程序設(shè)計(jì)方法設(shè)計(jì)猜數(shù)游戲,游戲的要求為:顯示一個菜單,讓用戶選擇游戲的方式:(1)選擇1,則只猜一個數(shù)次;(2)選擇2,則直到猜對為止猜多個數(shù),直到用戶選擇0退出為止;(3)選擇3,則最多猜10次;(4)選擇0,退出游戲。其中,猜每一個數(shù)的方式有三種:只猜一次,直到猜對為止,最多猜10次。4.1模塊化程序設(shè)計(jì)4.1模塊化程序設(shè)計(jì)4.1模塊化程序設(shè)計(jì)【例5.6】按照模塊化程序設(shè)計(jì)方法重新設(shè)計(jì)猜數(shù)游戲。intmain(void){intmagic;//計(jì)算機(jī)“想”的數(shù)

charchoice='\0';//將保存用戶選擇的變量初始化為ASCII碼值為0的空字符

while(choice!='0')//只要用戶不選0,就繼續(xù)猜下一個數(shù)

{

計(jì)算機(jī)生成一個隨機(jī)數(shù)顯示一個固定式菜單并返回用戶的選擇

switch(choice)//判斷用戶選擇的是何種操作

{

case'1':

用戶猜數(shù),只猜一次

break;case'2':

用戶猜數(shù),直到猜對為止

break;case'3':

用戶猜數(shù),最多猜10次

break;case'0':

提示游戲結(jié)束

break;default:

提示輸入數(shù)據(jù)錯誤}}

return0;}至少需要設(shè)計(jì)下面5個子模塊:(1)計(jì)算機(jī)生成一個隨機(jī)數(shù)(2)顯示一個固定式菜單并返回用戶的選擇(3)用戶猜數(shù),只猜一次(4)用戶猜數(shù),直到猜對為止(5)用戶猜數(shù),最多猜10次從上述對應(yīng)三種游戲方式的三個模塊中進(jìn)一步提煉出兩個公共子任務(wù),按執(zhí)行順序劃分再抽象出3個子模塊:(1)輸入用戶猜的數(shù)(2)對用戶猜對與否做出決策其中,“輸入用戶猜的數(shù)”子模塊可直接調(diào)用scanf()函數(shù)來實(shí)現(xiàn)輸入用戶猜的數(shù),其它子模塊要用戶自定義函數(shù)來實(shí)現(xiàn)。4.1模塊化程序設(shè)計(jì)4.2函數(shù)的定義用戶自定義函數(shù)的基本語法格式為:4.2函數(shù)的定義【例4.2】將例4.1猜數(shù)游戲?qū)嵗邪垂δ軇澐值娜缦聝蓚€子模塊定義為函數(shù)。(1)顯示一個固定式菜單并返回用戶的選擇(2)計(jì)算機(jī)生成一個隨機(jī)數(shù)4.2函數(shù)的定義#include<stdio.h>//調(diào)用printf()和scanf()所需包含的頭文件//函數(shù)功能:顯示菜單并返回用戶的選擇charMenuSelection(void){charchoice;//用戶的選項(xiàng)

printf("1.GuessOnce\n");printf("2.Guessuntilright\n");printf("3.Guessuptotentimes\n");printf("0.Exit\n");printf("Inputyourchoice:");scanf("%c",&choice);//注意這里%c前面有個空格,避免讀入前面的回車

returnchoice;}charMenuSelection(void){charchoice;//用戶的選項(xiàng)

printf("1.GuessOnce\n");printf("2.Guessuntilright\n");printf("3.Guessuptotentimes\n");printf("0.Exit\n");printf("Inputyourchoice:");scanf("%c",&choice);//注意這里%c前面有個空格,避免讀入前面的回車

returnchoice;}7.2.2函數(shù)的定義函數(shù)名標(biāo)識符形參表,函數(shù)的入口,接收調(diào)用者傳入的參數(shù)函數(shù)的出口,只能返回一個值給調(diào)用者函數(shù)體的定界符函數(shù)體—函數(shù)功能的主體實(shí)現(xiàn)部分返回值類型,與實(shí)際返回的變量類型一致4.2函數(shù)的定義#include<time.h>//調(diào)用time()所需包含的頭文件#include<stdlib.h>//調(diào)用rand()所需包含的頭文件#defineMAX_NUMBER100//計(jì)算機(jī)生成的隨機(jī)數(shù)的上限#defineMIN_NUMBER1//計(jì)算機(jī)生成的隨機(jī)數(shù)的下限//函數(shù)功能:計(jì)算機(jī)生成并返回一個隨機(jī)數(shù)intMakeNumber(void){srand(time(NULL));//為函數(shù)rand()設(shè)置隨機(jī)數(shù)種子

intmagic=(rand()%(MAX_NUMBER-MIN_NUMBER+1))+MIN_NUMBER;returnmagic;}【例4.3】將例4.1猜數(shù)游戲?qū)嵗邪垂δ軇澐值娜缦?個子模塊定義為函數(shù)。(1)用戶猜數(shù),只猜一次(2)用戶猜數(shù),直到猜對為止(3

溫馨提示

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

評論

0/150

提交評論