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 清除控制台缓冲区和相应的控制台窗口的显示信息。

posted @ 2020-11-02 09:04  张果  阅读(1091)  评论(0编辑  收藏  举报
AmazingCounters.com