



版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、19第5章 使用復(fù)合賦值和循環(huán)語(yǔ)句第5章 使用復(fù)合賦值和循環(huán)語(yǔ)句本章旨在教會(huì)你:l 使用復(fù)合賦值操作符更新變量值l 使用while、for和do循環(huán)語(yǔ)句l 單步執(zhí)行do語(yǔ)句,觀察變量值的變化第4章講述了如何使用if和switch語(yǔ)句選擇性地運(yùn)行語(yǔ)句。本章要介紹如何使用各種循環(huán)語(yǔ)句重復(fù)運(yùn)行一個(gè)或多個(gè)語(yǔ)句。寫(xiě)循環(huán)語(yǔ)句時(shí)通常要控制重復(fù)次數(shù)。為此可以使用一個(gè)變量,每次重復(fù)都更新它的值,并在變量抵達(dá)特定值時(shí)停止重復(fù)。因此,還要介紹如何在這些情況下使用特殊的賦值操作符來(lái)更新變量值。5.1 使用復(fù)合賦值操作符前面講過(guò)如何使用算術(shù)操作符創(chuàng)建新值。例如以下語(yǔ)句使用操作符+創(chuàng)建比變量answer大42的值,新值在
2、控制臺(tái)顯示:Console.WriteLine(answer + 42);前文還講過(guò)如何使用賦值語(yǔ)句更改變量值。以下語(yǔ)句使用賦值操作符=將answer的值變成42:answer = 42;要在變量的值上加42,可在同一個(gè)語(yǔ)句中使用賦值和加法操作。例如,以下語(yǔ)句在answer上加42,新值再賦給answer。換言之,在運(yùn)行該語(yǔ)句之后,answer的值比之前大42:answer = answer + 42; 雖然這是有效的語(yǔ)句,但有經(jīng)驗(yàn)的程序員不會(huì)這樣寫(xiě)。在變量上加一個(gè)值是常見(jiàn)操作,所以C#專(zhuān)門(mén)提供了+=操作符來(lái)簡(jiǎn)化它。要在answer上加42,有經(jīng)驗(yàn)的程序員會(huì)像下面這樣寫(xiě):answer += 4
3、2;類(lèi)似,可將任何算術(shù)操作符與賦值操作符合并見(jiàn)下表。這些操作符稱(chēng)為復(fù)合賦值操作符。不要這樣寫(xiě)要這樣寫(xiě)variable = variable * number;variable *= number;variable = variable / number;variable /= number;variable = variable % number;variable %= number;variable = variable + number;variable += number;variable = variable - number;variable -= number;提示復(fù)合賦值操作符和
4、簡(jiǎn)單賦值操作符具有一樣的優(yōu)先級(jí)和右結(jié)合性。操作符+=可用于字符串;作用是將一個(gè)字符串附加到另一個(gè)字符串末尾。例如,以下代碼在控制臺(tái)上顯示"Hello John":string name = "John"string greeting = "Hello "greeting += name;Console.WriteLine(greeting);但其他任何復(fù)合賦值操作符都不能用于字符串。注意變量遞增或遞減1不要使用復(fù)合賦值操作符,而是使用操作符+和-。例如,不要像下面這樣寫(xiě):count += 1;而是像下面這樣寫(xiě):count+;5.2 使
5、用while語(yǔ)句使用while語(yǔ)句,可在條件為true的前提下重復(fù)運(yùn)行一個(gè)語(yǔ)句。while語(yǔ)句的語(yǔ)法如下:while ( booleanExpression ) statement先求值booleanExpression(布爾表達(dá)式,注意必須放在圓括號(hào)中),如果為true,就運(yùn)行語(yǔ)句(statement)。再次求值booleanExpression,仍為true就再次運(yùn)行語(yǔ)句。再次求值booleanExpression這個(gè)過(guò)程一直繼續(xù),直至結(jié)果為false,此時(shí)while語(yǔ)句退出,從while構(gòu)造之后的第一個(gè)語(yǔ)句繼續(xù)。while語(yǔ)句在語(yǔ)法上與if語(yǔ)句有許多相似的地方(事實(shí)上,除了關(guān)鍵字不同,語(yǔ)
6、法完全相同),具體如下。l 表達(dá)式必須是布爾表達(dá)式。l 布爾表達(dá)式必須放在圓括號(hào)中。l 首次求值布爾表達(dá)式為false,語(yǔ)句不運(yùn)行。l 要在while的控制下執(zhí)行兩個(gè)或更多語(yǔ)句,必須用大括號(hào)將語(yǔ)句分組成代碼塊。以下while語(yǔ)句向控制臺(tái)寫(xiě)入值09。一旦變量i的值變成10,while語(yǔ)句中止,不再運(yùn)行代碼塊。int i = 0;while (i < 10) Console.WriteLine(i); i+;所有while語(yǔ)句都應(yīng)在某個(gè)時(shí)候終止。新手常見(jiàn)錯(cuò)誤是忘記添加語(yǔ)句最終造成布爾表達(dá)式求值為false來(lái)終止循環(huán)。在上例中,這個(gè)語(yǔ)句就是i+;。注意while循環(huán)的變量i控制循環(huán)次數(shù)。這是常
7、見(jiàn)的設(shè)計(jì)模式,具有這個(gè)作用的變量有時(shí)也稱(chēng)為哨兵變量。還可創(chuàng)建嵌套循環(huán),這種情況下一般延續(xù)該命名模式來(lái)使用j,k甚至l等作為哨兵變量名。提示和if語(yǔ)句一樣,建議總是為while語(yǔ)句使用代碼塊,即使其中只有一個(gè)語(yǔ)句。這樣以后添加代碼更省心。如果不這樣做,只有while后的第一個(gè)語(yǔ)句才會(huì)與之關(guān)聯(lián),造成難以發(fā)現(xiàn)的bug。例如以下代碼: int i = 0; while (i < 10) Console.WriteLine(i); i+;代碼將無(wú)限循環(huán),無(wú)限顯示零,因?yàn)橹挥蠧onsole.WriteLine語(yǔ)句才和while關(guān)聯(lián),i+;語(yǔ)句雖然縮進(jìn)但編譯器不把它視為循環(huán)主體的一部分。以下練習(xí)寫(xiě)一個(gè)
8、while循環(huán),每次從源文件讀取一行內(nèi)容,將其寫(xiě)入文本框。Ø 編寫(xiě)while語(yǔ)句1.在Visual Studio 2013中打開(kāi)WhileStatement項(xiàng)目,它位于“文檔”文件夾下的Microsoft PressVisual CSharp Step by StepChapter 5Windows XWhileStatement子文件夾中。2.在“調(diào)試”菜單中選擇“啟動(dòng)調(diào)試”。Visual Studio 2013生成并運(yùn)行應(yīng)用程序。應(yīng)用程序本身是一個(gè)簡(jiǎn)單的文本文件查看器,用于打開(kāi)文件并查看內(nèi)容。3.單擊Open File。如果使用Windows 8.1,將打開(kāi)文件選取器并顯示“文檔
9、”文件夾的內(nèi)容(如果使用Windows 8.1 Updatre1以后的版本,則顯示OneDrive的“文檔”文件夾中的內(nèi)容),如下圖所示(在你的計(jì)算機(jī)上,文件和文件夾列表可能有所不同)。如果使用Windows 7,將顯示“打開(kāi)”對(duì)話(huà)框,如下圖所示。無(wú)論什么操作系統(tǒng),都可利用該功能切換至一個(gè)文件夾并選擇要顯示的文件。4.切換到這臺(tái)電腦“文檔”文件夾下的Microsoft PressVisual CSharp Step by StepChapter 5Windows XWhileStatementWhileStatement子文件夾。5.選擇MainWindow.xaml.cs文件,單擊“打開(kāi)”按
10、鈕。文件名MainWindow.xaml.cs在小文本框顯示,但文件內(nèi)容沒(méi)有在大文本框中顯示。這是由于尚未實(shí)現(xiàn)代碼來(lái)讀取并顯示源文件內(nèi)容。下面的步驟將添加這個(gè)功能。6.返回Visual Studio 2013并停止調(diào)試。7.在“代碼和文本編輯器”窗口中打開(kāi)MainWindow.xaml.cs文件,找到openFileClick方法。在“打開(kāi)”對(duì)話(huà)框中選擇文件并單擊“打開(kāi)”按鈕后將調(diào)用該方法。應(yīng)用程序的不同版本以不同方式實(shí)現(xiàn)該方法。目前不需要理解方法的細(xì)節(jié),只需知道方法提示用戶(hù)指定文件(通過(guò)FileOpenPicker或OpenFileDialog窗口)并打開(kāi)指定文件以進(jìn)行讀取。(在Window
11、s 7版本中,方法只是顯示OpenFileDialog窗口。當(dāng)用戶(hù)選擇文件并單擊“打開(kāi)”按鈕后,將調(diào)用openFileDialogFileOk方法來(lái)打開(kāi)文件以進(jìn)行讀取。)openFileClick方法(Windows 8.1)或openFileDialogFileOk方法(Windows 7或Windows 8)的最后兩個(gè)語(yǔ)句很重要。Windows 8.1版本如下:TextReader reader = new StreamReader(inputStream.AsStreamForRead();displayData(reader);第一個(gè)語(yǔ)句聲明TextReader變量reader。Tex
12、tReader是.NET Framework提供的類(lèi),用于從文件等來(lái)源讀取字符流。它在System.IO命名空間中。該語(yǔ)句使用戶(hù)指定文件中的數(shù)據(jù)可供TextReader對(duì)象使用,然后利用該對(duì)象從文件讀取數(shù)據(jù)。最后一個(gè)語(yǔ)句調(diào)用displayData方法,將reader作為參數(shù)傳遞。方法使用reader對(duì)象讀取數(shù)據(jù)并在屏幕上顯示,稍后將實(shí)現(xiàn)該方法。Windows 7版本對(duì)應(yīng)的語(yǔ)句如下:TextReader reader = src.OpenText();displayData(reader);src變量是FileInfo對(duì)象,填充了用戶(hù)所選文件的信息。FileInfo類(lèi)也是.NET Framewo
13、rk提供的類(lèi),它的OpenText方法用于打開(kāi)文件以進(jìn)行讀取。第一個(gè)語(yǔ)句打開(kāi)所選文件,使reader變量能接收文件內(nèi)容。和Windows 8.1版本一樣,最后一個(gè)語(yǔ)句調(diào)用displayData方法并將reader作為參數(shù)傳遞。8.找到displayData方法。它的兩個(gè)版本是相同的:private void displayData(TextReader reader) / TODO: add while loop here主體只有一行代碼,馬上就要添加代碼來(lái)獲取并顯示數(shù)據(jù)。9.將TODO注釋替換成以下語(yǔ)句:source.Text = ""source變量是窗體上最大的那個(gè)文
14、本框。把它的Text屬性設(shè)為空字符串(""),就可以清除當(dāng)前顯示的任何文本。10.在剛才輸入的語(yǔ)句之后,輸入以下語(yǔ)句:string line = reader.ReadLine(); 上述語(yǔ)句聲明string變量line,調(diào)用reader.ReadLine方法把文件中的第一行文本讀入變量。方法要么返回讀取的一行文本;要么返回特殊值null來(lái)表明沒(méi)有更多的行可供讀取。如果一行文本都沒(méi)有返回,表明是空文件。11.在剛才輸入的代碼之后繼續(xù)輸入以下代碼:while (line != null) source.Text += line + 'n' line = rea
15、der.ReadLine();以上while循環(huán)依次讀取文件每一行,直至沒(méi)有更多行。while循環(huán)判斷l(xiāng)ine變量值。不為null就顯示讀取的行,具體做法是將該行附加到source文本框的Text屬性,并在行末添加換行符('n')。TextReader對(duì)象的ReadLine方法讀取每一行會(huì)自動(dòng)刪除換行符,所以要重新添加。然后,在下次循環(huán)之前,while循環(huán)讀取下一行文本。如果沒(méi)有更多文本,ReadLine返回null值,造成while循環(huán)終止。12.如果使用Windows 8.1,在while循環(huán)的結(jié)束大括號(hào)()之后添加以下語(yǔ)句:reader.Dispose();如果使用Win
16、dows 7或Windows 8,在之后添加以下語(yǔ)句:reader.Close();這將釋放與文件關(guān)聯(lián)的資源并關(guān)閉文件。這是一個(gè)好習(xí)慣。除了釋放訪(fǎng)問(wèn)文件所需的內(nèi)存和其他資源,還使其他應(yīng)用程序能使用該文件。13.在“調(diào)試”菜單中選擇“啟動(dòng)調(diào)試”。14.窗體出現(xiàn)之后單擊Open File。15.在文件選取器或“打開(kāi)”對(duì)話(huà)框中,切換到“文檔”文件夾下的Microsoft PressVisual CSharp Step by StepChapter 5Windows XWhileStatementWhileStatement子文件夾,選擇MainWindow.xaml.cs文件,單擊“打開(kāi)”按鈕。注意
17、不要打開(kāi)非文本文件。例如,打開(kāi)可執(zhí)行程序或圖形文件會(huì)顯示二進(jìn)制信息的文本形式。如果文件很大,應(yīng)用程序可能掛起,需要強(qiáng)制終止。 這次所選文件的內(nèi)容在文本框中完整顯示,可看到剛才輸入的代碼。下圖展示的是Windows 8.1版本的運(yùn)行情況。Windows 7版本與此相似。16.在文本框中滾動(dòng)文本,找到displayData方法。驗(yàn)證方法包含剛才添加的代碼。17.返回Visual Studio 2013并停止調(diào)試。5.3 編寫(xiě)for語(yǔ)句C#的大多數(shù)while循環(huán)語(yǔ)句都具有以下常規(guī)結(jié)構(gòu):initializationwhile (Boolean expression) statement update
18、control variablefor語(yǔ)句提供了這種結(jié)構(gòu)的更正式版本,它將initialization(初始化)、Boolean expression(布爾表達(dá)式)與update control variable(更新控制變量)合并到一起。用過(guò)for語(yǔ)句之后就能體會(huì)到它的好處,它能防止遺漏初始化和更新控制變量的代碼,減少寫(xiě)出無(wú)限循環(huán)代碼的概率。以下是for語(yǔ)句的語(yǔ)法:for (initialization; Boolean expression; update control variable) statement其中,statement(語(yǔ)句)是for循環(huán)主體,要么是一個(gè)語(yǔ)句,要么是用花括號(hào)
19、封閉的代碼塊。前面展示過(guò)while循環(huán)的一個(gè)例子,它顯示09的整數(shù)。下面要用for循環(huán)改寫(xiě)它:for (int i = 0; i < 10; i+) Console.WriteLine(i);初始化(int i = 0)只在循環(huán)開(kāi)始時(shí)發(fā)生一次。如果布爾表達(dá)式(i < 10)的求值結(jié)果為true,就運(yùn)行語(yǔ)句(Console.WriteLine(i);)。隨后,控制變量進(jìn)行更新(i+),布爾表達(dá)式重新求值,如果仍為true,語(yǔ)句再次執(zhí)行,控制變量更新,布爾表達(dá)式重新求值如此反復(fù)。注意三點(diǎn):初始化只發(fā)生一次;初始化后先執(zhí)行循環(huán)主體語(yǔ)句,再更新控制變量;更新控制變量后再重新求值布爾表達(dá)式。
20、提示和while語(yǔ)句一樣,建議總是為for循環(huán)主體使用代碼塊,即使其中只有一個(gè)語(yǔ)句。這樣一來(lái),以后添加代碼就更省心。for語(yǔ)句的三個(gè)部分都可以省略。如果省略布爾表達(dá)式,布爾表達(dá)式就默認(rèn)為true。以下for語(yǔ)句將一直運(yùn)行:for (int i = 0; ;i+) Console.WriteLine("根本停不下來(lái)!"); 省略初始化和更新部分會(huì)得到一個(gè)看起來(lái)很奇怪的for循環(huán),如下所示:int i = 0;for (; i < 10; ) Console.WriteLine(i); i+;注意for語(yǔ)句的初始化、布爾表達(dá)式和更新控制變量這三個(gè)部分必須用分號(hào)分隔,即使某
21、個(gè)部分的實(shí)際內(nèi)容并不存在。如有必要,可在for循環(huán)中提供多個(gè)初始化語(yǔ)句和多個(gè)更新語(yǔ)句(布爾表達(dá)式只能有一個(gè))。為此,請(qǐng)用逗號(hào)分隔不同的初始化和更新語(yǔ)句,如下例所示:for (int i = 0, j = 10; i <= j; i+, j-) .最后用for循環(huán)重寫(xiě)上個(gè)練習(xí)的while循環(huán):for (string line = reader.ReadLine(); line != null; line = reader.ReadLine() source.Text += line + n;理解for語(yǔ)句作用域前面說(shuō)過(guò),可在for語(yǔ)句的“初始化”部分聲明新變量。變量作用域限制于for語(yǔ)句主
22、體。for語(yǔ)句結(jié)束,變量消失。該規(guī)則造成兩個(gè)重要結(jié)果。首先,不能在for語(yǔ)句結(jié)束后使用變量,因?yàn)樗巡辉谧饔糜蛑?。下面是一個(gè)例子:for (int i = 0; i < 10; i+) .Console.WriteLine(i); / 編譯錯(cuò)誤其次,可在兩個(gè)或更多for語(yǔ)句中使用相同變量名,因?yàn)槊總€(gè)變量都在不同作用域中。下面是一個(gè)例子:for (int i = 0; i < 10; i+) .for (int i = 0; i < 20; i += 2) / okay .5.4 編寫(xiě)do語(yǔ)句while和for語(yǔ)句都在循環(huán)開(kāi)始時(shí)測(cè)試布爾表達(dá)式。這意味著假如首次測(cè)試布爾表達(dá)式為f
23、alse,循環(huán)主體一次都不運(yùn)行。do語(yǔ)句則不同,它的布爾表達(dá)式在每次循環(huán)之后求值,所以主體至少執(zhí)行一次。do語(yǔ)句的語(yǔ)法如下(不要忘記最后的分號(hào)):do statementwhile (booleanExpression);多個(gè)語(yǔ)句構(gòu)成的循環(huán)主體必須是放在中的代碼塊。以下語(yǔ)句向控制臺(tái)輸出09,這次使用do語(yǔ)句:int i = 0;do Console.WriteLine(i); i+;while (i < 10); break語(yǔ)句和continue語(yǔ)句第4章用break語(yǔ)句跳出switch語(yǔ)句。還可用它跳出循環(huán)。執(zhí)行break后,系統(tǒng)立即終止循環(huán),并從循環(huán)之后的第一個(gè)語(yǔ)句繼續(xù)執(zhí)行。在這種情
24、況下,循環(huán)的“更新”和“繼續(xù)”條件都不會(huì)重新判斷。相反,continue語(yǔ)句造成當(dāng)前循環(huán)結(jié)束,立即開(kāi)始下一次循環(huán)(在對(duì)布爾表達(dá)式重新求值之后)。下面是在控制臺(tái)上輸出09的例子的另一個(gè)版本,這次使用break語(yǔ)句和continue語(yǔ)句:int i = 0;while (true) Console.WriteLine("continue " + i); i+; if (i < 10) continue; else break;這段代碼看起來(lái)讓人難受。在許多編程守則中,都建議謹(jǐn)慎使用continue語(yǔ)句,或者根本不要用,因?yàn)樗苋菀自斐呻y以理解的代碼。continue語(yǔ)句的
25、行為還讓人捉摸不透。例如,在for語(yǔ)句中執(zhí)行continue語(yǔ)句,會(huì)在運(yùn)行for語(yǔ)句的“更新(控制變量)”部分之后,才開(kāi)始下一次循環(huán)。下例要寫(xiě)do語(yǔ)句將正的十進(jìn)制數(shù)轉(zhuǎn)換成八進(jìn)制的字符串形式。程序基于以下算法:將十進(jìn)制數(shù)存儲(chǔ)到變量dec中do以下事情: dec除以8,將余數(shù)存儲(chǔ)起來(lái) 將dec設(shè)為上一步得到的商while dec不等于0 按相反順序合并每一次得到的余例如,要將十進(jìn)制數(shù)999轉(zhuǎn)換成八進(jìn)制,可執(zhí)行以下步驟。1.999除以8,商124余7。2.124除以8,商15,余4。3.15除以8,商1余7。4.1除以8,商0,余1。5.按相反順序合并每一步得到的余,結(jié)果是1747。這就是999轉(zhuǎn)換
26、成八進(jìn)制的結(jié)果。Ø 寫(xiě)do語(yǔ)句1.在Visual Studio 2013中打開(kāi)DoStatement項(xiàng)目,它位于“文檔”文件夾下的Microsoft PressVisual CSharp Step by StepChapter 5Windows XDoStatement子文件夾中。2.在設(shè)計(jì)視圖中MainWindow.xaml窗體。窗體左側(cè)是number文本框。用戶(hù)在此輸入十進(jìn)制數(shù)。單擊Show Steps按鈕后,會(huì)生成該數(shù)字的八進(jìn)制形式。右側(cè)steps文本框顯示每個(gè)計(jì)算步驟的結(jié)果。3.在“代碼和文本編輯器”窗口中顯示MainWindow.xaml.cs的代碼。找到showSteps
27、Click方法。該方法在單擊Show Steps按鈕后運(yùn)行,目前為空。4.將以下加粗顯示的代碼添加到showStepsClick方法中:private void showStepsClick(object sender, RoutedEventArgs e) int amount = int.Parse(number.Text); steps.Text = "" string current = ""第一個(gè)語(yǔ)句使用int類(lèi)型的Parse方法將number文本框的Text屬性中存儲(chǔ)的字符串值轉(zhuǎn)換成int值。第二個(gè)語(yǔ)句將右側(cè)文本框steps的Text屬性設(shè)為
28、空字符串,清除顯示的文本。第三個(gè)語(yǔ)句聲明string變量current,初始化為空字符串。該字符串存儲(chǔ)每一次do循環(huán)時(shí)生成的八進(jìn)制數(shù)位。5.將以下加粗顯示的do語(yǔ)句添加到showStepsClick方法中:private void showStepsClick(object sender, RoutedEventArgs e) int amount = int.Parse(number.Text); steps.Text = "" string current = "" do int nextDigit = amount % 8; amount /= 8
29、; int digitCode = '0' + nextDigit; char digit = Convert.ToChar(digitCode); current = digit + current; steps.Text += current + "n" while (amount != 0);該算法反復(fù)計(jì)算amount變量除以8所得的余數(shù)。每次得到的余數(shù)都是正在構(gòu)造的新字符串的下一個(gè)數(shù)位。最終,amount變量將減小至0,循環(huán)結(jié)束。注意循環(huán)主體至少執(zhí)行一次。這個(gè)“至少執(zhí)行一次”的行為正是我們所需要的,因?yàn)榧词故菙?shù)字0,也有一個(gè)八進(jìn)制的數(shù)位。進(jìn)一步研究代
30、碼,do循環(huán)的第一個(gè)語(yǔ)句如下:int nextDigit = amount % 8;該語(yǔ)句聲明int變量nextDigit初始化為amount變量除以8之余。該值范圍是07。第二個(gè)語(yǔ)句如下:amount /= 8;這是復(fù)合賦值語(yǔ)句,相當(dāng)于amount = amount / 8;。如果amount的值是999,那么在執(zhí)行這個(gè)語(yǔ)句之后,amount的值就是124。下一個(gè)語(yǔ)句是:int digitCode = '0' + nextDigit;這個(gè)語(yǔ)句要稍微解釋一下!根據(jù)Windows操作系統(tǒng)使用的字符集,每個(gè)字符都有唯一代碼。在Windows操作系統(tǒng)常用的字符集中,字符'0&
31、#39;的代碼是整數(shù)值48。字符'1'的代碼是49,字符'2'的代碼是50,以此類(lèi)推,直到字符'9',它的代碼是57。C#允許將字符當(dāng)作整數(shù)處理,允許對(duì)它們執(zhí)行算術(shù)運(yùn)算。但這樣做會(huì)將字符碼作為值使用。所以,表達(dá)式'0' + nextDigit的結(jié)果是4855之間的值(記住,nextDigit的值在07之間),對(duì)應(yīng)于等價(jià)的八進(jìn)制數(shù)位的代碼。do語(yǔ)句的第四個(gè)語(yǔ)句如下:char digit = Convert.ToChar(digitCode);該語(yǔ)句聲明char變量digit,把它初始化為Convert.ToChar(digitCod
32、e)方法調(diào)用的結(jié)果。Convert.ToChar方法獲取字符碼(一個(gè)整數(shù)),返回與之對(duì)應(yīng)的字符。所以,假如digitCode的值是54,Convert.ToChar(digitCode)返回字符'6'??傊?,do循環(huán)的前4個(gè)語(yǔ)句計(jì)算與用戶(hù)輸入的數(shù)字對(duì)應(yīng)的最低有效八進(jìn)制數(shù)位(最右邊的數(shù)位)。下個(gè)任務(wù)是將這個(gè)數(shù)位添加到要輸出的字符串的前面,如下所示:current = digit + current;do循環(huán)的下一個(gè)語(yǔ)句如下:steps.Text += current + "n"該語(yǔ)句將迄今為止得到的八進(jìn)制數(shù)位添加到steps文本框中,還為每次輸出都附加換行符,
33、使每次輸出在文本框中都單獨(dú)占一行。最后,do循環(huán)末尾用while子句對(duì)循環(huán)條件進(jìn)行求值:while (amount != 0)如果amount的值目前不為0,就開(kāi)始下一次循環(huán)。最后一個(gè)練習(xí)使用Visual Studio 2013調(diào)試器來(lái)單步執(zhí)行上述do語(yǔ)句,幫助理解其工作原理。Ø 單步執(zhí)行do語(yǔ)句1.在打開(kāi)了MainWindow.xaml.cs文件的“代碼和文本編輯器”窗口中,將光標(biāo)移到showStepsClick方法的第一個(gè)語(yǔ)句:int amount = int.Parse(number.Text);2.右擊第一個(gè)語(yǔ)句,從彈出的快捷菜單中選擇“運(yùn)行到光標(biāo)處”命令。3.窗體出現(xiàn)后,在
34、左側(cè)文本框中鍵入999,單擊Show Steps按鈕。程序暫停運(yùn)行,Visual Studio 2013進(jìn)入調(diào)試模式?!按a和文本編輯器”窗口左側(cè)將出現(xiàn)一個(gè)黃色箭頭,標(biāo)記出當(dāng)前要執(zhí)行的語(yǔ)句。4.如果“調(diào)試”工具欄不可見(jiàn),請(qǐng)顯示它(選擇“視圖”|“工具欄”|“調(diào)試”)。5.單擊“調(diào)試”工具欄的下箭頭,指向“添加或移除按鈕”,選擇“窗口”,如下圖所示。這樣會(huì)在“調(diào)試”工具欄上顯示“斷點(diǎn)”按鈕。6.單擊“斷點(diǎn)”按鈕右側(cè)的下箭頭,選擇“局部變量”,如下圖所示。隨后將顯示下圖所示的“局部變量”窗口,其中列出了當(dāng)前方法的局部變量的名稱(chēng)、值和類(lèi)型,其中包括局部變量amount。注意amount變量的值目前是
35、0。7.在“調(diào)試”工具欄上單擊“逐語(yǔ)句”按鈕(或者按功能鍵F11)。調(diào)試器將運(yùn)行當(dāng)前語(yǔ)句:int amount = int.Parse(number.Text);在“局部變量”窗口中,amount的值變成999,黃色箭頭指向下一個(gè)語(yǔ)句。8.再次單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:steps.Text = ""該語(yǔ)句不影響“局部變量”窗口的顯示,因?yàn)閟teps是窗體控件,不是局部變量。黃箭頭指向下一個(gè)語(yǔ)句。9.再次單擊“逐語(yǔ)句”按鈕。調(diào)試器將運(yùn)行以下語(yǔ)句:string current = ""黃箭頭指向do循環(huán)的起始大括號(hào)。do循環(huán)主體有三個(gè)局部變量,
36、即nextDigit,digitCode和digit。注意,這些局部變量在“局部變量”窗口中顯示,而且值均為0。10.單擊“逐語(yǔ)句”按鈕。黃箭頭指向do循環(huán)主體的第一個(gè)語(yǔ)句。11.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:int nextDigit = amount % 8;在“局部變量”窗口中,nextDigit的值變成7,這是999除以8之余。12.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:amount /= 8;在“局部變量”窗口中,amount的值變成124。13.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:int digitCode = '0' + nextDigit;在“局
37、部變量”窗口中,digitCode變量的值變成55。這是'7'的字符碼(48 + 7)。14.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:char digit = Convert.ToChar(digitCode);在“局部變量”窗口中,digit的值變?yōu)?#39;7'?!熬植孔兞俊贝翱谕瑫r(shí)顯示char值的數(shù)值形式(本例是55)和字符形式(本例是'7')。注意,在“局部變量”窗口中,current變量的值仍是""。15.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:current = current + digit;在“局部變量”窗口中,cur
38、rent的值變成"7"。 16. 單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:steps.Text += current + "n"該語(yǔ)句在steps文本框中顯示文本"7",后跟換行符,確保以后的輸出從文本框的下一行開(kāi)始(窗體隱藏在Visual Studio后面,所以看不到)。黃箭頭移至do循環(huán)末尾的結(jié)束大括號(hào)。17.單擊“逐語(yǔ)句”按鈕。黃箭頭指向while語(yǔ)句,準(zhǔn)備求值while條件,判斷是結(jié)束還是繼續(xù)do循環(huán)。18.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:while (amount != 0);amount的值是124,表達(dá)式124
39、!= 0求值結(jié)果是true,所以進(jìn)行下一次循環(huán)。黃箭頭跳回do循環(huán)的起始大括號(hào)。19.單擊“逐語(yǔ)句”按鈕。黃箭頭再次指向do循環(huán)的第一個(gè)語(yǔ)句。20.連續(xù)單擊“逐語(yǔ)句”按鈕,重復(fù)三次do循環(huán),觀察變量值在“局部變量”窗口中的變化。21.第4次循環(huán)結(jié)束時(shí),amount的值變成0,current的值變成"1747"。黃箭頭指向do循環(huán)的while條件:while (amount != 0);amount目前為0,所以表達(dá)式amount != 0求值結(jié)果為false,do循環(huán)應(yīng)該終止。22.單擊“逐語(yǔ)句”按鈕。調(diào)試器運(yùn)行以下語(yǔ)句:while (amount != 0);如同預(yù)期的那
40、樣,do循環(huán)終止,黃箭頭移至showStepsClick方法的結(jié)束大括號(hào)。23.單擊工具欄上的“繼續(xù)”按鈕,或者從“調(diào)試”菜單選擇“繼續(xù)”。窗體隨后將出現(xiàn),顯示為創(chuàng)建999的八進(jìn)制形式所經(jīng)歷的4個(gè)步驟:"7","47","747"和"1747"(參見(jiàn)下圖)。24.返回Visual Studio 2013并停止調(diào)試。小 結(jié)本章講述了如何使用復(fù)合賦值操作符更新數(shù)值變量;講述了如何使用while,for和do語(yǔ)句在布爾條件為true的前提下重復(fù)執(zhí)行代碼。l 如果希望繼續(xù)學(xué)習(xí)下一章,請(qǐng)繼續(xù)運(yùn)行Visual Studio 2
41、013,然后閱讀第6章。l 如果希望現(xiàn)在就退出Visual Studio 2013,請(qǐng)選擇“文件”|“退出”。如果看到“保存”對(duì)話(huà)框,請(qǐng)單擊“是”按鈕保存項(xiàng)目。第5章快速參考目標(biāo)操作在變量(variable)上加一個(gè)值(amount)使用復(fù)合加法操作符。示例如下:variable += amount;從變量(variable)中減一個(gè)值(amount)使用復(fù)合減法操作符。示例如下:variable -= amount;條件為true時(shí)運(yùn)行一個(gè)或多個(gè)語(yǔ)句使用while語(yǔ)句。示例如下:int i = 0;while (i < 10) Console.WriteLine(i); i+;還可使用
42、for語(yǔ)句。示例如下:for (int i = 0; i < 10; i+) Console.WriteLine(i);一次或反復(fù)多次執(zhí)行語(yǔ)句使用do語(yǔ)句。示例如下:int i = 0;do Console.WriteLine(i); i+;while (i < 10);43第6章 管理錯(cuò)誤和異常第6章 管理錯(cuò)誤和異常本章旨在教會(huì)你:l 使用try,catch和finally語(yǔ)句處理異常l 使用checked和unchecked關(guān)鍵字控制整數(shù)溢出l 使用throw關(guān)鍵字從方法中拋出異常l 使用finally塊寫(xiě)總是運(yùn)行的代碼(即使在發(fā)生異常之后)之前學(xué)習(xí)了執(zhí)行常規(guī)任務(wù)所需的核心C#
43、語(yǔ)句,這些常規(guī)任務(wù)包括編寫(xiě)方法,聲明變量,用操作符創(chuàng)建值,用if和switch語(yǔ)句選擇運(yùn)行代碼,以及用while、for和do語(yǔ)句重復(fù)運(yùn)行代碼。但一直沒(méi)有提到程序可能出錯(cuò)的問(wèn)題。事實(shí)上,很難保證代碼總是像希望的那樣工作。有許多原因造成出錯(cuò),其中許多不是程序員能控制的。任何應(yīng)用程序都必須能檢測(cè)錯(cuò)誤,并以得體的方式處理:要么進(jìn)行糾正;如果糾正不了,也要用最清楚的方式報(bào)告出錯(cuò)原因。作為第部分的最后一章,本章要講述C#如何通過(guò)拋出異常來(lái)通知發(fā)生了錯(cuò)誤,如何使用try,catch和finally語(yǔ)句捕捉和處理這些異常所代表的錯(cuò)誤。通過(guò)本章的學(xué)習(xí),將進(jìn)一步掌握C#語(yǔ)言,為順利學(xué)習(xí)第部分的內(nèi)容打下堅(jiān)實(shí)的基礎(chǔ)
44、。6.1 處 理 錯(cuò) 誤生活并非總是一帆風(fēng)順。輪胎可能扎破,電池可能耗盡,螺絲起子并非總在老地方,應(yīng)用程序的用戶(hù)可能采取了出乎預(yù)料的操作。在計(jì)算機(jī)世界里,磁盤(pán)可能出故障,編寫(xiě)不當(dāng)?shù)某绦蚩赡苡绊憴C(jī)器上運(yùn)行的其他應(yīng)用程序(比如由于程序bug造成耗盡所有內(nèi)存),無(wú)線(xiàn)網(wǎng)絡(luò)可能在最不恰當(dāng)?shù)臅r(shí)刻斷開(kāi)連接,甚至一些自然現(xiàn)象(比如附近的一次閃電)也會(huì)造成電源或網(wǎng)絡(luò)故障。錯(cuò)誤可能在程序運(yùn)行的任何階段發(fā)生,其中許多都不是程序本身的問(wèn)題。那么,如何檢測(cè)并嘗試修復(fù)呢?人們多年來(lái)為此研發(fā)了大量機(jī)制。早期系統(tǒng)(如UNIX)采用的典型方案要求在每次方法出錯(cuò)時(shí)都由操作系統(tǒng)設(shè)置一個(gè)特殊全局變量。每次調(diào)用方法后都檢查全局變量,判
45、斷方法是否成功。和大多數(shù)面向?qū)ο缶幊陶Z(yǔ)言一樣,C#沒(méi)有使用這種痛苦的、折磨人的方式處理錯(cuò)誤。相反,它使用的是異常。為了寫(xiě)可靠的C#應(yīng)用程序,必須很好地掌握異常。6.2 嘗試執(zhí)行代碼和捕捉異常錯(cuò)誤任何時(shí)候都可能發(fā)生,使用傳統(tǒng)技術(shù)為每個(gè)語(yǔ)句手動(dòng)添加錯(cuò)誤檢測(cè)代碼,不僅勞神費(fèi)力,還很容易出錯(cuò)。另外,如果每個(gè)語(yǔ)句都需要錯(cuò)誤處理邏輯來(lái)管理每個(gè)階段都可能發(fā)生的每個(gè)錯(cuò)誤,會(huì)很容易迷失方向,失去對(duì)程序主要流程的把握。幸好,在C#中利用異常和異常處理程序 譯注:本書(shū)按照約定俗成的譯法,將exception handler翻譯成“異常處理程序”,但請(qǐng)把它理解成“用于異常處理的構(gòu)造”。同樣的道理也適用于“catch處
46、理程序”,它其實(shí)是指“catch構(gòu)造”。,可以很容易地區(qū)分實(shí)現(xiàn)程序主邏輯的代碼與處理錯(cuò)誤的代碼。為了寫(xiě)支持異常處理的應(yīng)用程序,要做下面兩件事。1.代碼放到try塊中(try是C#關(guān)鍵字)。代碼運(yùn)行時(shí),會(huì)嘗試執(zhí)行try塊內(nèi)的所有語(yǔ)句。如果沒(méi)有任何語(yǔ)句產(chǎn)生異常,這些語(yǔ)句將一個(gè)接一個(gè)運(yùn)行,直到全部完成。但一旦出現(xiàn)異常,就跳出try塊,進(jìn)入一個(gè)catch處理程序中執(zhí)行。2.緊接著try塊寫(xiě)一個(gè)或多個(gè)catch處理程序(catch也是C#關(guān)鍵字)來(lái)處理可能發(fā)生的錯(cuò)誤。每個(gè)catch處理程序都捕捉并處理特定類(lèi)型的異常,可在try塊后面寫(xiě)多個(gè)catch處理程序。try塊中的任何語(yǔ)句造成錯(cuò)誤,“運(yùn)行時(shí)”都會(huì)生
47、成并拋出異常。然后,“運(yùn)行時(shí)”檢查try塊之后的catch處理程序,將控制權(quán)移交給匹配的處理程序。下例在try塊中嘗試將文本框中的內(nèi)容轉(zhuǎn)換成整數(shù)值,調(diào)用方法計(jì)算值,將結(jié)果寫(xiě)入另一個(gè)文本框。為了將字符串轉(zhuǎn)換成整數(shù),要求字符串包含一組有效的數(shù)位,而不能是一組隨意的字符。如果字符串包含無(wú)效字符,int.Parse方法拋出FormatException異常,并將控制權(quán)移交給對(duì)應(yīng)的catch處理程序。catch處理程序結(jié)束后,程序從整個(gè)try/catch塊之后的第一個(gè)語(yǔ)句繼續(xù)。注意,如果沒(méi)有和異常對(duì)應(yīng)的處理程序,就說(shuō)異常未處理(稍后會(huì)討論這種情況)。try int leftHandSide = int.
48、Parse(lhsOperand.Text); int rightHandSide = int.Parse(rhsOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString();catch (FormatException fEx) / 處理異常.catch處理程序采用與方法參數(shù)相似的語(yǔ)法指定要捕捉的異常。在前例中,一旦拋出FormatException異常,fEx變量就會(huì)被填充一個(gè)對(duì)象,其中包含了異常細(xì)節(jié)。FormatException類(lèi)型提供大量屬
49、性供檢查造成異常的確切原因。其中不少屬性是所有異常通用的。例如,Message屬性包含錯(cuò)誤的文本描述。處理異常時(shí)可利用這些信息,例如可以把細(xì)節(jié)記錄到日志文件,或者向用戶(hù)顯示有意義的消息,并要求重新輸入。6.2.1 未處理的異常如果try塊拋出異常,但沒(méi)有對(duì)應(yīng)的catch處理程序,那么會(huì)發(fā)生什么?在前例中,lhsOperand文本框可能確實(shí)包含一個(gè)整數(shù),但該整數(shù)超出了C#允許的整數(shù)范圍(例如"2147483648")。在這種情況下,int.Parse語(yǔ)句會(huì)拋出OverflowException異常,而catch處理程序目前只能捕捉FormatException異常。如果try
50、塊是某個(gè)方法的一部分,那個(gè)方法將立即退出,并返回它的調(diào)用方法。如果它的調(diào)用方法有try塊,“運(yùn)行時(shí)”會(huì)嘗試定位try塊之后的一個(gè)匹配catch處理程序并執(zhí)行。如果調(diào)用方法沒(méi)有try塊,或者沒(méi)有找到匹配的catch處理程序,調(diào)用方法退出,返回它的更上一級(jí)的調(diào)用方法以此類(lèi)推。如果最后找到了匹配的catch處理程序,就運(yùn)行它,然后從捕捉(到異常的)方法的catch處理程序之后的第一個(gè)語(yǔ)句繼續(xù)執(zhí)行。重要提示 捕捉了異常之后,將從“捕捉方法”中的catch處理程序之后的第一個(gè)語(yǔ)句繼續(xù),這個(gè)catch處理程序是實(shí)際捕捉到異常的catch塊。控制不會(huì)回到造成異常的方法。由內(nèi)向外遍歷了所有調(diào)用方法之后,如果還
51、是找不到匹配的catch處理程序,整個(gè)程序終止,報(bào)告發(fā)生了未處理的異常??梢院苋菀椎貦z查應(yīng)用程序生成的異常。以“調(diào)試”模式運(yùn)行應(yīng)用程序(選擇“調(diào)試”|“啟動(dòng)調(diào)試”)并發(fā)生異常,會(huì)出現(xiàn)如下圖所示的對(duì)話(huà)框。應(yīng)用程序暫停,便于判斷造成異常的原因。應(yīng)用程序在拋出異常并導(dǎo)致調(diào)試器介入的語(yǔ)句停止。此時(shí)可檢查變量值,可更改變量的值,還可使用“調(diào)試”工具欄和各種調(diào)試窗口,從拋出異常的位置單步調(diào)試代碼。6.2.2 使用多個(gè)catch處理程序通過(guò)前面的討論,我們知道不同的錯(cuò)誤可能拋出不同類(lèi)型的異常。為了解決這個(gè)問(wèn)題,可以提供多個(gè)catch處理程序。所有catch處理程序依次列出,就像下面這樣:try int le
52、ftHandSide = int.Parse(lhsOperand.Text); int rightHandSide = int.Parse(rhsOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString();catch (FormatException fEx) /.catch (OverflowException oEx) /.如果try塊中的代碼拋出FormatException異常,和FormatException 對(duì)應(yīng)的catch塊開(kāi)始運(yùn)行
53、。如果拋出OverflowException異常,和OverflowException對(duì)應(yīng)的catch塊開(kāi)始運(yùn)行。注意如果FormatException catch塊的代碼拋出OverflowException異常,不會(huì)造成相鄰的那個(gè)OverflowException catch塊的運(yùn)行。相反,異常會(huì)傳給調(diào)用當(dāng)前代碼的方法。換言之,該異常會(huì)“傳播”至調(diào)用棧的上一級(jí)。本節(jié)前面有相關(guān)的描述。6.2.3 捕捉多個(gè)異常C#和Microsoft .NET Framework的異常捕捉機(jī)制相當(dāng)完善。.NET Framework定義了許多異常類(lèi)型,包括程序可能拋出的大多數(shù)異常!一般不可能為每個(gè)可能的異常都寫(xiě)
54、對(duì)應(yīng)的catch處理程序某些異??赡茉诔绦驎r(shí)都沒(méi)有想到。那么,如何保證所有可能的異常都被捕捉并處理呢?這個(gè)問(wèn)題的關(guān)鍵在于各個(gè)異常之間的關(guān)系。異常用繼承層次結(jié)構(gòu)進(jìn)行組織。這個(gè)繼承層次結(jié)構(gòu)由多個(gè)“家族”構(gòu)成(第12章將詳細(xì)討論繼承)。FormatException和OverflowException異常都屬于SystemException家族。該家族還包含其他許多異常。SystemException本身又是Exception家族的成員,而Exception是所有異常的“老祖宗”。捕捉Exception相當(dāng)于捕捉可能發(fā)生的所有異常。注意Exception包含眾多異常,其中許多異常是專(zhuān)門(mén)供.NET F
55、ramework的各種組件使用的。雖然一些異常較難理解,但至少應(yīng)該知道如何捕捉它們。下面的代碼將展示如何捕捉所有可能的異常:try int leftHandSide = int.Parse(lhsOperand.Text); int rightHandSide = int.Parse(rhsOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString();catch (Exception ex) / 這是常規(guī)catch處理程序,能捕捉所有異常 /.提示如果真的決定捕捉Exception,可以從catch處理程序中省略它的名稱(chēng),因?yàn)槟J(rèn)捕捉的就是Exception: catch / 但并不總是推薦這樣做。傳入catch處理程序的異常對(duì)象可能包含異常的重要信息。使用這個(gè)沒(méi)有參數(shù)的catch構(gòu)造進(jìn)行訪(fǎng)問(wèn),可能無(wú)法利用這些信息。最后還有一個(gè)問(wèn)題:異常與try塊之后的多個(gè)catch處理程序匹配會(huì)發(fā)生什么?假如一個(gè)處理程序捕捉FormatException,另一個(gè)捕捉Exception,最終運(yùn)行哪一個(gè)(還是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 超全結(jié)婚準(zhǔn)備清單及結(jié)婚流程
- 2025年小學(xué)教師實(shí)習(xí)報(bào)告范文-1
- 2025年風(fēng)電變流器柜體系統(tǒng)合作協(xié)議書(shū)
- 2025年輕質(zhì)建筑材料及制品項(xiàng)目發(fā)展計(jì)劃
- 貴州省仁懷市2025屆物理高二第二學(xué)期期末學(xué)業(yè)水平測(cè)試試題含解析
- 新形勢(shì)下如何進(jìn)行高效的專(zhuān)業(yè)性汽車(chē)工程師教育
- 心理學(xué)在藝術(shù)教育中的創(chuàng)新應(yīng)用
- 教育技術(shù)為特殊兒童創(chuàng)造更好的學(xué)習(xí)環(huán)境
- 四川省綿陽(yáng)市東辰高中2025年高一物理第二學(xué)期期末復(fù)習(xí)檢測(cè)模擬試題含解析
- 商業(yè)場(chǎng)景下教育培訓(xùn)品牌的營(yíng)銷(xiāo)全案
- 2025年電工證考試試題及答案
- 軍人心理健康教育教案
- 新成立傳媒公司策劃方案
- 2025年吉林省中考數(shù)學(xué)試卷真題及答案詳解(精校打印版)
- 病區(qū)醫(yī)院感染管理質(zhì)量評(píng)價(jià)標(biāo)準(zhǔn)(2024年)
- 2025至2030全球及中國(guó)廚房顯示系統(tǒng)(KDS)行業(yè)項(xiàng)目調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 2025年北京市高考語(yǔ)文試卷(含答案)
- 2025年高考湖北卷物理真題(解析版)
- 專(zhuān)題:任務(wù)型閱讀30篇 中考英語(yǔ)高分提升之最 新題速遞第三輯(答案+解析)
- 中國(guó)隱身材料行業(yè)發(fā)展分析及發(fā)展前景與投資研究報(bào)告2025-2028版
- 西子otis梯oh con6423中文調(diào)試手冊(cè)
評(píng)論
0/150
提交評(píng)論