C语言与数据结构课件_第1页
C语言与数据结构课件_第2页
C语言与数据结构课件_第3页
C语言与数据结构课件_第4页
C语言与数据结构课件_第5页
已阅读5页,还剩480页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章C語言概述本章首先介紹結構化的程式設計的基本方法;其次介紹數據結構與演算法在程式設計中的地位和重要性;最後介紹C語言的特點、基本結構及調試方法。1.1結構化的程式設計的基本方法1.2數據結構與演算法1.3

C語言概述1.4

TurboCV2.0的基本操作返回目錄開始下一章1.1結構化的程式設計的基本方法結構化程式設計的步驟:首先要從具體問題中抽象出一個適當的數學模型,然後設計一個解此數學模型的演算法(Algorithm),最後編出程式、進行測試、調整直至得到最終解答。尋求數學模型的實質是分析問題,從中提取操作的對象,並找出這些操作對象之間含有的關係,然後用數學的語言加以描述。1.2數據結構與演算法眾所周知,二十世紀四十年代,電子數字電腦問世的直接原因是解決彈道學的計算問題。早期,電子電腦的應用範圍,幾乎只局限於科學和工程的計算,其處理的對象是純數值性的資訊,通常,人們把這類問題稱為數值計算。近三十年來,電子電腦的發展異常迅猛,這不僅表現在電腦本身運算速度不斷提高、資訊存儲量日益擴大、價格逐步下降,更重要的是電腦廣泛地應用於情報檢索、企業管理、系統工程等方面,已遠遠超出了科技計算的範圍,而滲透到人類社會活動的一切領域。與此相應,電腦的處理對象也從簡單的純數值性資訊發展到非數值性的和具有一定結構的資訊。

一、基本概念和術語1.數據

數據是人們利用文字符號、數字符號以及其他規定的符號對現實世界的事物及其活動所做的描述。在電腦科學中,數據的含義非常廣泛,我們把一切能夠輸入到電腦中並被電腦程式處理的資訊,包括文字、表格、圖象等,都稱為數據。例如,一個個人書庫管理程式所要處理的數據可能是一張如表1-1所示的表格。表1-1個人書庫2.結點結點也叫數據元素,它是組成數據的基本單位。在程式中通常把結點作為一個整體進行考慮和處理。例如,在表1-1所示的個人書庫中,為了便於處理,把其中的每一行(代表一本書)作為一個基本單位來考慮,故該數據由10個結點構成。一般情況下,一個結點中含有若干個字段(也叫資料項目)。例如,在表1-1所示的表格數據中,每個結點都有登錄號、書號、書名、作者、出版社和價格等六個字段構成。字段是構成數據的最小單位。3.邏輯結構結點和結點之間的邏輯關係稱為數據的邏輯結構。在表1-1所示的表格數據中,各結點之間在邏輯上有一種線性關係,它指出了10個結點在表中的排列順序。根據這種線性關係,可以看出表中第一本書是什麼書,第二本書是什麼書,等等。4.存儲結構數據在電腦中的存儲表示稱為數據的存儲結構。在表1-1所示的表格數據在電腦中可以有多種存儲表示,例如,可以表示成數組,存放在記憶體中;也可以表示成文件,存放在磁片上,等等。5.數據結構(DataStructure)數據結構是研究數據元素(DataElement)之間抽象化的相互關係和這種關係在電腦中的存儲表示(即所謂數據的邏輯結構和物理結構),並對這種結構定義相適應的運算,設計出相應的演算法,而且確保經過這些運算後所得到的新結構仍然是原來的結構類型。為了敘述上的方便和避免產生混淆,通常我們把數據的邏輯結構統稱為數據結構,把數據的物理結構統稱為存儲結構(StorageStructure)。6.數據類型數據類型是指程式設計語言中各變數可取的數據種類。數據類型是高級程式設計語言中的一個基本概念,它和數據結構的概念密切相關。一方面,在程式設計語言中,每一個數據都屬於某種數據類型。類型明顯或隱含地規定了數據的取值範圍、存儲方式以及允許進行的運算。可以認為,數據類型是在程式設計中已經實現了的數據結構。另一方面,在程式設計過程中,當需要引入某種新的數據結構時,總是借助編程語言所提供的數據類型來描述數據的存儲結構。

二、演算法1、演算法的概念簡單地說就是解決特定問題的方法(關於演算法的嚴格定義,在此不作討論)。特定的問題可以是數值的,也可以是非數值的。解決數值問題的演算法叫做數值演算法,科學和工程計算方面的演算法都屬於數值演算法,如求解數值積分,求解線性方程組、求解代數方程、求解微分方程等。解決非數值問題的演算法叫做非數值演算法,數據處理方面的演算法都屬於非數值演算法。例如各種排序演算法、查找演算法、插入演算法、刪除演算法、遍曆演算法等。數值演算法和非數值演算法並沒有嚴格的區別。一般說來,在數值演算法中主要進行算術運算,而在非數值演算法中主要進行比較和邏輯運算。另一方面,特定的問題可能是遞歸的,也可能是非遞歸的,因而解決它們的演算法就有遞歸演算法和非遞歸演算法之分。從理論上講,任何遞歸演算法都可以通過迴圈,堆疊等技術轉化為非遞歸演算法。

2、

演算法的特點演算法是執行特定計算的有窮過程。這個過程有5個特點:

1.動態有窮:當執行一個演算法時,不論是何種情況,在經過了有限步驟後,這個演算法一定要終止。

2.確定性:演算法中的每條指令都必須是清楚的,指令無二義性。

3.輸入:具有0個或0個以上由外界提供的量。

4.輸出:產生1個或多個結果。

5.可行性:每條指令都充分基本,原則上可由人僅用筆和紙在有限的時間內也能完成。注意:演算法和程式是有區別的,即程式未必能滿足動態有窮。在本書中,我們只討論滿足動態有窮的程式,因此“演算法”和“程式”是通用的。

3、

演算法的描述方法

一個演算法可以用自然語言、數字語言或流程圖等來描述,也可以用電腦高級程式語言來描述,如Pascal語言、C語言或偽代碼等。

1.3C語言概述1.C語言的誕生與發展(1)在C語言誕生以前,系統軟體主要是用組合語言編寫的。由於組合語言程式依賴於電腦硬體,其可讀性和可移植性都很差;但一般的高級語言又難以實現對電腦硬體的直接操作(這正是組合語言的優勢),於是人們盼望有一種兼有組合語言和高級語言特性的新語言。(2)C語言是貝爾實驗室於70年代初研製出來的,後來又被多次改進,並出現了多種版本。80年代初,美國國家標準化協會(ANSI),根據C語言問世以來各種版本對C語言的發展和擴充,制定了ANSIC標準(1989年再次做了修訂)。(3)目前,在微機上廣泛使用的C語言編譯系統有MicrosoftC、TurboC、BorlandC等。雖然它們的基本部分都是相同的,但還是有一些差異,所以請大家注意自己所使用的C編譯系統的特點和規定(參閱相應的手冊)。本書選定的上機環境是TCV2.0(DOS操作系統)。

2.C語言的特點

C語言同時具有組合語言和高級語言的優勢。(1)語言簡潔、緊湊,使用方便、靈活。

(2)運算符極其豐富。(3)生成的目標代碼品質高,程式執行效率高。(4)可移植性好(較之組合語言)。(5)可以直接操縱硬體。

3.在C語言中,除實現順序、選擇和迴圈等三種基本結構的9條控制語句外,輸入輸出操作均由標準庫函數(不是C語言的組成部分)來實現。所以學習C語言,不僅要學習這9條控制語句和各種運算符,而且要學習並掌握常用標準庫函數的使用。4、C語言程式的結構與書寫規則(1)C語言程式的總體結構

一個完整的C語言程式,是由一個main()函數(又稱主函數)和若干個其他函數結合而成的,或僅由一個main()函數構成。[案例1.1]僅由main()函數構成的C語言程式。/*案例代碼檔案名:AL1_1.C*//*功能:僅由main()函數構成的C語言程式示例*/main(){printf(“ThisisaCprogram.\n”);}程式運行結果:

ThisisaCprogram.

[案例1.2]由main()函數和1個其他函數max()構成的C語言程式。/*案例代碼檔案名:AL1_2.C*//*功能:由main()函數和1個其他函數max()構成的C語言程式示例*/intmax(intx,inty){return(x>y?x:y);}main(){intnum1,num2;printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}程式運行情況:

Inputthefirstintegernumber:6←┘Inputthesecondintegernumber:9←┘max=9[案例1.3]改寫[案例1.2],交換main()函數和max()函數的前後位置。根源程式略。程式運行情況:

Inputthefirstintegernumber:6←┘Inputthesecondintegernumber:9←┘max=91.函數是C語言程式的基本單位。main()函數的作用,相當於其他高級語言中的主程序;其他函數的作用,相當於副程式。2.C語言程式總是從main()函數開始執行。一個C語言程式,總是從main()函數開始執行,而不論其在程式中的位置。當主函數執行完畢時,亦即程式執行完畢。習慣上,將主函數main()放在最前頭。4、根源程式書寫格式(1)所有語句都必須以分號“;”結束,函數的最後一個語句也不例外。(2)程式行的書寫格式自由,既允許1行內寫幾條語句,也允許1條語句分寫在幾行上。例如,[案例1.2]的主函數main(),也可改寫成如下所示的格式:……main(){intnum1,num2;printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}如果某條語句很長,一般需要將其分寫在幾行上。(3)允許使用注釋。C語言的注釋格式為:/*……*/說明:I、“/*”和“*/”必須成對使用,且“/”和“*”、以及“*”和“/”之間不能有空格,否則都出錯。技巧:為避免遺漏必須配對使用的符號,例如注釋符號、函數體的起止識別字(花括弧)、圓括號等等,在輸入時,可連續輸入這些起止識別字,然後再在其中進行插入來完成內容的編輯。在起止識別字嵌套時,以及相距較遠時,這樣做更有必要。

II、注釋的位置,可以單占1行,也可以跟在語句的後面。

III、如果1行寫不下,可另起1行繼續寫。

IV、注釋中允許使用漢字。在非中文操作系統下,看到的是一串亂碼,但不影響程式運行。

1.4TurboCV2.0的基本操作1.運行一個C語言程式的一般過程2.TC的啟動、退出與命令菜單3.編輯並保存一個C語言根源程式4.編譯、連接──單個根源程式檔5.運行與查看結果6.編輯下一個新的根源程式

1.運行一個C語言程式的一般過程

TurboC是一個集根源程式編輯、編譯、連接、運行與調試於一體、用菜單驅動的集成軟體環境。運行一個C語言程式的一般過程:(1)啟動TC,進入TC集成環境。(2)編輯(或修改)根源程式。(3)編譯。如果編譯成功,則可進行下一步操作;否則,返回(2)修改根源程式,再重新編譯,直至編譯成功。(4)連接。如果連接成功,則可進行下一步操作;否則,根據系統的錯誤提示,進行相應修改,再重新連接,直至連接成功。(5)運行。通過觀察程式運行結果,驗證程式的正確性。如果出現邏輯錯誤,則必須返回(2)修改根源程式,再重新編譯、連接和運行,直至程式正確。(6)退出TC集成環境,結束本次程式運行。

2.TC的啟動、退出與命令菜單

(1)啟動TurboC:tc←┘[畫面演示]啟動TurboC後,其主菜單條橫向排列在螢幕頂端,並被啟動,其中File主項成為當前項。主菜單的下麵,是Edit(編輯)窗口和Message(消息)窗口。兩個窗口中,頂端橫線為雙線顯示的,表示該窗口是活動窗口。編輯窗口的頂端為狀態行,其中:.Line1Col1:顯示游標所在的行號和列號,即游標位置。.Insert:表示編輯狀態處於“插入”。當處於“改寫”狀態時,此處為空白。.d:NONAME.C:顯示當前正在編輯的檔案名。顯示為“NONAME.C”時,表示用戶尚未給檔命名。螢幕底端是7個功能鍵的說明,以及NumLock鍵的狀態(顯示“NUM”時,表示處於“數字鍵”狀態;空白,表示“控制鍵”狀態)。

(2)命令菜單的使用

1)按下功能鍵F10,啟動主菜單。如果主菜單已經被啟動,則直接轉下一步。

2)用左、右方向鍵移動光帶,定位於需要的主項上,然後再按回車鍵,打開其子菜單(縱向排列)。

3)用上、下方向鍵移動光帶,定位於需要的子項上,回車即可。執行完選定的功能後,系統自動關閉菜單。注意:菜單啟動後,又不使用,可再按F10/Esc鍵關閉,返回原來狀態。

(3)退出TurboC

退出TC有兩種方法:

1)菜單法:File|Quit(先選擇File主項,再選擇並執行Quit子項)

2)快捷鍵法:Alt+“X”(先按下Alt鍵並保持,再按字母鍵X,然後同時放開)

3.編輯並保存一個C語言根源程式

(1)啟動主菜單,選擇並執行File|Load項(快捷鍵鍵:F3)。(2)在“LoadFileName”窗口,輸入根源程式檔案名。檔案名的輸入有兩種方法:直接輸入和選擇輸入。1)直接輸入按照檔案名的組成字串,逐個字元輸入即可。如果是已經存在的檔,系統就在編輯窗口顯示該檔的內容,可供編輯、修改。如果是新檔,則給出一個空白編輯窗口,可供輸入新的根源程式。如果該檔不在當前目錄下,則需要冠以路徑名和(或)盤符。2)選擇檔(僅適用於已經存在的根源程式檔)①空回車,打開當前目錄下、尾碼為.C的所有檔的檔案名窗口。②用上、下、左、右方向鍵,將光帶定位於所需的檔案名上。③按回車鍵。

(3)常用編輯操作在編輯根源程式過程中,隨時都可以按F2鍵(或File|Save),將當前編輯的檔存盤,然後繼續編輯。這是一個良好的習慣!關於線上幫助:在任何窗口(或狀態)下,按F1鍵啟動活動窗口(或狀態)的線上幫助:.下一頁──PageDown,返回上一頁──PageUp.關閉線上幫助、返回原窗口(或狀態)──Esc.返回前一個線上幫助屏──Alt+F1(無論線上幫助是否被啟動).返回線上幫助索引──F1:啟動線上幫助後,再按F1,則返回線上幫助索引,以便查詢其他類別線上幫助資訊。.查詢庫函數的線上幫助資訊──^F1:將游標移到需要查詢函數名的首字元上,然後鍵入^F1,即可獲得該庫函數的線上幫助資訊。注:為簡化描述,用“^”代表“Ctrl”鍵。^Fn就是Ctrl+Fn,下同。

4.編譯、連接──單個根源程式檔

選擇並執行Compile|MakeEXEFile項(快捷鍵:F9),則TC將自動完成對當前正在編輯的根源程式檔的編譯、連接,並生成可執行檔。如果根源程式有語法錯誤,系統將在螢幕中央的“Compiling”(編譯)窗口底端提示“Error:Pressanykey”(錯誤:按任意鍵)。此時,按空格鍵,螢幕下端的“Message”(消息)窗口被啟動,顯示出錯(或警告)資訊,光帶停在第一條消息上。這時“Edit”(編輯)窗口中也有一條光帶,它總是停在編譯錯誤在源代碼中的相應位置。注意:當用上、下鍵移動消息窗口中的光帶時,編輯窗口中的光帶也隨之移動,始終跟蹤源代碼中的錯誤位置!

5.運行與查看結果

(1)運行當前正在編輯的根源程式檔選擇並執行Run|Run項(快捷鍵:^F9),程式運行結束後,仍返回到編輯窗口。當你認為自己的根源程式不會有編譯、連接錯誤時,也可直接運行(即跳過對根源程式的編譯、連接步驟)。這時,TC將一次完成從編譯、連接到運行的全過程。(2)查看運行結果選擇並執行Run|UserScreen項(快捷鍵:Alt+F5)。查看完畢後,按任一鍵返回編輯窗口。如果發現邏輯錯誤,則可在返回編輯窗口後,進行修改;然後再重新編譯、連接、運行,直至正確為止。2.1程式設計概述一個程式應包括對數據的描述和對數據處理的描述。

1.對數據的描述,即數據結構。數據結構是電腦學科的核心課程之一。C語言中,系統提供的數據結構,是以數據類型的形式出現的。

2.對數據處理的描述,即電腦演算法。演算法是為解決一個問題而採取的方法和步驟,是程式的靈魂。為此,著名電腦科學家沃思(NikiklausWirth)提出一個公式:

數據結構+演算法=程式

實際上,一個程式除了數據結構和演算法外,還必須使用一種電腦語言,並採用結構化方法來表示。

2.2C語言的數據類型C語言提供的數據結構,是以數據類型形式出現的。具體分類如下:1.基本類型分為整型、實型(又稱浮點型)、字元型和枚舉型四種。2.構造類型分為數組類型、結構類型和共用類型三種。3.指針類型。在第9章仲介紹。4.空類型C語言中的數據,有常量和變數之分,它們分別屬於上述這些類型。本章將介紹基本類型中的整型、實型和字元型三種數據。

2.3常量和變數2.3.1常量

1.常量的概念

在程式運行過程中,其值不能被改變的量稱為常量。

2.常量的分類

(1)整型常量(2)實型常量(3)字元常量。(4)符號常量。常量的類型,可通過書寫形式來判別。2.3.2變數1.變數的概念在程式運行過程中,其值可以被改變的量稱為變數。2.變數的兩個要素(1)變數名。每個變數都必須有一個名字──變數名,變數命名遵循識別字命名規則。(2)變數值。在程式運行過程中,變數值存儲在內存中。在程式中,通過變數名來引用變數的值。3.識別字命名規則(1)有效字元:只能由字母、數字和下劃線組成,且以字母或下劃線開頭。(2)有效長度:隨系統而異,但至少前8個字元有效。如果超長,則超長部分被捨棄。例如,由於student_name和student_number的前8個字元相同,有的系統認為這兩個變數,是一回事而不加區別。在TCV2.0中,變數名(識別字)的有效長度為1~32個字元,缺省值為32。(3)C語言的關鍵字不能用作變數名。注意:C語言對英文字母的大小敏感,即同一字母的大小寫,被認為是兩個不同的字元。習慣上,變數名和函數名中的英文字母用小寫,以增加可讀性。思考題:在C語言中,變數名total與變數名TOTAL、ToTaL、tOtAl等是同一個變數嗎?識別字命名的良好習慣──見名知意:所謂“見名知意”是指,通過變數名就知道變數值的含義。通常應選擇能表示數據含義的英文單詞(或縮寫)作變數名,或中文拼音字頭作變數名。例如,name/xm(姓名)、sex/xb(性別)、age/nl(年齡)、salary/gz(工資)。4.變數的定義與初始化在C語言中,要求對所有用到的變數,必須先定義、後使用;且稱在定義變數的同時進行賦初值的操作為變數初始化。(1)變數定義的一般格式

[存儲類型]數據類型變數名[,變數名2……];例如,floatradius,length,area;

(2)變數初始化的一般格式[存儲類型]數據類型變數名[=初值][,變數名2[=初值2]……];例如,floatradius=2.5,length,area;

2.4整型數據2.4.1整型變數

1.分類

根據佔用記憶體位元組數的不同,整型變數又分為4類:(1)基本整型(類型關鍵字為int)。(2)短整型(類型關鍵字為short[int])。(3)長整型(類型關鍵字為long[int])。(4)無符號整型。無符號型又分為無符號基本整型(unsigned[int])、無符號短整型(unsignedshort)和無符號長整型(unsignedlong)三種,只能用來存儲無符號整數。2.佔用記憶體位元組數與值域

上述各類型整型變數佔用的記憶體位元組數,隨系統而異。在16位操作系統中,一般用2位元組表示一個int型變數,且long型(4位元組)≥int型(2位元組)≥short型(2位元組)。

顯然,不同類型的整型變數,其值域不同。佔用記憶體位元組數為n的(有符號)整型變數,其值域為:-2n*8-1~(2n*8-1-1);無符號整型變數的值域為:0~(2n*8-1)。

例如,PC機中的一個int型變數,其值域為-22*8-1~(22*8-1-1),即-32768~32767;一個unsigned型變數的值域為:0~(22*8-1),即0~65535。

2.4.2整型常量1.三種表示形式整型常量即整常數,在C語言中可用三種形式表示:(1)十進位。例如10、36。(2)八進制(以數字0開頭)。例如012。(3)十六進制(以數字0+小寫字母x開頭)。例如0x36。2.分類(1)基本整型。在16位機中,用2位元組存儲,其數據範圍與int型變數一樣。(2)長整型(在數值後面加“L(l)”)。對超出基本整型值域的整型常量,可使用長整型常量表示,其取值範圍可達-231-(231-1)。例如,123l、315L等。3.類型匹配規則類型匹配規則為:一個整型常量,可以賦給能容納下其值的整型變數。例如,其值在-215--(215-1)的整型常量,可以賦給int型變數和longint型變數;其值在-231--(231-1)的整型常量,就只能賦給longint型變數。注意:常量無unsigned型。但一個非負整型常量,只要它的值不超過相應變數的值域(即取值範圍),也可以賦給unsigned型變數。

2.5實型數據2.5.1實型變數

C語言的實型變數,分為兩種:

(1)單精確度型。類型關鍵字為float,一般占4位元組(32位)、提供7位有效數字。

(2)雙精度型。類型關鍵字為double,一般占8個位元組、提供15~16位有效數字。

2.5.2實型常量

1.表示形式

實型常量即實數,在C語言中又稱浮點數,其值有兩種表達形式:

(1)十進位形式。例如3.14、9.8。(2)指數形式:<尾數>E(e)<整型指數>。例如3.0E+5等。

2.關於類型

實型常量不分float型和double型。一個實型常量,可以賦給一個實型變數(float型或double型)。

2.6字元型數據2.6.1字元常量1.字元常量的定義用一對單引號括起來的單個字元,稱為字元常量。例如,‘A’、‘1’、‘+’等。2.轉義字元C語言還允許使用一種特殊形式的字元常量,就是以反斜杠“\”開頭的轉義字元。

注意:如果反斜杠或單引號本身作為字元常量,必須使用轉義字元:‘\\’、‘\’‘。[案例2.1]用轉義字元輸出可列印字元和不可列印字元。

/*案例代碼檔案名:AL2_1.C*/

/*程式功能:用轉義字元輸出可列印字元和不可列印字元*/

main()

{printf(“\x4F\x4B\x21\n”); /*等價於printf(“OK!\n”);*/

printf(“\x15\xAB\n”);

}程式運行結果如下:

OK!

§½

2.6.2字元變數字元變數的類型關鍵字為char,一般佔用1位元組記憶體單元。1.變數值的存儲

字元變數用來存儲字元常量。將一個字元常量存儲到一個字元變數中,實際上是將該字元的ASCII碼值(無符號整數)存儲到記憶體單元中。例如,charch1,ch2; /*定義兩個字元變數:ch1,ch2*/ch1=’a’;ch2=’b’;/*給字元變數賦值*/2.特性字元數據在內存中存儲的是字元的ASCII碼──一個無符號整數,其形式與整數的存儲形式一樣(如圖2-4所示),所以C語言允許字元型數據與整型數據之間通用。(1)一個字元型數據,既可以字元形式輸出,也可以整數形式輸出。

[案例2.2]字元變數的字元形式輸出和整數形式輸出。

/*案例代碼檔案名:AL2_2.C*/

/*程式功能:用字符形式和整數形式輸出字元變數*/

main()

{charch1,ch2;

ch1='a';ch2='b';printf(“ch1=%c,ch2=%c\n”,ch1,ch2);

printf(“ch1=%d,ch2=%d\n”,ch1,ch2);

}

程式運行結果:

ch1=a,ch2=b

ch1=97,ch2=98

(2)允許對字元數據進行算術運算,此時就是對它們的ASCII碼值進行算術運算。

[案例2.3]字元數據的算術運算。

/*案例代碼檔案名:AL2_3.C*/

/*程式功能:字元數據的算術運算*/

main()

{charch1,ch2;

ch1=‘a’;ch2=‘B’;

/*字母的大小寫轉換*/

printf(“ch1=%c,ch2=%c\n”,ch1-32,ch2+32);

/*用字符形式輸出一個大於256的數值*/

printf("ch1+200=%d\n",ch1+200);

printf("ch1+200=%c\n",ch1+200);

printf("ch1+256=%d\n",ch1+256);

printf("ch1+256=%c\n",ch1+256);

}程式運行結果:ch1=A,ch2=bch1+200=297ch1+200=)ch1+256=353ch1+256=a

思考題:用字符形式輸出一個大於256的數值,會得到什麼結果?2.6.3字串常量1.字串常量的概念和字串長度字串常量是用一對雙引號括起來的若干字元序列。字串中字元的個數稱為字串長度。長度為0的字串(即一個字元都沒有的字串)稱為空串,表示為“”(一對緊連的雙引號)。例如,“Howdoyoudo.”、“Goodmorning.”等,都是字串常量,其長度分別為14和13(空格也是一個字元)。

如果反斜杠和雙引號作為字串中的有效字元,則必須使用轉義字元。例如:(1)C:\msdos\v6.22→"C:\\msdos\\v6.22"

(2)Isay:"Goodbye!"→"Isay:\"Goodbye!\"“2.字串的存儲C語言規定:在存儲字串常量時,由系統在字串的末尾自動加一個‘\0’作為字串的結束標誌。注意:在根源程式中書寫字串常量時,不必加結束字元‘\0’,否則畫蛇添足。

如果有一個字串為“CHINA”,則它在內存中的實際存儲如下所示:最後一個字元'\0'是系統自動加上的,它佔用6位元組而非5位元組記憶體空間。CHINA\0綜上所述,字元常量'A'與字串常量"A"是兩回事:(1)定界符不同:字元常量使用單引號,而字串常量使用雙引號;(2)長度不同:字元常量的長度固定為1,而字串常量的長度,可以是0,也可以是某個整數;(3)存儲要求不同:字元常量存儲的是字元的ASCII碼值,而字串常量,除了要存儲有效的字元外,還要存儲一個結束標誌’\0’。

2.7算術運算與算術運算式在C語言中,除控制語句和輸入輸出函數外,其他所有基本操作都作為運算符處理。

1.五種基本算術運算符

+、-(減法/取負)、*、/、%(求餘數)(1)關於除法運算/C語言規定:兩個整數相除,其商為整數,小數部分被捨棄。例如,5/2=2。

(2)關於求餘數運算%要求兩側的運算元均為整型數據,否則出錯。

2.運算式和算術運算式(1)運算式的概念用運算符和括弧將運算對象(常量、變數和函數等)連接起來的、符合C語言語法規則的式子,稱為運算式。

單個常量、變數或函數,可以看作是運算式的一種特例。將單個常量、變數或函數構成的運算式稱為簡單運算式,其他運算式稱之為複雜運算式。(2)算術運算式的概念運算式中的運算符都是算術運算符。例如,3+6*9、(x+y)/2-1等,都是算術運算式。良好的根源程式書寫習慣:在運算式中,在雙目運算符的左右兩側各加一個空格,可增強程式的可讀性。請比較運算式“(x+y)/2–1”與“(x+y)/2–1”,您認為哪個的可讀性更好一些?3.運算符的優先順序與結合性(1)C語言規定了運算符的優先順序和結合性。所謂結合性是指,當一個運算元兩側的運算符具有相同的優先順序時,該運算元是先與左邊的運算符結合,還是先與右邊的運算符結合。自左至右的結合方向,稱為左結合性。反之,稱為右結合性。結合性是C語言的獨有概念。除單目運算符、賦值運算符和條件運算符是右結合性外,其他運算符都是左結合性。(2)運算式求值1)按運算符的優先順序高低次序執行。例如,先乘除後加減。2)如果在一個運算對象(或稱運算元)兩側的運算符的優先順序相同,則按C語言規定的結合方向(結合性)進行。例如,算術運算符的結合方向是“自左至右”,即:在執行“a–b+c”時,變數b先與減號結合,執行“a-b”;然後再執行加c的運算。4.數據類型轉換(1)在C語言中,整型、實型和字元型數據間可以混合運算(因為字元數據與整型數據可以通用)。如果一個運算符兩側的運算元的數據類型不同,則系統按“先轉換、後運算”的原則,首先將數據自動轉換成同一類型,然後在同一類型數據間進行運算。轉換規則如圖2-5所示。1)橫向向左的箭頭,表示必須的轉換。char和short型必須轉換成int型,float型必須轉換成double型。2)縱向向上的箭頭,表示不同類型的轉換方向。例如,int型與double型數據進行混合運算,則先將int型數據轉換成double型,然後在兩個同類型的數據間進行運算,結果為double型。注意:箭頭方向只表示數據類型由低向高轉換,不要理解為int型先轉換成unsigned型,再轉換成long型,最後轉換成double型。(2)除自動轉換外,C語言也允許強制轉換。數據類型強制轉換的一般格式為:

(要轉換成的數據類型)(被轉換的運算式)當被轉換的運算式是一個簡單運算式時,外面的一對圓括號可以缺省。例如,(double)a(等價於(double)(a))/*將變數a的值轉換成double型*/(int)(x+y) /*將x+y的結果轉換成int型*/(float)5/2(等價於(float)(5)/2)/*將5轉換成實型,再除以2(=2.5)*/(float)(5/2) /*將5整除2的結果(2)轉換成實型(2.0)*/注意:強制轉換類型得到的是一個所需類型的中間量,原運算式類型並不發生變化。例如,(double)a只是將變數a的值轉換成一個double型的中間量,其數據類型並未轉換成double型。

2.8賦值運算與賦值運算式1.賦值運算賦值符號“=”就是賦值運算符,它的作用是將一個運算式的值賦給一個變數。賦值運算符的一般形式為:變數=賦值運算式

例如,x=5

y=(float)5/2

如果運算式值的類型,與被賦值變數的類型不一致,但都是數值型或字元型時,系統自動地將運算式的值轉換成被賦值變數的數據類型,然後再賦值給變數。

思考題:假設變數num的數據類型為float,其值為2.5,則執行“num=(int)num”後,num的值等於多少?2.複合賦值運算複合賦值運算符是由賦值運算符之前再加一個雙目運算符構成的。複合賦值運算的一般格式為:變數雙目運算符=運算式└──┬──┘複合賦值運算符它等價於:變數=變數雙目運算符(運算式)。當運算式為簡單運算式時,運算式外的一對圓括號才可缺省,否則可能出錯。例如,x+=3 /*等價於x=x+3*/y*=x+6 /*等價於y=y*(x+6),而不是y=y*x+6*/C語言規定的10種複合賦值運算符如下:+=,-=,*=,/=,%=; /*複合算術運算符(5個)*/&=,^=,|=,<<=,>>=; /*複合位運算符(5個)*/3.賦值運算式由賦值運算符或複合賦值運算符,將一個變數和一個運算式連接起來的運算式,稱為賦值運算式。(1)一般格式變數(複合)賦值運算符運算式(2)賦值運算式的值任何一個運算式都有一個值,賦值運算式也不例外。被賦值變數的值,就是賦值運算式的值。例如,“a=5”這個賦值運算式,變數a的值“5”就是它的值。

2.9C語言特有的運算和運算符2.9.1自增(++)、自減(--)運算

1.作用

自增運算使單個變數的值增1,自減運算使單個變數的值減1。

2.用法與運算規則

自增、自減運算符都有兩種用法:

(1)前置運算──運算符放在變數之前:++變數、--變數

先使變數的值增(或減)1,然後再以變化後的值參與其他運算,即先增減、後運算。

(2)後置運算──運算符放在變數之後:變數++、變數--

變數先參與其他運算,然後再使變數的值增(或減)1,即先運算、後增減。

[案例2.4]自增、自減運算符的用法與運算規則示例。/*案例代碼檔案名:AL2_4.C*//*程式功能:自增、自減運算符的用法與運算規則示例*/main(){intx=6,y;printf("x=%d\n",x); /*輸出x的初值*/y=++x; /*前置運算*/printf("y=++x:x=%d,y=%d\n",x,y);y=x--; /*後置運算*/printf("y=x--:x=%d,y=%d\n",x,y);}程式運行結果:x=6y=++x:x=7,y=7y=x--:x=6,y=7

思考題:如果將案例“y=++x;”語句中的前置運算改為後置(y=x++;),“y=x--;”語句中的後置運算改為前置(y=--x;),程式運行結果會如何?3.說明(1)自增、自減運算,常用於迴圈語句中,使迴圈控制變數加(或減)1,以及指針變數中,使指針指向下(或上)一個地址。(2)自增、自減運算符,不能用於常量和運算式。例如,5++、--(a+b)等都是非法的。(3)在運算式中,連續使同一變數進行自增或自減運算時,很容易出錯,所以最好避免這種用法。2.9.2逗號運算(,)及其運算式C語言提供一種用逗號運算符“,”連接起來的式子,稱為逗號運算式。逗號運算符又稱順序求值運算符。1.一般形式運算式1,運算式2,……,運算式n2.求解過程自左至右,依次計算各運算式的值,“運算式n”的值即為整個逗號運算式的值。例如,逗號運算式“a=3*5,a*4”的值=60:先求解a=3*5,得a=15;再求a*4=60,所以逗號運算式的值=60。又例如,逗號運算式“(a=3*5,a*4),a+5”的值=20:先求解a=3*5,得a=15;再求a*4=60;最後求解a+5=20,所以逗號運算式的值=20。注意:並不是任何地方出現的逗號,都是逗號運算符。很多情況下,逗號僅用作分隔符號。

2.10順序結構程式設計為了讓電腦處理各種數據,首先就應該把源數據輸入到電腦中;電腦處理結束後,再將目標數據資訊以人能夠識別的方式輸出。C語言中的輸入輸出操作,是由C語言編譯系統提供的庫函數來實現。1格式化輸出——printf()函數2格式化輸入——scanf()函數3單個字元輸入輸出——getchar()和putchar()函數4順序結構程式設計良好的根源程式書寫風格──順序程式段左對齊

1格式化輸出——printf()函數printf()函數的作用:向電腦系統默認的輸出設備(一般指終端或顯示器)輸出一個或多個任意類型的數據。

一、

printf()函數的一般格式

[案例2.5]已知圓半徑radius=1.5,求圓周長和圓面積。

/*案例代碼檔案名:AL2_5.C。*/

main()

{floatradius,length,area,pi=3.1415926;

radius=1.5;

length=2*pi*radius; /*求圓周長*/

area=pi*radius*radius; /*求圓面積*/

printf(“radius=%f\n”,radius); /*輸出圓半徑*/

printf(“length=%7.2f,area=%7.2f\n”,length,area); /*輸出圓周長、面積*/

}

程式運行結果如下:

radius=1.500000length=9.42,area=7.07 printf()函數的一般格式如下:printf("格式字串"[,輸出項表]);

1.格式字串。“格式字串”也稱“轉換控制字串”,可以包含三種字元:(1)格式指示符。格式指示符的一般形式如下:%[標誌][寬度][.精度][F|N|h|L][類型]

常用的標誌字元如表3-1所示,常用的寬度指示符如表3-2所示,常用的精度指示符如表3-3所示,長度修飾符如表3-4所示,類型轉換字元如表3-5所示。

(2)轉義字元例如,[案例2.5]中printf()函數中的'\n'就是轉義字元,輸出時產生一個“換行”操作。(3)普通字元──除格式指示符和轉義字元之外的其他字元。格式字串中的普通字元,原樣輸出。例如,[案例2.5]中“printf("radius=%f\n",radius);”語句中的“radius=”,“printf("length=%7.2f,area=%7.2f\n",length,area);”語句中的“length=”、“area=”等都是普通字元。

2.輸出項表輸出項表是可選的。如果要輸出的數據不止1個,相鄰2個之間用逗號分開。下麵的printf()函數都是合法的:(1)printf("Iamastudent.\n");

(2)printf("%d",3+2);

(3)printf("a=%fb=%5d\n",a,a+3); 必須強調:“格式字串”中的格式指示符,必須與“輸出項表”中、輸出項的數據類型一致,否則會引起輸出錯誤。

二、

格式指示符

輸出不同類型的數據,要使用不同的類型轉換字元。

1.類型轉換字元d──以帶符號的十進位整數形式輸出。

[案例2.6]類型轉換字元d的使用。/*案例代碼檔案名:AL2_6.C。*/main(){intnum1=123;longnum2=123456;/*用3種不同格式,輸出int型數據num1的值*/printf("num1=%d,num1=%5d,num1=%-5d,num1=%2d\n",num1,num1,num1,num1);/*用3種不同格式,輸出long型數據num2的值*/printf("num2=%ld,num2=%8ld,num2=%5ld\n",num2,num2,num2);printf("num1=%ld\n",num1);}

程式運行結果如下:num1=123,num1=□□123,num1=123□□,num1=123num2=123456,num2=□□123456,num2=123456num1=16908411 對於整數,還可用八進制、無符號形式(%o(小寫字母o))和十六進制、無符號形式(%x)輸出。對於unsigned型數據,也可用%u格式符,以十進位、無符號形式輸出。所謂無符號形式是指,不論正數還是負數,系統一律當作無符號整數來輸出。例如,printf("%d,%o,%x\n",-1,-1,-1);2.類型轉換字元f──以小數形式、按系統默認的寬度,輸出單精確度和雙精度實數。[案例2.7]類型轉換字元f的使用。/*案例代碼檔案名:AL2_7.C。*/main(){floatf=123.456;doubled1,d2;d1=1111111111111.111111111;d2=2222222222222.222222222;printf("%f,%12f,%12.2f,%-12.2f,%.2f\n",f,f,f,f,f);printf("d1+d2=%f\n",d1+d2);}

程式運行結果如下:

123.456001,□□123.456001,□□□□□□123.46,123.46□□□□□□,123.46d1+d2=3333333333333.333010

本案例程式的輸出結果中,數據123.456001和3333333333333.333010中的001和010都是無意義的,因為它們超出了有效數字的範圍。對於實數,也可使用格式符%e,以標準指數形式輸出:尾數中的整數部分大於等於1、小於10,小數點占一位,尾數中的小數部分占5位;指數部分占4位(如e-03),其中e占一位,指數符號占一位,指數占2位,共計11位。也可使用格式符%g,讓系統根據數值的大小,自動選擇%f或%e格式、且不輸出無意義的零。3.類型轉換字元c──輸出一個字元(只占一列寬度)。[案例2.8]類型轉換字元c的使用。/*案例代碼檔案名:AL2_8.C。*/main(){charc='A';inti=65;printf("c=%c,%5c,%d\n",c,c,c);printf("i=%d,%c",i,i);}程式運行結果如下:

c=A,□□□□A,65i=65,A

需要強調的是:在C語言中,整數可以用字符形式輸出,字元數據也可以用整數形式輸出。將整數用字符形式輸出時,系統首先求該數與256的餘數,然後將餘數作為ASCII碼,轉換成相應的字元輸出。4.類型轉換字元s──輸出一個字串。[案例2.9]類型轉換字元s的使用。/*案例代碼檔案名:AL2_9.C。*/main(){printf("%s,%5s,%-10s","Internet","Internet","Internet");printf("%10.5s,%-10.5s,%4.5s\n","Internet","Internet","Internet");}

程式運行結果如下:Internet,Internet,Internet□□,□□□□□Inter,Inter□□□□□,Inter注意:系統輸出字元和字串時,不輸出單引號和雙引號。

三、

使用說明(1)printf()可以輸出常量、變數和運算式的值。但格式控制中的格式說明符,必須按從左到右的順序,與輸出項表中的每個數據一一對應,否則出錯。例如,printf("str=%s,f=%d,i=%f\n","Internet",1.0/2.0,3+5,"CHINA");是錯誤的。(2)格式字元x、e、g可以用小寫字母,也可以用大寫字母。使用大寫字母時,輸出數據中包含的字母也大寫。除了x、e、g格式字元外,其他格式字元必須用小寫字母。例如,%f不能寫成%F。(3)格式字元緊跟在“%”後面就作為格式字元,否則將作為普通字元使用(原樣輸出)。例如,“printf(”c=%c,f=%f\n“,c,f);”中的第一個c和f,都是普通字元。

2格式化輸入——scanf()函數scanf()函數是用來從外部輸入設備向電腦主機輸入數據的。

一、

scanf()函數的一般格式

[案例2.10]已知圓柱體的底半徑radius=1.5,高high=2.0,求其體積。

/*案例代碼檔案名:AL2_10.C。*/

main()

{floatradius=1.5,high=2.0,pi=3.14159,vol;

vol=pi*radius*radius*high;/*求體積*/

printf(“vol=%7.2f\n”,vol); /*輸出求出的體積*/

}

[案例2.11]已知圓柱體的底半徑為radius,高為high,求其體積。/*案例代碼檔案名:AL2_11.C。*//*功能:說明函數scanf()的格式及作用。*/main(){floatradius,high,vol,pi=3.1415926;printf("Pleaseinputradius&high:");scanf("%f%f",&radius,&high); /*從鍵盤輸入兩個實數賦給變數r,h*/vol=pi*radius*radius*high;printf("radius=%7.2f,high=%7.2f,vol=%7.2f\n",radius,high,vol);}

程式運行結果如下:

Pleaseinputradius&high:1.5□2.0↙radius=□□□1.50,high=□□□2.00,vol=□□14.14

在程式中給電腦提供數據,可以用賦值語句,也可以用輸入函數。在C語言中,可使用scanf()函數,通過鍵盤輸入,給電腦同時提供多個、任意的數據。1.scanf()函數的一般格式scanf("格式字串",輸入項首地址表);(1)格式字串。格式字串可以包含3種類型的字元:格式指示符、空白字元(空格、Tab鍵和回車鍵)和非空白字元(又稱普通字元)。格式指示符與printf()函數的相似,空白字元作為相鄰2個輸入數據的缺省分隔符號,非空白字元在輸入有效數據時,必須原樣一起輸入。(2)輸入項首地址表──由若干個輸入項首地址組成,相鄰2個輸入項首地址之間,用逗號分開。輸入項首地址表中的地址,可以是變數的首地址,也可以是字元數組名或指針變數。變數首地址的表示方法:&變數名其中“&”是地址運算符。例如,[案例2.11]中的“&radius”是指變數radius在內存中的首地址。

2.scanf()函數的功能:從鍵盤上接收格式化輸入。運行[案例2.11]的程式時,從鍵盤上輸入2個實數,分別存入&radius、&high起始的存儲單元中,即輸入兩個實數分別賦給radius和high。

二、

格式指示符格式指示符的一般形式為:%[*][寬度][F|N][h|l]類型字元

1.類型字元類型字元如表3-6所示。例如,在[案例3.7]的scanf()函數語句中,格式字串“%f%f”。

2.寬度n

指定該項輸入數據所占列數為n。換句話說,讀取輸入數據中相應的n位,但按需要的位數賦給相應的變數,多餘部分被捨棄。例如,scanf("%3c%3c",&ch1,&ch2);printf("ch1=%c,ch2=%c\n",ch1,ch2);

假設輸入“abcdefg”,則系統將讀取的“abc”中的“a”賦給變數ch1;將讀取的“def”中的“d”賦給變數ch2,所以printf()函數的輸出結果為:ch1=a,ch2=d。3.賦值抑制字元*表示本輸入項對應的數據讀入後,不賦給相應的變數(該變數由下一個格式指示符輸入)。例如,scanf("%2d%*2d%3d",&num1,&num2);printf("num1=%d,num2=%d\n",num1,num2);

假設輸入“123456789”,則系統將讀取“12”並賦值給num1;讀取“34”、但捨棄掉(“*”的作用);讀取“567”並賦值給num2。所以,printf()函數的輸出結果為:num1=12,num2=567。

4.類型修飾符──F、N、h、l。其含義與printf()中的一樣,分別為遠指針、近指針、短整型和長整型。

三、

數據輸入操作

1.如果相鄰2個格式指示符之間,不指定數據分隔符號(如逗號、冒號等),則相應的2個輸入數據之間,至少用一個空格分開,或者用Tab鍵分開,或者輸入1個數據後,按回車,然後再輸入下1個數據。例如,scanf("%d%d",&num1,&num2);

假設給num1輸入12,給num2輸入36,則正確的輸入操作為:12□36↙

或者:12↙36↙

注:使用“↙”符號表示按回車鍵操作,在輸入數據操作中的作用是,通知系統輸入操作結束。2.“格式字串”中出現的普通字元(包括轉義字元形式的字元),務必原樣輸入。例如,scanf("%d,%d",&num1,&num2);

假設給num1輸入12,給num2輸入36,正確的輸入操作為:12,36↙

另外,scanf()函數中、格式字串內的轉義字元(如\n),系統並不把它當轉義字元來解釋,從而產生一個控制操作,而是將其視為普通字元,所以也要原樣輸入。例如:scanf("num1=%d,num2=%d\n",&num1,&num2);

假設給num1輸入12,給num2輸入36,正確的輸入操作為:

num1=12,num2=36\n↙

提高人機交互性建議:為改善人機交互性,同時簡化輸入操作,在設計輸入操作時,一般先用printf()函數輸出一個提示資訊,再用scanf()函數進行數據輸入。例如,將scanf("num1=%d,num2=%d\n",&num1,&num2);改為:

printf("num1=");scanf("%d",&num1);printf("num2=");scanf("%d",&num2);3.輸入數據時,遇到以下情況,系統認為該數據結束:(1)遇到空格,或者回車鍵,或者Tab鍵。(2)遇到輸入域寬度結束。例如“%3d”,只取3列。(3)遇到非法輸入。例如,在輸入數值數據時,遇到字母等非數值符號(數值符號僅由數字字元0-9、小數點和正負號構成)。4.使用格式說明符“%c”輸入單個字元時,空格和轉義字元均作為有效字元被輸入。例如,scanf("%c%c%c",&ch1,&ch2,&ch3);printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3);

假設輸入:A□B□C↙,則系統將字母'A'賦值給ch1,空格'□'賦值給ch2,字母'B'賦值給ch3。

3單個字元輸入輸出——getchar()和putchar()函數一、

單個字元的輸出──putchar()函數[案例2.12]putchar()函數的格式和使用方法。/*案例代碼檔案名:AL2_12.C*//*功能:說明putchar()函數的格式和使用方法。*/#include"stdio.h" /*編譯預處理命令:檔包含*/main(){charch1='N',ch2='E',ch3='W';putchar(ch1);putchar(ch2);putchar(ch3); /*輸出*/putchar('\n');putchar(ch1);putchar('\n'); /*輸出ch1的值,並換行*/putchar('E');putchar('\n'); /*輸出字元'E',並換行*/putchar(ch3);putchar('\n');}

程式運行結果如下:

NEWNEW1.putchar()函數的格式:

putchar(ch);

其中ch可以是一個字元變數或常量,也可以是一個轉義字元。

2.putchar()函數的作用:向終端輸出一個字元。(1)putchar()函數只能用於單個字元的輸出,且一次只能輸出一個字元。另外,從功能角度來看,printf()函數可以完全代替putchar()函數。(2)在程式中使用putchar()函數,務必牢記:在程式(或檔)的開頭加上編譯預處理命令(也稱包含命令),即:

#include"stdio.h"

表示要使用的函數,包含在標準輸入輸出(stdio)頭檔(.h)中。二、

單個字元的輸入──getchar()函數[案例2.13]說明getchar()函數的格式和作用。/*案例代碼檔案名:AL2_13.C*//*功能:說明getchar()函數的格式和作用。*/#include"stdio.h" /*檔包含*/main(){charch;printf("Pleaseinputtwocharacter:");ch=getchar(); /*輸入1個字元並賦給ch*/putchar(ch);putchar('\n');putchar(getchar()); /*輸入一個字元並輸出*/putchar('\n');}

程式運行情況如下:

Pleaseinputtwocharacters:ab↙ab1.getchar()函數的格式:getchar();2.getchar()函數的作用:從系統隱含的輸入設備(如鍵盤)輸入一個字元。另外,從功能角度來看,scanf()函數可以完全代替getchar()函數。(1)getchar()函數只能用於單個字元的輸入,一次輸入一個字元。(2)程式中要使用getchar()函數,必須在程式(或檔)的開頭加上編譯預處理命令:

#include"stdio.h“

4順序結構程式設計

在順序結構程式中,各語句(或命令)是按照位置的先後次序,順序執行的,且每個語句都會被執行到。

[案例2.14]輸入任意三個整數,求它們的和及平均值。

/*案例代碼檔案名:AL2_14.C*/

/*功能:設計一個順序結構程式,求三個整數的和及平均值。*/

main()

{intnum1,num2,num3,sum;

floataver;

printf("Pleaseinputthreenumbers:");

scanf("%d,%d,%d",&num1,&num2,&num3);/*輸入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论