4.一维数组

4.复杂数据类型-数组-一维数组


4.1 知识点

基本概念

  • 数组是存储一组相同类型数据的集合。
  • 数组分为一维、多维、交错数组。
  • 一般情况下,一维数组就简称为数组。
  • 声明一个变量可以理解为开辟了一个房间,而声明一个数组可以理解为连续分配了多个房间。

数组的声明

  • 变量类型[] 数组名;

    int[] arr1;
    //这种声明方式只是声明了一个数组,但是并没有开房。
    //后面的代码要是想使用arr1,仍然要把数组new出来,所以这种方法比较少用。
    arr1 = new int[5];
    
  • 变量类型[] 数组名 = new 变量类型[数组的长度];

    int[] arr2 = new int[5];
    //这种声明方式相当于开了5个房间,但是房间里面的int值默认为0。
    
  • 变量类型[] 数组名 = new 变量类型[数组的长度]{内容1, 内容2, 内容3, .......};

    int[] arr3 = new int[5] { 1, 2, 3, 4, 5 };
    //这种声明方式相当于开了5个房间,房间里面的int值分别为1, 2, 3, 4, 5。
    //因为填了数组的长度,所以一定要初始化5个房间的值。
    
  • 变量类型[] 数组名 = new 变量类型[]{内容1, 内容2, 内容3, .......};

    int[] arr4 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    //这种声明方式省略了数组的长度,后面的内容就决定了数组的长度(房间数)。
    
  • 变量类型[] 数组名 = {内容1, 内容2, 内容3, .......};

    int[] arr5 = { 1, 3, 4, 5, 6 };
    //这种声明方式省略了数组的长度和new 变量类型[]。
    //后面的内容就决定了数组的长度(房间数)。
    //前面的变量类型决定了数组类型。
    

数组的使用

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

  • 数组的长度

    // 数组变量名.Length
    Console.WriteLine(array.Length);//5
    
  • 获取数组中的元素

    //数组中的下标和索引是从0开始的。
    //通过索引下标去获得数组中某一个元素的值时,一定注意不能越界,数组的房间号范围是 0 ~ Length-1。
    Console.WriteLine(array[0]);//1
    Console.WriteLine(array[2]);//3
    Console.WriteLine(array[4]);//5
    //Console.WriteLine(array[5]);//报错
    
  • 修改数组中的元素

    array[0] = 99;
    Console.WriteLine(array[0]);//99
    
  • 遍历数组通过循环快速获取数组中的每一个元素

    Console.WriteLine("**********************");
    for (int i = 0; i < array.Length; i++)
    {
        Console.WriteLine(array[i]);//1 2 3 4 5
    }
    Console.WriteLine("**********************");
    
  • 增加数组的元素

    // 数组初始化以后是不能够直接添加新的元素的。
    // 要重新声明比原来数组更长的数组。
    int[] array2 = new int[6];
    //搬家,用循环把新数组前面的值赋值为旧数组的值。
    for (int i = 0; i < array.Length; i++)
    {
        array2[i] = array[i];
    }
    //让旧数组指向新数组,就是让旧数组指向了内存中的新地址。
    array = array2;
    for (int i = 0; i < array.Length; i++)
    {
        Console.WriteLine(array[i]);//99 2 3 4 5
    }
    //重新给新开的房子赋值。
    
  • 删除数组的元素

    // 数组初始化以后是不能够直接删除元素的。
    // 要重新声明比原来数组更短的数组。
    int[] array3 = new int[5];
    //搬家,用循环把新数组前面的值赋值为旧数组的值。
    for (int i = 0; i < array3.Length; i++)
    {
        array3[i] = array[i];
    }
    //让旧数组指向新数组,就是让旧数组指向了内存中的新地址。
    array = array3;
    Console.WriteLine(array.Length);//5
    
  • 查找数组中的元素

    // 99 2 3 4 5 
    // 要查找 3这个元素在哪个位置
    // 只有通过遍历才能确定数组中是否存储了一个目标元素
    int a = 3;
    //遍历数组判断值是否等于3
    for (int i = 0; i < array.Length; i++)
    {
        if( a == array[i] )
        {
            Console.WriteLine("和a相等的元素在{0}索引位置", i);//和a相等的元素在2索引位置
            break;
        }
    }
    

总结

  • 概念:同一变量类型的数据集合。
  • 一定要掌握的知识:声明,遍历,增删查改。
  • 所有的变量类型都可以声明为数组。
  • 数组是用来批量存储游戏中的同一类型对象的容器,比如所有的怪物、所有玩家。

4.2 知识点代码

using System;

namespace Lesson02_一维数组
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("一维数组");

            #region 知识点一 基本概念
            //数组是存储一组相同类型数据的集合
            //数组分为 一维、多维、交错数组
            //一般情况 一维数组 就简称为 数组
            //声明一个变量可以理解为开辟了一个房间,声明一个数组可以理解为连续分配了多个房间
            #endregion

            #region 知识点二 数组的声明

            // 声明的数组的变量类型 可以是我们学过的 或者 没学过的所有变量类型

            // 变量类型[] 数组名;
            int[] arr1;
            //这种声明方式 只是声明了一个数组 但是并没有开房
            //后面的代码要是想使用arr1 仍然要把数组new出来 所以这种方法比较少用
            arr1 = new int[5];


            // 变量类型[] 数组名 = new 变量类型[数组的长度];
            int[] arr2 = new int[5];
            //这种声明方式 相当于开了5个房间 但是房间里面的int值 默认为0

            // 变量类型[] 数组名 = new 变量类型[数组的长度]{内容1,内容2,内容3,.......};
            int[] arr3 = new int[5] { 1, 2, 3, 4, 5 };
            //这种声明方式 相当于开了5个房间 房间里面的int值分别为12345
            //因为填了数组的长度所以一定要初始化5个房间的值 

            // 变量类型[] 数组名 = new 变量类型[]{内容1,内容2,内容3,.......};
            int[] arr4 = new int[] { 1,2,3,4,5,6,7,8,9};
            //这种声明方式 省略了数组的长度 后面的内容就决定了 数组的长度 “房间数”

            // 变量类型[] 数组名 = {内容1,内容2,内容3,.......};
            int[] arr5 = { 1,3,4,5,6};
            //这种声明方式 省略了数组的长度和new 变量类型[]
            //后面的内容就决定了 数组的长度 “房间数”
            //前面的变量类型决定了数组类型

            #endregion

            #region 知识点三 数组的使用

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


            //1.数组的长度
            // 数组变量名.Length
            Console.WriteLine(array.Length);//5


            //2.获取数组中的元素
            //数组中的下标和索引 他们是从0开始的
            //通过 索引下标去 获得数组中某一个元素的值时
            //一定注意!!!!!!!!
            //不能越界  数组的房间号 范围 是 0 ~ Length-1
            Console.WriteLine(array[0]);//1
            Console.WriteLine(array[2]);//3
            Console.WriteLine(array[4]);//5
            //Console.WriteLine(array[5]);//报错


            //3.修改数组中的元素
            array[0] = 99;
            Console.WriteLine(array[0]);//99


            //4.遍历数组 通过循环 快速获取数组中的每一个元素
            Console.WriteLine("**********************");
            for (int i = 0; i < array.Length; i++)
            {
                Console.WriteLine(array[i]);//1 2 3 4 5
            }
            Console.WriteLine("**********************");


            //5.增加数组的元素
            // 数组初始化以后 是不能够 直接添加新的元素的

            // 要重新声明比原来数组更长的数组 
            int[] array2 = new int[6];

            //搬家 用循环把新数组前面的值赋值为旧数组的值
            for (int i = 0; i < array.Length; i++)
            {
                array2[i] = array[i];
            }

            //让旧数组指向新数组 就是让旧数组指向了内存中的新地址
            array = array2;
            for (int i = 0; i < array.Length; i++)
            {
                Console.WriteLine(array[i]);// 99 2 3 4 5
            }

            //重新给新开的房子赋值
            array[5] = 999;
            Console.WriteLine("**********************");


            //6.删除数组的元素
            // 数组初始化以后 是不能够 直接删除元素的

            // 要重新声明比原来数组更短的数组 
            int[] array3 = new int[5];

            //搬家 用循环把新数组前面的值赋值为旧数组的值
            for (int i = 0; i < array3.Length; i++)
            {
                array3[i] = array[i];
            }
            //让旧数组指向新数组 就是让旧数组指向了内存中的新地址
            array = array3;
            Console.WriteLine(array.Length);//5


            //7.查找数组中的元素

            // 99 2 3 4 5 
            // 要查找 3这个元素在哪个位置
            // 只有通过遍历才能确定 数组中 是否存储了一个目标元素
            int a = 3;

            //遍历数组判断值是否等于3
            for (int i = 0; i < array.Length; i++)
            {
                if( a == array[i] )
                {
                    Console.WriteLine("和a相等的元素在{0}索引位置", i);//和a相等的元素在2索引位置
                    break;
                }
            }

            #endregion

            //总结
            //1.概念:同一变量类型的数据集合
            //2.一定要掌握的知识:声明,遍历,增删查改
            //3.所有的变量类型都可以声明为 数组
            //4.数组 是用来批量存储游戏中的同一类型对象的 容器  比如 所有的怪物 所有玩家
        }
    }
}

4.3 练习题

创建一个一维数组并赋值,让其值与下标一样,长度为100

int[] array = new int[100];
for (int i = 0; i < array.Length; i++)
{
    array[i] = i;
    Console.WriteLine(array[i]);
}

创建另一个数组B,让数组A中的每个元素的值乘以2存入到数组B中

int[] arrayB = new int[100];
for (int i = 0; i < arrayB.Length; i++)
{
    arrayB[i] = array[i] * 2;
    Console.WriteLine(arrayB[i]);
}

随机(0~100)生成1个长度为10的整数数组

array = new int[10];
Random r = new Random();
for (int i = 0; i < array.Length; i++)
{
    array[i] = r.Next(0, 101);
    Console.WriteLine(array[i]);
}

从一个整数数组中找出最大值、最小值、总和、平均值(可以使用随机数1~100)

array = new int[10];
r = new Random();
for (int i = 0; i < array.Length; i++)
{
    array[i] = r.Next(0, 101);
    Console.WriteLine(array[i]);
}

int min = array[0];
int max = array[0];
int sum = 0;
int avg = 0;
for (int i = 0; i < array.Length; i++)
{
    if (min > array[i])
    {
        min = array[i];
    }
    if (max < array[i])
    {
        max = array[i];
    }
    sum += array[i];
}
avg = sum / array.Length;
Console.WriteLine("最小值{0}最大值{1}总和{2}平均数{3}", min, max, sum, avg);

交换数组中的第一个和最后一个、第二个和倒数第二个,依次类推,把数组进行反转并打印

array = new int[10];
r = new Random();
for (int i = 0; i < array.Length; i++)
{
    array[i] = r.Next(0, 101);
    Console.WriteLine(array[i]);
}
Console.WriteLine("*****************");

for (int i = 0; i < array.Length / 2; i++)
{
    int temp = array[i];
    array[i] = array[array.Length - 1 - i];
    array[array.Length - 1 - i] = temp;
}

for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine(array[i]);
}

将一个整数数组的每一个元素进行如下的处理:

如果元素是正数则将这个位置的元素值加1;
如果元素是负数则将这个位置的元素值减1;
如果元素是0,则不变

array = new int[10];
r = new Random();
for (int i = 0; i < array.Length; i++)
{
    array[i] = r.Next(-10, 11);
    Console.WriteLine(array[i]);
}
Console.WriteLine("*******************");

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

    Console.WriteLine(array[i]);
}

定义一个有10个元素的数组,使用for循环,输入10名同学的数学成绩,将成绩依次存入数组,然后分别求出最高分和最低分,并且求出10名同学的数学平均成绩

try
{
    int[] scores = new int[10];
    int min = 0;
    int max = 0;
    int sum = 0;
    int avg = 0;

    for (int i = 0; i < scores.Length; i++)
    {
        Console.WriteLine("请输入第{0}位同学的成绩", i + 1);
        scores[i] = int.Parse(Console.ReadLine());

        if (i == 0)
        {
            min = scores[i];
            max = scores[i];
        }
        else
        {
            if (min > scores[i])
            {
                min = scores[i];
            }
            if (max < scores[i])
            {
                max = scores[i];
            }
        }
        sum += scores[i

];
    }

    avg = sum / scores.Length;
    Console.WriteLine("最高分{0}最低分{1}平均分{2}", max, min, avg);
}
catch
{
    Console.WriteLine("请输入数字");
}

请声明一个string类型的数组 (长度为25)(该数组中存储着符号),通过遍历数组的方式取出其中存储的符号打印出以下效果

string[] strs = new string[25];

for (int i = 0; i < strs.Length; i++)
{
    strs[i] = i % 2 == 0 ? "■" : "□";
}

for (int i = 0; i < strs.Length; i++)
{
    if (i % 5 == 0 && i != 0)
    {
        Console.WriteLine();
    }
    Console.Write(strs[i]);
}

4.4 练习题代码

using System;

namespace Lesson02_练习题
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("数组练习题");

            #region 练习题一
            //请创建一个一维数组并赋值,让其值与下标一样,长度为100
            int[] arrayA = new int[100];
            for (int i = 0; i < arrayA.Length; i++)
            {
                arrayA[i] = i;
                Console.WriteLine(arrayA[i]);
            }
            #endregion

            #region 练习题二
            //创建另一个数组B,让数组A中的每个元素的值乘以2存入到数组B中
            int[] arrayB = new int[100];
            for (int i = 0; i < arrayB.Length; i++)
            {
                arrayB[i] = arrayA[i] * 2;
                Console.WriteLine(arrayB[i]);
            }
            #endregion

            #region 练习题三
            //随机(0~100)生成1个长度为10的整数数组

            arrayA = new int[10];
            Random r = new Random();
            for (int i = 0; i < arrayA.Length; i++)
            {
                arrayA[i] = r.Next(0, 101);
                Console.WriteLine(arrayA[i]);
            }
            #endregion

            #region 练习题四
            // 从一个整数数组中找出最大值、最小值、总合、平均值
            //(可以使用随机数1~100)
            arrayA = new int[10];
            r = new Random();
            for (int i = 0; i < arrayA.Length; i++)
            {
                arrayA[i] = r.Next(0, 101);
                Console.WriteLine(arrayA[i]);
            }
            //第一次进入时  不存在 最大最小的概念
            //可以认为 第一次 最大值最小值 都是第一个数
            int min = arrayA[0];
            int max = arrayA[0];
            int sum = 0;
            int avg = 0;
            for (int i = 0; i < arrayA.Length; i++)
            {
                //如果当前的值 比min还要小 那么当前的值就是最小的值
                if (min > arrayA[i])
                {
                    min = arrayA[i];
                }
                //如果当前的值 比max还要大 那么当前的值就是最大的值
                if (max < arrayA[i])
                {
                    max = arrayA[i];
                }
                //每一次的值加上去 就是总和
                sum += arrayA[i];
            }
            //平均数 用总合 / 个数
            avg = sum / arrayA.Length;
            Console.WriteLine("最小值{0}最大值{1}总合{2}平均数{3}", min, max, sum, avg);


            #endregion

            #region 练习题五
            //交换数组中的第一个和最后一个、第二个和倒数第二个,依次类推,把数组进行反转并打印

            arrayA = new int[10];
            r = new Random();
            for (int i = 0; i < arrayA.Length; i++)
            {
                arrayA[i] = r.Next(0, 101);
                Console.WriteLine(arrayA[i]);
            }
            Console.WriteLine("*****************");

            //交换 那就中间商不赚差价
            //int temp = arrayA[0];
            //arrayA[0] = arrayA[arrayA.Length - 1 - 0];
            //arrayA[arrayA.Length - 1] = temp;

            //temp = arrayA[1];
            //arrayA[1] = arrayA[arrayA.Length - 1 - 1];
            //arrayA[arrayA.Length - 1 - 1] = temp;

            //temp = arrayA[2];
            //arrayA[2] = arrayA[arrayA.Length - 1 - 2];
            //arrayA[arrayA.Length - 1 - 2] = temp;

            for (int i = 0; i < arrayA.Length / 2; i++)
            {
                int temp = arrayA[i];
                arrayA[i] = arrayA[arrayA.Length - 1 - i];
                arrayA[arrayA.Length - 1 - i] = temp;
            }

            for (int i = 0; i < arrayA.Length; i++)
            {
                Console.WriteLine(arrayA[i]);
            }

            #endregion

            #region 练习题六
            //将一个整数数组的每一个元素进行如下的处理:
            //如果元素是正数则将这个位置的元素值加1;
            //如果元素是负数则将这个位置的元素值减1;
            //如果元素是0,则不变

            arrayA = new int[10];
            r = new Random();
            for (int i = 0; i < arrayA.Length; i++)
            {
                arrayA[i] = r.Next(-10, 11);
                Console.WriteLine(arrayA[i]);
            }
            Console.WriteLine("*******************");

            for (int i = 0; i < arrayA.Length; i++)
            {
                //得到每一个元素 进行判断即可
                if (arrayA[i] > 0)
                {
                    arrayA[i] += 1;
                }
                else if (arrayA[i] < 0)
                {
                    arrayA[i] -= 1;
                }

                Console.WriteLine(arrayA[i]);
            }


            #endregion

            #region 练习题七
            //定义一个有10个元素的数组,使用for循环,输入10名同学的数学成绩,
            //将成绩依次存入数组,然后分别求出最高分和最低分,
            //并且求出10名同学的数学平均成绩
            //int[] arrayA = new int[10];

            try
            {
                min = 0;
                max = 0;
                sum = 0;
                avg = 0;
                for (int i = 0; i < arrayA.Length; i++)
                {
                    Console.WriteLine("请输入第{0}位同学的成绩", i + 1);
                    arrayA[i] = int.Parse(Console.ReadLine());
                    //第一次进来 min max 没有任何意义 所以第一次可以就认为该成绩即使 最高分也是最低分
                    if (i == 0)
                    {
                        min = arrayA[i];
                        max = arrayA[i];
                    }
                    else
                    {
                        //只有 除了第一次以外  才来进行 大小值的判断 
                        if (min > arrayA[i])
                        {
                            min = arrayA[i];
                        }
                        if (max < arrayA[i])
                        {
                            max = arrayA[i];
                        }
                    }
                    sum += arrayA[i];
                }
                avg = sum / arrayA.Length;

                Console.WriteLine("最高分{0}最低分{1}平均分{2}", max, min, avg);
            }
            catch
            {
                Console.WriteLine("请输入数字");
            }
            #endregion

            #region 练习题八
            //请声明一个string类型的数组(长度为25)(该数组中存储着符号),
            //通过遍历数组的方式取出其中存储的符号打印出以下效果

            string[] strs = new string[25];
            
            //找到规律初始化
            for (int i = 0; i < strs.Length; i++)
            {
                strs[i] = i % 2 == 0 ? "■" : "□";
                //if( i % 2 == 0 )
                //{
                //    strs[i] = "■";
                //}
                //else
                //{
                //    strs[i] = "□";
                //}
            }

            //每五个换一行
            for (int i = 0; i < strs.Length; i++)
            {
                if (i % 5 == 0 && i != 0)
                {
                    Console.WriteLine();
                }
                Console.Write(strs[i]);
            }

            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏