一、什么是數組
數組用於存儲若干相同類型的數據。在本章將介紹什么是數組以及數組的使用方法。了解數組之
后,將學習 foreach 循環以及數組的應用。
數組是一種數據結構,包含同一種類型的多個元素。也就是說,數組是用於存儲多個相同類型數
據的集合。
假設現在有這樣的需求,接收 10 位學生的計算機成績,最后輸出每個學生的成績以及計算平均
分。按照我們學習過的知識,可以寫出如下的代碼來存儲每個學生的成績:
int n1,n2,n3,…,n10; //定義10個變量
其實從這句代碼中,我們可以看出這樣的缺點:所需要的變量太多,如果人數是 100 個,那么這
種寫法更加不切實際。我們就需要使用數組來存儲這樣的同種類型的多個數據。

二、一維數組
C#支持一維數組、多維數組等。在實際應用中,一維數組被廣泛使用。

2.1. 數組的聲明
一維數組聲明的語法如下:
數據類型 [] 數組名稱;
數據類型就是 int、char、float、double、string 等,代表了整個數組存放的元素的類型。數組
名稱由用戶自定義,不過跟變量名的取名一樣,也要遵循命名規則,如下代碼:
char[] chs; //定義了一個字符類型數組chs int[] nums; //定義了一個int類型數組nums
2.2. 數組的初始化
C#中的數組只有定義是不夠的,數組必須初始化后才能使用。數組的初始化有幾種常見的方式:
(1)指定數組存儲的元素序列,語法格式如下:
數據類型 [] 數組名稱 ={ 值 1, 值 2, 值 3, …, , 值 n};
(2)指定數組的長度,使用 new 關鍵字初始化數組,語法格式如下:
數據類型 [] 數組名稱 =new 數據類型[ [ 長度 ];
數組的長度,代表數組存儲元素的個數,可以是常量或變量,但如果是變量,變量必須先賦值。
在使用數組過程中,下面的寫法都是正確的。
int[] a1={1,2,3}; //第一種方式,長度為3(因為初始化了3個值) int[] a2=new int[4]; //第二種方式,長度為4 int[] a3=new int[4]{1,3,5,7}; //兩種形式的結合,數組長度必須和元素個數匹配 int[] a4=new int[]{1,2,3,4,5}; //初始化了元素,長度可以省略
下面列舉了一些可能出現的錯誤寫法。
int arr1[]=new int[5]; // []的位置不對 int[] arr2=new int[5]{1,2,3}; //數組長度和元素個數不匹配 int[] arr3=new string[5]; //左右的數據類型不一致
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { //定義長度為5的數組並賦初值 int[] a1 = {8,9,7,6,8 }; //定義長度為10的int類型數組 int[] a2=new int[10]; //定義長度為3的String類型數組,並賦初值 String[] a3 = new String[3] {"Hello","World","!" }; //定義數組並賦初值 double[] a4=new double[]{1.5,2.3,3.6}; double[] a5 = { 1.5, 2.3, 3.6 }; //獲取元素,賦值 a1[4] = 99; Console.WriteLine(a1[4]); //取得數組長度 Console.WriteLine(a3.Length); //遍歷數組 for (int i = 0; i < a4.Length; i++) { Console.WriteLine(a4[i]); } } } }

2.3. 數組元素的訪問
在 C#中,對數組的訪問即是對其元素的訪問。比如有這樣的一個數組:
int[] array={10,20,30,40,50};
我們如何去訪問里面的元素呢?在內存中,一維數組的元素是按照順序來存儲的,如圖所示:

每個數組元素在數組中都有一個順序號,稱為 索引或 下標。對數組元素的訪問,我們只要知道數
組的名字以及元素在數組中的索引即可。訪問數組元素的格式如下:
數組名稱[ 索引 ];
對於這個 array 數組,array[0]就是第一個數 10,array[1]就是第二個數 20,依次類推,
array[4]就是最后一個數 50。
小貼士:索引的范圍是從 0 到“長度-1”之間。索引是不能自定義的。
知道了數組元素的訪問方式,我們可以對數組元素進行依次賦值,如下代碼:
int[] arr=new int[3]; arr[0]=10; arr[1]=20; arr[2]=30;
當然,這種寫法進行大量的賦值時,顯得較麻煩,不如初始化方便。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { //定義長度為5的數組,循環向數組中輸入5個數字,遍歷數組並輸出 //使用2個循環,第1個控制輸入,第2個控制輸出,並列關系,不要嵌套 static void Main(string[] args) { int[] a = new int[5]; //定義長度為5的數組 for (int i = 0; i < a.Length; i++) { Console.Write("請輸入第{0}個數字:",i+1); a[i] = Convert.ToInt32(Console.ReadLine()); } for (int i = 0; i < a.Length; i++) { Console.WriteLine(a[i]); } } } }

定義一個字符串數組保存 4 個影片,影片信息由用戶輸入,最后輸出全部影片信息。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { //定義一個字符串數組保存 4 個影片,影片信息由用戶輸入, //最后輸出全部影片信息。 String[] a = new String[4]; for (int i = 0; i < a.Length; i++) { Console.Write("請輸入第{0}部影片名稱:", i + 1); a[i] = Console.ReadLine(); } Console.WriteLine("影片信息如下:"); for (int i = 0; i < a.Length; i++) { Console.WriteLine(a[i]); } } } }
三、算法及其實現
算法是解決問題的步驟,代表着用系統的方法描述解決問題的策略機制。在計算機科學中,算法
使用計算機語言來描述,代表用計算機解決某一特定類型問題的精確而有效的方法。常見的算法有最
大(小)值、求和、求平均、查找、排序等,數組在這些算法的實現中經常使用。
3.1. 求最大值/ 最小值
我們有一串隨機數列,我們的目的是找到這個數列中最大的數。如果將數列中的每一個數字看成
是一顆豆子的大小,可以將這問題的算法形象地稱為“撿豆子”,詳細描述如下:
(1)首先將第一顆豆子放入口袋中。
(2)從第二顆豆子開始檢查,如果正在檢查的豆子比口袋中的還大,則將它撿起放入口袋中,同時
丟掉原先口袋中的豆子。反之則繼續下一顆豆子,直到最后一顆豆子。
(3)最后口袋中的豆子就是所有的豆子中最大的一顆。
如果是求最小值,則是類似的過程,只要把小的豆子留下即可。那么,使用 C#來實現這個算法,
這個隨機的數列就可以使用數組來存放,算法的實現如下面的例子。
例 5.3 輸入 5 本書籍的價錢,求出最高價錢。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { //定義長度為5的雙精度數組 double[] books=new double[5]; //輸入書的價格 for (int i = 0; i < books.Length; i++) { Console.Write("請輸入第{0}本書的價格:",i+1); books[i] = Convert.ToDouble(Console.ReadLine()); } //假定第1本書為最高價格 double max = books[0]; //從第2本找出最高價格的圖書 for (int i = 1; i < books.Length; i++) { //如果當前圖書的價格比最高價格的圖書價格還要高 if (books[i] > max) { max = books[i]; } } Console.WriteLine("最高價格是:"+max); } } }

課堂作業: 舉一反三:輸入 5 本書籍的價錢,然后找出最便宜的書的價格。
3.2. 求和/ 求平均值
求和算法非常簡單,給定一串隨機的序列,只要把所有數一個一個的累加起來就可以了。計算出
了序列的和,那么平均值就是:總和/個數。
例 5.4 輸入 5 名員工的年齡,求出總年齡和平均年齡。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { //定義長度為5的雙精度數組 double[] books=new double[5]; //輸入書的價格 for (int i = 0; i < books.Length; i++) { Console.Write("請輸入第{0}本書的價格:",i+1); books[i] = Convert.ToDouble(Console.ReadLine()); } //假定第1本書為最高價格 double min = books[0]; //從第2本找出最高價格的圖書 for (int i = 1; i < books.Length; i++) { //如果當前圖書的價格比最高價格的圖書價格還要高 if (books[i] < min) { min = books[i]; } } Console.WriteLine("最高價格是:"+min); } } }
3.3. 數據搜索
搜索是許多程序中都會使用的一項重要操作,為了有效的進行搜索,有各種查找算法,本節介紹
線性查找算法。線性查找也稱為順序查找,在給定的隨機序列中按照順序查找某個值是否存在。它通
常從第一個元素開始,逐一檢查每個元素,直至找到所需元素。
例 5.5 在含有 5 首音樂的列表中查找某首音樂。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { //所有歌曲數組 String[] music = {"泡沫","酒醉的蝴蝶","洗澡歌","在南方","好日子"}; //提示用戶輸入 Console.Write("請輸入要查找的歌曲:"); String m = Console.ReadLine(); //查找 bool flag = false; //設置一個是否找到的變量,默認為沒找到 for (int i = 0; i < music.Length; i++) { if (music[i] == m) { Console.WriteLine("您要找到歌曲在第{0}位。",i); flag = true; //找到了,修改標簽 break; //結束,不再找 } } if (flag==false) { Console.WriteLine("您要找的歌曲不存在。"); } } } }
3.4. 數據排序
小 到 大 升序
大 到 小 降序
排序是編程中最常用的操作之一,排序的方法很多,可以使用 Array 類的 Sort()方法和
Reverse()方法進行排序。Sort()方法用於將序列升序排序,Reverse()方法用於將序列反轉。
例 5.6 對給定的隨機數列表進行排序。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { int[] s = {98,89,99,100,50,0,60,1,2,3,4,5,100,200}; //排序,升序 Array.Sort(s); //反轉 Array.Reverse(s); //查看排序后的結果 for (int i = 0; i < s.Length; i++) { Console.Write(s[i]+" "); } } } }
四、內部測試
1、定義一個長度為8的整型數組,在數組中存放數字9、9、5、1、0、3、0、9,遍歷數組循環輸出這些數字。
2、定義一個長度為8的整型數組,在數組中存放數字9、9、5、1、0、3、0、9(與上題相同),將數組中小於6的數字加1,排序后顯示修改后的數組。
3、實現一個汽車管理系統,實現汽車添加、汽車查詢功能。要求有菜單(添加汽車、汽車查詢、退出系統);汽車包含(編號、名稱、速度);添加汽車時向數組中增加編號、名稱與速度;汽車查詢時顯示所有汽車;退出系統則不再顯示菜單,不再有選擇功能。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication7 { /// <summary> /// 汽車類 /// </summary> class Car { public int bh; //編號 public string mc; //名稱 public int sd; //速度 } class Program { static void Main(string[] args) { Car[] cars = new Car[10]; int i = 0; do { Console.WriteLine("*****************************************************"); Console.WriteLine("1、添加汽車"); Console.WriteLine("2、汽車查詢"); Console.WriteLine("3、退出系統"); Console.WriteLine("*****************************************************"); Console.Write("請選擇(1-3):"); int n = Convert.ToInt32(Console.ReadLine()); if (n == 1) { Console.WriteLine("添加汽車:"); Car car = new Car(); Console.Write("編號:"); car.bh=Convert.ToInt32(Console.ReadLine()); Console.Write("名稱:"); car.mc =Console.ReadLine(); Console.Write("速度:"); car.sd = Convert.ToInt32(Console.ReadLine()); cars[i] = car; i++; } else if (n == 2) { Console.WriteLine("汽車查詢:"); Console.WriteLine("編號\t名稱\t速度"); foreach (var item in cars) { if (item != null) { Console.WriteLine("{0}\t{1}\t{2}", item.bh, item.mc, item.sd); } } } else { break; } } while (true); } } }
五、控制台
Console.BackgroundColor = ConsoleColor.Green;//背景色綠色
Console.ForegroundColor = ConsoleColor.Red;//字體色紅色
Console.Beep(3000, 1000); //通過控制台揚聲器播放提示音。
Clear 清除控制台緩沖區和相應的控制台窗口的顯示信息。
