數(shù)組
世上最甜美的歡樂(lè) 都是憂(yōu)傷的果實(shí)。
人間最純美的東西 都是從苦難中來(lái)的儿礼。
我們沒(méi)有經(jīng)歷過(guò)的艱難 怎么懂得去安慰別人咖杂。
--來(lái)自《圣經(jīng)》
一、 為什么使用數(shù)組
(一) 問(wèn)題
一次語(yǔ)文測(cè)試后,老師讓班長(zhǎng)統(tǒng)計(jì)每一個(gè)學(xué)生的成績(jī)并計(jì)算全班(全班共60人)的平均成績(jī),然后把所有成績(jī)顯示出來(lái).
(二) 實(shí)現(xiàn)代碼
int stu1 = 95;
int stu2 = 89;
int stu3 = 79;
int stu4 = 64;
int stu5 = 76;
int stu6 = 88;
……
avg = (stu1+stu2+stu3+stu4+stu5…+stu60)/30;
(三) 缺陷
上面的代碼缺陷很明顯蚊夫,
首先定義的變量太多了诉字,如果存儲(chǔ)10000個(gè)學(xué)生的成績(jī),難道真要定義10000個(gè)變量嗎~
另外不利于數(shù)據(jù)處理,比如求所有成績(jī)之和或最高分壤圃、輸出所有成績(jī)陵霉,就需要把所有的變量名都寫(xiě)出來(lái),這顯示不是一個(gè)好方法伍绳。
二踊挠、 C#中的數(shù)組
(一) 數(shù)組的存儲(chǔ)
在C#中,數(shù)據(jù)就是一個(gè)變量墨叛,用于將相同數(shù)據(jù)類(lèi)型的數(shù)據(jù)存儲(chǔ)在內(nèi)存當(dāng)中止毕,也就是說(shuō),數(shù)組中的每個(gè)數(shù)據(jù)元素都屬于同一種數(shù)據(jù)類(lèi)型漠趁。
在前面扁凛,我們已經(jīng)學(xué)過(guò)了,聲明一個(gè)變量就是在內(nèi)存空間分配一塊合適的空間闯传,然后將數(shù)據(jù)存儲(chǔ)在這個(gè)空間中谨朝。
聲明一個(gè)變量,就是在內(nèi)存空間劃出一塊合適的空間
聲明一個(gè)數(shù)組甥绿,就是在內(nèi)存空間劃出一串連續(xù)的空間
(二) 數(shù)組基本要素
(1) . 標(biāo)識(shí)符:數(shù)組的名稱(chēng)字币,用于區(qū)分不同的數(shù)組
(2) . 數(shù)組元素:向數(shù)組中存放的數(shù)據(jù)
(3) . 元素下標(biāo):對(duì)數(shù)組元素進(jìn)行編號(hào),從0開(kāi)始共缕,數(shù)組中的每個(gè)元素都可以通過(guò)下標(biāo)來(lái)訪(fǎng)問(wèn)
(4) . 元素類(lèi)型:數(shù)組元素的數(shù)據(jù)類(lèi)型
數(shù)組長(zhǎng)度固定不變洗出,避免數(shù)組越界
(三) 練習(xí)
使用數(shù)組的好處是什么?
下列哪組數(shù)據(jù)能存儲(chǔ)在數(shù)組中图谷?數(shù)組的類(lèi)型是什么翩活?
(1) . “劉星”,“夏雨”便贵,“夏雪”
(2) . 8菠镇,98,“c”承璃,23
(3) . 98.1利耍,341.2,34.3
(四) 總結(jié)
數(shù)組中的所有元素必須屬于相同的數(shù)據(jù)類(lèi)型
三盔粹、 如何使用數(shù)組【以一維數(shù)組為例】
(一) 使用數(shù)組的四步聲明數(shù)組
int[] myarr;分配空間
聲明數(shù)組并不實(shí)際創(chuàng)建它們隘梨,在C#語(yǔ)言中,使用new關(guān)鍵字創(chuàng)建數(shù)組的對(duì)象玻佩。
myarr = new int[5];賦值
myarr[0] = 1;處理數(shù)據(jù)
myarr[0] = myarr[0] * 10;
(二) 聲明數(shù)組
告訴計(jì)算機(jī)數(shù)據(jù)類(lèi)型是什么語(yǔ)法
數(shù)據(jù)類(lèi)型[ ] 數(shù)組名 ;
注意:
聲明數(shù)組時(shí)不規(guī)定數(shù)組長(zhǎng)度舉例
int score2[ ]; //C#成績(jī)
String[ ] name; //學(xué)生姓名
(三) 分配空間
告訴計(jì)算機(jī)分配幾個(gè)連續(xù)的空間語(yǔ)法
聲明與分配空間分離
int[] myarr;
myarr = new int[5];
聲明數(shù)組并分配空間
數(shù)據(jù)類(lèi)型[ ] 數(shù)組名 = new 數(shù)據(jù)類(lèi)型[大小] ;
(四) 賦值
向分配的格子里放數(shù)據(jù)語(yǔ)法
方法1:邊聲明邊賦值
int[] score = { 89, 79, 76 };
int[] score2 = new int[] { 89, 79, 76 }; //不能指定長(zhǎng)度
方法2:動(dòng)態(tài)地從鍵盤(pán)上錄入信息并賦值
for (int i = 0; i < 60; i++)
{
score[i] = Convert.ToInt32(Console.ReadLine());
}
(五) 對(duì)數(shù)據(jù)進(jìn)行處理訪(fǎng)問(wèn)數(shù)組的語(yǔ)法
訪(fǎng)問(wèn)數(shù)組成員:使用“標(biāo)識(shí)符[下標(biāo)]”
數(shù)組名[下標(biāo)]
C#中的數(shù)組下標(biāo)是從0開(kāi)始的出嘹,下標(biāo)最大值是數(shù)組長(zhǎng)度減1舉例:計(jì)算5位學(xué)生的平均分
常規(guī)做法
int [ ] score = {60, 80, 90, 70, 85};
double avg;
avg = (score[0] + score[1] + score[2] + score[3] + score[4])/5;
循環(huán)+數(shù)組
(六) 練習(xí)
練習(xí)1
需求
現(xiàn)在使用數(shù)組解決課程開(kāi)始遺留下來(lái)的問(wèn)題,為了簡(jiǎn)單起見(jiàn)咬崔,先計(jì)算機(jī)5位學(xué)員的平均分税稼。
參考代碼
try
{
int[] scores = new int[5]; //成績(jī)數(shù)組
int sum = 0; //成績(jī)總和
Console.WriteLine("請(qǐng)輸入5位學(xué)員的成績(jī):");
for (int i = 0; i < scores.Length; i++)
{
scores[i] = Convert.ToInt32(Console.ReadLine());
sum = sum + scores[i]; //成績(jī)累加
}
Console.WriteLine("平均分是:" + (double)sum / scores.Length);
}
catch
{
Console.WriteLine("輸入格式錯(cuò)誤");
}
Console.ReadKey();練習(xí)2:
需求
有一個(gè)數(shù)列:8烦秩,4,2郎仆,1只祠,23,344扰肌,12
(1) . 循環(huán)輸出數(shù)列的值
(2) . 求數(shù)列中所有數(shù)值的和
(3) . 猜數(shù)游戲:從鍵盤(pán)中任意輸入一個(gè)數(shù)據(jù)抛寝,判斷數(shù)列中是否包含此數(shù)
參考代碼
//定義并賦值數(shù)組
int[] arr = { 8,4,2,1,23,344,12 };
//輸出數(shù)列中的值
foreach (var item in arr)
{
Console.Write(item+",");
}
int sum = 0;
foreach (var item in arr)
{
sum += item;
}
Console.WriteLine("\n");
Console.WriteLine("數(shù)組所有數(shù)值的和為{0}", sum);
//判斷
int temp = Convert.ToInt32(Console.ReadLine());
for (int i = 0; i < arr.Length; i++)
{
if (temp == arr[i])
{
Console.WriteLine("{0}在數(shù)組中存在", temp);
break;
}
if (i == arr.Length - 1)
{
Console.WriteLine("{0}在數(shù)組中不存在", temp);
}
}
(七) 常見(jiàn)錯(cuò)誤為數(shù)組分配空間時(shí),沒(méi)有指明數(shù)組大小
int[ ] score = new int[ ]; //編譯出錯(cuò)曙旭,沒(méi)有指明數(shù)組大小
score[0] = 89;
score[1] = 63;數(shù)組越界
int[ ] scores = new int[2];
scores[0] = 90;
scores[1] = 85;
scores[2] = 65; //編譯出錯(cuò)盗舰,數(shù)組越界-
賦值時(shí)機(jī)出錯(cuò)
int[ ] score = new int[5];
score = {60, 80, 90, 70, 85}; //正確int[ ] score2;
score2 = {60, 80, 90, 70, 85}; //編譯出錯(cuò),創(chuàng)建數(shù)組并賦值方式必須在一條語(yǔ)句中完成
(八) 作業(yè) 作業(yè)1:顯示商品名稱(chēng)
需求
在控制臺(tái)顯示5件特價(jià)商品名稱(chēng)
實(shí)現(xiàn)思路:
(1) . 創(chuàng)建一個(gè)長(zhǎng)度為5的String數(shù)組桂躏,存儲(chǔ)商品名稱(chēng)钻趋。
(2) . 使用循環(huán)輸出商品名稱(chēng)
- 作業(yè)2:購(gòu)物金額結(jié)算
需求說(shuō)明
以表格的形式輸出5筆購(gòu)物金額及總金額
提示說(shuō)明
步驟:
1.創(chuàng)建一個(gè)長(zhǎng)度為5的 double類(lèi)型數(shù)組,存儲(chǔ)購(gòu)物金額剂习。
2.循環(huán)輸入五筆購(gòu)物金額蛮位, 并累加總金額。
3.利用循環(huán)輸出五筆購(gòu)物金額鳞绕,最后輸出總金額失仁。
數(shù)組(二)
一、 數(shù)組的應(yīng)用
(一) 冒泡排序
冒泡排序是一種簡(jiǎn)單的排序算法们何。它重復(fù)地走訪(fǎng)過(guò)要排序的數(shù)列萄焦,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過(guò)來(lái)冤竹。走訪(fǎng)數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換楷扬,也就是說(shuō)該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來(lái)是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端贴见。
1. 算法描述
比較相鄰的元素。如果第一個(gè)比第二個(gè)大躲株,就交換它們兩個(gè)片部;
對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)霜定,這樣在最后的元素應(yīng)該會(huì)是最大的數(shù)档悠;
針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)望浩;
重復(fù)步驟1~3辖所,直到排序完成。
2. 動(dòng)圖演示
https://images2017.cnblogs.com/blog/849589/201710/849589-20171015223238449-2146169197.gif
3. 分析過(guò)程
int[] nums={9,8,7,6,5,4,3,2,1,0}; 0,1,2,3,4,5,6,7,8,9
第一趟比較:8 7 6 5 4 3 2 1 0 9 交換了9次
第二趟比較:7 6 5 4 3 2 1 0 8 9 交換了8次
第三趟比較:6 5 4 3 2 1 0 7 8 9 交換了7次
第四趟比較:5 4 3 2 1 0 6 7 8 9 交換了6次
第五趟比較:4 3 2 1 0 5 6 7 8 9 交換了5次
第六趟比較:3 2 1 0 4 5 6 7 8 9 交換了4次
第七趟比較:2 1 0 3 4 5 6 7 8 9 交換了3次
第八趟比較:1 0 2 3 4 5 6 7 8 9 交換了2次
第九趟比較:0 1 2 3 4 5 6 7 8 9 交換了1次
4. 代碼演示
int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
for (int i = 0; i < nums.Length-1; i++) //比較的次數(shù)
{
for (int j = 0; j < nums.Length-1-i; j++) //交換的次數(shù)
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
(二) Array
Array 類(lèi)是 C# 中所有數(shù)組的基類(lèi)磨德,它是在 System 命名空間中定義缘回。
1. 方法
Sort(Array)****:使用數(shù)組的每個(gè)元素的 IComparable 實(shí)現(xiàn)來(lái)排序整個(gè)一維數(shù)組中的元素吆视。
Reverse(Array):逆轉(zhuǎn)整個(gè)一維數(shù)組中元素的順序。
IndexOf(Array, Object):搜索指定的對(duì)象酥宴,返回整個(gè)一維數(shù)組中第一次出現(xiàn)的索引啦吧。
2. 演示
int[] list = { 34, 72, 13, 44, 25, 30, 10 };
Console.Write("原始數(shù)組: ");
foreach (int i in list)
{
Console.Write(i + " ");
}
Console.WriteLine();
// 逆轉(zhuǎn)數(shù)組
Array.Reverse(list);
Console.Write("逆轉(zhuǎn)數(shù)組: ");
foreach (int i in list)
{
Console.Write(i + " ");
}
Console.WriteLine();
// 排序數(shù)組
Array.Sort(list);
Console.Write("排序數(shù)組: ");
foreach (int i in list)
{
Console.Write(i + " ");
}
Console.WriteLine();
(三) 練習(xí)
1. 練習(xí)1
需求
定義一個(gè)大小為10的整型數(shù)組,用隨機(jī)產(chǎn)生的數(shù)據(jù)為數(shù)組元素賦值拙寡,并將它們按從大到小的順序排列
參考代碼
Random 類(lèi)
Random類(lèi)默認(rèn)的無(wú)參構(gòu)造函數(shù)可以根據(jù)當(dāng)前系統(tǒng)時(shí)鐘為種子,進(jìn)行一系列算法得出要求范圍內(nèi)的偽隨機(jī)數(shù)
Random rd = new Random()
rd.next(1,10)(生成1~10之間的隨機(jī)數(shù)授滓,不包括10)
2. 練習(xí)2
需求
<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"><v:formulas></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path></v:stroke></v:shapetype><v:shape id="圖片_x0020_16" o:spid="_x0000_i1027" type="#_x0000_t75" alt="圖8.13.BMP" style="width:257.25pt;height:211.5pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" o:title="圖8.13"></v:imagedata></v:shape>
步驟:
1.定義數(shù)組存儲(chǔ)價(jià)格,并利用循環(huán)輸入肆糕。
2.定義變量min保存當(dāng)前的最低價(jià)般堆。
3. 將min和數(shù)組中的其余元素依次比較。
(四) 作業(yè)
1. 需求
實(shí)現(xiàn)用戶(hù)隨機(jī)輸入6個(gè)整數(shù)诚啃,按從大到小排列
<v:shape id="Picture_x0020_2" o:spid="_x0000_i1026" type="#_x0000_t75" alt="Snap1" style="width:229.5pt;
height:131.25pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image002.png" o:title="Snap1" grayscale="t"></v:imagedata></v:shape>
2. 實(shí)現(xiàn)思路
定義數(shù)組存放用戶(hù)輸入的數(shù)據(jù)
使用冒泡排序算法
循環(huán)輸出交換后的數(shù)組
二淮摔、 二維數(shù)組
(一) 值類(lèi)型和引用類(lèi)型
1. 描述
前面介紹的基本數(shù)據(jù)類(lèi)型都是值類(lèi)型,到目前為止绍申,我們學(xué)過(guò)的引用類(lèi)型只有字符串和數(shù)組噩咪,那么值類(lèi)型和引用類(lèi)型有什么區(qū)別呢?
值類(lèi)型的存儲(chǔ)空間是分配在棧(stack)中极阅,引用類(lèi)型的存儲(chǔ)空間是分配在堆(heap)中胃碾。數(shù)組屬于引用類(lèi)型,所以如下代碼代表的意思是:
int[] arr = { 1, 3, 5, 7, 9 };
數(shù)組的各個(gè)元素在中分配筋搏,并按順序依次排列仆百。而變量arr分配于棧上,它存放的是一個(gè)內(nèi)存地址的指針奔脐,這個(gè)指針指向堆中數(shù)組元素的地址俄周。
也就是說(shuō),可以通過(guò)變量arr找到堆上的數(shù)組元素髓迎。
<v:shape id="圖片_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75" style="width:191.25pt;height:108.75pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png" o:title=""></v:imagedata></v:shape>
2. 演示
下面通過(guò)例子來(lái)演示值類(lèi)型和引用類(lèi)型的區(qū)別
代碼
/**
值類(lèi)型演示
*/
int num1 = 100;
int num2 = num1;
num1 = 50;
Console.WriteLine("num1={0},num2={1}", num1, num2);
/**
引用類(lèi)型的演示
*/
int[] arr1 = { 1, 3, 5, 7, 9 };
int[] arr2 = arr1;
arr1[0] = 500;
Console.Write("arr1的值是");
for (int i = 0; i < arr1.Length; i++)
{
Console.Write(arr1[i] + ",");
}
Console.Write("arr2的值是");
for (int i = 0; i < arr2.Length; i++)
{
Console.Write(arr2[i] + ",");
}
分析過(guò)程
(二) 二維數(shù)組
1. 概念
二維組有兩索引(索引號(hào)都是從0開(kāi)始)峦朗,其中一個(gè)表示行,一個(gè)表示列排龄。從概念上講波势,二維數(shù)組就像一個(gè)具有行和列的表格一樣。
te>