C#編程基礎第五章:數組


一、什么是數組

數組用於存儲若干相同類型的數據。在本章將介紹什么是數組以及數組的使用方法。了解數組之
后,將學習 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);
        }
    }
}
View Code

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("您要找的歌曲不存在。");
            }

        }
    }
}
View Code

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);
        }
    }
}
View Code

 

五、控制台

Console.BackgroundColor = ConsoleColor.Green;//背景色綠色

Console.ForegroundColor = ConsoleColor.Red;//字體色紅色

Console.Beep(3000, 1000); //通過控制台揚聲器播放提示音。

Clear 清除控制台緩沖區和相應的控制台窗口的顯示信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM