C#程序設計教程(第6版)課件 ch05 數(shù)組、結構和枚舉_第1頁
C#程序設計教程(第6版)課件 ch05 數(shù)組、結構和枚舉_第2頁
C#程序設計教程(第6版)課件 ch05 數(shù)組、結構和枚舉_第3頁
C#程序設計教程(第6版)課件 ch05 數(shù)組、結構和枚舉_第4頁
C#程序設計教程(第6版)課件 ch05 數(shù)組、結構和枚舉_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章數(shù)組、結構和枚舉C#程序設計教程(第6版)01知識目標:使學生了解C#中的3種主要的數(shù)據(jù)結構類型:數(shù)組、結構和枚舉。03思政目標:使學生明白成員只是集體的一部分,從而培養(yǎng)團隊合作的意識。02能力目標:使學生能夠使用C#實現(xiàn)常用算法,如搜索算法、排序算法。本章學習目標5.1數(shù)組PARTONE5.1.1數(shù)組的概念數(shù)組是一種數(shù)據(jù)結構,它包含大量相同類型的變量,這些變量可以通過數(shù)組名和數(shù)組下標來訪問。包含在數(shù)組中的變量被稱為數(shù)組元素,其類型也可被稱為數(shù)組元素類型。在C#中,數(shù)組是一維(只有一個下標)的或多維(有多個下標)的,一維數(shù)組的應用相對普遍。對于每個維,數(shù)組中數(shù)組元素的個數(shù)叫作這個維的數(shù)組長度。無論是一維數(shù)組還是多維數(shù)組,每個維的下標都是從0開始的,該維的最后一個下標為這個維的數(shù)組長度減1。數(shù)組可以被用于各種場景,因為它提供了一種將相關變量合成一組變量的方法。例如,可以用數(shù)組保存一個月中每天的溫度記錄、貨物平均價格的清單或收集的程序設計書籍。數(shù)組的主要優(yōu)點是,通過這種方法組織數(shù)據(jù)使得數(shù)據(jù)容易被操縱。例如,有一個數(shù)組,其中包括選定的一組家庭收入,遍歷該數(shù)組后很容易計算該家庭的平均收入。而且數(shù)組以這樣的方法組織數(shù)據(jù),會使數(shù)據(jù)排序變得輕易。在實際使用數(shù)組的過程中,一般先確定數(shù)組類型,再根據(jù)實際情況確定數(shù)組長度。數(shù)組長度不宜比實際中可能用到的數(shù)據(jù)個數(shù)大很多,數(shù)組長度太大會導致大量空間被浪費。數(shù)組長度也不宜太小,太小會導致在使用過程中因數(shù)組空間不足而產(chǎn)生溢出。5.1.2一維數(shù)組由具有一個下標的數(shù)組元素構成的數(shù)組就是一維數(shù)組。一維數(shù)組是簡單的數(shù)組。例如,要想記錄30個網(wǎng)上在線用戶的賬號,可以使用一個長度為30的一維數(shù)組。一維數(shù)組比較直觀,使用起來相對容易。1.一維數(shù)組的定義數(shù)組在使用前必須先定義。定義一維數(shù)組的一般語法格式如下。數(shù)組類型[]數(shù)組名;其中,數(shù)組類型為本書前面介紹過的各種數(shù)據(jù)類型(如double類型或類類型),它表示數(shù)組元素的類型;數(shù)組名可以是C#的合法標識符;在數(shù)組名與數(shù)據(jù)類型之間是一組空的方括號。例如:char[]CharArr; //定義了一個字符型一維數(shù)組int[]IntArr; //定義了一個整型一維數(shù)組string[]StringArray; //定義了一個字符串型一維數(shù)組在定義數(shù)組后,必須對其進行初始化才能使用。初始化數(shù)組的方法有兩種,即動態(tài)初始化和靜態(tài)初始化。5.1.2一維數(shù)組2.動態(tài)初始化動態(tài)初始化需要借助new運算符來為數(shù)組元素分配內(nèi)存空間并賦初值。動態(tài)初始化數(shù)組的一般語法格式如下。數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度];其中,數(shù)據(jù)類型是數(shù)組中數(shù)據(jù)元素的數(shù)據(jù)類型,數(shù)組長度可以是整型的常量或變量。事實上,可以將數(shù)組定義與動態(tài)初始化合并,一般語法格式如下。數(shù)據(jù)類型[]數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度];例如:int[]IntArr=newint[5];上面的語句定義了一個整型數(shù)組,它包含從IntArr[0]到IntArr[4]五個元素。new運算符用于創(chuàng)建數(shù)組,并用默認值對數(shù)組元素進行初始化。在以上示例中,所有數(shù)組元素的值都被初始化為0。用戶也可以為其賦予其他初始值。int[]IntArr=newint[5]{3,6,9,2,18};此時,數(shù)組元素的初始值就是大括號中列出的元素值。定義其他類型的數(shù)組的方法也是一樣的,如下面的語句用于定義一個存儲8個字符串元素的數(shù)組,并對其進行初始化。string[]StringArr=newstring[8];3.靜態(tài)初始化如果數(shù)組中包含的元素不多,而且初始元素可以窮舉,則可以采用靜態(tài)初始化的方法。靜態(tài)初始化數(shù)組必須與數(shù)組定義相結合,否則程序就會報錯。靜態(tài)初始化數(shù)組的一般語法格式如下。數(shù)據(jù)類型[]數(shù)組名={元素1[,元素2…]};用這種方法對數(shù)組進行初始化時,無須說明數(shù)組元素的個數(shù),只需按順序列出數(shù)組中的全部元素即可,系統(tǒng)會自動計算并分配數(shù)組所需的內(nèi)存空間。例如:int[]IntArr={3,6,9,2,18};string[]StringArr={"English","Computer","Maths","Chinese"};5.1.2一維數(shù)組4.關于一維數(shù)組初始化的幾點說明在C#中,數(shù)組初始化是程序設計中經(jīng)常出錯的部分,為加深讀者對C#中數(shù)組的理解,下面列出了一些需要讀者注意的方面。(1)在動態(tài)初始化數(shù)組時,可以把定義與初始化分開,在不同的語句中進行。例如:int[]IntArr; //定義數(shù)組IntArr=newint[5]; //動態(tài)初始化,初始化元素的值均為0或者IntArr=newint[5]{3,6,9,2,18}; //動態(tài)初始化,元素值為大括號中列出的值此時,在“newint[5]{3,6,9,2,18}”這條語句中,方括號中表示數(shù)組元素個數(shù)的“5”可以省略,因為后面的大括號中列出了數(shù)組中的全部元素。(2)靜態(tài)初始化數(shù)組必須與定義數(shù)組寫在一條語句中,否則程序就會出錯。例如:int[]IntArr; //定義數(shù)組IntArr={3,6,9,2,18}; //錯誤,定義數(shù)組與靜態(tài)初始化數(shù)組分別寫在兩條語句中(3)在數(shù)組初始化語句中,如果大括號中已明確列出了數(shù)組元素,即確定了元素個數(shù),則表示數(shù)組元素個數(shù)的數(shù)值(方括號中的數(shù)值)必須是常量,并且該數(shù)值必須與數(shù)組元素的個數(shù)一致。例如:intj=3; //定義一個整型變量j,并為j賦初值為3int[]x=newint[3]{2,6,8}; //正確int[]y=newint[j]{2,6,8}; //錯誤,j不是一個常量int[]z=newint[3]{2,6,8,13}; //錯誤,數(shù)組元素的個數(shù)與方括號中的數(shù)值不一致5.1.2一維數(shù)組5.訪問一維數(shù)組中的元素定義一個一維數(shù)組,在對其進行初始化后就可以訪問數(shù)組中的元素了。在C#中是通過數(shù)組名和下標值來訪問數(shù)組元素的。數(shù)組下標就是元素索引值,它代表了要被訪問的數(shù)組元素在內(nèi)存中的相對位置。在C#中,數(shù)組下標從0開始,到數(shù)組長度減1時結束。在訪問數(shù)組元素時,其下標可以是一個整型常量或整型表達式。例如,下面的數(shù)組元素的下標都是合法的。IntArr[2]StringArr[0]IntArr[j]StringArr[2*i-1]在實際的程序設計工作中,有時會因為各種原因而使下標值超出正常取值范圍。在C#中,執(zhí)行程序時為了安全考慮,將檢查數(shù)組下標是否越界,如果下標越界,則會拋出一個IndexOutOfRangeException異常。5.1.2一維數(shù)組5.1.3二維數(shù)組1.二維數(shù)組的定義二維數(shù)組的定義與一維數(shù)組的很相似,一般語法格式如下。數(shù)據(jù)類型[,]數(shù)組名;其中,數(shù)據(jù)類型為數(shù)組中元素的類型,可以是前面介紹過的各種數(shù)據(jù)類型;數(shù)組名是C#中合法的標識符;數(shù)組的每一維是用逗號“,”隔開的。例如:char[,]CharArr; //定義一個字符型二維數(shù)組int[,]IntArr; //定義一個整型二維數(shù)組定義多維數(shù)組的方法與定義二維數(shù)組的相同,只是要根據(jù)定義數(shù)組的維數(shù)確定方括號中逗號的個數(shù),一般定義一個n(n≥2)維數(shù)組需要的逗號個數(shù)是n-1。例如,下面語句定義的是一個三維數(shù)組。string[,,]StringArr; //定義一個字符串型三維數(shù)組定義二維數(shù)組并不為數(shù)組元素分配內(nèi)存空間,必須為其分配內(nèi)存后才能使用。與一維數(shù)組對應的是多維數(shù)組,在C#中,多維數(shù)組可看作數(shù)組的數(shù)組,即高維數(shù)組中的每一個元素本身就是一個低維數(shù)組,因此多維數(shù)組的定義、初始化和元素訪問與一維數(shù)組的都非常相似。在多維數(shù)組中,二維數(shù)組是最簡單也是最常用的數(shù)組,本節(jié)主要介紹二維數(shù)組。2.二維數(shù)組的初始化二維數(shù)組的初始化與一維數(shù)組的相似,它也包括兩種初始化方法,即動態(tài)初始化和靜態(tài)初始化,其初始化格式也非常相似。動態(tài)初始化二維數(shù)組的一般語法格式如下。數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度1,數(shù)組長度2];其中,數(shù)組長度1和數(shù)組長度2可以是整型的常量或變量,它們分別表示數(shù)組第一維和第二維的長度。在程序設計中,也可以將二維數(shù)組的定義與動態(tài)初始化合并在一條語句中,一般語法格式如下。數(shù)據(jù)類型[,]數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度1,數(shù)組長度2];例如:int[,]IntArr=newint[3,2];new運算符用于創(chuàng)建數(shù)組并默認對數(shù)組元素進行初始化。在上例中,所有數(shù)組元素的值都被初始化為0。上例中定義了一個二維數(shù)組,其中,第1維的長度為3,第2維的長度為2。在二維數(shù)組中,第1維常常被稱為行,第2維常常被稱為列。這樣,一個二維數(shù)組就與一個二維表格對應起來了,如表5-1所示。5.1.3二維數(shù)組如果只給出二維數(shù)組的第一維下標,以一維數(shù)組來看二維數(shù)組的話,則這樣的數(shù)組所代表的是另一個一維數(shù)組。例如,IntArr[0]代表由兩個int類型的元素組成的另一個一維數(shù)組。不難算出,IntArr數(shù)組中一共有6(3×2=6)個int類型元素,這6個元素在內(nèi)存中也是按順序存放的。先存放IntArr[0]的兩個元素,再存放IntArr[1]的兩個元素,最后存放IntArr[2]的兩個元素。二維數(shù)組常常用于存放矩陣,其行和列與矩陣的行和列可以相對應。在動態(tài)初始化二維數(shù)組時,也可以直接為其賦予初始化值,如下所示。int[,]IntArr=newint[,]{{2,3},{5,8},{6,11}};它所表示的數(shù)組元素值如表5-2所示。與一維數(shù)組一樣,二維數(shù)組也可以進行靜態(tài)初始化。例如,下面的語句定義了一個2行3列的double類型二維數(shù)組,并對其進行靜態(tài)初始化。double[,]DoubleArr={{1.2,2.3,3.4},{4.5,5.6,6.7}};在靜態(tài)初始化二維數(shù)組時,也必須與數(shù)組定義結合在一條語句中,否則程序會報錯。而在動態(tài)初始化數(shù)組時,它們可以分開寫在不同的語句中,如下所示。int[,]IntArr; //定義二維數(shù)組IntArr=newint[,]{{1,3},{5,7},{9,11}}; //正確,動態(tài)初始化定義的二維數(shù)組IntArr={{1,3},{5,7},{9,11}}; //錯誤,靜態(tài)初始化必須與數(shù)組定義結合在一條語句中在5.1.2節(jié)中關于一維數(shù)組初始化的幾點說明同樣適用于二維數(shù)組。5.1.3二維數(shù)組3.訪問二維數(shù)組的元素與一維數(shù)組類似,二維數(shù)組也是通過數(shù)組名和下標值來訪問數(shù)組元素的,二維數(shù)組的下標值同樣是從0開始的。與一維數(shù)組不同的是,二維數(shù)組需要兩個下標才能唯一標識一個數(shù)組元素,其中,第1個下標表示該元素所在的行,第2個下標表示該元素所在的列。例如,IntArr[2,0]代表數(shù)組名為IntArr的二維數(shù)組的第3行、第1列的元素。根據(jù)二維數(shù)組的特點,訪問二維數(shù)組中的元素需要一個二重循環(huán),下面通過幾個示例介紹訪問二維數(shù)組的方法。5.1.3二維數(shù)組利用數(shù)組對數(shù)據(jù)進行排序是非常重要的應用之一。數(shù)據(jù)排序可以按從小到大或從大到小的順序進行。排序方法有很多種,本節(jié)主要介紹冒泡排序法。冒泡排序法是一種簡單而經(jīng)典的排序方法。其基本思想是:將待排序序列中的數(shù)據(jù)存儲在數(shù)組中,從第1對相鄰元素開始依次比較數(shù)組中相鄰兩個元素的值,如果兩個相鄰元素是按升序排列的,就保持原有位置不變;如果不是按升序排列的,就交換它們的位置。這樣經(jīng)過第1輪比較后,值最大的元素就會被交換到數(shù)組底部。之后進行第2輪比較,使值次大的元素交換到數(shù)組倒數(shù)第2個元素的位置上,依次進行比較,使待排序序列中較小的元素像氣泡一樣冒出來,逐漸“上浮”到數(shù)組的頂部,使較大的元素逐漸“下沉”到數(shù)組的底部,這就是冒泡排序法?!纠?-6】給定一組數(shù)據(jù)序列:68、65、56、79、218、112、5、16、86,要求用冒泡排序法將其按升序排列。分析:該序列中共有9個數(shù)據(jù),按規(guī)則要進行8輪比較,其中,第1輪兩個相鄰元素需比較8次,第2輪需比較7次,依次類推,最后的一輪即第8輪需比較一次。下面利用數(shù)組來存儲待排序序列中的元素,并給出冒泡排序法的具體程序。5.1.4冒泡排序算法——數(shù)組的實例5.1.4冒泡排序算法——數(shù)組的實例該程序的運行結果如下。待排序序列:6865567921811251686排序完后的序列:5165665687986112218通過上面的示例,可以看出使用冒泡排序法編寫排序程序相對簡單。5.2結構類型PARTTWO5.2.1結構的聲明struct標識符{//結構成員定義}說明:(1)struct關鍵字表示聲明的是一種結構,就像class關鍵字表示聲明的是一個類一樣。(2)標識符必須是C#合法的標識符,它用來在程序中唯一確定所定義的結構。(3)由一對大括號“{}”括起來的部分稱為結構體,它定義了結構中所包含的各種成員。結構類型也是先聲明后使用。結構類型的聲明與類類型的相似,不同的是聲明類時要使用class關鍵字,而聲明結構時要使用struct關鍵字。聲明結構類型的一般語法格式如下。5.2.2結構成員的訪問結構成員前面通常有public修飾符,表示該成員為公有成員,可以被外界訪問。創(chuàng)建結構類型的變量的一般語法格式如下。結構名標識符;說明:結構名為已聲明的結構類型的名稱,標識符必須是C#合法的標識符,它用來表示結構類型的變量。結構成員可分為兩類,一類是實例成員,另一類是靜態(tài)成員。如果成員名前有static關鍵字,則該成員為靜態(tài)成員,否則為實例成員。靜態(tài)成員通過結構名來訪問,而實例成員通過創(chuàng)建結構類型的變量來訪問。在各種系統(tǒng)軟件或應用軟件中,查找是一種常見操作。查找是指在一個含有眾多數(shù)據(jù)元素的集合中找出某個特定的數(shù)據(jù)元素。由于查找操作往往需要訪問所有給定的數(shù)據(jù)元素以獲得查找結果,所以通常將這個過程稱為遍歷。順序查找的操作過程為,在一組順序排列的數(shù)據(jù)中,從第n個數(shù)據(jù)開始逐個與要查找的數(shù)據(jù)進行比較,如果符合查找條件,則查找成功,否則繼續(xù)比較,直至返回第一個數(shù)據(jù)。5.2.3順序查找算法——結構的實例5.3枚舉PARTTHREE5.3.1枚舉類型的定義說明:(1)定義枚舉類型時,必須使用enum關鍵字。(2)枚舉名必須是C#中合法的標識符。(3)枚舉類型中定義的所有枚舉值都默認為整型。(4)由大括號“{}”括起來的部分是枚舉成員表,枚舉成員通常使用用戶易于理解的標識符字符串表示,它們之間用逗號隔開。與定義結構類型一樣,在“}”后可以選擇加或不加“;”符號。下面是一個定義枚舉類型的示例。

enumWeekDay{Sun,Mon,Tue,Wed,Thu,Fri,Sat};上面的語句中定義了一個名為WeekDay的枚舉類型,它包含Sun、Mon、Tue、Wed、Thu、Fri、Sat這7個枚舉成員。經(jīng)過上述定義后,WeekDay就成了一個類型說明符,此后就可以像常量那樣使用此符號,但兩個枚舉成員的名稱不能相同。枚舉類型是一種用戶自定義的、由一組指定常量集合組成的獨特類型。定義枚舉類型時必須使用enum關鍵字,一般語法格式如下。enum枚舉名{枚舉成員表}[;]5.3.2枚舉成員的賦值1.為第1個枚舉成員賦值在定義枚舉類型時為第1個枚舉成員賦值?!纠?-10】輸出枚舉成員對應的整數(shù)值。在定義枚舉類型時,可以定義零個或多個枚舉成員,它們實質(zhì)上是枚舉類型的命名常量,任何兩個枚舉成員都不能具有相同的名稱。在定義的枚舉類型中,每一個枚舉成員都有一個相對應的常量值,如上一節(jié)定義的名為WeekDay的枚舉類型,其枚舉成員Sun、Mon、Tue、Wed、Thu、Fri和Sat在執(zhí)行程序時,可被分別賦予常量值,如0、1、2、3、4、5和6。對于枚舉成員對應的常量值,在默認情況下,C#規(guī)定第1個枚舉成員的值為0,它后面的每個枚舉成員的值依次加1。在編寫程序時,也可以根據(jù)實際需要為枚舉成員賦值,下面依次討論幾種不同的為枚舉成員賦值的情況。從運行結果可以看出,為第1個枚舉成員指定整數(shù)值后,其后的枚舉成員的值會依次加1。值得注意的是,枚舉成員的值在未經(jīng)顯式轉換前是不會變換成整數(shù)值的,這也是本程序用兩條語句輸出枚舉成員yellow的用意所在。第1條語句輸出的依然是枚舉成員的標識符字符串,第2條語句輸出的是經(jīng)過顯式轉換的常量值。2.為某一個枚舉成員賦值如果在定義枚舉類型時直接為某個枚舉成員賦值,則其他枚舉成員將依次取值,如下所示。enumcolor{yellow,brown,blue,black=6,purple};在上面的代碼中,為枚舉成員black直接賦常量值6。讀者可以依照例5-10將該段代碼補齊,程序的運行結果如下。yellow=0brown=1blue=2black=6purple=75.3.2枚舉成員的賦值由此可知,如果為某一個(不是第1個)枚舉成員賦值,則從第1個枚舉成員到被賦值的枚舉成員前的那個枚舉成員都是按默認方式賦值的,即第1個枚舉成員yellow的值為0,后面的枚舉成員依次加1。被賦值的枚舉成員取賦給它的值,即black=6,它后面的枚舉成員則在所賦值的基礎上依次加1。3.為多個枚舉成員賦值在定義枚舉類型時,可以為多個枚舉成員賦值,此時可以不遵循按次序取值的原則,如下所示。enumcolor{yellow,brown=3,blue,black=-3,purple};在上面的代碼中,為枚舉成員brown和black直接賦常量值3和-3。讀者可以依照例5-10將該段代碼補齊,程序運行后,輸出結果如下。yellow=0brown=3blue=4black=-3purple=-25.3.2枚舉成員的賦值由此可知,如果為某幾個枚舉成員賦值,則被賦值的枚舉成員取賦給它的值,其后的枚舉成員的值依次加1,在第1個被賦值的枚舉成員之前的枚舉成員,按默認方式賦值。在編寫程序時,可以根據(jù)需要為所有枚舉成員賦值,這樣每個枚舉成員都會取賦給它的值,這樣就不會存在默認賦值的情況了。4.為多個枚舉成員賦同樣的值每個枚舉成員都有一個與之對應的常量值,在定義枚舉類型時,可以讓多個枚舉成員具有同樣的常量值,如下所示。enumcolor{yellow,brown=3,blue,black=blue,purple};在上面的代碼中,通過“black=blue”使枚舉成員black與

溫馨提示

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

評論

0/150

提交評論