




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
目錄CONTENTS第1章概述第2章數(shù)據(jù)類型、運算符和表達(dá)式第3章順序與分支結(jié)構(gòu)第4章循環(huán)結(jié)構(gòu)第5章數(shù)組第6章函數(shù)第7章指針第8章結(jié)構(gòu)、共用和枚舉類型第9章編譯預(yù)處理第10章文件第11章計算機(jī)算法基礎(chǔ)第12章模塊化程序設(shè)計實戰(zhàn)全套可編輯PPT課件第1章概述1.1程序設(shè)計語言1.2C語言的發(fā)展歷史和特點1.3簡單的C程序示例1.4C語言上機(jī)環(huán)境本章小結(jié)
1.1程序設(shè)計語言
1.機(jī)器語言
機(jī)器語言是計算機(jī)唯一能直接接收和執(zhí)行的語言,由二進(jìn)制碼組成。每一串二進(jìn)制碼稱為一條指令。一條指令規(guī)定了計算機(jī)執(zhí)行的一個動作。機(jī)器語言的主要優(yōu)點在于執(zhí)行速度極快,因為它不需要任何轉(zhuǎn)換即可直接由計算機(jī)執(zhí)行;缺點是其采用二進(jìn)制碼表示指令,人工記憶十分困難,另外,采用機(jī)器語言編寫的計算機(jī)程序具有不可移植性,即對某一種體系結(jié)構(gòu)的計算機(jī)編寫的計算機(jī)程序,在另一種體系結(jié)構(gòu)的計算機(jī)上不能運行。
2.匯編語言
機(jī)器語言難學(xué)、難記、難修改,僅適用于專業(yè)人員。為了簡化編程,計算機(jī)科學(xué)家們將機(jī)器語言的每一條指令采用助記符表示,即實現(xiàn)機(jī)器語言符號化。
采用匯編語言編寫的計算機(jī)程序必須翻譯為機(jī)器語言后,計算機(jī)才能識別運行,這些助記符經(jīng)過匯編器翻譯成機(jī)器語言,這種翻譯程序稱為匯編程序,對應(yīng)的過程稱為匯編過程。匯編語言的出現(xiàn)降低了編程難度,提高了編程效率。
3.高級語言
機(jī)器語言和匯編語言都是面向機(jī)器的語言,屬于低級語言。高級語言是一種接近于自然語言和數(shù)學(xué)公式的程序設(shè)計語言。它采用了完全符號化的描述形式,用類似自然語言的形式描述對問題的處理過程,用數(shù)學(xué)表達(dá)式的形式描述對數(shù)據(jù)的計算過程。高級語言的優(yōu)點是通用性強(qiáng),編程效率高。它使程序員可以不用與計算機(jī)的硬件打交道,可以不必了解機(jī)器語言的指令系統(tǒng),可集中精力解決問題,這極大地提高了編程效率。高級語言具有可移植性及易學(xué)、易記等特點。
1.2C語言的發(fā)展歷史和特點
1.2.1C語言的發(fā)展歷史20世紀(jì)70年代初,編寫計算機(jī)系統(tǒng)軟件時人們使用了一種符號法的自展組合編程語言BCPL。BCPL進(jìn)一步發(fā)展為一種系統(tǒng)軟件描述語言,即B語言。BCPL是在CPL(CombinedProgrammingLanguage)的基礎(chǔ)上開發(fā)的,而CPL可以追溯到最早的程序設(shè)計語言之一—ALGOL60語言。
1972年,美國貝爾實驗室的丹尼斯·里奇(DennisM.Ritchie)在B語言的基礎(chǔ)上設(shè)計出了C語言。
目前流行的C語言編譯系統(tǒng)大多是以89ANSIC為基礎(chǔ)進(jìn)行開發(fā)的,但不同版本的C編譯系統(tǒng)所實現(xiàn)的語言功能和語法規(guī)則又略有差別。不同的編譯器開發(fā)商在遵照C語言標(biāo)準(zhǔn)的基礎(chǔ)上,對標(biāo)準(zhǔn)新增了一些特性(如增加了圖形圖像處理能力)或增加了特定的庫函數(shù)。
1.2.2C語言的特點
(1)?C語言有豐富的運算符。
(2)?C語言有豐富的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型。
(3)?C語言是結(jié)構(gòu)化程序設(shè)計語言。
(4)?C語言是模塊化語言。
(5)任何一個C程序有且僅有一個稱為主函數(shù)的main()函數(shù)。
(6)?C語言有豐富的預(yù)處理功能。
(7)?C語言是面向過程的語言,其函數(shù)采用面向過程的思想進(jìn)行設(shè)計。
(8)?C程序具有可移植性。不同的程序員可以在不同的平臺上設(shè)計實現(xiàn)某一大型軟件中的子功能,然后在另一平臺上進(jìn)行組裝,構(gòu)成該大型軟件。
1.3簡單的C程序示例
1.3.1C程序的構(gòu)成與書寫格式1.C程序的構(gòu)成
2.C程序的書寫格式
在編輯C語言源程序時,需注意以下幾點。
(1)?C程序既可采用塊注釋方法,也可采用行注釋方法。塊注釋的書寫格式如下:
/*注釋部分*/
行注釋的書寫格式如下:
//從此處開始至行末尾,為行注釋內(nèi)容
注釋部分只為了提高程序的可讀性,不參與程序的編譯和運行。書寫時要注意“/”與“*”之間或“*”與“/”之間不能有空格。
(2)?C語言一般采用小寫字母作為標(biāo)識符。而BASIC語言中,一般采用大寫字母作為標(biāo)識符。
(3)?C語言是區(qū)分字母大小寫的。如“MAX”“max”和“Max”表示的是3個不同的標(biāo)識符。
(4)?C程序書寫格式靈活,一個語句可連續(xù)寫在多行上,一行也可以寫多個語句。如例1-2中的max函數(shù)可以寫成如下形式:
intmax(inta,intb){returna>b?a:b;}
(5)為了使書寫的程序結(jié)構(gòu)清晰、層次分明,建議采用“右縮進(jìn)對齊”的格式編輯C語言源程序,即同一結(jié)構(gòu)層次的語句左對齊,結(jié)構(gòu)下的語句相對于結(jié)構(gòu)本身而言向右縮進(jìn)。
1.3.2良好的編程風(fēng)格
關(guān)于良好的編程風(fēng)格,有以下幾點建議可供初學(xué)者參考:
(1)采用一致的命名規(guī)范。
(2)采用適當(dāng)?shù)目s進(jìn)和空格。
(3)添加注釋和文檔。
(4)使代碼模塊化和函數(shù)化。
(5)避免過長的函數(shù)和代碼行。
1.4C語言上機(jī)環(huán)境
1.4.1程序的編譯與編程環(huán)境1.程序的編譯利用C語言編寫的程序稱為源程序(.c),翻譯成的機(jī)器語言程序稱為目標(biāo)程序(.obj),將目標(biāo)程序鏈接后生成的程序稱為可執(zhí)行程序(.exe)??蓤?zhí)行程序是我們在使用計算機(jī)時能運行的程序。程序的鏈接要用到系統(tǒng)的庫函數(shù)(即編譯器廠商按C語言標(biāo)準(zhǔn)提供的事先編譯好的函數(shù),供用戶在編程時使用)。C語言的很多功能也是由庫函數(shù)完成的。
2.程序的編譯環(huán)境
“工欲善其事,必先利其器”,編程環(huán)境是開發(fā)人員用來編寫、調(diào)試和管理源代碼的工具集合,它提供了一個集成開發(fā)環(huán)境(IDE),以提高開發(fā)效率。用于C語言程序開發(fā)的工具軟件非常豐富,常用的有MicrosoftVisualC++(簡稱VisualC++)系列軟件、Code::Blocks、QtCreator、Dev-C++、Clang等。
1.4.2C語言程序的開發(fā)過程
開發(fā)C語言程序的步驟如下:
(1)在編輯窗口中錄入或修改C/C++源程序,其文件擴(kuò)展名為“.c”或“.cpp”。
(2)用編譯(Compile)命令對源程序文件進(jìn)行編譯,生成與源程序文件同名的二進(jìn)制目標(biāo)程序文件,其擴(kuò)展名為“.obj”。
(3)用組建(Build)命令對工程或解決方案進(jìn)行編譯與鏈接,為每個工程生成相應(yīng)的與工程同名的可執(zhí)行程序文件,其擴(kuò)展名為“.exe”。
(4)運行與調(diào)試。
上述步驟中,由于步驟(3)包含了步驟(2),所以一般不需要對步驟(2)進(jìn)行單獨操作。因此,用VisualC++2010Express開發(fā)C語言程序時,只要反復(fù)進(jìn)行步驟(1)、(3)和步驟(4)即可。C語言程序的開發(fā)過程如圖1-1所示。
圖1-1C語言程序的開發(fā)過程
1.4.3VisualC++2010Express上機(jī)操作
1.啟動VisualC++2010Express
如果Windows操作系統(tǒng)中已經(jīng)安裝好VisualC++2010Express,則可在Windows桌面雙擊該軟件圖標(biāo)或在“開始”菜單中選擇該軟件以啟動VisualC++2010Express,也可在Windows“開始”菜單的“運行”命令輸入框中輸入命令“VCExpress”以啟動VisualC++2010Express。VisualC++2010Express啟動后的主界面如圖1-2所示。
圖1-2VisualC++2010Express的主界面
2.新建Project與Solution
在VisualC++2010Express開發(fā)環(huán)境下,C程序按“解決方案(Solution)”→“工程(Project)”→“文件(File)”的層次結(jié)構(gòu)進(jìn)行組織。解決方案用于組織和管理一個或多個工程,每個工程由一個或多個源程序文件和頭文件所構(gòu)成。同一工程中,可以有多個源程序文件,但只能有一個main()函數(shù)。
在VisualC++2010Express起始頁(StartPage)中單擊“NewProject...”(如圖1-2所示),或在主菜單中單擊“File”→“New”→“Project...”(如圖1-3所示),打開如圖1-4所示的新建工程(NewProject)對話框。
圖1-3VisualC++2010Express新建工程的命令選項
圖1-4新建工程時設(shè)置工程名、存放位置、解決方案名
在圖1-4中完成設(shè)置后,單擊“OK”→“Next”,將彈出如圖1-5所示的應(yīng)用程序設(shè)置(ApplicationSettings)對話框。將應(yīng)用程序類型(Applicationtype)設(shè)置為控制臺應(yīng)用程序(Consoleapplication),并將附加選項(AdditionalOptions)設(shè)置為空工程(Emptyproject)。單擊“Finish”后將彈出如圖1-6所示的界面,在界面左邊的解決方案瀏覽器(SolutionExplorer)中可查看到剛剛新建的解決方案名及工程名。
圖1-5應(yīng)用程序設(shè)置(ApplicationSettings)對話框
圖1-6在解決方案瀏覽器(SolutionExplorer)中查看新建的解決方案名及工程名
3.在Project中添加并編輯源程序
如圖1-7所示,在解決方案瀏覽器(SolutionExplorer)中,若欲為工程添加新文件(C語言源程序、頭文件等),可依次單擊工程名(如圖1-7中的“myProject_1”)右鍵菜單中的子菜單項“Add”→“NewItem...”,打開添加C語言源程序等文件的設(shè)置對話框(如圖1-8所示)。在該對話框中,設(shè)置文件類型為“C++File”,文件名(Name)自定義(如圖1-8中命名為“myCode_1.c”),文件位置(Location)默認(rèn)為工程所在位置(如圖1-8中的“D:\mySolution\myProject_1\”,表示文件的存儲位置是之前新建的D盤根目錄下的解決方案文件夾mySolution下的工程文件夾myProject_1)。
圖1-7為工程添加新文件的命令項
圖1-8為工程添加C語言源程序的設(shè)置對話框
設(shè)置好后,單擊“Add”將出現(xiàn)如圖1-9所示的空白程序編輯窗口。接著,就可以在程序編輯窗口錄入自己編寫的C語言源程序了(示例如圖1-10所示)。
圖1-9C語言源程序的文件名及編輯窗口
圖1-10在編輯窗口中錄入C語言源程序的簡單示例
4.編譯(Compile)
編譯就是把文本形式的C語言源程序文件翻譯為機(jī)器語言形式的目標(biāo)程序文件的過程。
在C語言源程序文件(如myCode_1.c)的文件名上調(diào)出其右鍵菜單,單擊“Compile”;或在選中C語言源程序文件后,單擊主菜單項“Build”的下拉菜單項“Compile”;或在選中C語言源程序文件后,按快捷鍵“Ctrl+F7”,將生成與C語言源程序文件同名的目標(biāo)程序文件(擴(kuò)展名為“.obj”,默認(rèn)存放于所在工程文件夾的Debug子目錄中)。由于編譯操作是針對C語言源程序文件進(jìn)行的,且已經(jīng)包含在隨后介紹的組建(Build)操作中,所以編譯操作一般不必單獨使用。
5.組建(Build)
VisualC++2010Express中的組建操作,相當(dāng)于早期編譯器的編譯與鏈接的組合操作,即先將C語言源程序文件編譯生成目標(biāo)程序文件,然后將整個工程(或解決方案)的所有目標(biāo)程序文件和用到的相關(guān)庫函數(shù)文件進(jìn)行組裝,形成最終的可執(zhí)行程序文件。
在解決方案瀏覽器中,在所選的工程名(如myProject_1)上調(diào)出其右鍵菜單并單擊“Build”;或單擊主菜單項“Build”的下拉菜單項“Build”(后接工程名,如“BuildmyProject_1”),將生成與工程名同名的可執(zhí)行程序文件(擴(kuò)展名為“.exe”,默認(rèn)存放于所在解決方案文件夾的Debug子目錄中),如圖1-11所示。
圖1-11對工程進(jìn)行組建操作的命令項及其執(zhí)行結(jié)果
從圖1-11左邊窗口的解決方案瀏覽器中可以看出,解決方案mySolution中有兩個工程,分別是myProject_1和myProject_2。若想對解決方案中的所有工程進(jìn)行組建操作,則在解決方案瀏覽器的最頂端的解決方案名上調(diào)出其右鍵菜單,并單擊“BuildSolution”;或單擊主菜單項“Build”的下拉菜單項“BuildSolution”;或按快捷鍵“F7”,將生成與各工程名同名的可執(zhí)行程序文件(擴(kuò)展名為“.exe”,默認(rèn)存放于所在解決方案文件夾的Debug子目錄中),如圖1-12所示。
圖1-12對解決方案進(jìn)行組建操作的命令項及其執(zhí)行結(jié)果
6.運行程序
如圖1-13所示,選擇“Debug”→“StartWithoutDebugging”菜單項,或按快捷鍵“Ctrl+F5”,將運行生成的“.exe”文件。程序運行結(jié)果如圖1-14所示,按任意鍵即結(jié)束運行。
圖1-13運行程序的菜單項圖1-14在命令行窗口顯示的程序運行結(jié)果
7.調(diào)試程序
調(diào)試程序是程序設(shè)計過程中一個很重要的環(huán)節(jié)。C語言程序的錯誤主要包括兩大類,一類是語法錯誤,另一類是邏輯設(shè)計錯誤。語法錯誤是指違背了C語言語法規(guī)則而導(dǎo)致的錯誤。語法錯誤分為一般錯誤(error)和警告錯誤(warning)兩種。當(dāng)程序出現(xiàn)一般錯誤時,將不會產(chǎn)生可執(zhí)行程序。當(dāng)程序出現(xiàn)警告錯誤時,通常能夠生成可執(zhí)行程序,但程序運行時可能發(fā)生錯誤,嚴(yán)重的錯誤還會引起死機(jī)現(xiàn)象。所以,警告錯誤比一般錯誤更難修改,程序員應(yīng)該盡量消除警告錯誤。編譯器能找出源程序的語法錯誤,程序員可以根據(jù)錯誤提示信息進(jìn)行修改。
下面介紹VisualC++2010Express查錯方法。
1)利用編譯器查找語法錯誤
如果程序沒有違背C語言的語法規(guī)則,編譯器也沒有提示出錯,而且程序能夠成功運行,但程序執(zhí)行結(jié)果卻與原意不符,這類程序設(shè)計上的錯誤稱為邏輯設(shè)計錯誤或缺陷(Bug)。
如果程序有語法錯誤,則在編譯(Compile或Build)時,VisualC++2010Express的編譯器將在輸出窗口中給出語法錯誤提示信息。錯誤提示信息中一般指出錯誤發(fā)生所在位置的行號。用戶可以在輸出窗口中雙擊錯誤提示信息或按F4鍵定位到出錯語句,如圖1-15所示。
圖1-15C語言源程序在編譯時出現(xiàn)了warning和error
2)使用調(diào)試(Debug)器查找邏輯設(shè)計錯誤
VisualC++2010Express提供了重要的調(diào)試工具—Debug,用于查找和修改程序中的邏輯設(shè)計錯誤。VisualC++2010Express的“Debug”主菜單項包含了用于調(diào)試程序的常用子菜單項,具體如表1-1所示。
如圖1-16所示,當(dāng)單步執(zhí)行main()函數(shù)中調(diào)用add()函數(shù)的語句時,若執(zhí)行的是“StepOver”,則該語句直接執(zhí)行完成,執(zhí)行流程隨后指向下一條語句,即printf()語句;若執(zhí)行的是“StepInto”,則執(zhí)行流程進(jìn)入add()函數(shù)體內(nèi)部,隨后執(zhí)行add()函數(shù)體內(nèi)部的各條語句。在add()函數(shù)體內(nèi)部,可隨時用“StepOut”跳出函數(shù),完成函數(shù)的執(zhí)行并返回至函數(shù)調(diào)用處。在調(diào)試過程中,通過跟蹤程序運行過程中的狀態(tài)變化,并輔以人工分析,可以發(fā)現(xiàn)程序中的問題所在。
圖1-16調(diào)試程序時的Watch窗口和Locals窗口
本章小結(jié)
本章先介紹了程序設(shè)計語言的三個發(fā)展階段,以及C語言的發(fā)展歷史和特點;其次通過兩個簡單的C程序示例介紹了C程序的構(gòu)成和書寫格式,并強(qiáng)調(diào)了編程風(fēng)格的重要性,提出了良好編程習(xí)慣的一些建議;最后介紹了程序的編譯以及C語言常見的開發(fā)環(huán)境和工具,重點介紹了以VisualC++2010Express為例進(jìn)行C語言程序開發(fā)的過程。第2章數(shù)據(jù)類型、運算符和表達(dá)式2.1基本數(shù)據(jù)類型、變量和常量2.2運算符和表達(dá)式2.3輸入/輸出函數(shù)本章小結(jié)
2.1基本數(shù)據(jù)類型、變量和常量
2.1.1基本數(shù)據(jù)類型和取值范圍在計算機(jī)中,所有的數(shù)據(jù)都采用二進(jìn)制形式表示,5種基本數(shù)據(jù)類型規(guī)定了數(shù)據(jù)在內(nèi)存中占用的二進(jìn)制位數(shù)/字節(jié)數(shù),從而也規(guī)定了數(shù)據(jù)的取值范圍。與數(shù)據(jù)類型相關(guān)的是類型修飾符,整型數(shù)據(jù)類型有兩類修飾符:一類是符號修飾;另一類是長度修飾。
其中符號修飾符有帶符號(signed)和不帶符號(unsigned)之分,默認(rèn)為帶符號(signed)修飾;長度修飾有短型(short)和長型(long)之分,這些數(shù)據(jù)長度與具體機(jī)器編譯環(huán)境有關(guān)。例如在VisualC++2010Express編程環(huán)境下,int類型與long類型一樣,都是占4個字節(jié)(32位);而在TurboC2.0編程環(huán)境下,int類型與short類型一樣,都是占2個字節(jié)(16位)。本書以VisualC++2010Express作為開發(fā)環(huán)境,其主要數(shù)據(jù)類型和取值范圍如表2-1所示。表中類型帶中括號的項表示可選項。
2.1.2變量
變量的定義格式如下:
[存儲類型]數(shù)據(jù)類型變量名;
例如:
inta,a5,_a;
float_a5,A5;
變量的數(shù)據(jù)類型可以是表2-1中的任何數(shù)據(jù)類型,變量名必須遵守以下C語言標(biāo)識符命名規(guī)則:
(1)第1個字符必須是字母或下畫線。
(2)其余字符可以是字母、下畫線和數(shù)字。
(3)字母區(qū)分大小寫。
(4)用戶自定義的變量名不能與C語言的保留字或預(yù)定義標(biāo)識符同名,并應(yīng)盡量做到“見名知意”,以增加程序的可讀性。保留字如表2-2所示。
變量沒有賦初值時,變量中存放的是一隨機(jī)值。變量定義時可同時賦初值,這稱為變量的初始化,如:
inta=1,a5=10;
定義變量包括兩個方面的含義:一是給變量分配存儲空間和規(guī)定變量的取值范圍,從而可以對變量進(jìn)行存儲操作,如上述舉例中,為整型變量a、a5、_a各分配了4個字節(jié)空間,為浮點型變量_a5、A5各分配了4個字節(jié)空間,變量有了存儲空間,也就有變量地址,如&a、&a5、&_a分別表示變量a、a5、_a的首地址(符號&是取地址運算符);二是規(guī)定了其允許的操作,如實數(shù)可進(jìn)行加、減、乘、除運算,但不能進(jìn)行求余運算。
2.1.3常量
1.整型常量
C語言中整型常量按進(jìn)制劃分有十進(jìn)制、八進(jìn)制(前綴為數(shù)字0)、十六進(jìn)制(前綴為數(shù)字0X或0x)3種。數(shù)據(jù)377按這3種進(jìn)制的格式可分別表示為:377、0571、0x179(或0X179)。
整型常量加后綴小寫字母l或大寫字母L,表示該常量為長整型。如377L、0571L、0x179L分別表示十進(jìn)制、八進(jìn)制、十六進(jìn)制長整型數(shù)。整型常量若沒加后綴,則默認(rèn)為int類型。
2.實型常量
實型常量有兩種表示方法:一類是標(biāo)準(zhǔn)記數(shù)方法,如PI值表示為3.141?592?6;另一類是科學(xué)記數(shù)法??茖W(xué)記數(shù)法的一般形式為
尾數(shù)E階碼
或
尾數(shù)e階碼
如PI值可以表示為如下形式:
3.14159E03.14159e00.314159E131.4159e-1
3.字符常量
字符常量用一對單引號包圍,如'5'、'a'、'A'、''等,每個字符占一個字節(jié)。在計算機(jī)中,字符按ASCII(見附錄1)值存放,上述對應(yīng)的4個字符的ASCII值為53、97、65、32等,因此字符也可以參加整型運算。由于單引號已經(jīng)用作任意字符常量的界限符,所以單引號如果要用作普通字符常量時可在字符前面加反斜杠“\”(稱為轉(zhuǎn)義字符)區(qū)分,如“\'”表示單引號。常用轉(zhuǎn)義字符如表2-3所示。
4.字符串常量
字符串常量是用一對雙引號包圍的字符數(shù)組,如"Hello,world!",它們在內(nèi)存中是按照每個字符的ASCII碼連續(xù)存放的,并在結(jié)尾處添加了一結(jié)束符'\0',對應(yīng)的ASCII值為0,這樣n個字符組成的字符串需占用n+1個字節(jié)。因此,12個字符組成字符串"Hello,world!"在內(nèi)存中占用13個字節(jié),其存儲形式如圖2-1所示。
圖2-1字符串"Hello,world!"的存儲表示
值得注意的是:
①字符串中包含有雙引號字符時,字符雙引號必須用轉(zhuǎn)義字符表示,具體可參見例2-4。
②一個字符串需占用兩行時,需采用兩對雙引號界定表示,具體可參見例2-5。
2.2運算符和表達(dá)式
2.2.1優(yōu)先級與結(jié)合規(guī)則數(shù)學(xué)中表達(dá)式是這樣定義的:用運算符(操作符)將運算數(shù)(操作數(shù))連接起來的式子。其運算順序是這樣規(guī)定的:先乘除后加減,從左至右依次進(jìn)行。這句話包含了兩層意思:先乘除后加減表明了乘除運算符的優(yōu)先級別比加減運算符優(yōu)先級別高;在同一級別運算時,按從左至右依次進(jìn)行,即說明了結(jié)合規(guī)則。對于算術(shù)運算的結(jié)合規(guī)則是按從左至右進(jìn)行的,即左結(jié)合性。
C語言中除了算術(shù)運算符之外,還有其他一些運算符,部分常見運算符的優(yōu)先級別和結(jié)合規(guī)則如表2-4所示,從表2-4中我們可以看出加減運算符的級別為4級,比運算級別為3級的乘除運算符級別要低。
當(dāng)由多個不同運算符和運算數(shù)組成較為復(fù)雜的表達(dá)式時,其運算符計算順序按如下規(guī)則執(zhí)行:
(1)不同級別的運算符按運算符的優(yōu)先級別確定計算順序,優(yōu)先級別高(優(yōu)先級別數(shù)小)的運算符先計算,優(yōu)先級別低(優(yōu)先級別數(shù)大)的運算符后計算;
(2)相同級別的運算符按結(jié)合規(guī)則確定計算順序。
2.2.2賦值運算與連續(xù)賦值
簡單賦值運算的一般形式為
變量=表達(dá)式
其功能是將一個表達(dá)式的值賦給變量。如:
a=b+c
該式讀作將表達(dá)式b+c的值賦給a。其本意是改寫變量a的值,而不是判斷b+c與a是否相等,初學(xué)者往往將C語言中的賦值運算符看作數(shù)學(xué)上的關(guān)系運算符——等于運算符,這是錯誤的,請讀者認(rèn)真理解。又如數(shù)學(xué)上將表達(dá)式
a=a+5
看作錯誤的表達(dá)式,在C語言中這是正確的合法表達(dá)式,它是改寫存儲單元a中的內(nèi)容,因為在C語言中,運算符“=”不是等于運算符,而是賦值運算符。
在C語言中,賦值運算符的優(yōu)先級別較低,為14級,并滿足右結(jié)合規(guī)則。因此表達(dá)式
x=y=z=1
是連續(xù)賦值表達(dá)式,其功能相當(dāng)于如下表達(dá)式的功能:
x=(y=(z=1))
它是先執(zhí)行表達(dá)式z=1,即將1賦給z,該表達(dá)式值也為1;然后將z=1表達(dá)式的值1賦給y,即執(zhí)行y=1,該表達(dá)式值也仍為1;最后將y=1表達(dá)式的值1賦給x,即執(zhí)行x=1。
2.2.3算術(shù)運算
C語言中算術(shù)運算符有加“+”、減“-”、乘“*”、除“/”、取余(模)“%”、自加“++”、自減“--”。其中“+”“-”運算符優(yōu)先級別為4級,“*”“/”“%”運算符優(yōu)先級別為3級,它們都滿足左結(jié)合規(guī)則,都是二元運算符,“+”“-”“*”“/”都能對整數(shù)或?qū)崝?shù)進(jìn)行運算。取余運算符“%”只能對整型數(shù)據(jù)進(jìn)行運算,如5%2的值為1,5%3值為2。
“++”“--”運算符可寫在變量的前面或變量的后面,寫在變量的前面稱為前綴(或前置)運算,寫在變量的后面稱為后綴(或后置)運算,當(dāng)使用前綴運算與后綴運算時要注意以下兩點:
(1)?++a與a++單獨構(gòu)成表達(dá)式時,兩者使用時沒有區(qū)別。
(2)?++a與a++不是單獨構(gòu)成表達(dá)式時,前綴運算表示先加后用,后綴運算表示先用后加。
先用后加指的是先讀取a的數(shù)據(jù)進(jìn)行使用,當(dāng)表達(dá)式中比++運算符高的運算符都執(zhí)行完后,a再進(jìn)行自加運算。先加后用指的是先對a進(jìn)行自加運算,然后再讀取a進(jìn)行其他運算。
2.2.4關(guān)系運算
關(guān)系運算又稱為比較大小運算,它有6個運算符:“>”“>=”“<”“<=”“==”“!=”,它們的結(jié)合規(guī)則都是自左向右的。其中“>”“>=”“<”“<=”4個運算符優(yōu)先級別為6級,它們比“==”“!=”兩個運算符優(yōu)先級別為7級的級別高。關(guān)系運算的結(jié)果為邏輯真或邏輯假,關(guān)系成立時為邏輯真(值為1),關(guān)系不成立時為邏輯假(值為0)。如表達(dá)式5>3,5>=3,5<3,5<=3,5==3,5!=3的邏輯值分別為1、1、0、0、0、1。
關(guān)系運算的等于運算符“==”與數(shù)學(xué)上的等于運算符“=”具有相同的含義,與C語言中的賦值運算符“=”完全不同,這一點初學(xué)者往往容易搞錯。
2.2.5邏輯運算
C語言中邏輯運算符有3個,分別是邏輯與“&&”(優(yōu)先級為11級、左結(jié)合)、邏輯或“||”(優(yōu)先級為12級、左結(jié)合)、邏輯非“!”(優(yōu)先級為2級、右結(jié)合)。邏輯與表達(dá)式a&&b表示a與b中只要有一個條件不滿足(值為0),其運算結(jié)果為0。邏輯或表達(dá)式a||b表示a與b中只要有一個條件滿足(值為1),其運算結(jié)果為1。邏輯非表達(dá)式!a表示當(dāng)a為1時,結(jié)果為0;當(dāng)a為0時,結(jié)果為1。邏輯運算真值表如表2-4所示。
2.2.6位運算
1.位運算符
位運算符有“&”“|”“^”“~”“>>”“<<”等6個,其含義如表2-5所示。
2.位異或運算
位異或運算真值表如表2-6所示,即對應(yīng)位相同時結(jié)果為0,不同時結(jié)果為1。
3.移位運算
左移位運算a<<b表示將a左移b位,右邊空出的低位部分用0填補(bǔ),左邊移出的部分將丟棄。右移位運算a>>b,右邊移出的部分將丟棄,左邊空出的高位部分填補(bǔ)方法則根據(jù)
a是否為帶符號數(shù)分為兩種:a為帶符號數(shù)時,左邊空出的高位部分用符號位填補(bǔ);a為不帶符號數(shù)時,左邊空出的高位部分用0填補(bǔ)。
2.2.7條件運算
條件運算符是C語言中唯一的三元運算符,用符號“?:”表示,它帶有3個運算數(shù),優(yōu)先級為13級,結(jié)合規(guī)則為右結(jié)合,其書寫一般形式為
a?b:c
其計算方法是:先計算a,若a非0,則選擇b作為表達(dá)式的值;若a為0,則選擇c作為表達(dá)式的值。因此,條件運算又稱為選擇運算。
2.2.8復(fù)合賦值運算
同賦值運算一樣,復(fù)合賦值運算符也是二元運算符,優(yōu)先級別為14級,結(jié)合規(guī)則為右結(jié)合。復(fù)合賦值運算符共有10個,其含義如表2-7所示。復(fù)合賦值運算與其他運算相結(jié)合時,應(yīng)特別注意其運算優(yōu)先級與結(jié)合規(guī)則。如表達(dá)式:
a/=b+c*d
相當(dāng)于表達(dá)式
a=a/(b+c*d)
因為復(fù)合賦值運算符“/=”優(yōu)先級別比“+”“*”的優(yōu)先級別低。
2.2.9其他運算
1.逗號運算
逗號運算符是C語言中優(yōu)先級別最低的運算符,優(yōu)先級為15級,結(jié)合規(guī)則為左結(jié)合。其一般形式如下:
e1,e2,e3,…,en
其功能為先計算表達(dá)式e1,然后計算表達(dá)式e2,再計算表達(dá)式e3……最后計算表達(dá)式en,其中表達(dá)式en的值為整個表達(dá)式的值。
2.sizeof運算
“sizeof”表示計算變量或表達(dá)式所占用的存儲空間大小,即字節(jié)數(shù),其優(yōu)先級別為2級,結(jié)合規(guī)則為右結(jié)合。
sizeof計算數(shù)據(jù)類型占用字節(jié)數(shù)的形式為
sizeof(類型)
sizeof計算變量占用字節(jié)數(shù)的形式有兩種:
sizeof(變量)
或
sizeof變量
2.2.10數(shù)據(jù)類型轉(zhuǎn)換及其規(guī)則
1.算術(shù)運算類型轉(zhuǎn)換
算術(shù)運算中,當(dāng)兩個運算數(shù)類型相同時,運算結(jié)果類型與原類型相同,當(dāng)兩個運算數(shù)類型不同時,先將兩個運算數(shù)轉(zhuǎn)換為相同類型,轉(zhuǎn)換方法為將級別低的數(shù)據(jù)類型轉(zhuǎn)換為級別高的數(shù)據(jù)類型,運算結(jié)果與級別高的數(shù)據(jù)類型相同。類型級別高低按下述規(guī)則進(jìn)行:
2.賦值類型轉(zhuǎn)換
執(zhí)行賦值運算“變量a=表達(dá)式b”時,若a、b類型相同,則直接將b賦給a即可,若a、b類型不同,則需先將b的類型轉(zhuǎn)換為a的類型后再賦值,這種類型轉(zhuǎn)換,稱為賦值類型轉(zhuǎn)換。賦值類型轉(zhuǎn)換分為以下幾種情況。
(1)不帶符號整型向帶符號整型轉(zhuǎn)換。
(2)帶符號整型向不帶符號整型轉(zhuǎn)換。
(3)短整型向長整型轉(zhuǎn)換。
(4)長整型向短整型轉(zhuǎn)換。
如圖2-2所示。
(5)單精度浮點型向雙精度浮點型轉(zhuǎn)換。這是等值轉(zhuǎn)換。
(6)雙精度浮點型向單精度浮點型轉(zhuǎn)換。圖2-2長整型賦給短整型示意圖
3.強(qiáng)制類型轉(zhuǎn)換
強(qiáng)制類型轉(zhuǎn)換的一般格式為
(目標(biāo)類型)表達(dá)式
其功能是將表達(dá)式類型轉(zhuǎn)換為目標(biāo)類型,其轉(zhuǎn)換方法同賦值類型轉(zhuǎn)換。如:
floata=3.8;
inti;
i=(int)a;
則i的值為3。
4.輸入/輸出類型轉(zhuǎn)換
輸入/輸出類型轉(zhuǎn)換將在2.3節(jié)中介紹。
2.3輸入/輸出函數(shù)
2.3.1格式化輸出函數(shù)用戶看不到程序運算的過程和運算變量的值,而運算變量的值對用戶又有特別重要的意義。C語言為用戶提供了格式化輸出函數(shù),其功能是按用戶指定格式輸出運算結(jié)果值。格式化輸出函數(shù)的調(diào)用格式為printf("格式字符串",表達(dá)式1,表達(dá)式2,…,表達(dá)式n);
格式說明符以“%”開始,以類型代碼結(jié)束,其一般格式為
%[flags][width][precision][F|N|h|l]type
1.類型代碼(type)
類型代碼(type)意義如表2-8所示。
2.寬度(width)
寬度為n是指表達(dá)式輸出時至少占用n位,實際數(shù)據(jù)輸出的寬度可以比指定的寬度大。寬度為0n時,其中的數(shù)字0表示左邊空位用0填補(bǔ),n含義與前述相同。
3.精度(precision)
對于不同類型的輸出表達(dá)式,精度表示不同的含義。說明符“%e”“%E”“%f”作用于浮點數(shù),精度表示小數(shù)點后最多顯示的位數(shù)(不是傳統(tǒng)的有效位數(shù)),如果未指定精度,精度默認(rèn)值為6。如%10.4f顯示的數(shù)據(jù)至少占10位,其中小數(shù)最多4位。
4.標(biāo)志(flags)
標(biāo)志flags為“-”時,表示左對齊(默認(rèn)為右對齊);為“+”時,表示右對齊或在帶符號的正數(shù)前顯示正號(+);為“0”時,表示在輸出數(shù)值時指定左面不使用的空位補(bǔ)前導(dǎo)0;為“#”時,在八進(jìn)制和十六進(jìn)制數(shù)前顯示前導(dǎo)0,即0x或0X。
5.處理其他類型的修飾說明符(F|N|h|l)
h、l(小寫字母)可用于修飾%d、%o、%u、%x,h修飾時表示輸出短整數(shù),l修飾時表示輸出長整數(shù)。l可修飾%e、%f、%g,表示輸出double類型(C99標(biāo)準(zhǔn))。
2.3.2格式化輸入函數(shù)
scanf()函數(shù)使用的格式為
scanf("格式字符串",地址項1,地址項2,…,地址項n);
格式字符串由兩類項目組成:第一類是指定數(shù)據(jù)分隔字符,第二類對應(yīng)每個輸入項的格式說明符。格式說明符數(shù)量必須與輸入數(shù)據(jù)地址項數(shù)量嚴(yán)格一致,格式說明符與輸入地址項按從左到右的方式依次匹配。變量地址項為變量名前加&,如&x、&y、&a等。格式說明符的一般格式如下:
%[*][width][h|l]type
其每個項的含義與printf()中的格式字符串的相同,不同的是輸入格式串沒有精度項,其中“*”用于跳讀輸入的數(shù)據(jù)項。
1.(隱含方式)用空白符號分隔數(shù)據(jù)流
分隔數(shù)據(jù)流的空白符可以為空格(Space)、制表符(Tab)和回車符(Enter)等,如上面程序的數(shù)據(jù)輸入可以為
3↙
5↙
4↙
2.指定數(shù)據(jù)輸入寬度分隔數(shù)據(jù)流
“width”用于指定每個輸入數(shù)據(jù)項的最大寬度。實際輸入數(shù)據(jù)的寬度可以小于指定的寬度,此時可采用空白符或其他方式分隔數(shù)據(jù)流。
3.用指定的符號分隔數(shù)據(jù)
若將上面程序輸入語句改寫為
scanf("r=%dh=%2d",&r,&h);
則數(shù)據(jù)輸入格式必須為
r=3h=4↙
初學(xué)者在輸入數(shù)據(jù)時往往遺漏r=和h=,這樣往往產(chǎn)生錯誤的運行結(jié)果。
4.根據(jù)數(shù)據(jù)含義分隔數(shù)據(jù)流
數(shù)據(jù)流輸入時,scanf()函數(shù)能根據(jù)數(shù)據(jù)類型的匹配與否進(jìn)行數(shù)據(jù)流的分隔,如輸入十進(jìn)制整型數(shù)時,不可能出現(xiàn)字母。
2.3.3字符輸入/輸出函數(shù)
C語言中輸入字符時,除在scanf()函數(shù)中指定%c格式輸入字符外,還可采用專門的字符輸入函數(shù)getchar(),其使用格式一般為
字符變量=getchar();
上述語句的功能是在鍵盤上讀取一個字符,并將讀取的字符賦給字符變量。
C語言中輸出字符時,除在printf()函數(shù)中指定%c格式輸出字符外,還可采用專門的字符輸出函數(shù)putchar(),其使用格式一般為
putchar(參數(shù));
上述語句的功能是向控制臺(如顯示器)輸出參數(shù)所指定的一個字符。參數(shù)可以是字符常量、字符變量、整型常量、整型變量或是表達(dá)式。
在程序中使用字符輸入/輸出函數(shù)時,必須在程序首部加上包含語句:
#include<stdio.h>
本章小結(jié)
在C語言中,數(shù)據(jù)類型和變量定義是編寫程序的基礎(chǔ)。本章首先介紹了C語言中基本數(shù)據(jù)類型以及變量的定義;然后介紹了C語言提供的各種運算符、運算符的優(yōu)先級以及數(shù)據(jù)類型轉(zhuǎn)換;最后介紹了C語言中的輸入/輸出函數(shù),即scanf()函數(shù)和printf()函數(shù)。本章內(nèi)容是C語言程序設(shè)計首先需要掌握的基本內(nèi)容,也是后續(xù)章節(jié)學(xué)習(xí)的基礎(chǔ)。第3章順序與分支結(jié)構(gòu)3.1程序結(jié)構(gòu)框圖3.2順序結(jié)構(gòu)3.3二分支結(jié)構(gòu)3.4多分支結(jié)構(gòu)3.5分支結(jié)構(gòu)的綜合示例本章小結(jié)
3.1程序結(jié)構(gòu)框圖
3.1.1算法的表示程序設(shè)計的關(guān)鍵是算法。那什么是算法?算法就是求解實際問題的步驟。有了正確有效的算法,就可以用計算機(jī)語言編寫程序,解決實際問題。算法可采用自然語言、流程圖或N-S圖來描述。
1.自然語言描述
例3-1從鍵盤輸入3個數(shù),按由小到大的順序輸出。
解題思路從鍵盤輸入的3個數(shù)值必須用3個變量來保存,設(shè)3個變量為x、y、z。3個數(shù)按由小到大的順序輸出,則必須將數(shù)據(jù)兩兩比較,在比較的過程中,始終保持變量x最小,變量z的值最大,如果不滿足此條件,則將比較的兩變量互相交換其值。設(shè)中間變量為t。
算法步驟如下:
①輸入3個數(shù),其值分別賦給3個變量x、y、z;
②?x、y進(jìn)行比較,如果x大于y,通過t交換x、y的值;
③?x、z進(jìn)行比較,如果x大于z,通過t交換x、z的值;
④?y、z進(jìn)行比較,如果y大于z,通過t交換y、z的值;
⑤按x、y、z的順序輸出其變量的值。
2.流程圖
流程圖是一種傳統(tǒng)的算法描述方法,它用幾種不同的幾何圖來代表不同性質(zhì)的操作,用流程線來指示算法的執(zhí)行方向。用流程圖表示的算法簡單直觀,容易轉(zhuǎn)化成相應(yīng)的語言
程序。
圖3-1所示為國際標(biāo)準(zhǔn)化組織(InternationalStandardOrganization,ISO)規(guī)定的一些常用流程圖符號。這些符號已為各國普遍采用。圖3-1常用的流程圖符號
例3-2將例3-1中的算法用流程圖表示。
流程圖如圖3-2所示。圖3-2例3-1的算法流程圖
3.?N-S圖
N-S圖是程序算法的另一種圖形表示,它是由美國人I.Nassi和B.Shneiderman共同提出來的,其依據(jù)是:因為任何算法都是由順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)這3種結(jié)構(gòu)所組成的,所以可以不需要各結(jié)構(gòu)之間的流程線,全部算法寫在一個矩形框內(nèi),矩形框內(nèi)由順序、分支、循環(huán)3種結(jié)構(gòu)組成。三種基本結(jié)構(gòu)的N-S圖如圖3-3所示。圖3-33種基本結(jié)構(gòu)的N-S圖
例3-3將例3-1中的算法用N-S圖表示。
N-S圖如圖3-4所示。圖3-4例3-1的N-S圖
3.1.2結(jié)構(gòu)化程序設(shè)計
結(jié)構(gòu)化程序設(shè)計的基本思想是:任何程序都由3種基本結(jié)構(gòu)組成,這3種基本結(jié)構(gòu)如下:
(1)順序結(jié)構(gòu):按照語句出現(xiàn)的先后順序依次執(zhí)行的。
(2)分支結(jié)構(gòu):根據(jù)給定條件進(jìn)行判斷,選擇其中的一個分支執(zhí)行。
(3)循環(huán)結(jié)構(gòu):根據(jù)某一個條件成立與否來決定是否重復(fù)執(zhí)行某一部分操作,反復(fù)執(zhí)行的部分稱為循環(huán)體。
循環(huán)結(jié)構(gòu)有以下兩種類型:
①當(dāng)型(while型)循環(huán)結(jié)構(gòu):當(dāng)條件滿足時,重復(fù)執(zhí)行某一操作。
②直到型循環(huán)結(jié)構(gòu):先執(zhí)行循環(huán)體操作,再判斷條件,如果條件滿足,則繼續(xù)執(zhí)行循環(huán)體操作,直到條件不滿足時,才退出循環(huán),繼續(xù)執(zhí)行循環(huán)體后面的語句。
由上面3種基本結(jié)構(gòu),可以看出結(jié)構(gòu)化程序設(shè)計具有以下特點:
①只有一個入口和一個出口;
②程序中不能有無窮循環(huán)(死循環(huán));
③程序中不能有在任何條件下都執(zhí)行不到的語句(死語句)。
3.1.3復(fù)合語句
將若干語句用一對花括號括起來的語句,稱為復(fù)合語句。如
{
y=x++;
printf("%d%d",x,y);
}
復(fù)合語句在邏輯上相當(dāng)于一個單一語句,在流程控制結(jié)構(gòu),如if結(jié)構(gòu)、for結(jié)構(gòu)、while結(jié)構(gòu)中經(jīng)常用到。復(fù)合語句在書寫時采用向右縮進(jìn)的方式,語句組相對于花括號向右縮進(jìn)一個制表位。
3.2順序結(jié)構(gòu)
順序結(jié)構(gòu)是最基本、最簡單的程序結(jié)構(gòu)。順序結(jié)構(gòu)中,各語句按照代碼的書寫順序,自上而下地逐條執(zhí)行,沒有任何條件判斷或循環(huán)操作,每個語句都被執(zhí)行一遍,且只執(zhí)行一次。
例3-4已知長方形的長和寬,計算其周長和面積。
解題思路輸入長方形的長和寬并用兩個變量保存,設(shè)兩個變量分別為length、width,然后利用公式計算長方形的周長和面積,周長和面積也分別用兩個變量perimeter、area
表示。
算法步驟如下:
(1)輸入兩個數(shù),其值分別賦給length、width;
(2)根據(jù)公式計算長方形的周長,并將其值賦給perimeter;
(3)根據(jù)公式計算長方形的面積,并將其值賦給area;
(4)輸出perimeter和area。
3.3二分支結(jié)構(gòu)
二分支結(jié)構(gòu)就是判定給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。用if語句可以構(gòu)成分支結(jié)構(gòu),if語句可以根據(jù)不同的條件,選擇不同的執(zhí)行語句。先來看這樣一個問題,計算分段函數(shù):
求解問題的流程如下:
(1)輸入x;
(2)如果x≥0,則y=x?-?5;否則y=5/x;
(3)輸出y的值。
要完成該問題的計算,顯然程序的流程必須由x的值確定。像這樣的流程(根據(jù)某個變量或表達(dá)式的值做出判定,以決定執(zhí)行某個模塊和跳過某個模塊),就需要選擇語句。
3.3.1if-else二分支選擇語句
若表達(dá)式為非0(即條件判斷為真),則執(zhí)行if后面的語句1,而不執(zhí)行語句2;否則(即條件判斷為假),越過語句1,執(zhí)行else后面的語句2。if-else的N-S圖如圖3-5所示。其中的語句1、語句2都是單一的邏輯語句,若語句1、語句2不是單一的邏輯語句,則必須用花括號括起來形成復(fù)合語句。
在條件控制語句中,人們習(xí)慣把圓括號內(nèi)的表達(dá)式叫作條件,其中if和else是關(guān)鍵字。
圖3-5if-else的N-S圖
使用if-else語句時的注意事項如下:
(1)?if語句中的條件一般是條件表達(dá)式或邏輯表達(dá)式,它們必須放在圓括號內(nèi)。
(2)因為C語言中沒有邏輯型變量,這里只是測試表達(dá)式的值是否為0,所以可以將
if(表達(dá)式!=0)
簡化為
if(表達(dá)式)
(3)?if或else后的語句可以是一個簡單語句,也可以是由幾個簡單語句組成的復(fù)合語句。若是復(fù)合語句,則必須用花括號括起來。
(4)要注意賦值運算符(=)與關(guān)系運算符(==)的區(qū)別。
幾種常見的if表達(dá)式的寫法如下:
①?if(!a):判斷變量a的值是否為0。
②?if(x>=0&&x<=10):當(dāng)x位于區(qū)間[0,10]上,邏輯表達(dá)式為真。
③?if(x>0,y>10):括號內(nèi)為逗號表達(dá)式,故最后一個表達(dá)式(y>10)的值是整個條件表達(dá)式的值。若表達(dá)式y(tǒng)>10成立,則if的條件為真。
④?if(x>0||y<10):只要一個關(guān)系表達(dá)式成立,if的條件為真。
例3-5求兩個整數(shù)x、y中較大的數(shù),并賦給變量max。
解題思路x、y值由輸入函數(shù)輸入,根據(jù)其大小進(jìn)行判斷,較大的數(shù)賦給max變量。其N-S圖如圖3-6所示。圖3-6例3-5的N-S圖
3.3.2不平衡if結(jié)構(gòu)
缺少else分支的二分支結(jié)構(gòu),稱為不平衡if結(jié)構(gòu)。不平衡if結(jié)構(gòu)的基本形式如下:
if(表達(dá)式)語句;
若表達(dá)式為非0(即條件判斷為“真”),則執(zhí)行if后面的語句;否則(即條件判斷為“假”),順序執(zhí)行if語句的下一條語句。不平衡if結(jié)構(gòu)的N-S圖如圖3-7所示。
圖3-7不平衡if結(jié)構(gòu)的N-S圖
例3-6從鍵盤輸入3個整數(shù),按由小到大的順序輸出。
解題思路輸入3個整數(shù)x、y、z,兩兩比較,始終保持x的值最小,z的值最大,不滿足此條件,則將其值進(jìn)行交換。N-S圖如圖3-8所示。圖3-8例3-6的N-S圖
例3-7求一元二次方程ax2?+?bx?+?c?=?0(a不為0)的解。
解題思路對于任意輸入的3個數(shù)a、b、c(a不等于0),有這樣3種可能:
(1)若b2?-?4ac>0,則方程有兩個不相等的實根。
(2)若b2?-?4ac=0,則方程有兩個相等的實根。
(3)若b2?-?4ac<0,則方程有兩個復(fù)數(shù)根。
3.3.3if語句的嵌套
C語言允許if語句嵌套使用。通常,if語句的嵌套有兩種結(jié)構(gòu):不平衡if嵌套結(jié)構(gòu)和多分支嵌套結(jié)構(gòu)。本小節(jié)介紹不平衡if嵌套結(jié)構(gòu)的內(nèi)容,多分支嵌套結(jié)構(gòu)的內(nèi)容將在后面小節(jié)介紹。
在這種形式的if嵌套結(jié)構(gòu)中,若表達(dá)式1為“假”,則跳過花括號中的所有語句,去執(zhí)行該復(fù)合語句下面的語句;若表達(dá)式1為“真”,則進(jìn)一步去判斷表達(dá)式11,若表達(dá)式11也為“真”,則執(zhí)行語句11,然后越過else子句,去執(zhí)行該復(fù)合語句下面的語句,若表達(dá)式11為“假”,則跳過語句11,而去執(zhí)行語句12,然后去執(zhí)行該復(fù)合語句下面的語句。
其執(zhí)行流程的N-S圖如圖3-9所示。
圖3-9不平衡if嵌套結(jié)構(gòu)的N-S圖
例3-8從鍵盤接收一整數(shù)x,判斷x是否含有因子5的正整數(shù),如有,則輸出“YES”,否則輸出“NO”。
3.4多分支結(jié)構(gòu)
3.4.1if-else多分支語句二分支if語句中,若二分支中的語句1或語句2也是一個分支結(jié)構(gòu),則整個結(jié)構(gòu)稱為分支嵌套結(jié)構(gòu)。采用多層嵌套可以實現(xiàn)多分支結(jié)構(gòu)。
分支結(jié)構(gòu)中,若表達(dá)式1的值不為0,則執(zhí)行語句1,然后越過所有的else子句,去執(zhí)行整個if語句的下一個語句。若表達(dá)式1的值為0,則判斷表達(dá)式2的值是否為0,若其值不為0,則執(zhí)行語句2,然后越過它下面的所有else子句,去執(zhí)行整個if語句下的語句;若表達(dá)式2的值為0,則再判斷下一個if語句的條件表達(dá)式。若表達(dá)式1,表達(dá)式2,…,表達(dá)式n的結(jié)果都為0,則執(zhí)行語句n+1。其執(zhí)行流程如圖3-12所示。
圖3-10多分支嵌套結(jié)構(gòu)的流程
例3-9計算下列分段函數(shù)的值。
N-S圖如圖3-11所示。
圖3-11例3-9的算法N-S圖
在if嵌套語句中,應(yīng)注意以下兩點。
(1)?else語句要有if語句與之匹配,在同一個模塊內(nèi),else總是與其前面最近的、沒有匹配過的if語句相匹配。
(2)?if后的表達(dá)式可以是關(guān)系表達(dá)式、邏輯表達(dá)式。if和else關(guān)鍵字后的語句可以是單語句,也可以是復(fù)合語句,這與單if語句相同。
例3-10從鍵盤輸入一學(xué)生成績,判斷學(xué)生成績等級。如果成績在90~100,等級為“A”;成績在80~89,等級為“B”;成績在70~79,等級為“C”;成績在60~69,等級為“D”;成績小于60,等級為“E”。
3.4.2switch語句
switch語句將一個表達(dá)式的值與多個常量表達(dá)式的值一一進(jìn)行比較,如果相等,則與之相應(yīng)的語句便會被執(zhí)行。
switch語句的一般形式如下:
其中,語句序列稱為switch語句的子語句;switch語句中的表達(dá)式稱為開關(guān)控制表達(dá)式。方括號內(nèi)的語句可缺省。
switch語句的執(zhí)行過程如下:
(1)計算switch語句后面表達(dá)式的值。
(2)逐個比較表達(dá)式的值與case后面常量表達(dá)式的值是否相等。
(3)當(dāng)表達(dá)式的值與常量表達(dá)式i的值相等時,就轉(zhuǎn)去執(zhí)行語句序列i的各個語句,若語句序列i后有break語句,則終止switch語句,繼續(xù)執(zhí)行整個switch語句后的下一條語句;當(dāng)語句序列i后無break語句,則會順序執(zhí)行語句序列i+1,i+2,…,直到遇到break語句或語句序列n+1為止,然后繼續(xù)執(zhí)行整個switch語句后的下一條語句。如果沒有一個常量表達(dá)式的值與switch語句表達(dá)式的值相等,則執(zhí)行語句n+1后,繼續(xù)執(zhí)行整個switch語句后的下一條語句。
在不考慮break語句的情況下,switch語句一般形式的執(zhí)行流程如圖3-12所示。圖3-12switch語句一般形式的執(zhí)行流程圖
使用switch語句注意事項如下:
(1)?switch后面的表達(dá)式的值類型和常量表達(dá)式的值類型必須一致,且只能是整型、字符型或枚舉型。
(2)當(dāng)表達(dá)式的值與某個case中的常量表達(dá)式的值進(jìn)行匹配,若相等時,就執(zhí)行相應(yīng)的case后的語句序列,直到遇到break語句或到達(dá)switch語句末尾(無break語句,則入口后的語句序列順序執(zhí)行)。若匹配不成功,則執(zhí)行default后的語句。default語句是可省的,如沒有default語句,所有的匹配不成功,則不執(zhí)行case中任何語句序列,程序繼續(xù)執(zhí)行整個switch語句后的下一條語句。
(3)多個連續(xù)的case語句可以共用一個語句序列。
(4)?case后的常量表達(dá)式的值不能相等。
(5)?break的作用是改變程序在switch結(jié)構(gòu)中的執(zhí)行流程,將程序流程跳出switch語句,轉(zhuǎn)到整個switch語句后的下一條語句去執(zhí)行。
(6)?switch語句中允許嵌套switch語句,這稱為switch嵌套結(jié)構(gòu)。
例3-11用switch語句完成從鍵盤輸入一學(xué)生成績,判斷學(xué)生成績等級。如果成績在90~100分,等級為A;成績在80~89分,等級為B;成績在70~79分,等級為C;成績在60~69分,等級為D;成績小于60分,等級為E。
3.5分支結(jié)構(gòu)的綜合示例
例3-12從鍵盤輸入3個整數(shù),按從小到大的順序輸出。N-S圖如圖3-13所示。
圖3-13例3-12的算法N-S圖
例3-13計算下面分段函數(shù)的值。
下面使用4種不同的方法實現(xiàn)上述計算,以展現(xiàn)C語言多分支結(jié)構(gòu)的風(fēng)格。
(1)使用不嵌套的if語句編程。
(2)使用嵌套的if語句編程。
(3)使用if-else形式編程。
(4)使用switch語句編程。
本章小結(jié)
C語言中,順序結(jié)構(gòu)和分支結(jié)構(gòu)是兩大基本結(jié)構(gòu)。順序結(jié)構(gòu)可確保程序按照既定順序執(zhí)行每條指令,是程序設(shè)計的基礎(chǔ)。本章首先介紹了程序結(jié)構(gòu)框圖,如流程圖和N-S圖,然后介紹了順序結(jié)構(gòu),最后介紹了分支結(jié)構(gòu)。分支結(jié)構(gòu)中常用的if語句和switch語句,可使程序能夠根據(jù)不同條件選擇執(zhí)行路徑。if語句靈活,適用于處理復(fù)雜的條件判斷,而switch語句在處理多個簡單條件時更為高效。將順序結(jié)構(gòu)和分支結(jié)構(gòu)兩者結(jié)合使用,是C語言程序員必須掌握的核心技能。第4章循環(huán)結(jié)構(gòu)4.1循環(huán)結(jié)構(gòu)的要素4.2循環(huán)語句4.3循環(huán)嵌套4.4流程轉(zhuǎn)移控制語句4.5循環(huán)結(jié)構(gòu)的綜合示例本章小結(jié)
4.1循環(huán)結(jié)構(gòu)的要素
循環(huán)結(jié)構(gòu)就是用來處理需要重復(fù)處理的問題的,所以循環(huán)結(jié)構(gòu)又稱為重復(fù)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)有3個要素:循環(huán)控制變量、循環(huán)體和循環(huán)條件。
1.循環(huán)控制變量
循環(huán)控制變量通常用于控制循環(huán)的次數(shù)和進(jìn)程。它在循環(huán)開始前被初始化,在循環(huán)過程中會發(fā)生變化,并且循環(huán)條件通常會依賴于這個變量的值。在for循環(huán)中,控制變量的初始化、條件檢查和變量更新通常在循環(huán)語句的頭部明確給出。
2.循環(huán)體
循環(huán)體包含了每次循環(huán)迭代時需要執(zhí)行的代碼塊。只要循環(huán)條件為真,循環(huán)體內(nèi)的代碼就會被執(zhí)行。循環(huán)體可以是一個簡單的語句或一個復(fù)雜的代碼塊,包括更多的控制流語句,如條件判斷、嵌套循環(huán)等。
3.循環(huán)條件
循環(huán)條件是一個邏輯表達(dá)式,其結(jié)果決定了循環(huán)是否繼續(xù)執(zhí)行。在每次循環(huán)迭代開始前(while和for循環(huán))或結(jié)束時(do-while循環(huán))檢查這個條件。如果條件為真(即表達(dá)式結(jié)果非0),則循環(huán)繼續(xù)執(zhí)行;如果條件為假(即表達(dá)式結(jié)果為0),則循環(huán)結(jié)束,控制流轉(zhuǎn)移到循環(huán)結(jié)構(gòu)后的下一條語句。
循環(huán)有兩種:無限循環(huán)和有限循環(huán)。無限循環(huán),如地球繞太陽的轉(zhuǎn)動或晝夜的連續(xù)交替,理論上永無止境。有限循環(huán),在滿足特定條件后便會停止,比如在處理完一個班級里所有50名學(xué)生的績點計算之后循環(huán)停止。
循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、分支結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。因此,熟練掌握循環(huán)結(jié)構(gòu)的概念及使用方法是程序設(shè)計最基本的要求。
4.2循環(huán)語句
循環(huán)語句是一種在編程中使用的語句,它允許程序重復(fù)執(zhí)行一段代碼多次,直到滿足某個條件為止。C語言中提供for、while、do-while這三種循環(huán)控制語句來實現(xiàn)循環(huán)結(jié)構(gòu)。
4.2.1for語句
1.?for語句的一般形式
for語句的一般形式為
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
循環(huán)體;
循環(huán)體;
其中:表達(dá)式1可以是賦值表達(dá)式、逗號表達(dá)式或函數(shù)調(diào)用表達(dá)式,它是循環(huán)控制的初始化部分,為循環(huán)中所使用的變量賦初值,即為循環(huán)作準(zhǔn)備;表達(dá)式2通常是關(guān)系表達(dá)式或邏輯表達(dá)式,它是循環(huán)條件,循環(huán)體反復(fù)執(zhí)行多次,必須在循環(huán)條件滿足的情況下(即表達(dá)式2的值非0)才能進(jìn)行,否則循環(huán)終止;表達(dá)式3是賦值表達(dá)式或算術(shù)表達(dá)式,它使循環(huán)變量的值或循環(huán)條件得到修改,使循環(huán)只能進(jìn)行有限次;循環(huán)體是循環(huán)結(jié)構(gòu)中反復(fù)執(zhí)行的語句,它可以是空語句(單獨用分號表示的一條語句)、單語句或復(fù)合語句。
2.?for語句的執(zhí)行過程
for語句的執(zhí)行過程如下:
(1)計算表達(dá)式1。
(2)判斷表達(dá)式2,若其值非0,則執(zhí)行第(3)步;若為0,則執(zhí)行第(6)步。
(3)執(zhí)行循環(huán)體。
(4)計算表達(dá)式3。
(5)跳轉(zhuǎn)到第(2)步繼續(xù)執(zhí)行。
(6)終止循環(huán),執(zhí)行for語句后的下一條語句。
for語句的執(zhí)行流程如圖4-1所示。
圖4-1for語句的執(zhí)行流程
3.?for語句的說明
for語句的使用說明如下:
(1)在for語句中3個表達(dá)式都可以缺省,但其中的兩個分號不可省。例如,下面的語句是正確的:
for(;;)
①若表達(dá)式1缺省,則必須將表達(dá)式1作為語句安排在for語句之前。如例4-1中的語句
for(s=0,n=1;n<=100;n++)
可改成
s=0;
n=1;
for(;n<=100;n++)
②若表達(dá)式2缺省,則系統(tǒng)默認(rèn)循環(huán)條件為真(非0值),此時,如果不在循環(huán)體中加其他語句進(jìn)行控制,循環(huán)將無限制進(jìn)行下去,即出現(xiàn)死循環(huán)。如將例4-1中的循環(huán)語句改成
for(s=0,n=1;;n++)
s=s+n;
則會出現(xiàn)死循環(huán)。
③若表達(dá)式3缺省,可將它的語句放在循環(huán)體的最后。如可將例4-1中的循環(huán)語句改成
for(s=0,n=1;n<=100;)
{
s=s+n;
n++;
}
(2)若循環(huán)體中有多個語句,則循環(huán)體一定要用花括號括起來,以復(fù)合語句形式出現(xiàn),且循環(huán)體中的變量在每一次循環(huán)過程中其值一般來說是不相同的。
如例4-1中,第一次循環(huán),s的值是1,n的值是1;第二次循環(huán),s的值是3,n的值是2。
(3)循環(huán)體可以為空語句,但必須有分號(即循環(huán)為空語句)。
(4)要注意循環(huán)終止后循環(huán)變量的值,一般來講該值是循環(huán)變量最后一次循環(huán)值加步長。如例4-1中循環(huán)變量終止后n的值為100+1,即101。
4.程序舉例
例4-2判斷正整數(shù)x是否為素數(shù)。
解題思路素數(shù)是指除1和本身之外不能被其他數(shù)整除的數(shù)。設(shè)一個標(biāo)志性變量flag,如果其值等于0,則x不為素數(shù);如果其值等于1,則x為素數(shù)。先設(shè)flag?=?1(即假設(shè)x為素數(shù)),另設(shè)變量n由2變化到x?-?1,接著判斷x是否能被n整除,只要有一個n值能使x被整除,則令flag=0。
N-S圖如圖4-2所示圖4-2例4-2的N-S圖
例4-3從鍵盤輸入任意兩個正整數(shù)x和y,求出這兩數(shù)的最大公因子。
解題思路首先輸入兩個正整數(shù),判斷其大小,大的數(shù)放在x中,小的數(shù)放在y中。其次設(shè)r為余數(shù),x與y的關(guān)系可寫為x?=?ky?+?r,由于x與y有公因子f,因此r中必有公因子f。這樣求大的數(shù)x與y的公因子,就可以轉(zhuǎn)化為求小的數(shù)y與r的公因子f。這就是輾轉(zhuǎn)相除法。當(dāng)r?=?0時,y值為最大公因子。
N-S圖如圖4-3所示,
圖4-3例4-3的N-S圖
例4-4輸出斐波那契數(shù)列的前20項之值。
解題思路設(shè)f0、f1、f2是數(shù)列中的3個數(shù),且有如下關(guān)系:f2?=?f1?+?f0。在循環(huán)計算過程中,始終使f1、f0指向兩個相加的相鄰數(shù),f2始終為新計算出的和值。
4.2.2while語句
1.?while語句的一般形式
while語句是一種當(dāng)型循環(huán)語句,即先判斷條件,后執(zhí)行循環(huán)體。while語句的一般形式為
while(表達(dá)式)
循環(huán)體;
其中:圓括號中的表達(dá)式一般是關(guān)系表達(dá)式、邏輯表達(dá)式或算術(shù)表達(dá)式,運算結(jié)果是一個邏輯值,或為真(非0),或為假(0),它是循環(huán)控制的條件;循環(huán)體是循環(huán)反復(fù)執(zhí)行的語句,它可以是空語句、單語句或復(fù)合語句。
2.?while語句的執(zhí)行過程
首先計算和判斷表達(dá)式的值,如果表達(dá)式的值為“真”(非0),則執(zhí)行循環(huán)體;然后程序轉(zhuǎn)回去計算和判斷表達(dá)式的值,當(dāng)表達(dá)式的值為“假”(0)時,終止while循環(huán),繼續(xù)執(zhí)行while語句后的下一條語句。
其N-S圖如圖4-4所示。圖4-4while語句的N-S圖
3.程序舉例
例4-5求10個數(shù)(實數(shù))中的最大數(shù)。
解題思路設(shè)存放最大數(shù)的變量為max。先輸入第一個數(shù),并將其值賦給max。然后輸入第二個數(shù),將其與當(dāng)前max比較,如果輸入的數(shù)大于max,則將max更新為當(dāng)前最大數(shù)。接著輸入第三個數(shù)、第四個數(shù)……
N-S圖如圖4-5所示
圖4-5例4-5的算法N-S圖
例4-6用while語句求s?=?1?+?2?+?3?+?…?+?100。
解題思路首先s賦初值0,被加數(shù)n賦初值1,將n的值(1)累加到s中;然后將n加1后的值(2)累加到s中。這樣,n的值不斷加1并被累加到s中,直到將100也累加到s中為止,此時s中的值即為所求累加和。
4.2.3do-while語句
1.?do-while語句的一般形式
do-while語句的一般形式為
do
{
循環(huán)體;
}while(表達(dá)式);
2.?do-while語句的執(zhí)行過程
do-while語句的作用是,首先無條件地執(zhí)行循環(huán)體一次(無論表達(dá)式的值是否為0),然后計算和判斷表達(dá)式的值,若表達(dá)式的值為“真”(非0),則程序轉(zhuǎn)回去反復(fù)執(zhí)行循環(huán)體,直到表達(dá)式的值為“假”(0),這時終止do-while語句,繼續(xù)執(zhí)行do-while語句后的下一條語句。do-while語句的N-S圖如圖4-6所示。圖4-6do-while語句的N-S圖
3.程序舉例
例4-7求12?+?22?+?32?+?…?+?n2?≤?10?000的最大n值。
解題思路定義累加和變量s和正整數(shù)n。當(dāng)s小于或等于10?000的值為真時輸出n?-?1。
N-S圖如圖4-7所示圖4-7例4-7的N-S圖
例4-8求一個正整數(shù)(該數(shù)小于65535)的逆序數(shù)。
解題思路對于x的逆序數(shù),按順序分離它的每個數(shù)位t,設(shè)變量newd保存逆序數(shù),初始值為0,按表達(dá)式“newd=newd*10+t”將t累加到newd變量中,則可實現(xiàn)轉(zhuǎn)換。
例4-9用牛頓迭代法求方程3x3?-?4x2?+?3x?-?6?=?0在1.5附近的根,要求絕對值誤差小于1E-5,并輸出迭代次數(shù)。
解題思路牛頓迭代法實際上是根據(jù)曲線f(x)的切線與x軸的交點來求非線性方程的近似解,其迭代公式為
x?=?x0?-?f(x0)?/?f1(x0)
其中f1(x0)是f(x)的導(dǎo)函數(shù)在x0點的值。
4.2.4三種循環(huán)的比較
while循環(huán)和do-while循環(huán)由循環(huán)控制變量、循環(huán)條件和循環(huán)體組成,循環(huán)體中包含需要反復(fù)執(zhí)行的操作和循環(huán)控制變量值的修改語句。而for語句則在它的一般形式中有4個固定位置,用4個表達(dá)式表示,其結(jié)構(gòu)更加簡潔。
while循環(huán)和for循環(huán)是先判斷循環(huán)條件,后執(zhí)行循環(huán)體,當(dāng)?shù)谝淮闻袛嘌h(huán)條件不滿足時,循環(huán)體一次也不執(zhí)行,稱為當(dāng)型循環(huán);do-while循環(huán)是先執(zhí)行循環(huán)體一次,后判斷循環(huán)條件,所以循環(huán)體至少執(zhí)行一次,稱為直到型循環(huán)。
4.3循環(huán)嵌套
如果一個循環(huán)完全包含在另一個循環(huán)的循環(huán)體中,那么這樣的結(jié)構(gòu)稱為循環(huán)嵌套。內(nèi)嵌的循環(huán)中還可以再嵌套循環(huán),這稱為多重循環(huán)。三種循環(huán)控制語句for、while、do-while可以互相嵌套、自由組合。
例4-10求1~1000中的回文數(shù)(正讀和反讀相同的整數(shù))的個數(shù)。
解題思路回文數(shù)是正讀和反讀相同的整數(shù),即該數(shù)和它的逆序數(shù)相等。
例4-11求2~1000中所有素數(shù)的個數(shù)及這些素數(shù)的和。
解題思路判斷一個數(shù)x是否為素數(shù),在例4-2中有詳細(xì)做法,這里只需要遍歷判斷2~1000的每個數(shù)是否為素數(shù)即可。
二重循環(huán)的執(zhí)行過程是:外循環(huán)執(zhí)行一次,內(nèi)循環(huán)執(zhí)行一遍,之后,跳轉(zhuǎn)到外循環(huán),若外循環(huán)條件滿足,則重復(fù)執(zhí)行一遍內(nèi)循環(huán),如此反復(fù);當(dāng)外循環(huán)條件不滿足時,結(jié)束整個循環(huán)。通俗地說,執(zhí)行時由外循環(huán)進(jìn)入內(nèi)循環(huán),退出則相反,由內(nèi)循環(huán)退至外循環(huán),直到外循環(huán)結(jié)束時才結(jié)束整個循環(huán)嵌套。
循環(huán)嵌套可以有效解決復(fù)雜問題,但在使用循環(huán)嵌套時,要注意以下幾點:
(1)使用花括號明確定義每個循環(huán)體。
(2)區(qū)分各層循環(huán)的控制變量名。
(3)保持清晰的縮進(jìn)層次。
(4)嚴(yán)格遵守循環(huán)的包含關(guān)系。
(5)循環(huán)要進(jìn)行初始化
4.4流程轉(zhuǎn)移控制語句
在C語言中,流程轉(zhuǎn)移控制是指通過特定的語句改變程序的執(zhí)行流程。主要的流程轉(zhuǎn)移控制語句有break、continue等語句,這些控制語句允許程序根據(jù)條件跳過某些代碼的執(zhí)行或提前退出循環(huán),使得代碼的邏輯更加靈活。
4.4.1break語句
break語句經(jīng)常放在循環(huán)語句的循環(huán)體中,且通常和if語句一起連用。break語句的一般形式為
break;
其作用是:在滿足一定條件時,提前退出本層循環(huán)(不管循環(huán)條件是否成立),使程序流程轉(zhuǎn)向該循環(huán)結(jié)構(gòu)后的下一條語句。break語句示例如圖4-8所示。圖4-8break語句示例
例4-13求2~1000中超級素數(shù)的個數(shù)。
解題思路超級素數(shù)指一個素數(shù)從低位到高位依次去掉一位數(shù)后剩下的數(shù)還是素數(shù)。判斷一個數(shù)x是否為素數(shù),在例4-2中有詳細(xì)介紹,若x是素數(shù),則去掉x的一個數(shù)位,繼續(xù)判斷x是否為素數(shù)。
4.4.2continue語句
continue語句的一般形式為
continue;
其作用是:提前結(jié)束本次循環(huán),即跳過循環(huán)體中某些還沒有被執(zhí)行的語句,開始新的一次循環(huán)。continue語句示例如圖4-9所示,執(zhí)行循環(huán)體中的continue時,提前結(jié)束本次循環(huán),即循環(huán)體中continue后的語句不執(zhí)行,接著進(jìn)行下一次循環(huán)操作。圖4-9continue語句示例
例4-14從鍵盤輸入10個不為0的整數(shù),統(tǒng)計其中負(fù)數(shù)的個數(shù),并求所有正數(shù)的平均值。
解題思路程序中定義的變量count用于統(tǒng)計負(fù)數(shù)個數(shù);變量avg在循環(huán)結(jié)構(gòu)中用于統(tǒng)計正數(shù)的和,循環(huán)結(jié)束后用于計算平均值,
4.5循環(huán)結(jié)構(gòu)的綜合示例
例4-15祖沖之一生鉆研自然科學(xué),其主要貢獻(xiàn)在數(shù)學(xué)、天文歷法和機(jī)械制造三個方面。他在劉徽開創(chuàng)的探索圓周率的精確方法基礎(chǔ)上,首次將圓周率精算到小數(shù)點后第7位,即在3.1415926和3.1415927之間。他提出的“祖率”對數(shù)學(xué)的研究具有重大貢獻(xiàn)。請利用級數(shù)展開式求π的近似值,直到某一項的值小于10-8為止。
解題思路這是一個累加求和問題,但這里的循環(huán)次數(shù)是未知的,只能使用條件控制的循環(huán)來實現(xiàn)。由于控制循環(huán)結(jié)束的條件是累加的最后一項的絕對值小于10-8,因此循環(huán)繼續(xù)的條件是累加的最后一項的絕對值大于或等于10-8。又由于累加項是由分子和分母兩部分組成的,因此累加項的構(gòu)成規(guī)律為
term=sign/n
由于相鄰累加項的符號是正負(fù)交替變化的,因此可以令分子sign按+1,-1,+1,-1,…交替變化,這可通過反復(fù)取sign自身的相反數(shù)再重新賦值給自己(即sign=-sign)的方法來實現(xiàn),注意sign需初始化為1。分母n則按1,3,5,7,…即每次遞增2變化,這可通過n=n+2來實現(xiàn),注意n也需初始化為1。此外,還要設(shè)置一個計數(shù)器變量count來統(tǒng)計累加的項數(shù)。count需初始化為0。在循環(huán)體中每累加一項,count的值就增1。
例4-16打印如下大小可變的菱形圖案(下面菱形的大小是7):
解題思路菱形的大小size其實就是中間行中“*”號的個數(shù),也是整個菱形的行數(shù),其值必須是奇數(shù)。問題的關(guān)鍵之一是如何確定每行中“*”號的個數(shù)。經(jīng)過分析得知:當(dāng)行數(shù)i(假設(shè)最上面的一行為第1行)≤(size?+?1)/2時,該行上的“*”號個數(shù)為“n=2*i-1”,否則“n=2*(size-i+1)-1”。問題的關(guān)鍵之二是如何確定每行顯示的第一個“*”號的位置,也就是顯示第一個*號之前應(yīng)顯示多少個空格。經(jīng)過分析得知:每行應(yīng)顯示的空格數(shù)為m=(size-n)/2個。
例4-17我國古代數(shù)學(xué)家張丘建在《算經(jīng)》一書中曾提出過著名的“百錢買百雞”問題。該問題簡述如下:公雞5文錢一只,母雞3文錢一只,小雞3只一文錢,用100文錢買100只雞,其中公雞、母雞、小雞都必須要有。問:公雞、母雞、小雞要買多少只剛好花去100文錢?
解題思路設(shè)公雞、母雞、小雞分別為x、y、z,依題意列出方程組x?+?y?+?z?=?100,5x?+?3y?+?z/3?=?100,此題可采用窮舉法求解。因100文錢買公雞最多可買20只,買母雞最多可買33只,故x從0變化到20,y從0變化到33,而
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一種用于儲能集裝箱的消防系統(tǒng)及儲能集裝箱的制作方法
- 2025年高職筆試試題及答案
- 2025年優(yōu)缺點面試試題及答案
- 2025年小學(xué)科目面試題及答案
- 2025年以前的公司法試題及答案
- 2025年音樂教室樂理試題及答案
- 2025年醫(yī)療直播面試題及答案
- 2025年初一音樂測試題及答案
- 2025年達(dá)鋼鉗工考試題及答案
- 2025年ug考試試題及答案
- 個人信息保護(hù)培訓(xùn)
- 電子級(高純)氫氟酸生產(chǎn)工藝和質(zhì)量指標(biāo)介紹
- 2024年煤礦安全管理人員(機(jī)電運輸)考試題庫(濃縮500題)
- 支付令異議申請書(2篇)
- 數(shù)據(jù)崗位招聘筆試題與參考答案(某大型央企)2025年
- 第六單元 資本主義制度的初步確立 復(fù)習(xí)課件 2024-2025學(xué)年統(tǒng)編版九年級歷史上冊
- 供應(yīng)鏈安全培訓(xùn)教材課件
- 口腔頜面外科創(chuàng)口的處理(口腔頜面外科課件)
- 智鼎在線測評規(guī)律題題庫
- 蘋果電腦macOS效率手冊
- 緊急停車按鈕的安全設(shè)置要求
評論
0/150
提交評論