主要内容

什么是数组、定义数组、初始化数组、访问数组元素、常用方法及属性、数组的分类、参数数组

一.什么是数组

  • 数组是从Array类派生的,一组数据类型相同的变量组合
  • 一种空间连续的数据结构
  • 元素通过索引(位置的序号)进行操作

数组概述

  • 数组可以是一维、多维或交错的
  • 数值数组元素的默认值为0,而引用元素的默认值为null
  • 交错数组是数组的数组,因此其元素是引用类型并初始化为null
  • 数组的索引从0开始
  • 数组元素可以是任何类型,包括数组类型

二.定义数组

语法

  • 声明数组
    数据类型[] 数组名;
    
  • 初始化数组
    数组名 = new 数据类型[元素总数];
    
  • 初始化的元素类型与声明时的类型必须相同

三.初始化数组

数组初始化后,内存中存储该数据类型的默认值。

  • 整形为0
  • 非整形为0.0
  • char为\0
  • string为null
  • bool为false

初始化+赋值

可以在数组初始化时同时对元素进行赋值。

语法

数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};

示例

int[] array = new int[]{1,2,3,4,5};

初始化时[]内也可以填入数组长度,但必须与所赋值的元素总数一致。如

double[] array = new double[2]{1.0,2.0};

声明+赋值

可以在数组声明时同时对元素进行赋值

语法

数据类型[] 数组名 = {元素1,元素2,...}

示例

int[] array = {1,2,3,4,5}

元素个数即为数组长度。

程序员可以省略初始化,但编译器内部仍然会”new数据类型[]”.

不支持以下写法:

double[] array;
arrat = {1.0,2.0}

四.访问数组元素

通过索引访问

可以通过数组的索引进行读写操作

语法

数组名[索引]

示例

string array = new string[]{"a","b","c"};
Console.WriteLine(array[0]); // --> 获取数组第一个元素
Console.WriteLine(array[2]); // --> 获取数组第三个元素

通过for遍历

  • 遍历:按照某种顺序访问每一个元素

  • for循环遍历数组元素,正在输出到控制台中:

    string array = new string[]{"a","b","c"};
    for(int i=0;i<array.Length;i++)
    {
      Console.WriteLine(array[i]);
    }
    

通过foreach遍历

  • foreach是一种更简单明了的读取数组元素的语句。
  • 局限性
    • 只能读取全部元素(语句本身)
    • 不能修改元素
    • 只能遍历实现Ienumerable接口的集合对象

练习

在控制台中录入学生成绩

要求:成绩范围0-100之间

private static float[] EnterScore()
{
    Console.WriteLine("请输入学生总数:");
    int count = int.Parse(Console.ReadLine());
    float[] Scores = new float[count];

    for (int i = 0; i < Scores.Length;)
    {
        Console.WriteLine($"请输入第{i + 1}个学生成绩:");
        float score = float.Parse(Console.ReadLine());
        if (score >= 0f && score <= 100f)
        {
            Scores[i] = score;
            i++;
        }
        else
            Console.WriteLine("成绩有误!");

    }
    return Scores;

}

五.常用方法及属性

知识点

//object 万类之祖,可以赋值任何类型的数据
object o = true;
//Array数组的基类
Array array = new int[1];
//推断(隐式)类型:根据数据推断数据类型
var v="a";

数组长度

数组名.Length;

清除元素值 – 将数组中的元素恢复默认值

Array.Clear();

复制元素

Array.Copy();
数组名.CopyTo();

克隆

数组名.Clone();

查找元素

//查找数组中元素的索引
//可以判断数组中是否存在某个元素
Array.IndexOf();
Array.LastIndexOf();

排序

Array.Sort();

反转

Array.Reverse();

冒泡排序

//冒泡排序
//2 8 6 1
//第一轮:1 8 6 2 (3次) 第一个位置 与后面元素进行比较,满足条件则交换
//第二轮:1 2 8 6 (2次) 第二个位置 与后面元素进行比较,满足条件则交换
//第三轮:1 2 6 8 (1次) 第三个位置 与后面元素进行比较,满足条件则交换
private static int[] OrderBy(int[] array)
{

    for (int r = 0; r < array.Length - 1; r++)
    {
        for (int i = r + 1; i < array.Length; i++)
        {
            if (array[r] > array[i])
            {
                //交换
                int temp = array[i];
                array[i] = array[r];
                array[r] = temp;

            }
        }
    }

    return array;
}

选择排序

替换次数比冒泡排序少

private static int[] OrderBy(int[] array)
{

    for (int r = 0; r < array.Length - 1; r++)
    {
        int minIndex = r;
        for (int i = r + 1; i < array.Length; i++)
        {
            if (array[minIndex] > array[i])
            {
                minIndex = i;
            }

        }
        if (minIndex != r)
        {
            //交换
            int temp = array[r];
            array[r] = array[minIndex];
            array[minIndex] = temp;
        }

    }

    return array;
}

六.数组的分类

数组分为:一维数组、多维数组和交错数组

多维数组

数组可以具有多个维度,例如,下面声明创建一个四行两列的二维数组

int[,] array = new int[4,2]

声明一个三维数组

int[,,] array = new int[4,2,3]

交错数组

交错数组是元素为数组的数组。交错数组元素的维度和大小可以不同。交错数组有时称为“数组的数组”

int[][] array = new int[3][];

必须初始化array的元素后才可以使用它

array[0] = new int[5];
array[1] = new int[4];
array[2] = new int[2];    

每个元素都是一个一维整形数组,第一个元素是由5个整形数组组成,第二个元素是由4个整形数组组成,而第三个元素是由2个整形数组组成。

array[0] = new int[]{1,2,3,4,5};
array[1] = new int[]{1,2,3,4};
array[2] = new int[]{1,2};

声明数组时,将其初始化

int[][] array = new int[][]
{
    new int[]{1,2,3,4,5},
    new int[]{0,2,4,6},
    new int[]{11,12}   
};

访问元素

array[1][0]=0;

七.参数数组

  • 在方法形参中通过关键字params定义
  • 方法调用者可以传递数组、也可以传递一组数据类型相同的变量,甚至可以不传递参数

注意

  • 参数数组必须在形参列表中的最后一位。
  • 只能在一维数组上使用params关键字
  • WriteLine中使用占位符,就是通过参数数组实现的。
static void Main()
{
    int s = Add(1, 2, 3);
}
//数字相加求和的方法
private static int Add(params int[] arr)
{
    int sum = 0;
    for (int i = 0; i < arr.Length; i++)
    {
        sum += arr[i];
    }
    return sum;
}

八.相关代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Day5
{
    class Program
    {
        //数组
        static void Main1(string[] args)
        {
            //声明数组类型变量
            int[] array;
            //初始化  5 个元素
            array = new int[5];
            //赋值
            //将数据100 赋值给数组的第一个元素
            array[0] = 100;
            array[1] = 250;
            //将数据360赋值给数组的第四个元素
            array[3] = 360;

            //将所有元素显示到控制台中
            //array.Length 表示数组元素总数
            for (int i = 0; i < array.Length; i++)
            {//i:0 1 2 3 4
                Console.WriteLine(array[i]);
            }
            /*
            foreach (元素类型 变量名称 in 数组名称)
            {
                变量名称即数组元素
            }*/

            foreach (var item in array)
            {
                Console.WriteLine(item);
            }
        }
        /*
         * 练习1:在控制台中录入学生成绩 float[]
         * 要求:成绩范围0 -100之间
         * 请输入学生总数
         * 请输入第一个学生的成绩
         */
        static void Main2()
        {
            //EnterScore();
            float[] arrays = new float[] { 1f, 8f, 5f, 3f, 2f,9f };

            float a = GetMaxByArray(arrays);
        }

        private static float[] EnterScore()
        {
            Console.WriteLine("请输入学生总数:");
            float[] total = new float[int.Parse(Console.ReadLine())];

            for(int i = 0; i < total.Length; )
            {
                Console.WriteLine("请输入第{0}个学生的成绩:", i + 1);
                float score = float.Parse(Console.ReadLine());
                if (score >= 0 && score <= 100)
                {
                    total[i++] = score;
                }
                else
                    Console.WriteLine("成绩有误,请重新输入");

            }
            return total;
        }
        //练习:获取数组中的最大值
        private static float GetMaxByArray(float[] array)
        {
            //假设第一个元素为最大值
            float maxNumber = array[0];
            //依次与后面元素进行比较
            for (int i = 1; i < array.Length; i++)
            { 
                //如果发现更大的数据则替换最大值
                if (maxNumber < array[i])
                    maxNumber = array[i];
            }
            //返回最大值
            return maxNumber;

        }

        static void Main3()
        {
            //数组的写法
            //1.声明+初始化
            string[] array01 = new string[5];

            //2.声明+赋值
            string[] array02 = new string[] { "a", "b" };

            //3.声明+初始化+赋值
            string[] array03 = { "a", "b" };

            //object 万类之祖
            object o = true; //隐式转换

            //数组的基类
            Array arr = new int[1];

            //推断(隐式)类型:根据数据推断数据类型
            var v = 1;

            //查找数组中元素的索引值
            int index = Array.IndexOf(array02, "a");
            //作用 判断数组中是否存在某个元素
            //true 存在 false不存在
            bool re = Array.IndexOf(array02, "a") >= 0;
        }

        private static void PrintArray(Array array)
        {
            foreach (var item in array)
                Console.WriteLine(item);
        }

        //练习:根据年月日,计算当天是本年的第几天
        //例如:2021 1 3
        //提示:将每月天数存储到数组中


        private static int GetDays(int year,int month,int day)
        {
            int days=0;
            int[] MonthArray = new int[12] { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
            MonthArray[1] = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 29 : 28;
            //累加前几个月
            for(int i = 0; i <month-1; i++)
                days += MonthArray[i];
            //累加当月天数
            days += day;
            return days;
        }

        #region 彩票模拟器
        /*练习:彩票模拟器
         * 红球 1 -33   6个  号码不能重复
         * 篮球 1- 16     1个
         * 方法1:在控制台中购买彩票的功能int[7]
         * 请输入第一个红球号码:...
         * 方法2:随机产生一注彩票
         * static Random random = new Random();本行代码放到其他方法外面
         * 在方法内部 产生随机数:random.Nex(1,17)
         * 方法3:两注彩票比较的功能 返回中将等级
         *        先判断红球号码中将数量
         *              蓝
         * 
         * 模拟
         * 在Main()方法中调用
         * 方案:随机产生一注,循环购买
         *       购买一注,循环随机产生
         */

        /// <summary>
        /// 手动选择一注
        /// </summary>
        /// <returns></returns>
        private static int[] HandPicked()
        {
            int[] array = new int[7];
            //购买红球
            for (int i = 0; i < 6; )
            {
                Console.WriteLine("请输入第{i+1}个红球号码:");
                int num = int.Parse(Console.ReadLine());
                if (num>0 && num <= 33)
                {
                    if(Array.IndexOf(array, num) == -1)
                        array[i++] = num;
                    else
                        Console.WriteLine("该号码{num}已存在");
                }
                else
                    Console.WriteLine("输入错误,请输入1-33之间的号码");
            }
            //购买蓝球
            int BlueNumber = 0;
            while (true)
            {
                Console.WriteLine("请输入蓝球号码:");
                int num2 = int.Parse(Console.ReadLine());
                if (num2 > 1 && num2 <= 16)
                {
                    array[6] = num2;
                    break;
                }
                else
                    Console.WriteLine("输入错误,请输入1-16之间的号码");
            }
            //返回结果
            return array;

        }
        static Random random = new Random();
        /// <summary>
        /// 机选一注
        /// </summary>
        /// <returns></returns>
        private static int[] MachineSelected()
        {
            int[] array = new int[7];
            //红球
            for (int i = 0; i < 6; i++)
                array[i] = random.Next(1, 34);
            //蓝球
            array[6] = random.Next(1, 17);
            //红球排序
            Array.Sort(array,0,6);
            return array;
        }
        /// <summary>
        /// 计算中将结果
        /// </summary>
        /// <param name="HandArray">手动选择</param>
        /// <param name="MachineArray">机选</param>
        private static int ComputedLevel(int[] HandArray,int[] MachineArray)
        {
            //计算蓝球个数
            int blueCount = HandArray[6] == MachineArray[6] ? 1 : 0;
            //计算红球个数
            int redCound = 0;
            for (int i = 0; i < 6; i++)
            {
                if (Array.IndexOf(MachineArray, HandArray[i], 0, 6) != -1)
                    redCound++;
            }
            //计算中将等级
            int level;
            if (redCound + blueCount == 7)
                level = 1;
            else if (redCound == 6)
                level = 2;
            else if (redCound + blueCount == 6)
                level = 3;
            else if (redCound + blueCount == 5)
                level = 4;
            else if (redCound + blueCount == 4)
                level = 5;
            else if (blueCount == 1)
                level = 6;
            else
                level = 0;

            return level;
        }

        static void Main4()
        {
            int[] array1 = HandPicked();

            int level;
            int count=0;
            do
            {
                count++;
                int[] array2 = MachineSelected();
                level = ComputedLevel(array1, array2);
                if (level != 0)
                    Console.WriteLine("恭喜您获得{level}等奖,累计消费{count * 2}元!");


            } while (level != 1);

        }

        #endregion

        // for for引入
        static void Main5()
        {

            //控制行
            for (int r = 0; r<5; r++) //        0       1
            {
                //控制列
                for (int i = 0; i<3; i++)  // 0 1 2    0 1 2
                {
                    Console.Write("隔壁老王\t");
                }
                Console.WriteLine();
            }

            /*
             *4行             * #
            * ##
            * ###
            * ####
            */

            for (int i = 0; i<4; i++)
            {
                for (int a = 0; a <= i; a++)
                {
                    Console.Write("#");
                }
                Console.WriteLine();
            }
            Console.WriteLine("------------------------------------------");
            /*
             * 0####  4
             * 1 ###  3
             * 2  ##  2
             * 3   #  1
             */
            for (int i = 0; i <4; i++)
            {
                for (int a = 0; aarray[c])
                    {
                        int temp = array[c];
                        array[c] = array[r];
                        array[r] = temp;
                    }
                }
            }

            return array;
        }

        static void Main6()
        {
            int[] array = new int[] { 2, 8, 6, 1,1 };

            bool a  = IsIdentical(array);
        }

        //练习:判断数组中是否有相同的元素

        private static bool IsIdentical(int[] array)
        {

            for (int r = 0; r"请输入第{r + 1}个学生的第{c + 1}门成绩");
                    Infos[r, c] = int.Parse(Console.ReadLine());
                }
            }

            return Infos;
        }

        /// <summary>
        /// 在控制台中打印信息
        /// </summary>
        /// <param name="array"></param>
        private static void PrintInformation(int[,] array)
        {
            for (int r = 0; r <array.GetLength(0); r++)
            {
                for (int c = 0; c < array.GetLength(1); c++)
                {
                    Console.Write(array[r, c] + "\t");
                }
                Console.WriteLine();
            }
        }
        /// <summary>
        /// 计算每个学生的平均分
        /// </summary>
        /// <param name="array"></param>
        private static void StudentsAverage(int[,] array)
        {
            //        科目1     科目二
            //张三     80         70
            //李四     65         75
            //王五     68         82

            //// 第一个学生的平均分是 80 + 70  /  2
            //(array[0, 0] + array[0, 1]) / 2;

            //// 第二个学生的平均分是
            //(array[1, 0] + array[1, 1]) / 2;

            ////第三个学生的平均分是
            //(array[2, 0] + array[2, 1]) / 2;


            for (int r = 0; r < array.GetLength(0); r++)
            {
                int average = 0;
                for (int c = 0; c < array.GetLength(1); c++)
                {
                    average += array[r, c] / array.GetLength(1);

                }
                Console.WriteLine("第{r + 1}个学生的平均分是{average}");

            }

        }
        /// <summary>
        /// 科目平均分
        /// </summary>
        /// <param name="array"></param>
        private static void SubjectAverage(int[,] array)
        {
            //        科目1     科目二
            //张三     80         70
            //李四     65         75
            //王五     68         82

            //科目1的平均分为
            //array[0,0]  array[1, 0]  array[2, 0]

            //科目2的平均分为
            //array[0, 1]  array[1, 1]  array[2, 1]
            for (int c = 0; c"第{c + 1}个科目的平均分是{average}");
            }


        }

        //交错数组
        static void Main9()
        {
            //交错数组  参数数组
            //数组分类:一维数组、多维数组、交错数组

            //规则的表格用二维数组  不规则的表格用交错数组

            //创建具有3个元素的交错数组,每个元素又是独立的一维数组
            int[][] array = new int[3][];
            //创建一维数组 赋值给 交错数组第一个元素
            array[0] = new int[4];
            array[1] = new int[5];
            array[2] = new int[3];
            //赋值
            array[0][0] = 100;
            array[1][2] = 250;
            array[2][2] = 360;

            foreach(int[] item in array)
            {
                foreach(int i in item)
                {
                    Console.Write(i + "\t");
                }
                Console.WriteLine();
            }

            for (int r = 0; r < array.Length; r++)
            {
                for (int c = 0; c < array[r].Length; c++)
                {
                    Console.Write(array[r][c] + "\t");
                }
                Console.WriteLine();
            }
        }

        //参数数组   数据类型确定但个数不确定
        static void Main()
        {
            //对于调用者而言:可以传递数组
            int sum01 = Add(new int[] { 1,25,35,56});
            //对于调用者而言:可以传递一组数据类型相同的变量集合
            int sum02 = Add(1, 25, 35, 56);
            //对于调用者而言:可以不传递
            int sum03 = Add();
        }

        //整数相加的功能,数据类型确定但个数不确定
        private static int Add(params int[] array)
        {
            //对于方法定义者,参数数组就是普通的一维数组
            //将数组每个元素累加
            int sum = 0;
            for (int i = 0; i < array.Length; i++)
            {
                sum += array[i];
            }

            return sum;

        }
    }
}

发表评论

邮箱地址不会被公开。 必填项已用*标注