- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.函数的类型与函数的返回值
⑴ 函数的类型
【例5】输出两个数中的大数。
说明: ①函数的类型 决定了函数返 回值的类型。 若省略函数的 类型,系统默 认其为int型。 ②无返回值的 函数应将其类 型定义为void (空类型) 。
#include<stdio.h> max(int x,int y) { int z; z=x>y?x:y; return (z); /* 返回z的值 */ } void main( ) { int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b);
程序输出结果: main: a=1 b= 1 c= 1 sub: a=2 b= 3 c= 1 main: a=1 b= 1 c= 1 comp: a=2 b= 2 c= 1 c= main: a=1 b= 1 c= 1
{ int a=1,b=1,c=1; printf("main:\ta=%d b= %d c= %d\n",a,b,c); sub(a,b); printf("main:\ta=%d b= %d c= %d\n",a,b,c); 局部变量 { int a=2,b=2; printf("comp:\ta=%d b= %d c= %d\n",a,b,c); } printf("main:\ta=%d b= %d c= %d\n",a,b,c); }
m=max(c,max(a,b));
【例3】求1~100的累加和。
#include<stdio.h> int sum100( ) { int i,t=0; for (i=1; i<=100; i++) t+=i; return (t);} void main( ) { int s; s=sum100( ); printf("%d\n", s); }
函数调用的例子
#include<REG51.H> ************************** #include<stdio.h> How do you do! void serial_init() ************************** { SCON=0X50;TMOD|=0X20; TH1=0xF3;TI=1;TR1=1;} /*串行口初始化,波特率2400*/ void printstar() { printf("**************************\n");} void print_message() { printf("How do you do!\n");} void main( ) 程序的执行总是 { serial_init(); 从main函数开始 printstar(); print_message(); 函数调用 printstar(); for(;;); }
形式参数(形参)
实际参数(实参)
程序输出结果: x=20,y=10 a=10,b=20
有关形参和实参的说明:
① 形参为局部变量,当函数被调用时才给其 分配内存单元。调用结束,所占内存单元 被释放。 ② 实参可以是常量、变量或表达式,但要求 它们有确定的值。 ③ 实参与形参类型要一致或兼容(例:字符 型与整型可以兼容)。 ④ 实参与形参的个数必须相等,顺序一一对 应。在函数调用时,实参的值赋给与之相 对应的形参。传递方式为“单向值传递: 实参→形参”。
从函数定义形式分: ①
有参函数: 在主调函数和被调函数之间 通过参数进行数据传递, 如: int max (int x,int y) { … } ② 无参函数: 如: serial_init() 在调用无参函数时,主调函 数不需要将数据传递给无参函 数,无参函数函数大都没有返 回值。所以常采用如下形式 : void serial_init(void)定 义函数。
二、 函数的调用
函数调用的一般形式:
函数名(实参表列)
在C语言中,把函数调用也作为一个表达式。 因此凡是表达式可以出现的地方都可以出现函数 调用。 调用方式有三种: ①函数语句: welcome( ); ②作为表达式的一部分:
if (iabs (a)>max) max=iabs(a);
③作为函数参数。
程序输出结果: 9
sub1(int n) { int i,a=0; for (i=n; i>0; i--) a+=sub2(i); sub2(int n) { return a ; return n+1; }
}
四、局部变量和全局变量及其作用域
问题:一个变量在程序的任何部分都能使用吗?
1. 变量的作用域
项目三 抢答器设计
任务1 认识单片机C语言 学习内容 1.熟练掌握函数的3种定义方法。 2.掌握函数的参数与函数值。 3.掌握函数的调用。
函数的作用
C程序项目
源程序文件1
……
源程序文件n
函数1 使用函 数的 好处
…
函数n
函数1
…
函数m
① 程序结构清晰,可读性好。 ② 减少重复编码的工作量。 ③ 可多人共同编制一个大程序,缩短程序 设计周期,提高程序设计和调试的效率。
复 合 语 句
3. 全局变量及其作用域
全局变量(外部变量):在所有函数外部定 义的变量。 作用域:从定义变量的位置开始到本源文件 结束。如在其作用域内的函数或复合语句中 定义了同名局部变量,则在局部变量的作用 域内,同名全局变量暂时不起作用。 【例8】全局变量和局部变量的作用域。
一、 函数的定义
函数定义的一般形式 函数类型 函数名(类型名 形式参数1,… ) { 说明语句 执行语句 }
类型省略时 默认为int 类型
例如:求两个整数的最大值。 int max(int x,int y) { int z; 对于无参函数 z = x > y ? x : y; return( z ); 括号内应为 } 空或void,但 括号不可省略
#include<stdio.h> 思 int sum ( int x ) 考:{ int i,t=0; 两 for (i=1; i<=x; i++) t+=i; 个 程 return (t); } 序 void main( ) 有 { int s; 何 s=sum (100); 不 printf("%d\n", s); 同 }
变量的作用域:变量在程序中可以被使用的范围。 根据变量的作用域可以将变量分为局部变量和全局 变量。
2. 局部变量及其作用域
局部变量(内部变量):在函数内部或复合语句内 定义的变量(包括形参)。 作用域:函数内或复合语句内。 【例7】分析下面程序的运行结果及变量的作用域。
void sub(int a,int b) 局部变量 { int c; a=a+b; b=b+a; c=b-a; printf("sub:\ta=%d b= %d void main( ) %d\n",a,b,c); } 局部变量
⑷ 函数的分类
从用户使用的角度看: ① 标准函数(即库函数) 由编译系统提供,在程序中 可以直接调用它们。如: _nop_( )、 _irol_() 、 sin(x)、printf() 等。 在文件夹“C:\keil\c51\inc” 中相应的头文件中列出了 keil软件所带的所有库函数。 ② 用户自定义函数。 如:例中的printstar()、 serial_init()函数。
3. 对被调函数的声明和函数原型
变量要先定义后使用, 函数也如此。即被调函数的 定义要出现在主调函数的定 义之前。如swap函数: 允许整型函数(且参数 也是整型)的定义出现在主 调函数之后。如max函数: 如果非整型函数在主调 函数之后定义,则应在主调 函数中或主调函数之前对被 调函数进行声明。 void swap(int x, int y) { …} void main( ) {… swap(a,b); } void main( ) {… c=max(a,b); } max(int x,int y) { …}
【例2】有参函数的定义与调用。
#include<REG51.H> #include<stdio.h>
void
serial_init(); /*函数声明*/ int max(int x,int y); /*函数声明*/ void main( ) { int a=12,b=34; serial_init(); printf("max(a,b)=%d\n",max(a,b)); for(;;);} 程序的输出结果如下: int max(int x,int y) max(a,b)=34 { return(x>y?x:y);} void serial_init() { SCON=0X50;TMOD|=0X20; TH1=0xF3;TI=1;TR1=1;} /*串行口初始化,波特率2400*/
程序运行情况如下:
说明
⑴ 一个C程序项目可以由一个或多个源程序 文件组成。C编译系统在对C源程序进行编译时 是以文件为单位进行的。 ⑵ 一个C源程序文件可以由一个或多个函数 组成。所有函数都是独立的,在程序中其地位 是平行的。主函数main()可以调用其它函数, 其它函数可以相互调用,但其它函数不能调用 主函数main()。 ⑶ 在一个C程序中,有且仅有一个主函数 main()。C程序的执行总是从main()函数开始, 调用其它函数后最终回到main()函数,在 main()函数中结束整个程序的运行。