第06章方法课件_第1页
第06章方法课件_第2页
第06章方法课件_第3页
第06章方法课件_第4页
第06章方法课件_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录第1章计算机、因特网、万维网和C#第2章VisualStudio.NET集成开发环境第3章C#编程介绍第4章控制结构(一)第5章控制结构(二)第6章方法第7章数组第8章基于对象的编程第9章面向对象编程:继承第10章面向对象编程:多态性第11章异常处理第12章图形用户界面概念(一)第13章图形用户界面概念(二)第14章多线程第15章字符、字符串和正则表达式第16章图形和多媒体第17章文件和流第18章数据库、SQL和ADO.NET第19章可扩展标记语言(XML)第20章ASP.NET、Web窗体和Web控件第21章ASP.NET和Web服务第22章网络:基于流的套接字和数据包第23章数据结构和集合第24章可访问性第一部分.NET综述第二部分结构化编程第三部分面向对象编程第四部分C#相关应用第五部分C#应用扩展第6章方法6.1概述

开发和维护大型程序的最好方式是将其分拆为许多小的、简单的程序段或者模块,然后再由它们组成这个复杂的大程序。 这个技术被称为“分而治之”。

C#中的程序模块称为方法和类。C#程序是由新方法和类组合而成的,这些方法和类是程序员在.NET框架类库(FCL)中的方法和类的基础上完成的。

FCL提供了丰富的类和方法的集合。这些类和方法可以实现常见的数学计算、字符串操作、字符操作、输入输出操作、检错操作和许多其他有用的操作。 程序员可以通过编写方法的方式来描述那些程序中使用多次的特定任务。这些方法称为程序员定义(或用户定义)方法。6.2C#中的程序模块

Math类方法可以使程序能够完成某种常见的数学计算。 注意事项:

Math类在System命名空间中,因此使用的时候没必要添加程序集的引用。

P121图6.2显示了常用的Math类方法。6.3Math类方法

方法使得程序员可以模块化程序。在方法定义体中声明的变量为局部变量(即只有定义它们的方法知道它们的存在)。大多数方法带有一个参数列表,它可以使方法调用时在方法之间进行通信。方法的参数也是该方法的局部变量。 用方法来模块化程序有3个动机:

(1)分而治之。 (2)软件重用。 (3)避免在程序中重复编写代码。6.4方法

参数的强制转换指把参数强制转换为适合向方法传递的类型。这个过程通常为隐含转换。在这个过程中,复制的变量值的拷贝不用直接进行强制转换就可以转换为不同类型。 这些转换工作也可以由命名空间System中的Convert类来完成。

C#语言既支持宽转换也支持窄转换。 6.6参数提升(转换)

FCL(框架类库)定义在集合.dll文件里。

命名空间 描述

System 包含基本的类和数据类型。

System.Data 包含ADO.NET中的类,

System.Drawing 包含用于绘画和图形的类

System.IO 包含数据输入和输出的类,如文件

System.Threading 包含多线程的类

System.Windows.Forms 包含用于创建图形用户接口的类

System.Xml 包含用于处理XML数据的类6.7C#命名空间

一个数值类型的变量包含着该类型的数据。相反,一个引用类型的变量包含着存储数据的内存地址定位。数值类型通常代表数据的单个段,例如int或bool值。另一方面,引用类型代表着可以包含许多独立的数据段的对象。

C#语言包含内置数值类型和引用类型。内置数据类型有整数数据类型,浮点数据类型和decimal、bool数据类型。内置数据类型有string和object。 程序员可以创建数值类型和引用类型。6.8数值类型和引用类型

在许多编程语言中都有两种向方法中传递参数的方式:通过值传递和通过引用传递。 当通过值来传递参数时,被调用的方法接收了该参数的复制值。

当参数通过引用传递时,调用者给了被调用方法直接访问和修改调用者的原始数据的权力。6.9传输参数:值传递与引用传递

数值类型的变量通过数值向方法中传递参数,而引用类型变量是通过引用向方法中传递参数。 如果程序员想通过引用的方式向方法中传递一个数值类型的话,可以这样做:

C#语言提供了关键字ref和out。关键字ref指定了一个数值类型参数应该由引用来传递。关键字out指定了一个输出参数,该参数是被调用方法将要对其赋值的参数。 请看P134代码。

命名空间System中定义了Random类。其用法如下:

RandomrandomObject=newRandom(); intrandomNumber=randomObject.Next(); Next方法产生一个从0到常量Int32.MaxValue的确定的整数值。 由Next方法产生的数值事实上都是伪随机数——由一个复杂的算术计算产生的序列。在该算数计算中要有一个种子值。我们一般选择当前的时间作为种子值。6.10生成随机数

Next方法的单参数形式产生一个范围从0到该参数(但不包含该值)的随机序列。例如:

value=randomObject.Next(6);

将产生一个从0到5的随机序列。

Next方法的双参数形式产生一个两个参数之间的随机序列。例如: value=randomObject.Next(1,7);

将产生一个从1到6的随机序列。 请看P137的程序。

请看P138的程序。 注意:Directory类需要在代码中添加引用: usingSystem.IO;

Directory类GetCurrentDirectory方法将返回正在执行的文件夹的路径。如果在VS.NET环境下运行该程序的话,这个返回的路径值将是工程路径中的bin\Debug路径。 代码第46行中增加的路径是程序员在工程的bin\Debug路径下又新建了一个images的文件夹,其中放置了die1.gif到die6.gif一共6张图片。

称为“双骰子赌博”的掷骰子游戏是最流行的机率游戏之一。规则如P142所示。 思考题: 书中的代码逻辑上有一些问题,请仔细阅读代码,并改正这些代码中的错误。6.11机率游戏

变量的属性包括名称、类型、大小和值。还有持续周期和作用范围这些属性。 变量的持续周期(也称为生命周期)是指该变量在内存中存在的周期。变量的作用范围是指程序中哪些地方可以引用变量标识符(即变量的名字)。 方法中(即参数和在方法中声明的变量)的局部变量有一个自动的生命周期。

对于类的实例变量,如果程序员没有提供初始值,则编译器会对它进行初始化。例如P140中的第32行代码。 局部变量在其值被使用之前,必须进行初始化。静态生命周期的变量从定义它们的类被载入内存时就开始存在了。直到程序结束时,它们才消失。6.12变量的持续周期

变量、引用或方法的标识符的作用范围(有时也称声明空间)是指这些标识符可以访问的程序部分。 类的成员的具有类的作用范围并且在类的声明空间中可以被看到。在一个程序块中声明的标识符有该程序块的作用范围(局部变量声明空间)。程序块的作用范围开始于标识符的声明,结束于该程序块的结束右花括号“}”。方法的局部变量有该程序块的作用范围属性,同样,方法的参数也是方法的局部变量。

注意:当程序块嵌套于方法体中,并且在外层程序块中的一个标识符和内层程序块中定义的标识符有相同的名字,此时将产生错误。另一方面,如果方法中的局部变量和一个实例变量有相同的名字的时候,调用方法中的该变量值将被“隐藏”起来,直到被调用方法结束执行的时候为止。即为“局部优先原则”。

请看P146的代码。6.13变量的作用范围

递归方法就是指直接或间接地由别的方法来自己调用自己的方法。6.14递归图6-145!的递归推导5!5*4!4*3!3*2!2*1!15!5*4!4*3!3*2!2*1!11returned返回2!=2*1=2返回3!=3*2=6返回4!=4*6=24返回5!=5*24=120Finalvalue=120 publiclongFactorial(longnumber)

{ if(number<=1) return1; else returnnumber*Factorial(number-1); }

斐波拉契数列0,1,1,2,3,5,8,13,21,……

这个序列开始于0和1,并且有如下属性:每个子斐波拉契数列数值都是前两个斐波拉契数列数字的和。

publicintFibonacci(intnumber) { if(number==0||number==1) returnnumber; else returnFibonacci(number-1)+Fibonacci(number-2); }6.15使用递归的实例

当程序遇到Fibonacci(number-1)+Fibonacci(number-2)这样的语句的时候,C#语言是按照从作向右的顺序进行计算的。

C和C++语言对大多数运算符(包括+运算符)的操作数的计算顺序并不做定义。所以在大多数变成语言中,程序员将不会对这些调用执行的顺序做任何假设。C#语言定义了操作数的计算顺序是从左到右。 要避免Fibonacci风格的递归程序,因为它会导致调用方法的次数指数幂增长。

斐波拉契数列的非递归形式: publicvoidFactorial()

{ inta=1,b=1; for(inti=1;i<=10;i++) { a=a+b; b=b+a; } }

迭代和递归都是基于一种控制结构的——迭代使用循环结构(例如for、while或do/while),而递归使用分支结构(例如if、if/else或switch)。 迭代和递归都要涉及循环问题——迭代直接明确地使用循环结构而递归则通过重复调用方法的方式来实现循环。 迭代和递归都要涉及一个结束测试——迭代是当循环继续的条件为假时结束的,而递归是当识别到基本问题的时候结束递归的。 循环计数迭代和递归都是逐渐地逼近结束条件。 迭代和递归都可以被无限次执行。 从性能角度出发应避免使用递归。递归调用占据很多时间并消耗额外地内存。6.16递归与迭代的比较

C#语言可以在同一个类中定义具有相同名字的几个方法,只要这些方法有不同的参数设置(参数的数目、参数类型或者参数的顺序)就可以。这称为方法重载。 当程序中的一个重载方法被调用时,C#编译器通过检查调用者使用的参数的数目、类型和顺序来选择确切的方法。 方法重载通常是用来创建带有相同名字且执行相似任务,但处理的数据类型不一样的几个方法。6.17方法重载

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论