c#教案第七章.docx
《c#教案第七章.docx》由会员分享,可在线阅读,更多相关《c#教案第七章.docx(16页珍藏版)》请在冰豆网上搜索。
c#教案第七章
长江大学工程技术学院章节备课
章节
名称
第七章(1-7节)
备注
课序
21
学时
2
本章主要参考文献资料:
基本
内容
声明和创建数组,多维数组,交错数组,foreach语句
数组与方法,Array类
教学目的与教学思路
掌握数组的基本概念,对多维数组交错数组有初步的认识
教学重点难点
重点
数组的声明,创建,foreach语句
难点
多维数组,数组与方法
练习与思考题
数组的使用
过程考核要点
考勤
教学
方法
多媒体讲解、案例讲解
教学内容提要
具体内容
时间分配
7.1声明和创建数组
对应着一组顺序排放的存储单元,数组中的每个元素数组是数据类型相同、数目一定的变量的有序集合,组成数组的变量称为该数组的元素。
内存分配时,数组按照创建时的次序在其中存放。
C#语言中,数组是一种引用类型。
使用前需要声明和创建。
7.1.1声明数组
数据类型[]数组名
例:
int[]a;
string[]str;
注意:
int[5]a;//错误
intb[];//错误
7.1.2创建数组
数组名=new数据类型[数组元素个数]
例:
a=newint[5];
注意:
数组的声明和创建可以出现在同一条语句中。
7.1.2创建数组(续)
访问数组中的元素:
数组名[索引表达式]
注意:
索引表达式的最大值是数组元素个数减1,如果指定的索引表达式的值大于最大值或小于0,程序运行时,将会引发异常。
用类型数组中保存只是对象引用。
在访问这些对象的成员前,必须使用new运算符创建实际的对象。
创建数组时可以给数组元素指定初始值:
int[]b=newint[3]{1,2,3,}int[]c=newint[4]{1,2,3,}//错
注意:
在这种初始化形式中,方括号内用于指定数组元素个数的表达式必须是一个常量表达式。
7.1.2创建数组(续)
用于初始化的值的个数必须与数组中元素的个数相同,因此,上述初始化表达式中完全可以不用显式给出元素的个数。
int[]b=newint[]{1,2,3};//有3个元素
更简洁的初始化方式:
int[]b={1,2,3,};
//只能与数组声明出现在同一条语句中
7.1.2创建数组(续)
int[]b;
b={1,2,3};//错误
而:
int[]b;
b=newint[]{1,2,3};//正确
例7-3初始化数组
7.2多维数组
int[,]array;
array=newint[3,2];
int[,,]array=newint[2,3,4];
7.2多维数组(续)
创建多维数组时,可以同时初始化:
int[,]array1=newint[4,2]
{{1,2},{3,4},{5,6},{7,8}};
int[,,]array2=newint[,,]
{{{1,2,3}},{{4,5,6}}};
7.2多维数组(续)
也可以采用如下形式声明并创建一个多维数组:
int[,]array4={{1,2},
{3,4},{5,6},{7,8}};
注意:
这种简洁方式只能与数组声明出现在同一条语句中。
7.2多维数组(续)
创建一个多维数组后,就可以通过下述表达式访问其中的元素:
数组名[索引表达式1,索引表达式2,…]
其中,每个索引表达式的值都必须在0到它指定的维度的大小减1之间。
例7-4多维数组
7.3交错数组
元素是数组对象的数组通常被称作交错数组:
int[][]jaggedArray=newint[3][];
从本质上说,它是一个由3个元素组成的一维数组,其中每个元素都是一个一维int型数组。
7.3交错数组(续)
交错数组是数组的数组,因此,从本质上说它是一种引用类型的一维数组,元素默认值为null。
在访问其元素前,必须使用new运算符初始化:
jaggedArray[0]=newint[5];
jaggedArray[1]=newint[4];
jaggedArray[2]=newint[2];
交错数组元素中所包含元素的个数可以不同。
7.3交错数组(续)
可以使用初始值列表来初始化交错数组元素:
jaggedArray[0]=newint[]{1,3,5,7,9};
jaggedArray[1]=newint[]{0,2,4,6};
jaggedArray[2]=newint[]{11,22};
7.3交错数组(续)
可以在声明交错数组时直接初始化:
int[][]jaggedArray=newint[][]{newint[]{1,3,5,7,9},newint[]{0,2,4,6},
newint[]{11,22}};
int[][]jaggedArray3={newint[]{1,3,5,7,9},newint[]{0,2,4,6},newint[]{11,22}};
7.3交错数组(续)
对于上述定义,可以使用如下例所示形式访问交错数组中的个别元素:
jaggedArray3[0][1]=77;
jaggedArray3[2][1]=88;
7.3交错数组(续)
可以混合使用交错数组和多维数组:
int[][,]jaggedArray4=newint[3][,]{newint[,]{{1,3},{5,7}},newint[,]{{0,2},{4,6},{8,10}},newint[,]{{11,22},{99,88},{0,9}}};
对于上述定义,可以使用如下例所示形式访问个别元素:
System.Console.Write("{0}",jaggedArray4[0][1,0]);
7.3交错数组(续)
与多维数组不同,对于交错数组,属性Length返回的是包含在当前交错数组中的数组元素的数目。
例:
System.Console.WriteLine(
jaggedArray4.Length);
//输出值3
7.3交错数组(续)
必须注意,即使某个交错数组是“矩形”或“长方体”等形状,也不能使用下述方法创建:
int[][]array=newint[3][4];
例7-5交错数组
7.4foreach语句
foreach(数据类型循环变量名in集合)
语句
foreach语句的执行顺序是:
首先创建一个循环变量,然后从集合中读取第1个元素赋值给该变量(如果集合中不存在元素,foreach语句的执行自动结束),并执行循环体;每次执行完循环体后,如果集合中还有剩余元素,就继续按顺序从集合中读取下一个元素赋值给该变量,并执行循环体;否则,结束foreach语句的执行。
7.4foreach语句(续)
foreach语句中循环变量的值在循环体内不应改变。
事实上,当循环变量的类型是简单类型时,编译器会阻止这种情况的发生。
例:
int[]arr={1,2,3,4};
foreach(intiinarr)
{
i=0;//编译错误
i++;//编译错误
}
7.4foreach语句(续)
当循环变量不属于简单类型时,调用对象的相关方法有可能会改变该变量的值,但最好不要这样做。
例7-6foreach语句
7.4foreach语句(续)
对于多维数组,可以使用相同的方法来循环访问元素。
此时,foreach循环从索引全部为0开始顺序访问所有的索引组合,右边的索引值先增加,当右边的索引值增加到上限时,被重置为0,这时左边的索引值加1。
int[,]numbers2D=newint[3,2]{{9,99},{3,33},{5,55}};
foreach(intiinnumbers2D)
System.Console.Write("{0}",i);
7.4foreach语句(续)
foreach语句用于交错数组时,通常需要嵌套该循环,才能得到实际的数据。
int[][]array={newint[]{1,2},newint[]{3},newint[]{4,5,6}};
foreach(int[]iinarray)
{
foreach(intjini)
System.Console.WriteLine(j);
}
7.4foreach语句(续)
int[][]array={newint[]{1,2},newint[]{3},newint[]{4,5,6}};
foreach(intiinarray)
System.Console.WriteLine(i);
上述foreach语句是错误的。
因为数组array中包含的元素是int[]类型,而不是int类型,必须循环每个数组元素和该交错数组本身。
7.5数组与方法
7.5.1将数组传递给方法
7.5.2参数数组
7.5.3Main方法和命令行参数
7.5.4返回数组
7.5.1将数组传递给方法
数组是一种引用类型,其对象可以用作参数传递给方法。
这种传递属于引用传递。
例7-7将数组传递给方法
7.5.2参数数组
所谓参数数组是指用关键字params修饰的数组类型的形式参数。
使用参数数组,可以直接传递同一类型的数目可变的参数,从而简化了编程。
7.5.2参数数组(续)
classA
{
publicstaticvoidMethod(paramsint[]array)
{}
}
对于上述方法,完全可以使用下述语句调用:
A.Method(1,2)
编译器会将上述调用语句转换成类似如下的代码:
int[]array=newint[]{1,2};
A.Method(array);
当然也可以使用下述语句调用:
A.Method(1,2,3)
7.5.2参数数组(续)
向参数数组传递多个参数时,实际上,编译器会将这些参数写入一个数组,然后传递给它。
因此,参数数组除了可以用多个与参数数组元素类型相容的参数初始化外,还可以用一个元素类型与参数数组的元素类型相同的数组初始化。
使用关键字params修饰的数组只能是一维数组。
一个方法只能有一个参数数组,而且此参数数组必须是方法定义中的最后一个参数。
参数数组必须是值参数,不能使用关键字ref或out修饰。
参数数组是自动可选的,即可以不给参数数组传递任何参数。
关键字params不能用于区分重载方法。
7.5.3Main方法和命令行参数
Main方法的方法头可以是下列4种形式之一:
staticvoidMain()
staticintMain()
staticvoidMain(string[]args)
staticintMain(string[]args)7.5.3Main方法和命令行参数(续)
命令行中的参数传递给Main方法后,保存在Main方法的字符串数组参数args中。
其中,命令行中的第1个参数保存在args[0]中;命令行中的第2个参数保存在args[1]中;......;依此类推。
7.5.4返回数组
数组也可以用作方法的返回值。
从某一方法返回数组,实际返回的只是一个引用数组的引用。
通过这个引用就可以操作相应的数组。
7.6Array类
7.6.1数组的复制
7.6.2数组排序
7.6.3在数组中查找
7.6.1数组的复制
Array.Copy
CopyTo
7.6.2数组排序
Array.sort:
可以给一维数组中的全部或部分元素按从小到大的顺序排序。
排序依据的是数组元素实现的接口System.IComparable或特别给出的与之相关的实现了接口System.IComparer的类。
7.6.2数组排序(续)
接口IComparable和IComparer是比较对象大小的标准方式,
接口IComparable在要待比较的对象的类型中实现,用于比较当前对象与另一个对象;而接口IComparer在另一个单独的类中实现,用于比较任意两个对象。
最常用的是接口IComparable,.NET框架预定义的许多类型都实现了该接口。
比如,数值类型中,该接口被实现按数值大小进行比较。
7.6.2数组排序(续)
为了使某个类型具有默认的比较能力,应该实现接口System.IComparable。
接口IComparable中只有一个方法CompareTo,该方法有一个Object型参数,当这个参数大于该方法所属的对象时返回负整数,等于该方法所属的对象时返回0,小于该方法所属的对象时返回正整数。
7.6.2数组排序(续)
比较两个对象的大小:
实现了接口IComparable的同类对象可以调用方法CompareTo比较大小。
7.6.3在数组中查找
Array.BinarySearch:
在一个一维数组中查找某个元素。
如果查找到了目标元素,返回数组中目标元素的索引值;否则,返回一个负整数。
查找时,比较的依据是数组元素和待查对象所实现的接口IComparable或特别给出的与之相关的实现了接口IComparer的类。
查找前,待查数组必须已经相应地依据数组元素实现的接口IComparable或特别给出的与之相关的实现了接口IComparer的类按从小到大顺序排序。