《C#面向对象程序设计》第4章:数组与方法.ppt

上传人:小飞机 文档编号:5896031 上传时间:2023-08-31 格式:PPT 页数:31 大小:468.50KB
返回 下载 相关 举报
《C#面向对象程序设计》第4章:数组与方法.ppt_第1页
第1页 / 共31页
《C#面向对象程序设计》第4章:数组与方法.ppt_第2页
第2页 / 共31页
《C#面向对象程序设计》第4章:数组与方法.ppt_第3页
第3页 / 共31页
《C#面向对象程序设计》第4章:数组与方法.ppt_第4页
第4页 / 共31页
《C#面向对象程序设计》第4章:数组与方法.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《《C#面向对象程序设计》第4章:数组与方法.ppt》由会员分享,可在线阅读,更多相关《《C#面向对象程序设计》第4章:数组与方法.ppt(31页珍藏版)》请在三一办公上搜索。

1、第4章 数组与方法,主要内容与学习目标4.1 数组4.2 多维数组4.3 值类型与引用类型4.4 方法,主要内容与学习目标,主要内容:(1)声明数组、创建对象数组、数组元素的引用。(2)数组的Length属性。(3)数组初始化。(4)可变长度的数组的声明。(5)foreach语句。(6)数组对象的赋值运算。(7)多维数组的声明和创建、多维数组初始化。(8)二维数组应用举例。(9)值类型与引用类型。(10)方法。(11)传值方式、以传值方式传递值类型参数、以传值方式传递引用类型参数。(12)传引用方式、以传引用方式传递值类型参数、以传引用方式传递引用类型参数。(13)值传递方式与引用传递方式比较

2、。学习目标:(1)使用方法,以模块方式构造程序。(2)理解在方法之间传递信息的机制。(3)理解如何声明数组、初始化数组,以及引用数组的单独元素。(4)声明和操纵多下标数组。,4.1 数组,数组是同一类型的一组变量,数组允许你通过同一名称引用这一系列的变量,并使用一个称为“索引”或“下标”的数字来进行区分。数组中包含的变量(又称数组的元素)具有相同的类型,该类型称为数组的元素类型。如果程序中要存储一个月中每一天的日常开销,可以创建一个含有 30 个元素的数组,而不必声明30个变量。数组中的每个元素都存有一个值,可通过指定元素的索引进行访问。例如,如果要用数组number表示5个整数的集合(26,

3、86,98,12,68),可以这样创建数组number:int number=new int5;任务4.1:计算月平均降雨量问题描述:编写程序,从输入对话框中输入12个月中每个月的实际降雨量,计算月平均降雨量及月实际降雨量与月平均降雨量的偏差。并将结果输出。4.1.1 数组初始化4.1.2 可变长度的数组的声明,4.1.1 数组初始化,C#通过将初始值括在大括号()内,为在声明时初始化数组提供了简单而直接了当的方法。特别要注意的是,如果声明时未初始化数组,则数组成员自动初始化为该数组类型的默认初始值。任务4.2:显示月名称 问题描述:修改计算月平均降雨量的程序,使命令窗口中的输入提示是“一月”

4、而不是“1月”,如图4.3所示。,图4.3 从命令窗口中输入值,4.1.2 可变长度的数组的声明,在前面的例子中,我们利用常数指定数组的大小,例如下面的语句中的常数12:double difference=new double12;利用常数声明数组大小不总占用有效的存储空间。例如,假设我们声明大小为100的整数数组:int numbers=new int100;我们把利用常数声明数组称为“定长数组声明”。利用定长数组声明可能产生两个问题:第1个问题是程序最多处理100个数,如果我们需要处理的数多于100(例如,需要处理101个数),则必须修改程序后重新编译,第2个问题是可能产生未充分利用空间的

5、问题,上面的声明语句分配100个空间而忽略这些空间是否被使用。假设程序平均处理20个数,那么该程序的平均空间利用率只有20%。C#并不限于定长数组声明,还可以在每次运行程序时声明不同长度的数组。下面的代码提示用户输入数组的长度,然后创建指定长度的数组:int size;Console.WriteLine(请输入要创建的数组的元素的个数:);size=Int32.Parse(Console.ReadLine();numbers=new intsize;任务4.3:创建数组 问题描述:在创建数组时,元素个数是否能为变量。数组的Length属性。编写一控制台应用程序,先输入要创建的数组的元素的个数,

6、然后输入每个元素的值,最后将数组输出(如图4.4所示)。,图4.4 创建数组,4.2 多维数组,4.2.1 多维数组的声明和创建4.2.2 多维数组初始化4.2.3 二维数组应用举例,4.2.1 多维数组的声明和创建,除一维数组之外,C#还支持多维数组。一维数组由排列在一行中的所有元素组成,它只有一个索引。从概念上讲,二维数组就像一个具有行和列的表格一样。考虑以下考试成绩的表格(表4.1),它有5行2列,5行代表5个学生,2列代表2次考试,第1列代表第1次考试的成绩,第2列代表第2次考试的成绩。我们可以用一个二维数组表示这个表。先声明并创建一个二维数组Score:int,Score=new i

7、nt5,2;其中5表示行数,2表示列数。二维数组有两个索引(索引号从0开始),其中一个表示行,一个表示列,如我们要将第1行第2列的元素赋值为88,表示为:Score0,1=88;Score 0,1表示学生1的考试2成绩,Score0,0表示学生1的考试1成绩。,表4.1 学生考试成绩表,4.2.2 多维数组初始化,可以在声明数组时将其初始化,如下所示:int,myArray=new int,1,2,3,4,5,6,7,8;如果在声明数组时提供了初始值设定项,可省略 new 语句:int,myArray=1,2,3,4,5,6,7,8;如果要声明一个数组变量但不将其初始化,必须使用 new 运算

8、符将数组分配给此变量,例如:int,myArray;myArray=new int,1,2,3,4,5,6,7,8;/正确myArray=1,2,3,4,5,6,7,8;/错误可以给数组元素赋值,例如:myArray2,1=25;也可以读取数组元素的值,例如:int aNumber=myArray10,1;,4.2.3 二维数组应用举例,任务4.4:二维数组 主要知识点:二维数组的声明、创建、初始化。输出二维数组每个元素的值。将初始化的数组作为参数传递给方法。获得数组每维的长度。问题描述:创建一简单程序,演示二维数组的声明、创建、初始化,并将创建的数组对象以调用输出数组的方法输出。任务4.5:

9、学生考试成绩统计主要知识点:二维数组的应用。问题描述:假定5个学生参加了两门课的考试,试统计出全部学生的最高分和全部学生的最低分及每个学生的平均成绩,并输出(如图4.6所示)。,图4.6 成绩统计,4.3 值类型与引用类型,前面讲的基本数据类型都是值类型,到目前为止学过的数组、String、类是引用类型。如果某个数据类型在自己的内存分配中包含数据,则该数据类型是“值类型”。“引用类型”含有指向包含数据的其他内存位置的地址。也就是说,值类型变量的值是该变量包含的实际数据,该实际数据存储在值类型变量的存储位置中。引用类型变量的值为一地址,该变量包含的数据存储在该地址指向的内存位置中。下面我们介绍把

10、一个变量的值赋给另外一个变量时发生的情况,考虑下列使用整数的赋值语句:int num1,num2;num1=14;num2=num1;num1+=5;其中,变量声明语句int num1,num2;分配了存储了一个类型为int的值的存储位置,同时命名这个位置为num1;分配了存储了一个类型为int的值的另一个存储位置,同时命名这个位置为num2(如图4.7所示)。为了在存储位置为num1的存储位置存储一个整数值,即把一个整数值赋给变量num1,我们写出的语句为:num1=14;图4.8说明了此赋值语句执行之后内存的状态。为了在存储位置为num2的地方存储一个与存储位置为num1的地方所存储的值同

11、样的整数值,即把num1变量的值赋给变量num2,我们写出的语句为:num2=num1;图4.9说明此赋值语句执行之后内存的状态。执行语句“num1+=5;”后内存的状态如图4.10所示。,图4.7 声明整型变量的结果,图4.8 整型变量赋值的结果一,图4.9 整型变量赋值的结果二,图4.10 整型变量赋值的结果三,4.4 方法,方法是用来实现可以由对象或类执行的计算或操作。在前面几章中,我们已经尝试过如何在自己定义的类中定义自己的Main方法,也定义过事件处理方法,用它们指定我们在程序中发生的操作,在我们的方法中调用.NET框架类库(FCL)中的一些类的方法以执行特定的任务,如Message

12、Box类的Show方法、Int32类的Parse方法、Math类的Pow方法等。应用程序中的每行代码都必须在某个方法的内部,如Main、Calculate或button1_Click。可以把在一个程序中多次用到的某个任务定义为方法,如常用的计算、文本和控件的操作。方法对执行重复或共享的任务很有用,可以在代码中的许多不同位置调用方法,因此可以将方法作为应用程序的生成块。用方法构造代码有以下优点:方法允许将程序分为不连续的逻辑单元。调试单独的单元与调试不包含方法的整个程序相比要容易得多。可以在其他程序中使用为某个程序开发的方法,而通常只需进行少量修改,甚至不需要修改。4.4.1 传值方式4.4.2

13、 以传值方式传递值类型参数4.4.3 以传值方式传递引用类型参数4.4.4 传引用方式4.4.5 以传引用方式传递值类型参数4.4.6 以传引用方式传递引用类型参数,4.4.1 传值方式,如果声明方法的参数时,参数前没有ref或out修饰符,则调用方法时,以传值方式向方法传递参数。在C#中默认为通过值传递参数。所谓“传值”,就是在方法调用时,将实参的值传递给形参。如果实参的类型为值类型,则实参的值为该参数包含的数据。如果实参的类型为引用类型,则实参的值为地址。如参数是以传值方式传递,形参将创建新的存储位置,在该存储位置存储形参接收的值。也就是说,被调用的方法将接收实参的一个副本。传值时,如果对

14、被调用的方法的值的副本进行修改(也就是形参的值进行修改),不会影响实参变量的值。也就是说,传值时,允许在方法体内将新值赋给形参。这样的赋值只影响由形参表示的局部存储位置的值它们不影响在方法调用中给出的实参的值,这是因为参数以传值方式传递时,形参和实参的存储位置不同。以传值方式时,形参的初始化是通过复制对应实参的值来完成的。在这里我们再给出一个概念:值参数。值参数以传值方式进行传递。注意,不要将值参数和值类型参数弄混淆。值参数既可是值类型参数也可以是引用类型参数。值参数在调用方法时出现,并由调用中给定的参数值初始化。值参数也是局部变量,它和局部变量一样,当所在方法返回时消失。,4.4.2 以传值

15、方式传递值类型参数,值类型参数的值为该参数包含的实际数据,以传值方式传递值类型参数时,当形参接收到实参的值后,形参变量和实参变量就不再有任何关系。任务4.6:移动矩形 问题描述:创建一个Rectangle类来描述矩形,矩形有两个基本属性即位置和大小。并定义一个方法,将矩形的位置调整指定的量。,4.4.3 以传值方式传递引用类型参数,引用类型参数的值是地址,该地址表示的存储位置存储的是该引用类型变量引用的对象。以传值方式传递引用类型参数时,形参分配独立的存储位置,该存储位置与实参的存储位置不同。形参接收到的值为一地址并将其存储在形参表示的存储位置中,形参所引用的对象存储在形参的值表示的存储位置中

16、。因此,以传值方式传递引用类型参数时,将创建实参值(地址)的副本,而不是实参引用对象的副本。数组是引用类型,数组变量的值是一地址,该地址表示的存储位置存储的是该数组变量所引用的数组对象。要向方法传递一个数组参数,需要在省略括号的前提下指定数组名。如任务4.1中调用printArray方法采用如下方式:printArray(app.rainfall);任务4.7:以传值方式传递数组主要知识点:通过传值方式传递引用类型变量。下面的例子使用任务4.1中的代码,修改printArray方法。该例子演示:向printArray方法传递引用类型的参数app.rainfall。由于该参数是对app.rain

17、fall数组对象的引用,所以printArray方法有可能更改数组元素的值。但是,将形式参数aArray重新分配到不同的内存位置时,该操作仅在方法内有效,并不影响原始变量app.rainfall。解决方案:(1)打开任务4.1的项目,然后打开其代码文件。将MonthActualApp类的printArray方法修改如下(修改处见带底纹部分):(2)按Ctrl+F5键运行该应用程序,仍然按图4.1所示输入数据,可得到如图4.19所示的输出。(3)再次将printArray方法修改如下(修改处见带底纹部分):(4)按Ctrl+F5键运行该应用程序,仍然按图4.1所示输入数据,可得到如图4.20所示

18、的输出。,图4.19 程序运行结果,图4.20 程序运行结果,4.4.4 传引用方式,以传值方式传递引用类型的参数时,有可能更改引用所指向的数据,如数组元素的值。但是无法更改引用本身的值;也就是说,在方法内不能使用new运算符对原始数组进行重新分配内存。若要这样做,那该怎么办呢?如果希望通过传递一个值类型参数,在方法内对该参数的修改能够返回给原始参数,那又该怎么办呢?为实现这样的编程,C#提供了关键字ref和out。ref和out关键字指出一个值类型变量或引用类型变量应该以传引用方式传递。如果使用关键字ref和out通过引用传递变量,则方法能够修改变量本身。具体说来,如果参数为对象变量,则在方

19、法内可以给它分配新的对象。这种重新分配也会影响到调用程序中的对象变量。如果参数为值类型变量,在方法中对参数所做的任何更改都将反映在该变量中,因此参数使用ref和out关键字后被调用的方法能够修改原始变量。若要使用 ref 参数,必须将参数作为 ref 参数显式地传递到方法。ref 参数的值被传递到 ref 参数。传递到 ref 参数的参数必须最先初始化。out指定一个输出参数,被调用的方法会向其赋值。通常,当方法收到一个未初始化的值时,会发生编译错误,如在参数前添out关键字,可要求被调用的方法对其进行初始化,并防止发生未初始化变量的错误。若要使用out参数,必须将参数作为out参数显式传递到

20、方法。out参数的值不会传递到out参数。不必初始化作为out参数传递的变量。然而,必须在方法返回之前为out参数赋值。out参数通常用于产生多个返回值的方法中。,4.4.5 以传引用方式传递值类型参数,1.ref参数任务4.8:调用方法获得多个值(使用ref参数)主要知识点:通过传引用方式传递值类型变量。问题描述:在矩形Rectangle类中,声明方法getXYWH,用户调用该方法时,可一次获得表示矩形位置的x、y坐标和矩形的宽度(Width)、高度(Height)。解决方案:(1)创建一个空项目Testref,向该项目添加如下代码文件(2)添加引用后。按Ctrl+F5键执行该应用程序,可得

21、到如图4.24所示的输出。2.out参数任务4.9:调用方法获得多个值(使用out参数)主要知识点:使用out参数。问题描述:使用out参数修改上一个示例,使其完成同样的任务。解决方案:使用out参数调用方法时,不必对out参数初始化,由被调用的方法为其赋值。编译并运行程序,可得到如图4.25所示的输出。3.ref参数与out参数的比较任务4.10:改变矩形位置主要知识点:ref参数与out参数的区别。问题描述:声明一矩形类,在矩形类中声明一方法ChangePos,该方法将矩形的位置坐标x、y改变为参数指定的量,并将修改后的矩形的位置坐标x、y返回。解决方案:由于要求方法返回两个值,因此必须使

22、用传引用方式传递参数,因为方法要使用传递参数的值,所以必须采用ref参数。(1)创建一个空项目Testref1,在该项目中添加如下类:(2)编译并运行程序,可得到如图4.26所示的输出。,图4.24 程序运行结果,图4.25 程序运行结果,图4.26 程序运行结果,4.4.6 以传引用方式传递引用类型参数,以传值方式传递引用类型的参数时,有可能更改引用所指向的数据,如数组元素的值。但是无法更改引用本身的值;也就是说,在方法内不能使用new运算符对原始数组进行重新分配内存。可使用C#提供的ref或out关键字解决这一问题。我们再次强调,ref或out关键字告诉编译器,形参将不创建新的存储位置,形

23、参指向与正被传递的参数(实参)相同的存储位置。这样如果被调用方法修改了形参的值并且返回,调用代码的变量(实参)的值就被修改了。注意:修改了引用类型变量的值,该变量就引用一个新的对象,也就是给该变量创建了一个新的对象。下面的示例演示了采用传引用方式传递引用类型参数的使用。任务4.11:调用方法为实参创建新的对象 主要知识点:通过传引用方式传递引用类型变量。问题描述:修改任务4.1中的代码和printArray方法,演示通过引用传递方式向printArray方法传递引用类型的参数app.rainfall。由于采用引用传递方式传递参数,实参和形参存储位置相同,因此在方法中对形参重新创建对象(形参的值被修改)后,实参也被重新分配对象,也就是在被调用方法中为实参创建了一个新对象。解决方案:(1)打开任务4.1的项目及其代码文件。将MonthActualApp类的printArray方法修改(2)修改Main方法中调用printArray方法的参数类型(3)按Ctrl+F5键来运行程序,还是按图4.1所示输入数据,可得到如图4.27所示的输出。,图4.27 以传引用方式传递引用类型参数,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号