C_#函数基础[1]
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[案例] 定义一个函数,用于求两个数中的大数。 /*功能:定义一个求较大数的函数并在主函数中调用*/ static int max(int n1, int n2) /*定义一个函数max()*/ { return (n1>n2?n1:n2); } static void Main(string[] args) { int num1,num2; num1=4; num2=5; Console.WriteLine(max(num1,num2)); Console.ReadLine(); }
[Return]
1.4 函数的形参与实参
函数的参数分为形参和 实参 两种,作用是实 现数据传送。 形参出现在函数定义中,只能在该函数体内 使用。发生函数调用时,调用函数把实参的值复 制1份,传送给被调用函数的形参,从而实现调 用函数向被调用函数的数据传送。
[案例] 实参对形参的数据传递。
/*实参对形参的数据传递。*/
局部变量和全局变量
在一个函数内部声明的变量是内部变量,它只在 该函数范围内有效。 也就是说,只有在包含变量声明的函数内部,才 能使用被声明的变量,在此函数之外就不能使用这些 变量了。所以内部变量也称“局部变量”。
对于一个类,如果是全局变量,那么在整个类中
都可以访问这个数据。如果是非全局变量,那么只能 在声明这个变量的代码块中访问。
•
[Return]
函数的定义
• 函数就是可以完成一定功能,可以重复执行的代 码块.同时在面向对象过程中,函数就是方法的 另一种叫法.函数可以使代码的可读性更高,可 以创建多用途的代码. • 函数的作用: (1)代码复用 (2)提高代码可读性 (3)创建多用途代码
1 .1 函数的定义
1.任何函数(包括主函数Main())都是由函 数声明和函数体两部分组成。根据函数是否需要 参数,可将函数分为无参函数和有参函数两种。 (1)无参函数的一般形式 函数类型 函数名(函数参数) {
关于局部变量的作用域还要说明以下几点:
1 .主函数 Main() 中定义的内部变量,也只能在主函数 中使用,其它函数不能使用。同时,主函数中也不能使用其 它函数中定义的内部变量。因为主函数也是一个函数,与其 它函数是平行关系。这一点是与其它语言不同的,应予以注 意。
2 .形参变量也是内部变量,属于被调用函数;实参变 量,则是调用函数的内部变量。 3 .允许在不同的函数中使用相同的变量名,它们代表 不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
对象名作为函数的形参和实参
对象名作函数参数时,既可以作形参, 也可以作实参。 对象名作函数参数时,要求形参和相对 应的实参都必须是类型相同的对象。
作业
• 1使用C#数组实现冒泡排序算法 • 2.输入10个学生的成绩,求最高成绩、最低成 绩和平均成绩。
• 冒泡排序策略:搜索整个数组,比较相邻元素,如果两者的相对大小次 序不对,则交换它们,其结果是最大值“像水泡一样”移动到数组的最 后一个位置上,这也是它在最终完成排序的数组中合适的位置。 然后,再次搜索数组,将第二个大的值移动至倒数第二哥位置上,重复 该过程,直至将所有元素移动到正确的位置上。
说明:
( 1 )调用函数时,函数名称必须与具有该功能的自 定义函数名称完全一致。 ( 2 )实参在类型上按顺序与形参,必须一一对应和 匹配。如果类型不匹配,编译程序将按赋值兼容的规则 进行转换。如果实参和形参的类型不赋值兼容,通常并 不给出出错信息,且程序仍然继续执行,只是得不到正 确的结果。 (3)如果实参表中包括多个参数,对实参的求值顺 序随系统而异。有的系统按自左向右顺序求实参的值, 有的系统则相反。
注意:调用函数中无return语句,并不是不返回一个值,而是一个
不确定的值。为了明确表示不返回值,可以用“void”定义成“无(空) 类型”。
2.函数类型 在定义函数时,对函数类型的声明,应与 return 语句中、返回值表达式的类型一致。 如果不一致,则以函数类型为准。如果缺省函数 类型,则系统一律按整型处理。
static void s(int n) { int i; Console.WriteLine(n); for(i=n-1; i>=1; i--) n=n+i; /*改变形参的值*/ Console.WriteLine(n); /*输出改变后形参的值*/ }
static void Main(string[] args) { int n=100; /*定义实参n,并初始化*/ s(n); /*调用函数*/ Console.WriteLine(n); Console.ReadLine(); }
全局,从这个字面上就可以直达它的含义了,就是声明在当前任何 地方都可以访问的变量;比如: class A { int a=0;//全局变量 pulic void B() { int b= 0;//局部变量 } public void C() { int c= 0; c=a; c=b;//抛出异常 } } 在A这个类里a是全局变量,b是局部变量,c是局部变量,c可以访问全 局变量a,但访问不到局部变量b,b的作用域只是在方法B的两个{} 之间。a的作用域就在类A的两个{}之间 。
static bool isalp(char c) { if (c>='a'&&c<='z'||c>='A'&&c<='Z') return true; else return false; } static void Main(string[] args) { int i,num=0; string line=Console.ReadLine(); char[] str=line.ToCharArray(); int lineLen=str.Length; for(i=0;i<lineLen;i++) if (isalp(str[i])) num++; Console.WriteLine(num); Console.ReadLine(); } [程序演示]
说明: (1)用数组元素作实参时,只要数组类型和函数的 形参类型一致即可,并不要求函数的形参也是下标变量。 换句话说,对数组元素的处理是按普通变量对待的。 (2)在普通变量或下标变量作函数参数时,形参变 量和实参变量是由编译系统分配的两个不同的内存单元。 在函数调用时发生的值传送,是把实参变量的值赋予形 参变量。
[Return]
2.2 数组名作为函数的形参和实参
与数组元素作为函数的形参和实参不同,用 数组元素作实参时,对数组的处理是传送引用 (地址)。 即在数组作函数参数时,形参变量和实参变 量是由编译系统分配的两个相同的内存单元。在 函数调用时发生的地址传送,是把实参的地址赋 予形参变量。
• 类的成员方法实际上是函数,可分为一般的成 员方法和构造函数与析构函数。
4.在复合语句中也可定义变量,其作用域只在复合语 句范围内。
[Return]
函
数
1.函数的定义与调用 2.数组作为函数参数 3.内部变量与外部变量 4.内部函数与外部函数 5.变量的动态存储与静态存储 [Return]
1.函数的定义与调用
1.1函数的定义 1.2函数的返回值与函数类型 1.3函数的调用 1.4函数的形参与实参
1.2 函数的返回值与函数类型
函数可分为有返回值函数和无返回值函数两种。
1.函数返回值与return语句 有参函数的返回值,是通过函数中的return语句来获得 的。 (1)return语句的一般格式: return ( 返回值表达式 ); (2)return语句的功能:返回调用函数,并将“返回值 表达式”的值带给调用函数。
良好的程序设计习惯:为了使程序具有良好的可
读性并减少出错,凡不要求返回值的函数都应定义为 空类型;即使函数类型为整型,也不使用系统的缺省 处理。
[Return]
1.3 函数的调用
在程序中,是通过对函数的调用来执行函数体的,其过程与其它 语言的子程序调用相似。 函数调用的一般形式为: 函数名([实际参数表])
切记 :实参的个数、类型和顺序,应该与被调用函数所要求的
参数个数、类型和顺序一致,才能正确地进行数据传递。
可以用以下几种方式调用函数:
(1)函数表达式。函数作为表达式的一项,出现在表达式中, 以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。 (2)函数语句。函数可以只进行某些操作而不返回函数值,这 时的函数调用可作为一条独立的语句。 (3)函数实参。函数作为另一个函数调用的实际参数出现。这 种情况是把该函数的返回值作为实参进行传送,因此要求该函数必 须是有返回值的。
[Return]
2 数组作为函数参数
数组用作函数参数有两种形式:一种是把数组元素 作为实参使用;另一种是把数组名作为函数的形参和实 参使用。 2.1 数组元素作为函数参数 2.2 数组名作为函数的形参和实参
[Return]
ቤተ መጻሕፍቲ ባይዱ
2.1 数组元素作为函数参数
数组元素就是下标变量,它与普通变量并无区别。数 组元素只能用作函数实参,其用法与普通变量完全相同: 在发生函数调用时,把数组元素的值传送给形参,实现单 向值传送。 [案例] 写一函数,统计字符串中字母的个数。
声明语句部分;
可执行语句部分;
}
(2)有参函数的一般形式
函数类型 函数名( 数据类型 参数[,数据类型 参数2……] )
{
声明语句部分; 可执行语句部分; } 有参函数比无参函数多了一个参数表。调用有参 函数时,调用函数将赋予这些参数实际的值。 为了与调用函数提供的实际参数区别开,将函数 定义中的参数表称为形式参数表,简称形参表。
[程序演示]
说明:
(1)实参可以是常量、变量、表达式、函数等。无论实参是何 种类型的量,在进行函数调用时,它们都必须具有确定的值,以便 把这些值传送给形参。 因此,应预先用赋值、输入等办法,使实参获得确定的值。 (2)形参变量只有在被调用时,才分配内存单元;调用结束时, 即刻释放所分配的内存单元。 因此,形参只有在该函数内有效。调用结束,返回调用函数后, 则不能再使用该形参变量。 (3)实参对形参的数据传送是单向的,即只能把实参的值传送 给形参,而不能把形参的值反向地传送给实参。 (4)实参和形参占用不同的内存单元,即使同名也互不影响。
例如: static int f1(int a) /*函数f1*/ { int b,c; …… } /*a,b,c作用域:仅限于函数f1()中*/
static int f2(int x) /*函数f2*/ { int y,z; …… } /*x,y,z作用域:仅限于函数f2()中*/
static void Main(string[] args) { int m,n; …… } /*m,n作用域:仅限于函数Main()中*/