T7 变量作用域及函数传值方式_第1页
T7 变量作用域及函数传值方式_第2页
T7 变量作用域及函数传值方式_第3页
T7 变量作用域及函数传值方式_第4页
T7 变量作用域及函数传值方式_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1T7变量作用域及有参有返回值的函数2回顾1、C语言的基本单位是什么?2、使用函数有哪些好处?3、自定义函数包含哪几部分?4、什么是函数的定义?什么是函数的调用?5、函数的调用分哪两种方式?3本章任务

定义几个全局变量,用来保存一个客户的开户信息,包括用户名、卡号、密码和开户金额,然后分别完成开户、存款、取款、余额查询等业务。4本章目标理解变量的作用域理解函数的参数理解函数的返回值5变量的作用域

作用域是某些事物起作用或有效的区域。限于陆地限于海洋限于空中6程序中变量也有不同的使用范围,称为变量的作用域。变量的作用域决定变量的可访问性变量的作用域voiddisplayDiscount(){floatdiscount_amt;.........}局部变量:只在某函数内部有效floatdiscount_amt;voidmain(){......}voiddisplayDiscount(){......}全局变量:从定义时到程序结束有效7变量的作用域#include<stdio.h>voidaddNumbers(){

intnum1,num2,sum;

printf("\n

请输入两个数:");

scanf("%d%d",&num1,&num2);

sum=num1+num2;

printf("子函数中sum的值是%d\n",sum);}voidmain(){

intsum=0;//局部变量

addNumbers();

printf("\n

主函数中sum的值是%d\n",sum);}内存sumnum2045num1请输入两个数:5645子函数中sum的值是101主函数中sum的值是056sum101示例一8变量的作用域#include<stdio.h>intsum=0;//全局变量voidaddNumbers(){

intnum1,num2;

printf("\n

请输入两个数:");

scanf("%d%d",&num1,&num2); sum=num1+num2;

printf("子函数中sum的值是%d\n",sum);}voidmain(){

addNumbers();

printf("\n

主函数中sum的值是%d\n",sum);}内存sumnum2045num1请输入两个数:5645子函数中sum的值是101主函数中sum的值是10156101示例二9全局变量全局变量:它是在任何函数外部定义的变量。它的作用域是从定义时刻开始,到程序结束。全局变量需注意以下几点:1.全局变量定义必须在所有的函数之外。2.全局变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变量,因而使得函数的独立性降低。3.在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,同名的全局变量不起作用。10全局变量int

a,b;/*全局变量*/floatx,y;/*全局变量*/voidf1()/*函数f1*/

{

……

}

intf2()/*函数f2*/

{

……

}main()/*主函数*/

{

……

}此时,全局变量a,b,x,y可以在函数f1、f2、及主函数中使用11使用全局变量的例子#include"stdio.h"inta=0;voidout(){

printf("%d\n",a);}voidmain(){ a=1; out();}声明全局变量a并初始化为0将a的值输出,输出为1将a赋值为1 上面的程序声明了一个全局的整型用于传递数据,通过运行程序可以看出:在函数内和函数外都可以修改全局变量的值。12局部变量局部变量:在函数内定义说明的,其作用范围仅限于该函数内。局部变量需注意以下几点:1.主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。2.允许在不同的函数中使用相同的变量名,它们代表不同的变量,分配不同的存放单元,互不相干,不会发生混淆。3.复合语句中定义的变量,也是复合语句的局部变量。所谓复合语句,就是用{}包含起来的语句块.13局部变量#include"stdio.h"voidstup(){inta=3,b=4;

printf("函数stup()的局部变量a,b\n%d%d\n",a,b);}voidmain(){inta=1,b=2;{inta=7,b=9;

printf("复合语句中的局部变量a,b\n%d%d\n",a,b);}

printf("函数main()的局部变量a,b\n%d%d\n",a,b);

stup();}函数stup()的局部变量函数

main()的局部变量复合语句中的局部变量示例三14小结1、什么是变量的作用域?2、全局变量和局部变量有什么区别?15函数形参和实参display(intnum,floatfraction){......}voidmain(){......display(10,20.5);}实际参数函数调用形式参数16函数参数及函数的调用形式参数:简称形参。形参出现在函数定义中,在整个函数体内的局部变量.实际参数:简称实参。出现在函数调用中。是函数调用时,参数的实际值。int

max(int

a,intb){if(a>=b) returna;else returnb;}voidmain(){int

x,y,mux;......mux=max(x,y)......}实参形参函数调用17函数的参数使用案例voidtotal(int

a,intb){

intsum=0;

for(inti=a;i<=b;i++){sum+=i;}

printf(“%d到%d的和是%d\n”,a,b,sum);}voidpow(double

a,intb){doublesum=1.0;

for(inti=0;i<b;i++){sum*=a;}

printf(“%lf的%d次方是%lf\n”,a,b,sum);}voidfun(intn){doubles=1.0;

while(n>1)s*=n--;

printf(“%d的阶乘是%lf\n”,n,s);}18函数参数的说明注意以下几点:1、定义函数时,必须说明形参的类型。形参只能是变量和数组。2、形参是函数局部变量,只在函数内部有效3、实参的传递,必须和形参的类型,个数,顺序完全一致19使用局部变量的例子#include"stdio.h"voidout(inta){ a++;}voidmain(){ a=1;

out(a);

printf(“a=%d\n”,a);}定义形参变量a,是函数内部的局部变量将a的值传递进函数20小结1、什么是形参?什么是实参?2、实参在使用时,必须注意什么?21函数的返回值返回语句:returnxx;/*’xx’为一变量、表达式、常量*/注意:1、如果你声明的是一有返回值的函数,但没有使用return语句,将报错.2、一个函数中可以有多个return语句,但是函数运行过程中遇见第一个return语句就会返回,同时终止该函数的运行!22改写n!doublefun(intn){doubles=1.0;

while(n>1)s*=n--;returns;}调用:voidmain(){doublesum;sum=fun(5);printf(“5的阶乘是%lf\n”,sum);}或者voidmain(){doublesum;

intn=5;sum=fun(n);

printf(“%d的阶乘是%lf\n”,n,sum);}或者voidmain(){printf(“5的阶乘是%lf\n”,fun(5));}特点:有返回值的函数,一般使用容器将返回值接收!23例

有参有返回值的函数问题描述:编写函数求给定2个数中的最大值#include"stdio.h"int

getMax(int

a,intb);//函数声明voidmain(){

int

x,y,max;

printf("请输入两个整数:");

scanf("%d%d",&x,&y); max=getMax(x,y);//函数调用

printf("%d和%d中的较大数是:%d\n",x,y,max);}int

getMax(int

a,intb)//函数定义{

if(a>b) { returna; } else { returnb; }}示例四24函数值的类型函数的类型即函数值的类型,在定义时声明。例:int

max(int

a,intb);函数类型为int型。说明:函数的类型同函数返回值的类型一般是要求保持一致,如果函数返回值类型(即return语句返回的类型)同函数类型不一致,则在函数返回值时对其进行强行转化,转化为函数类型;25小结定义几个全局变量,用来保存一个客户的开户信息,包括用户名、卡号、密码和开户金额,然后分别完成开户、存款、取款、余额查询等业务。现场编程charname[10];longcardID;longpsw;floatmoney;voidmain(){……}voidopenAccount()//开户{ printf("\t\t\t本系统现在为你开户\n");printf("\t\t\t请输入您的用户名:");scanf("%s",name);printf("\t\t\t请输入您的卡号:");scanf("%ld",&cardID);printf("\t\t\t请输入您的密码:");scanf("%ld",&psw);printf("\t\t\t请输入您的开户金额:");scanf("%f",&money);printf("\t\t\t开户成功,请妥善保管您的开户信息\n");}voidsaveMoney()//存款{longID;floatm;

printf("\t\t\t请输入您的卡号:");

scanf("%ld",&ID);

if(ID==cardID){

printf("\t\t\t请输入您的存款金额:");

scanf("%f",&m);money=m+money;

printf(“\t\t\t存款成功,您卡上的余额是: %0.2f\n",money);}else{

printf("\t\t\t您的卡号输入错误,无法存款!\n");}}26变量交换

1224xyc1224方式二: x=x+y; y=x-y; x=x-y;27传值调用与传址调用

C语言中函数的形式参数的传递方式有两种,一种是传值,另一种是传址,对于这两个概念,最核心的思想是: 第一、

在传值调用中,函数中传递的是实际参数的值即内容,这时形式参数的改变不会影响实参。 第二、在传址调用中,函数中传递的是实际参数的地址,这时函数形式参数的改变会影响实参。其原因是:传址是形参和实参共用一个地址内存。 下面先看一下传值调用的例子:28值传递传递的是实参变量的内容的复制品,而不是实参本身。函数参数的值传递voidfunc(inta){ a++;

printf(“func函数中的a=%d\n”,a);}voidmain(){

inta=12;

func(a);

printf(“main函数中的a=%d\n”,a);}结论:只要是基本类型作为函数的参数,都是属于值传递.内存aa121213func函数中的a=13main函数中的a=1229思考定义一个变量交换的函数,如下所示:

voidchange(int

a,intb){

intc=a; a=b; b=c;} voidmain(){

inta=12,b=24;

printf(“交换前:a=%d,b=%d\n”,a,b);

change(a,b);

printf(“交换后:a=%d,b=%d\n”,a,b); }内存12a24b交换前:a=12,b=24交换后:a=12,b=2412a24b30#include<stdio.h>voidincrement(int,int);voidmain(){

intnum1,num2;

printf("\n

请输入两个数:");

scanf("%d%d",&num1,&num2);

printf("\n

递增前的值是%d和%d\n",num1,num2); increment(num1,num2);

printf("\n

递增后的值是%d和%d\n",num1,num2);}voidincrement(intval1,intval2){ val1++; val2++;

printf("\n

子函数中值%d和%d\n",val1,val2);}例2传值调用请输入两个数

:3456递增前的值是

34和

56_递增后的值是

34和56num1num2var13456var2子函数中的值是

35和5735345657num1num234563456FF23FF05调用后修改为35val2FFEAFF45将变量num1的值赋给形参val1将变量num2的值赋给形参val2val1调用后修改为57调用函数被调用函数示例五31函数实参的地址传递在学习地址传递之前,我们先回顾一下一维数组的定义:

inta[5];其中,数组a有5个元素,它们在内存中是连续存放的。数组名a就是数组的元素在内存中存放的首地址.地址的概念就像门牌号码.邮递员送信只认门牌号码,而不用管这个地址中住的是什么人。32数组作为函数参数(传址调用)在用数组作实参时,以传址方式调用函数,也就是说把实参数组的首地址赋给形参实际上形参数组和实参数组为同一数组,共同拥有一段内存空间33使用数组作为函数参数实现变量交换

温馨提示

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

评论

0/150

提交评论