




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第4章數(shù)組
4.1任務描述4.2一維數(shù)組4.3二維數(shù)組4.4學生信息的數(shù)據(jù)存儲與處理4.5習題在學生成績管理系統(tǒng)中,我們要錄入許多學生的信息,包括學號、姓名、語文成績與英語成績,如表4-1所示。
如果所有這些數(shù)據(jù),都分別用一個單獨的變量來存儲,那么,需要定義的變量非常多,不利于處理。我們可以利用C#語言提供的數(shù)組這種數(shù)據(jù)類型,來解決學生數(shù)據(jù)的存儲問題。
數(shù)組可以是一維數(shù)組,也可以是多維數(shù)組。存儲二維表格的學生數(shù)據(jù)需要使用二維數(shù)組,下面先介紹一維數(shù)組的使用,在此基礎上再介紹二維數(shù)組。4.1任務描述表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ù)組分配內存空間)后才能使用。初始化數(shù)組有兩種方法:靜態(tài)初始化和動態(tài)初始化。
1.靜態(tài)初始化
如果數(shù)組中包含的元素不多,且初始元素值是已知的,則可以采用靜態(tài)初始化方法。
靜態(tài)初始化數(shù)組時,必須與數(shù)組定義結合在一起,否則會出錯。靜態(tài)初始化格式如下:
數(shù)據(jù)類型[]數(shù)組名={元素1,元素2,…元素n};用這種方法對數(shù)組進行初始化,無需說明數(shù)組元素的個數(shù),只需按順序列出數(shù)組中全部元素即可,系統(tǒng)會自動計算并分配數(shù)組所需的內存空間。
例如:
int[]arry={1,2,3,4};
string[]str={"優(yōu)","良","差"};
2.動態(tài)初始化
動態(tài)初始化需用new關鍵字將數(shù)組實例化為一個對象,再為該數(shù)組對象分配內存空間并為數(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)初始化結合在一起
new運算符用來為數(shù)組對象在內存中分配一定的空間。?數(shù)組占據(jù)的內存空間由數(shù)組的數(shù)據(jù)類型和表達式的數(shù)值共同決定。
例如:
//定義了一個名為arr的整型數(shù)組,只進行聲明,需要時再實例化
int[]arr;
//進行實例化,為arrv數(shù)組在內存中分配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ù)組定義結合在一條語句中,否則程序會出錯。
(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ù)組元素
當定義完一個數(shù)組并對其初始化后,就可以引用數(shù)組中的元素了。可通過數(shù)組名和元素的下標來引用數(shù)組元素。
一維數(shù)組的引用方式是:
數(shù)組名[下標];數(shù)組的下標是元素的索引值,代表了要被訪問的數(shù)組元素在內存中的相對位置,就是從數(shù)組的第1個元素到某個數(shù)組元素的偏移量。數(shù)組元素的索引是從0而不是1開始的,如數(shù)組arr的第1個元素是arr[0],第2個元素是arr[1],依次類推,第n個元素是arr[n-l]。
在訪問數(shù)組元素時,要注意不要使下標越界,例如:
int[]A=newint[5];
A[5]=15;//錯誤,下標越界【例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]);
}
}
}
運行結果如圖4-1所示。圖4-1例4-1運行結果【例4-2】輸入幾位學生的成績,輸出最高成績。
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]) //如果當前元素a[i]比max大
{
max=grades[i]; //把當前元素a[i]的值賦給max
}
i++;
}
Console.WriteLine("最高分為:"+max);
Console.ReadLine();
}
}
運行結果如圖4-2所示。圖4-2例4-2運行結果
【例4-3】使用“冒泡”法進行排序(由小到大)。
冒泡排序又稱簡單交換排序。其基本思想是對存放原始數(shù)據(jù)的數(shù)組,按從后往前的方向進行多次掃描,每次掃描稱為一趟排序,當發(fā)現(xiàn)相鄰兩個數(shù)據(jù)的次序與排序要求不符時,將這兩個數(shù)據(jù)交換。這樣,較小的數(shù)據(jù)就會逐單元往前移動,好象氣泡往上浮一樣。
如圖4-3所示?,F(xiàn)有5個數(shù),第1趟將9和7對調,然后將9和4對調,得到3→8→7→4→9的順序,可以看出:最大的數(shù)9已“沉底”,成為最下面一個數(shù);而小的數(shù)“上升”,如4向上“浮起”一個位置,所以這種排序方法叫“冒泡”法。經過一趟得到最大的數(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++) //顯示排序后的結果
{
Console.Write("{0}\t",a[j]);
}
Console.WriteLine();
}
Console.WriteLine("--------------排序后的結果--------------");
for(intj=0;j<n;j++) //顯示排序后的結果
{
Console.Write("{0}\t",a[j]);
}
Console.Read();
}
}
運行結果如圖4-3所示。圖4-3例4-3運行結果4.2.4使用foreach遍歷數(shù)組
foreach語句列舉出一個集合(collection)中的所有元素,并執(zhí)行關于集合中每個元素的嵌套語句。foreach語句的格式如下:
foreach(變量類型迭代變量in集合表達式)
{
循環(huán)體語句塊
}語句中的“迭代變量”是一個循環(huán)變量,在循環(huán)中,該變量依次獲取數(shù)組中各元素的值。因此,對于依次獲取數(shù)組中各元素值的操作,使用這種循環(huán)語句就很方便。要注意,“迭代變量”的類型必須與數(shù)組的類型一致。
foreach語句遍歷數(shù)組雖然很方便,但其功能受一定的限制。例如,如果想為數(shù)組各元素依次有規(guī)律地賦值,foreach循環(huán)將無能為力?!纠?-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);
}
}
運行結果如圖4-4所示。圖4-4例4-4運行結果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ù)組元素分配內存空間。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ù),在最外一層“{}”內,每一個“{}”對應一行數(shù)組元素,所以最外層“{}”內的“{}”個數(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ù)組定義結合在一條語句中,否則會出錯。
2.動態(tài)初始化
動態(tài)初始化數(shù)組也需要使用new關鍵字為數(shù)組元素分配內存空間,并為數(shù)組元素賦初值。動態(tài)初始化格式如下:
數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度1,數(shù)組長度2];
其中“數(shù)組長度1”和“數(shù)組長度2”可以是整型的常量或變量,分別表示數(shù)組的第一維和第二維的長度。new關鍵字仍然是以默認值0來初始化數(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ù)組名和下標值來訪問數(shù)組元素的。唯一與一維數(shù)組不同的是,二維數(shù)組需由兩個下標來標識一個數(shù)組元素,二維數(shù)組的引用形式為:
數(shù)組名[下標1,下標2]
其中:“下標1”表示元素所在的行,“下標2”表示元素所在的列,兩個下標都應是整數(shù)或整數(shù)類型的變量、表達式。二維數(shù)組的下標也是從0開始算起的。
例如:a[2,3]表示是a數(shù)組的第3行、第4個元素。通常,a[i,j]表示是數(shù)組的第i+1行、j+l列元素(因為下標從0算起)。數(shù)組的下標使用范圍不要超過數(shù)組定義的相應維長度,否則程序編譯會出現(xiàn)異常,所以在編程時一定要嚴格區(qū)分多維數(shù)組每一維的長度和相應每一維最后一個元素的下標之間的關系,系統(tǒng)默認它們的關系是:某一維的最后一個元素的下標為這一維的長度減1。
根據(jù)二維數(shù)組的特點,訪問二維數(shù)組中的元素需要通過二重循環(huán)?!纠?-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();
}
}
運行結果如圖4-5所示。圖4-5例4-5運行結果
【例4-6】用二維數(shù)組存放表4-1的學生成績信息并輸出。
采用二維數(shù)組來存儲學生信息,其中第一維表示學生的個數(shù),因此第一維的長度為3;第二維的長度與每個學生的信息數(shù)相對應,這里為學號、姓名、語文成績與英語成績,因此第二維的長度為4。usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
string[,]student=newstring[3,4]
{{"1","李明","77","78"},{"2","劉勇","82","89"},{"3","張三","80","88"}};
Console.WriteLine("學號\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]);
}
}
}
運行結果如圖4-6所示。圖4-6例4-6運行結果下面用二維數(shù)組來存儲學生信息,實現(xiàn)學生成績管理系統(tǒng)的主要功能,如學生信息的錄入、查詢以及輸出,按語文成績排序的功能此處只作簡單的輸出提示,具體將在后面版本實現(xiàn)。參考運行界面如圖4-7至圖4-10所示。4.4學生信息的數(shù)據(jù)存儲與處理圖4-7運行界面圖4-8輸入學生成績圖4-9顯示學生成績圖4-10查詢學生成績學生成績管理系統(tǒng)V2.0代碼的實現(xiàn)步驟如下:
usingSystem;
publicclassGradeManage
{
publicstaticvoidMain()
{
constintCOUNT=100;//最多處理100位學生信息
string[,]student=newstring[COUNT,4];//student用于保存學生信息
intpos=0;
do
{
Console.WriteLine(" ***學生成績管理系統(tǒng)***\n");
Console.WriteLine(" 1---輸入學生記錄");
Console.WriteLine(" 2---顯示所有成績");
Console.WriteLine(" 3---查詢學生成績");
Console.WriteLine(" 4---退出");
Console.Write(" 請選擇:");
intchoice=int.Parse(Console.ReadLine());
switch(choice)
{
case1:
//錄入學生信息
do{
Console.Write("請輸入學號:");
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("顯示學生成績:");
Console.WriteLine("學號\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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國棉織睡袋數(shù)據(jù)監(jiān)測研究報告
- 15籃球運球 教學設計 -九年級體育與健康
- 大型儀器服務平臺升級改造數(shù)據(jù)管理與存儲方案
- 二零二五年度水稻種植戶風險共擔收購合同
- 二零二五年度勞動合同與用工單位員工離職交接與檔案管理合同
- 二零二五年度知識產權侵權案件和解協(xié)議
- 二零二五年度承包油茶種植基地土地承包與品牌推廣合同
- 二零二五年度防盜門品牌形象設計與授權合同
- 《書憤》教學設計 2024-2025學年統(tǒng)編版高中語文選擇性必修中冊
- 二零二五年度宅基地使用權轉讓與農村醫(yī)療衛(wèi)生服務體系合作協(xié)議
- 2025年度光伏電站光伏組件回收處理合同示范文本
- 2025年春季少先隊工作計劃及安排表(附:少先隊每月工作安排表)
- 中央2025年公安部部分直屬事業(yè)單位招聘84人筆試歷年參考題庫附帶答案詳解
- CWAN 0043-2021攪拌摩擦焊攪拌頭設計及制造標準
- 教學課件:《公共關系學》(本科)
- 劉聰版在燦爛陽光下鋼琴伴奏譜簡譜版
- 2025年春新人教PEP版英語三年級下冊全冊教學課件
- 體育老師籃球說課
- 化學-江蘇省蘇州市2024-2025學年2025屆高三第一學期學業(yè)期末質量陽光指標調研卷試題和答案
- 浙江省金華市義烏市2024年中考語文二模試卷含答案
- GB/T 45015-2024鈦石膏綜合利用技術規(guī)范
評論
0/150
提交評論