版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湘教版二年級語文上冊階段測試試卷含答案
- 2025年新世紀(jì)版選修6地理下冊階段測試試卷
- 智慧林業(yè)大數(shù)據(jù)云平臺建設(shè)和運營整體解決方案
- 2025年外研版2024九年級科學(xué)上冊月考試卷含答案
- 2024版工程建設(shè)施工廉政合同
- 2025年蘇教版三年級語文上冊月考試卷含答案
- 2024年貴州工業(yè)職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 2025年冀教新版高三數(shù)學(xué)上冊月考試卷
- 2025年北師大版八年級數(shù)學(xué)上冊階段測試試卷含答案
- 二零二五年茶山茶葉收購與加工合作協(xié)議3篇
- 護理用藥安全管理課件(圖文)
- 2024年大學(xué)計算機基礎(chǔ)考試題庫附答案(完整版)
- 八年級下冊英語單詞默寫打印版
- 培訓(xùn)課件核電質(zhì)保要求
- 鐵路防洪安全教育培訓(xùn)
- 履帶輪組式電動多功能輪椅設(shè)計說明書樣本
- 建筑勞務(wù)合作協(xié)議書范本.文檔
- 基于Internet的銀行競爭情報收集系統(tǒng)的研究與實現(xiàn)的中期報告
- 泌尿外科利用PDCA循環(huán)降低持續(xù)膀胱沖洗患者膀胱痙攣的發(fā)生率品管圈QCC成果匯報
- GB/T 43430-2023藏香
- 醫(yī)療設(shè)備、器械項目實施方案、服務(wù)實施方案
評論
0/150
提交評論