(教学思路 C#数组一)认识数组,了解数组类型、学习定义及初始化

               以下是我在给学生讲解数组时采用的ppt的大纲内容(粗体),由于本人知识上的欠缺,可能在很多知识点上把握不准,所以我会把我要给学生讲解的语句(不加粗)同时写出,希望有路过我这份教案的人给予指点,如何能够给可能只有c语言基础知识的学生讲解清楚,同时让他们理解其实际项目中的用法。
  一:我们来认识数组,了解数组类型、学习定义及初始化
      数组是同一数据类型的一组值    
    首先我们将介绍几个概念有助于你们理解数组。数组是一种具有相同类型和名称的变量的集合,如一组整数、一组字符等。组成数组的这些变量被称为数组的元素,元素的个数也称为数组的长度、数组的容量,容量一旦创建了,便固定了,此数组的元素个数也就不能增加或减少了。
    每个数组元素都有一个编号,这个编号叫做下标,这个下标也称为索引,一个有n个元素的数组,其索引是从0~n-1为止。索引以及容量这些数组对象的特性,在数组对象创建的时候便固定了,当利用索引操作时,不可以超出定义的容量,以免发生数组索引超出界限的错误。
    在c语言中,数组也会存在索引越界的情况,但是在编译时一般不会体现出来,可能会顺利的通过,但是却为你的程序带来了隐患,如果用户操作不当,超出容量了,程序就会出现错误。VS就解决了这个问题,在编译时发现越界就会报错,将危险停留在编程阶段,减少了程序的不稳定性。
  
   同学们现在是不是有点疑惑,为什么要用数组来存放数据呢?我定义多个变量来存放数据不行吗?用数组有什么好处呢?
   让我们用数组的下个特性来解释吧!
数组属于引用类型,存储在托管堆内存中 ,指针在线程堆栈中。
    引用类型的数值,会把在托管堆中分配一块专门的位置存放数据,然后在线程堆栈中存放着指向数据存储的内存地址,因为数组是引用类型,这样它增加、修改数组中的元素都会按照索引将元素排列在一起,就像班级中学生的学号一样,你按照学号(索引)就可以对学生的如成绩、信息进行操作,你只需定义一个数组变量,记住它的名字就可以方便进行各种你想达到的效果。不会像简单数值类型那样,你得记住班级每个学生的名字才能进行工作,修改或删除信息都不方便,而且他们的存放位置也不一定连续,这势必会降低程序的效率,所以你可以利用数组,组织所要管理的数据,例如,记录按日、按月……消费的流水账,记录员工的工作效率等。 
    接下来,我们看一下数组的定义及初识化。
 一维数组的定义及初识化:
type[] arrayname={value1,value2,……,valueN};  //定义了数据类型同时赋值。
type[] arrayname=new type[N]{v1,v2,……,vN};   //使用new关键字定义同时赋值。此处的N可以省略,因为定义类型后已经赋了N个初值。
           在这里第一次出现了new这个关键字,它是c#中很常用的,也是你们现在比较难理解的概念,你们现在只需要知道new的过程实际上就是给数组在托管堆 中分配了一块位置,用来存放数据就可以了,以后我们在学习到类时会专门讲解。 接下来要看到的这种定义是我要强调的。
         数组元素初始化或给数组元素赋值都可以在声明数组时或在程序的后面阶段中进行。也就是说,你可以像下面的例子一样,先定义,但这是要写上N,告诉编译器定义了N个元素。
type[] arrayname=new type[N];                //先定义N个元素
         这种定义后.net会先为数组中的每个元素根据类型赋予同一个默认值。如int型,便给每个元素赋值为0;string类型为“”。当你想对那个元素进行操作时,就按照索引给它赋值。如: 
        arrayname[0]=value1; arrayname[N-1]=valueN;
type[] arrayname;                      //这种方法是将第二种定义方法拆分成两步
        arrayname=new type[N]{v1,v2,……,vN};  //此处的N也是可以省略的,道理相同。

以上是我们很容易理解的一维数组,在介绍多维数组的定义时我们先来看看数组的类型。    
 数组依照其维度结构进行分类。看一下这张图,为方便我们赋值,所有的编号都是从0开始,和索引相同。
(教学思路 C#数组一)认识数组,了解数组类型、学习定义及初始化
           现在我们就像叫学生学号一样,告诉他成绩,用数组怎么赋值呢?
看一维的图片,现在我们叫1号学生起立,告诉他成绩是99分,用数组是这样写 :
               int[] cj=new int[3];//先定义cj(成绩),说明只有3个学生。
              cj[1]=99;//1号索引位的学生成绩是99.
             其他同学也可以这样赋值。
 看二维的图片,现在我们叫0班2号学生起立,告诉他成绩是88,用二维数组是这样表示:   
                     int[,] cj=new int[3,3];//先定义[3行,3列]的二维数组变量cj(成绩),说明有3*3个学生。
              cj[0,2]=99;//行的索引是0,列的索引是2的学生成绩是88.也就是图片的第1行第3列.
             其他同学也可以这样赋值。                 在以后学习绘图时会用到这种用法。
 看三维的图片,现在我们叫3校1班2号学生起立,告诉他成绩是77,用二维数组是这样表示:
                  int[,,] cj=new int[3,3,4];//先定义[3行,3列,4高]的三维数组变量cj(成绩),说明有3*3*4个学生。
              cj[1,2,3]=77;//行的索引是1,列的索引是2,高的索引是3的学生成绩是77.也就是图片的3校字上面的第2行最后一个成绩.
             其他同学也可以这样赋值。         在做3d游戏的开发时会利用到多维数组,定位物体移动的轨迹。
 
如果成绩的范围在扩大到区,就增加一维,扩大到市,就再增加一维。
实际是就是用维数定义了点的空间,用索引定位了空间中点的位置。比如以前初中学习坐标轴,当a点行坐标x=3,纵坐标y=4时,a就可以用(3,4)来定义,二维数组就是可以这样理解。

            理解了维的概念,我们来看一下多维数组的定义和初识化。和c语言不同,多维数组将维数都写“[]”里,用“,”隔开。在c语言中定义二维数组如int a[][];在c#中一定不要搞混,因为它代表另一种数组类型:交错数组,我会在数组的第二节给你们讲解。

        int[,] array6 = new int[10, 10];
声明数组时将其初始化
int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

提问:谁能告诉老师,上面这个定义[ x , y ]各是几?也就是说是几行几列的数组?答案:4行2列[4,2]

这样的赋值老师这样写就比较直观了:

         int[,] array2D = new int[,] { { 1, 2 },
                                          { 3, 4 },
                                          { 5, 6 },
                                          { 7, 8 } };这样就看容易看出每个位的值了。

int[, ,] array3D = new int[,,] { { { 1, 2, 3 } }, { { 4, 5, 6 } } };
声明一个数组变量但先不将其初始化
int[,] array5;
array5 = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };   // OK
//array5 = {{1,2}, {3,4}, {5,6}, {7,8}};     // Error
也可以给数组元素赋值,例如:
array5[2, 1] = 25;

 以上就是我们这一节要学习的知识点,我再将本节的重点强调一下,同时复习。
索引是访问数组成员的依据,值范围是基于从0开始,到数组容量(元素个数、数组长度)-1结束不能超出或等于。
数组的容量是固定的,如果定义时没有赋值,一定要定义数组个数,同时元素值是默认的。
数组对象存在很多类型,主要依其维度结构进行分类。
数组是引用类型,根据地址传递值。

          例如: int[] a ={ 1, 2, 3 };//定义一个a数组,元素值分别是1,2,3
            int[] b=a;//定义一个b数组等于a。这是b在线程里存放的是a元素在托管堆中存放的地址,也就是说b也指向a在堆中的元素值,不会为b另开存储空间,int [] b=new int[3];这种定义b的情况除外,new实际上就是给b在托管堆中另开了一块位置,与a就无关了。
            b[0] = 7;//改变b的0索引的元素值,看a数组中元素的值变化。

                     Console.WriteLine(a[0]);
            Console.WriteLine(a[1]);
            Console.WriteLine(a[2]);

                   结果改变是7,2,3。这就说明了如果有两个数组间是相等的关系,改变一个数组的值,另一个也会有变化。

 下一节我们来学习交错数组以及对数组数据的操作。

你可能感兴趣的:(初始化)