《Visual C# NET案例教程》課件第4章_第1頁
《Visual C# NET案例教程》課件第4章_第2頁
《Visual C# NET案例教程》課件第4章_第3頁
《Visual C# NET案例教程》課件第4章_第4頁
《Visual C# NET案例教程》課件第4章_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章數(shù)組

4.1任務(wù)描述4.2一維數(shù)組4.3二維數(shù)組4.4學(xué)生信息的數(shù)據(jù)存儲與處理4.5習(xí)題在學(xué)生成績管理系統(tǒng)中,我們要錄入許多學(xué)生的信息,包括學(xué)號、姓名、語文成績與英語成績,如表4-1所示。

如果所有這些數(shù)據(jù),都分別用一個單獨的變量來存儲,那么,需要定義的變量非常多,不利于處理。我們可以利用C#語言提供的數(shù)組這種數(shù)據(jù)類型,來解決學(xué)生數(shù)據(jù)的存儲問題。

數(shù)組可以是一維數(shù)組,也可以是多維數(shù)組。存儲二維表格的學(xué)生數(shù)據(jù)需要使用二維數(shù)組,下面先介紹一維數(shù)組的使用,在此基礎(chǔ)上再介紹二維數(shù)組。4.1任務(wù)描述表4-1成績信息4.2.1一維數(shù)組的定義

定義一維數(shù)組的格式如下:

數(shù)據(jù)類型[]數(shù)組名;

其中:

●數(shù)據(jù)類型可以是C#?語言中的各種數(shù)據(jù)類型,包括數(shù)值類型和引用類型。

●方括號“[]”在這里表示是定義一個數(shù)組。

4.2一維數(shù)組例如:

int[]arr; //定義了一個名為arr的整型數(shù)組

double[]area; //定義了一個名為area的數(shù)組,該數(shù)組可用來存放多個double型數(shù)

string[]arr2; //聲明了一個字符串型的一維數(shù)組4.2.2初始化一維數(shù)組

定義數(shù)組后只有對其進行初始化(為數(shù)組分配內(nèi)存空間)后才能使用。初始化數(shù)組有兩種方法:靜態(tài)初始化和動態(tài)初始化。

1.靜態(tài)初始化

如果數(shù)組中包含的元素不多,且初始元素值是已知的,則可以采用靜態(tài)初始化方法。

靜態(tài)初始化數(shù)組時,必須與數(shù)組定義結(jié)合在一起,否則會出錯。靜態(tài)初始化格式如下:

數(shù)據(jù)類型[]數(shù)組名={元素1,元素2,…元素n};用這種方法對數(shù)組進行初始化,無需說明數(shù)組元素的個數(shù),只需按順序列出數(shù)組中全部元素即可,系統(tǒng)會自動計算并分配數(shù)組所需的內(nèi)存空間。

例如:

int[]arry={1,2,3,4};

string[]str={"優(yōu)","良","差"};

2.動態(tài)初始化

動態(tài)初始化需用new關(guān)鍵字將數(shù)組實例化為一個對象,再為該數(shù)組對象分配內(nèi)存空間并為數(shù)組元素賦初值,動態(tài)初始化數(shù)組的格式如下。

用兩條語句實現(xiàn):

數(shù)據(jù)類型[]數(shù)組名; //數(shù)組定義

數(shù)組名=new數(shù)據(jù)類型[表達式]; //動態(tài)初始化

或用一條語句實現(xiàn):

數(shù)據(jù)類型[]數(shù)組名=new數(shù)據(jù)類型[表達式]; //將數(shù)組定義和動態(tài)初始化結(jié)合在一起

new運算符用來為數(shù)組對象在內(nèi)存中分配一定的空間。?數(shù)組占據(jù)的內(nèi)存空間由數(shù)組的數(shù)據(jù)類型和表達式的數(shù)值共同決定。

例如:

//定義了一個名為arr的整型數(shù)組,只進行聲明,需要時再實例化

int[]arr;

//進行實例化,為arrv數(shù)組在內(nèi)存中分配4?×?10個字節(jié)的存儲空間,元素值均為0

arry=newint[10];

如果需要,也可以在初始化的同時為其賦其他初始值。程序代碼如下:

int[]arry=newint[]{1,2,3,4,5,6,7,8,9,10};說明:

(1)靜態(tài)初始化數(shù)組必須與數(shù)組定義結(jié)合在一條語句中,否則程序會出錯。

(2)在數(shù)組初始化語句中,如大括號中已明確列出了數(shù)組中的元素值,即確定了數(shù)組元素的個數(shù),則數(shù)組元素的個數(shù)(方括號中的數(shù)值)必須是常量,并且該數(shù)值必須與數(shù)組元素的個數(shù)一致。例如:

inti=4;

int[]x=newint[4]{1,2,3,4}; //正確

int[]y=newint[i]{l,2,3,4}; //錯誤,i不是一個常量

int[]z=newint[3]{1,2,3,4};//錯誤,數(shù)組元素個數(shù)與方括號中數(shù)值不一致4.2.3引用一維數(shù)組元素

當(dāng)定義完一個數(shù)組并對其初始化后,就可以引用數(shù)組中的元素了??赏ㄟ^數(shù)組名和元素的下標(biāo)來引用數(shù)組元素。

一維數(shù)組的引用方式是:

數(shù)組名[下標(biāo)];數(shù)組的下標(biāo)是元素的索引值,代表了要被訪問的數(shù)組元素在內(nèi)存中的相對位置,就是從數(shù)組的第1個元素到某個數(shù)組元素的偏移量。數(shù)組元素的索引是從0而不是1開始的,如數(shù)組arr的第1個元素是arr[0],第2個元素是arr[1],依次類推,第n個元素是arr[n-l]。

在訪問數(shù)組元素時,要注意不要使下標(biāo)越界,例如:

int[]A=newint[5];

A[5]=15;//錯誤,下標(biāo)越界【例4-1】遍歷輸出數(shù)組中的元素。

usingSystem;

classProgram

{

publicstaticvoidMain(String[]args)

{

int[]a=newint[]{3,8,9,23,4};

for(inti=0;i<a.Length;i++)//Length返回數(shù)組元素的個數(shù)

{

Console.WriteLine(a[i]);

}

}

}

運行結(jié)果如圖4-1所示。圖4-1例4-1運行結(jié)果【例4-2】輸入幾位學(xué)生的成績,輸出最高成績。

usingSystem;

classProgram

{

staticvoidMain(string[]args)

{

int[]grades=newint[5];

for(intj=0;j<5;j++)

{

grades[j]=int.Parse(Console.ReadLine());

}

intmax=grades[0]; //max變量用于存放最大數(shù)

inti=0;while(i<grades.Length)

{

if(max<grades[i]) //如果當(dāng)前元素a[i]比max大

{

max=grades[i]; //把當(dāng)前元素a[i]的值賦給max

}

i++;

}

Console.WriteLine("最高分為:"+max);

Console.ReadLine();

}

}

運行結(jié)果如圖4-2所示。圖4-2例4-2運行結(jié)果

【例4-3】使用“冒泡”法進行排序(由小到大)。

冒泡排序又稱簡單交換排序。其基本思想是對存放原始數(shù)據(jù)的數(shù)組,按從后往前的方向進行多次掃描,每次掃描稱為一趟排序,當(dāng)發(fā)現(xiàn)相鄰兩個數(shù)據(jù)的次序與排序要求不符時,將這兩個數(shù)據(jù)交換。這樣,較小的數(shù)據(jù)就會逐單元往前移動,好象氣泡往上浮一樣。

如圖4-3所示。現(xiàn)有5個數(shù),第1趟將9和7對調(diào),然后將9和4對調(diào),得到3→8→7→4→9的順序,可以看出:最大的數(shù)9已“沉底”,成為最下面一個數(shù);而小的數(shù)“上升”,如4向上“浮起”一個位置,所以這種排序方法叫“冒泡”法。經(jīng)過一趟得到最大的數(shù),然后進行第二趟比較,對余下的4個數(shù)再按上述方法進行比較,依次類推,直到最后得到一個有序的序列?!懊芭荨钡倪^程如下:原順序:38974

第1趟:38749

第2趟:37489

第3趟:34789

第4趟:34789算法代碼如下:

usingSystem;

classProgram

{

publicstaticvoidMain(String[]args)

{

int[]a=newint[]{3,8,9,7,4};

intn=a.Length;

Console.WriteLine("------------排序排序前的數(shù)據(jù)------------");

for(intj=0;j<n;j++) //顯示排序前的數(shù)據(jù)

{

Console.Write("{0}\t",a[j]);

}Console.WriteLine("\n------------排序過程--------------------");

for(inti=1;i<n;i++) //進行n-1趟排序

{

for(intj=0;j<n-i;j++)

{

if(a[j]>a[j+1]) //前大后小,交換

{

//交換元素

inttemp;

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}for(intj=0;j<n;j++) //顯示排序后的結(jié)果

{

Console.Write("{0}\t",a[j]);

}

Console.WriteLine();

}

Console.WriteLine("--------------排序后的結(jié)果--------------");

for(intj=0;j<n;j++) //顯示排序后的結(jié)果

{

Console.Write("{0}\t",a[j]);

}

Console.Read();

}

}

運行結(jié)果如圖4-3所示。圖4-3例4-3運行結(jié)果4.2.4使用foreach遍歷數(shù)組

foreach語句列舉出一個集合(collection)中的所有元素,并執(zhí)行關(guān)于集合中每個元素的嵌套語句。foreach語句的格式如下:

foreach(變量類型迭代變量in集合表達式)

{

循環(huán)體語句塊

}語句中的“迭代變量”是一個循環(huán)變量,在循環(huán)中,該變量依次獲取數(shù)組中各元素的值。因此,對于依次獲取數(shù)組中各元素值的操作,使用這種循環(huán)語句就很方便。要注意,“迭代變量”的類型必須與數(shù)組的類型一致。

foreach語句遍歷數(shù)組雖然很方便,但其功能受一定的限制。例如,如果想為數(shù)組各元素依次有規(guī)律地賦值,foreach循環(huán)將無能為力。【例4-4】計算一維整型數(shù)組中奇數(shù)和偶數(shù)的個數(shù)。

usingSystem;

classProgram

{

publicstaticvoidMain(String[]args)

{

intodd=0,even=0;

int[]array=newint[]{0,4,7,8,9,10,14,17,19,24,56};

foreach(intiinarray)

{

if(i%2==0)

even++;

else

odd++;

}

Console.WriteLine("{0}個奇數(shù),{1}個偶數(shù)",odd,even);

}

}

運行結(jié)果如圖4-4所示。圖4-4例4-4運行結(jié)果4.3.1二維數(shù)組的定義

二維數(shù)組的定義格式為:

數(shù)據(jù)類型[,]數(shù)組名;

其中:

●“數(shù)據(jù)類型”為數(shù)組中元素的數(shù)據(jù)類型,可以是C#語言中的各種數(shù)據(jù)類型。

●“數(shù)組名”的命名規(guī)則同變量的命名規(guī)則相同。

●數(shù)組的每一維都用逗號隔開。4.3二維數(shù)組例如:

int[,]a; //定義了名為a的整型二維數(shù)組

string[,]str; //定義了名為str的字符串型二維數(shù)組

float[,]arr2; //聲明一個浮點型的二維數(shù)組

string[,]arr3; //聲明一個字符串型的二維數(shù)組

與一維數(shù)組一樣,以上定義的二維數(shù)組并不為數(shù)組元素分配內(nèi)存空間。4.3.2初始化二維數(shù)組

1.靜態(tài)初始化

二維數(shù)組靜態(tài)初始化格式與一維數(shù)組一樣。靜態(tài)二維數(shù)組的格式為:

數(shù)據(jù)類型[,]數(shù)組名={{元素[0,0],元素[0,1],…,元素[0,n-1]}

{元素[1,0],元素[1,1],…,元素[1,n-1]},

?{……},

{元素[n-1,0],元素[n-1,1],…,元素[n-1,n-1]}

};靜態(tài)初始化數(shù)組時可以不指出數(shù)組的行數(shù)和列數(shù),在最外一層“{}”內(nèi),每一個“{}”對應(yīng)一行數(shù)組元素,所以最外層“{}”內(nèi)的“{}”個數(shù)決定了行數(shù),而每一行的數(shù)據(jù)個數(shù)決定了多維數(shù)組的列數(shù)。

例如:

//定義一個3行2列的整型二維數(shù)組并對其靜態(tài)初始化

int[,]a={{1,3},{7,4},{10,21}};

//定義一個2行2列的字符串二維數(shù)組并對其靜態(tài)初始化

string[,]arr2={{"甲","乙"},{"冠軍","亞軍"}};

靜態(tài)初始化二維數(shù)組時,也必須與數(shù)組定義結(jié)合在一條語句中,否則會出錯。

2.動態(tài)初始化

動態(tài)初始化數(shù)組也需要使用new關(guān)鍵字為數(shù)組元素分配內(nèi)存空間,并為數(shù)組元素賦初值。動態(tài)初始化格式如下:

數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度1,數(shù)組長度2];

其中“數(shù)組長度1”和“數(shù)組長度2”可以是整型的常量或變量,分別表示數(shù)組的第一維和第二維的長度。new關(guān)鍵字仍然是以默認值0來初始化數(shù)組元素的。

在程序設(shè)計中,通常也將數(shù)組定義與動態(tài)初始化合并在一條語句中,格式為:

數(shù)據(jù)類型[,]數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度1,數(shù)組長度2];例如:

int[,]a=newint[2,3];//定義了一個2行3列的二維數(shù)組

在動態(tài)初始化二維數(shù)組時,也可直接為其賦不同的初始值。例如:

int[,]a=newint[,]{{1,2,3},{3,2,5}};

int[,]arr1=newint[2,4]{{1,2,3,4},{5,6,7,8}};

string[,]arr2=newstring[2,2]{{"某甲","某乙"},{"冠軍","亞軍"}};

4.3.3引用二維數(shù)組元素

與一維數(shù)組類似,二維數(shù)組也是通過數(shù)組名和下標(biāo)值來訪問數(shù)組元素的。唯一與一維數(shù)組不同的是,二維數(shù)組需由兩個下標(biāo)來標(biāo)識一個數(shù)組元素,二維數(shù)組的引用形式為:

數(shù)組名[下標(biāo)1,下標(biāo)2]

其中:“下標(biāo)1”表示元素所在的行,“下標(biāo)2”表示元素所在的列,兩個下標(biāo)都應(yīng)是整數(shù)或整數(shù)類型的變量、表達式。二維數(shù)組的下標(biāo)也是從0開始算起的。

例如:a[2,3]表示是a數(shù)組的第3行、第4個元素。通常,a[i,j]表示是數(shù)組的第i+1行、j+l列元素(因為下標(biāo)從0算起)。數(shù)組的下標(biāo)使用范圍不要超過數(shù)組定義的相應(yīng)維長度,否則程序編譯會出現(xiàn)異常,所以在編程時一定要嚴(yán)格區(qū)分多維數(shù)組每一維的長度和相應(yīng)每一維最后一個元素的下標(biāo)之間的關(guān)系,系統(tǒng)默認它們的關(guān)系是:某一維的最后一個元素的下標(biāo)為這一維的長度減1。

根據(jù)二維數(shù)組的特點,訪問二維數(shù)組中的元素需要通過二重循環(huán)。【例4-5】求一個3?×?3矩陣的對角線元素之和。

usingSystem;

classProgram

{

publicstaticvoidMain(String[]args)

{

int[,]A={{1,2,3},{4,5,6},{7,8,9}};

intsum=0;

//輸出數(shù)組所有元素

for(inti=0;i<3;i++)

{

for(intj=0;j<3;j++)

{Console.Write("{0}\t",A[i,j]);

}

Console.WriteLine();

}

//求對角線元素之和

for(inti=0;i<3;i++)

sum=sum+A[i,i];

Console.WriteLine("對角線和為{0}",sum);

Console.ReadLine();

}

}

運行結(jié)果如圖4-5所示。圖4-5例4-5運行結(jié)果

【例4-6】用二維數(shù)組存放表4-1的學(xué)生成績信息并輸出。

采用二維數(shù)組來存儲學(xué)生信息,其中第一維表示學(xué)生的個數(shù),因此第一維的長度為3;第二維的長度與每個學(xué)生的信息數(shù)相對應(yīng),這里為學(xué)號、姓名、語文成績與英語成績,因此第二維的長度為4。usingSystem;

classProgram

{

staticvoidMain(string[]args)

{

string[,]student=newstring[3,4]

{{"1","李明","77","78"},{"2","劉勇","82","89"},{"3","張三","80","88"}};

Console.WriteLine("學(xué)號\t姓名\t語文\t英語");

for(inti=0;i<3;i++)

{

Console.WriteLine("{0}\t{1}\t{2}\t{3}",student[i,0],student[i,1],student[i,2],student[i,3]);

}

}

}

運行結(jié)果如圖4-6所示。圖4-6例4-6運行結(jié)果下面用二維數(shù)組來存儲學(xué)生信息,實現(xiàn)學(xué)生成績管理系統(tǒng)的主要功能,如學(xué)生信息的錄入、查詢以及輸出,按語文成績排序的功能此處只作簡單的輸出提示,具體將在后面版本實現(xiàn)。參考運行界面如圖4-7至圖4-10所示。4.4學(xué)生信息的數(shù)據(jù)存儲與處理圖4-7運行界面圖4-8輸入學(xué)生成績圖4-9顯示學(xué)生成績圖4-10查詢學(xué)生成績學(xué)生成績管理系統(tǒng)V2.0代碼的實現(xiàn)步驟如下:

usingSystem;

publicclassGradeManage

{

publicstaticvoidMain()

{

constintCOUNT=100;//最多處理100位學(xué)生信息

string[,]student=newstring[COUNT,4];//student用于保存學(xué)生信息

intpos=0;

do

{

Console.WriteLine(" ***學(xué)生成績管理系統(tǒng)***\n");

Console.WriteLine(" 1---輸入學(xué)生記錄");

Console.WriteLine(" 2---顯示所有成績");

Console.WriteLine(" 3---查詢學(xué)生成績");

Console.WriteLine(" 4---退出");

Console.Write(" 請選擇:");

intchoice=int.Parse(Console.ReadLine());

switch(choice)

{

case1:

//錄入學(xué)生信息

do{

Console.Write("請輸入學(xué)號:");

student[pos,0]=Console.ReadLine();

Console.Write("請輸入姓名:");

student[pos,1]=Console.ReadLine();

Console.Write("請輸入語文成績:");

student[pos,2]=Console.ReadLine();

Console.Write("請輸入英語成績:");

student[pos,3]=Console.ReadLine();

pos++;

if(pos>=COUNT)

{

break;

}Console.Write("是否繼續(xù)輸入?(y/n)");

}while(char.Parse(Console.ReadLine())=='y');

break;

case2:

Console.WriteLine("顯示學(xué)生成績:");

Console.WriteLine("學(xué)號\t姓名\t語文\t英語");

for(inti=0;i<pos;i++)

{

Console.WriteLine("{0}\t{1}\t{2}\t{3}",student[i,0],student[i,1],student[i,2],student[i,3]);

}break;

case3:

boolfind=false;

Console.WriteLine("請輸入姓名:");

stringname=Console.

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論