第七章 函数第2讲(C语言)

合集下载

《c语言函数》PPT课件

《c语言函数》PPT课件
其它函数: 可以互相调用函数、自调用函数,不能调用main()。
精选课件ppt
4
2、使用参数 入口参数: 主调函数向被调函数传递的数据------实参、形参。
出口参数: 被调函数向主调函数传递的数据------返回值。
精选课件ppt
5
§7.2 函数的定义 问题: 1、被调函数如何使用主调函数中的数据。 2、假设被调函数有办法使用主调函数中的数据,如何保证 被调函数和主调函数中数据类型的一致。
在函数中允许有多个return语句,但每次调用只能有一个 return 语句被执行, 因此只能返回一个函数值。
精选课件ppt
15
2、函数值(回传值)的类型与被调用函数的类型说明
函数调用语句 被调函数类型 回传值类型
在定义函数时,需要指定函数的类型:
例如:
int max(x,y);
doubel a(c1,c2); 等等
1、被调函数为库函数 对库函数的调用不需要再作说明, 但必须把该函数的头
文件用include命令包含在源文件前部。
精选课件ppt
23
2、用户自定义的函数 一般应该在主调函数中对被调函数的返回值的类型做说明。 对被调函数的说明也有两种格式,
一种为传统格式,其一般格式为: 类型说明符 被调函数名();
9
调用结束:形参临时单元被释放,形参数据失效,实参数 据不变。这就是所谓的单值传递。
函数的形参和实参具有以下特点:
(1)、形参变量只有在被调用时才分配内存单元,在调用 结束时, 即刻释放所分配的内存单元。因此,形参只有在 函数内部有效。 函数调用结束返回主调函数后则不能再使 用该形参变量。
精选课件ppt
}
精选课件ppt

C语言第七讲 函数(2)

C语言第七讲 函数(2)
变量类型决定了变量在内存中所占的字节数 及数据的表示形式,并且决定了变量起作用的代 码范围,也决定了系统在什么时间、什么空间为 变量分配或释放内存单元。这是变量的生存期和 作用域。
21
一、变量的存储空间分配概念
变量定义位置 变量的作用域 空间 (变量的使用范围)
变量的存储类别变量的生存期 时间
26
局部变量
二、变量的作用域——
局部变量(local variable)与全局变量(global variable)

void swap( ) { int t,x,y; t=x;x=y;y=t; } main() { int x=3,y=5; printf("x=%d,y=%d\n",x,y); swap( ); printf("x=%d,y=%d\n",x,y); }
斐波那契数列的递归方法实现。计算并输出斐波 那契数列的前7个数据。
1 当n =0, 1时
fib(n) =
fib(n-1)+ fib(n-2) 当n > 1时
int fib(int n) { if(n==0||n==1) return 1; else return fib(n-1)+fib(n-2); }
10
void main() { int n; for(n=11;n<=99;n++) if( absoluteprime(n) ) printf("%d\t",n); } /*判断一个数是否为绝对素数*/ int absoluteprime (int n) /*函数定义*/ { if(prime(n)==0) return 0; else if(prime(invert(n))==1) return 1; else return 0; }

C语言函数详解PPT课件

C语言函数详解PPT课件
使用库函数应注意的问题: 1、调用库函数时要用#include命令将相关的头文件包含进来。
如:调用数学函数,用#include "math.h" |<math.h> 调用输入输出函数,用#include "stdio.h" |<stdio.h>
2、库函数调用的一般形式: 函数名(参数表)
要注意函数的功能、参数的个数与类型、函数值的类型。 如:求平方根的函数sqrt的形式是:double sqrt(double x)
int mainxt(imnatvxox(,iindnttpx例y,ryi)n)空tst函ar数( )
{ }
zrie=nttxu{}>zrn;zrye=i(?ntz或xut{v{)>:r;zyony;;(ipp?dzxrr);ii:pnnyv{r;ttoiffn}i((d""tsd**tu**a**mr**(m**v**yo**(i**vd**o**函i)\\dnn)数""体));; 为}} 空
f1() { ┇
f11(); ┇
f12(); ┇ } f2() { ┇ f21(); ┇ }
f11() { ┇ } f12() { ┇ } f21() { ┇ }
2
函数的分类
从用户角度
❖标准函数(库函数):由系统提供 ❖用户自定义函数
从函数形式
❖无参函数 ❖有参函数
3
§7.1 库函数
库函数由系统提供,用户只要按照要求的格式正确调用即可。 不同的C编译系统提供的库函数有些不同。
5
§7.2 函数的定义和返回值
1. 函数定义的一般格式
现代风格:
函数返回值的类型

c语言程序设计第七章函数笔记总结

c语言程序设计第七章函数笔记总结

c语言程序设计第七章函数笔记总结第七章函数1. 函数的概念与作用在C语言程序设计中,函数是一种封装了一系列语句的代码块,它可以实现特定的功能并且可以被多次调用。

函数的作用在于提高代码的复用性、模块化和可维护性。

通过函数,可以将程序分解成一个个小的模块,使得整体代码结构更加清晰,更易于维护和管理。

2. 函数的定义与声明在C语言中,函数由函数名、参数列表、返回类型、函数体四部分组成。

函数的定义包括了函数的实际操作代码,而函数的声明则告诉编译器函数的存在和函数的类型。

在使用函数之前,通常需要提前声明或者定义函数。

3. 函数的参数传递C语言中,函数的参数传递有值传递和指针传递两种方式。

值传递是将实参的值传递给形参,在函数内部对形参的修改不会影响到实参。

而指针传递则是传递变量的位置区域,可以在函数内部通过指针对实参进行修改。

4. 函数的返回值函数可以有返回值,也可以没有返回值。

在函数有返回值时,需要在函数定义中定义返回类型,并且使用return语句返回具体的数值或者变量。

5. 函数的递归调用函数可以调用自身,这种特性被称为递归调用。

递归函数通常通过递归终止条件来结束递归过程,可以解决一些数学问题或者遍历树的问题。

6. 内联函数内联函数是一种特殊的函数,它会在函数调用时直接将函数的代码嵌入到调用的地方,而不是通过函数调用指令来执行。

内联函数可以提高程序运行的效率,但也会增加代码的大小。

总结与个人观点:本章介绍了C语言中函数的使用和定义,详细讲解了函数的各种特性和用法。

通过学习这一章的内容,我对函数的概念和作用有了更深入的了解,也掌握了如何正确地定义和调用函数。

在实际编程中,函数的使用能够更好地组织和管理代码,提高程序的可读性和可维护性。

个人观点上,我认为函数作为一种重要的编程工具,在程序设计中扮演着至关重要的角色。

合理地使用函数能够将复杂的问题分解成简单的小模块,使得程序结构更加清晰和易于维护。

我也认为要注意函数的递归调用和内联函数的使用,灵活运用不同的函数特性来提高程序的效率和性能。

《C语言函数》课件

《C语言函数》课件

函数的参数传递
函数可以接受参数,用于传递数据给函数内部使 用。
函数的调用
函数通过调用语句来执行,将会转到函数内部执 行相应的代码。
函数的分类
标准库
自定义函数
程序员可以根据需要自行定义函数,以完成特定的 任务。
函数的组成部分
1
函数头
函数头包含函数名和参数列表,用于声明函数的名称和接受的参数。
《C语言函数》PPT课件
C语言函数是学习C语言的基础,本课件将介绍函数的基本概念、分类、组成 部分,以及函数的递归调用、函数指针、库函数的使用等内容。
函数的基本概念
函数的定义
函数是一段完成特定任务的可重复使用的代码块, 通常接受参数并返回值。
函数的返回值
函数可以返回一个值,用于提供计算结果或执行 状态。
编写函数库
将函数编写为库
将一组相关函数封装成库,方便重用。
库的使用方法
使用库函数时,需要包含相关的头文件,并链接 库文件。
错误处理
1
错误处理的概念
程序中可能出现各种错误,需要进行处理,以确保程序正确运行。
2
错误处理的方法
常见的错误处理方法包括返回特定错误码、抛出异常等。
总结
函数的重要性
函数是程序的基本组成单元, 可以将复杂任务分解为更小 的可管理部分。
函数指针
1
函数指针的定义
函数指针是指向函数的指针变量,可以
函数指针的应用
2
用来存储函数的地址。
函数指针可以用来动态地调用不同的函 数,增加代码的灵活性。
库函数的使用
标准库函数的使用
标准库提供了许多常用的函数,可以直接调用来完 成任务。
自定义库函数的使用

C语言程序设计课件第七章函数

C语言程序设计课件第七章函数
int max(int n1, int n2) max() { return (n1>n2?n1:n2); }
main() { int max(int n1, int n2); /*函数说明*/ int num1,num2; printf("input two numbers:\n"); scanf("%d%d", &num1, &num2);
参数个数、类型和顺序一致,才能正确地进行数据传递。
在C语言中,可以用以下几种方式调用函数:
(1)函数表达式。函数作为表达式的一项,出现在表达式中,
以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。
(2)函数语句。C语言中的函数可以只进行某些操作而不返回
函数值,这时的函数调用可作为一条独立的语句。
而是一个不确定的值。为了明确表示不返回值,可以用 “void”定义成“无(空)类型”。
2.函数类型
在定义函数时,对函数类型的说明,应与return 语句中、返回值表达式的类型一致。
如果不一致,则以函数类型为准。如果缺省函数 类型,则系统一律按整型处理。
良好的程序设计习惯:为了使程序具有良好的可
读性并减少出错,凡不要求返回值的函数都应定义为 空类型;即使函数类型为整型,也不使用系统的缺省 处理。
第七章 函 数
一、教学内容: 函数的定义,调用,函数的参数和函数 的值,函数的应用。 二、教学目标: 掌握函数的定义,调用及应用。 三、教学重点,难点: 函数的定义,函数的参数及应用。
函数的定义与调用
❖ 1 函数的定义 ❖ 2 函数的返回值与函数类型 ❖ 3 对被调用函数的说明和函数原型 ❖ 4 函数的调用 ❖ 5 函数的形参与实参

C程序设计(第五版)谭浩强学习笔记—重点及易错点(第7章-函数)

C程序设计(第五版)谭浩强学习笔记—重点及易错点(第7章-函数)

C程序设计(第五版)谭浩强学习笔记—重点及易错点(第7章-函数)⽤函数实现模块化程序设计⽬录⼀、定义函数定义函数应包括以下⼏个内容:(1) 指定函数的名字,以便以后按名调⽤。

(2) 指定函数的类型,即函数返回值的类型。

(3) 指定函数的参数的名字和类型,以便在调⽤函数时向它们传递数据。

对⽆参函数不需要这项。

(4) 指定函数应当完成什么操作,也就是函数是做什么的,即函数的功能。

这是最重要的,是在函数体中解决的。

类型名函数名(形式参数表列){函数体}例如:int max(int x,int y){ int z; //声明部分z=x>y?x:y; //执⾏语句部分return(z);}当然函数可以没有返回值或者形式参数。

⼆、调⽤函数1.⾸先要对要调⽤的函数进⾏声明2.采⽤合适的⽅式调⽤函数(1). 函数调⽤语句 把函数调⽤单独作为⼀个语句。

如printf_star(); 这时不要求函数带回值,只要求函数完成⼀定的操作。

(2). 函数表达式 函数调⽤出现在另⼀个表达式中,如c=max(a,b); 这时要求函数带回⼀个确定的值以参加表达式的运算。

(3). 函数参数 函数调⽤作为另⼀个函数调⽤时的实参。

如m=max(a,max(b,c));,⼜如:printf (″%d″, max (a,b));3.实参和形参间的数据传递:实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,⽽不能由形参传给实参。

实参和形参在内存中占有不同的存储单元,实参⽆法得到形参的值。

例如:{ float add(float x, float y); //对add函数作声明float a,b,c;printf("Please enter a and b:"); //提⽰输⼊scanf("%f,%f",&a,&b); //输⼊两个实数c=add(a,b); //调⽤add函数printf("sum is %f\n",c); //输出两数之和return 0;}float add(float x,float y) //定义add函数{ float z;z=x+y;return(z); //把变量z的值作为函数值返回}三、函数的递归调⽤在调⽤⼀个函数的过程中⼜出现直接或间接地调⽤该函数本⾝,称为函数的递归调⽤。

C语言函数课件

C语言函数课件


Page 1
C语言 程序设计
第7章 函数
第7章 函数
知识点
函数的定义与调用; 函数调用时的数据传递方法; 数组作为函数参数; 函数的嵌套调用和递归调用; 局部变量与全局变量的作用域; 动态存储变量和ห้องสมุดไป่ตู้态存储变量的生存期。
重点:
函数的定义与调用; 函数调用时的数据传递方法。
Page 4

C语言 程序设计
第7章 函数
7.2 函数定义与函数调用
函数定义: g ( x , y )
两个形式参数
x y
2
2
函数定义时函数名后的括号中 的变量叫形式参数,简称形参
函数值
函数调用: g(3,4 ) 32 42 5
两个实际参数

函数调用时函数名后的括号中 的参数叫实际参数,简称实参
Page 10
C语言 程序设计
第7章 函数
二、函数的参数
一、形式参数与实际参数
对无参函数,形参表列与实参表列均为空,但括
号不能省略,如fun( )。
对有参函数,实参与形参应个数相等,顺序对应,
类型一致或赋值相容。
定义函数时形参不占用存储单元,只有在调用函
数期间才给形参分配存储单元,并将实参的值传 递给形参。函数调用结束,形参所占用存储单元 也被释放。
Page 17

C语言 程序设计
第7章 函数
五、函数调用的条件
1、被调函数是库函数或已经存在的自定义函数; 2、若被调函数是库函数,一般需在文件开头将其 头文件#include到本文件; 3、若被调函数是自定义函数,一般应在调用前进 行函数原型声明,声明的格式是: 函数类型 函数名(形参类型表列) ; 或者:函数类型 函数名(形参名及其类型表列) ; 举例:int max(int,int) ; 或:int max(int x,int y) ; 一个例外:若被调函数定义在前、调用在后, 则可不加函数原型声明。 Page 18

C语言课件(函数)

C语言课件(函数)

2
P OSIX库函数的使用
介绍POSIX库函数,以及在UNIX和UNIX-like系统中使用它们的方法。
3
系统函数的使用
学习如何使用操作系统提供的函数来完成特定的任务,如文件操作和网络编程。
Part 9:常见问题和技巧
1 函数调试的技巧
分享一些用于调试函数的技巧和工具,帮助您更好地查找和修复错误。
递归函数的应用场景
探索递归函数的实际应用场景, 如数学计算和数据结构。
Part 6:函数指针
1
函数指针的定义和使用
学习如何定义和使用函数指针,以便在程序中灵活地调用函数。
2
函数指针的作用
讨论函数指针的作用,包括回调函数和动态函数调用。
3
回调函数的实现
了解回调函数的原理及其在实际编程中的应用。
Part 7:高级函数
可变参数的函数
学习如何编写可接受可变数量参数的函数,以提高代码的灵活性。
内联函数
介绍内联函数的概念以及如何使用内联函数来提高程序的执行效率。
匿名函数的实现
探索匿名函数的实现方式以及它们在函数编程中的应用。
Part 8:库函数和系统函数
1
标准库函数的使用
了解常用的C标准库函数,并学习如何正确地使用它们。
C语言课件(函数)
C语言课件(函数)
Part 1:函数概述
函数的定义形式
了解函数的定义方式,例如函数名、参数列表和返回类型。
函数参数的传递方式
探索函数参数传递的不同方式,如按值传递、按引用传递和按指针传递。
函数返回值的类型
了解函数返回值的类型,并了解如何处理不同类型的返回值。
Part 2:函数的调用和传参
2 头文件的作用

C语言程序设计知识点—第7章 函数

C语言程序设计知识点—第7章 函数
C 语言程序设计知识点
第 7 章:函数
主讲教师:杨剑
1. 本章目标
熟练掌握函数的定义与调用方法 理解函数的定义、声明和调用的区别 理解函数原型、实参、形参和函数的返回值 了解函数的嵌套调用和递归调用的方法 掌握数组做为函数参数的使用方法 理解变量的作用域和存储方法
2. 函数机制的优点
~6~
C 语言程序设计知识点
主讲教师:杨剑
[练习]若各选项中所用变量已正确定义,函数 fun 中通过 return 语句返回一个函数值,
以下选项中错误的程序是( )
A.main()
{……x=fun(2,10); ……}
float fun(int a,int b){……}
B.float fun(int a,int b){……}
int data; scanf(“%d”,&data); printf(“%d”,add(data)); return 0;
~5~
C 语言程序设计知识点
主讲教师:杨剑
} int add(____②_____) {
int i,sum=0; for(i=1;i<=n;i++)
sum=sum+i; _______③__________ } 答案: ①int add(int); ②int n ③retrun sum;
{
printf(“%d\n”,F(3+5));
}
[练习]程序运行后的输出结果是( )
A.192 B.29
C.25
D.编译出错
答案:D
在 C 语言中,函数返回值的类型最终取决于( )
A.函数定义时在函数首部所说明函数类型
B.return 语句中表达式值的类型 C.调用函数时主调函数所传递的实参类型

C语言函数PPT课件

C语言函数PPT课件

类型名 函数名() {
函数体 }
类型名 函数名(void) {
函数体 }
包包括括声声明明部部分分和 和语语句句部部分分
7.2.2 定义函数的方法
1.定义无参指 值函定的数函类数型 定义无参函数的一般形式为:
类型名 函数名() {
函数体 }
类型名 函数名(void) {
函数体 }
7.2.2 定义函数的方法
实参 a 2 3 b
形参 x 2 3 y
7.3.4. 函数的返回值
➢通常,希望通过函数调用使主调函数能得 到一个确定的值,这就是函数值(函数的返 回值) (1)函数的返回值是通过函数中的return语
定义函数时函数名后面的变量名称为“形 式参数”(简称“形参”)
主调函数中调用一个函数时,函数名后面 参数称为“实际参数”(简称“实参”)
实际参数可以是常量、变量或表达式
7.3.2 函数调用时的数据传递
2. 实参和形参间的数据传递
在调用函数过程中,系统会把实参的值传 递给被调用函数的形参
或者说,形参从实参得到一个值 该值在函数调用期间有效,可以参加被调
7.3.2 函数调用时的数据传递
先编写max函数:
int max(int x,int y) {
int z; z=x>y?x:y; return(z); }
7.3.2 函数调用时的数据传递
在max函数上面,再编写主函数
#include <stdio.h> int main() { int max(int x,int y); int a,b,c;
printf(“two integer numbers: "); scanf(“%d,%d”,&a,&b); c=max(a,b); 实参可以是常量、变量或表达式 printf(“max is %d\n”,c); }

C语言(函数)省公开课获奖课件市赛课比赛一等奖课件

C语言(函数)省公开课获奖课件市赛课比赛一等奖课件

函数旳定义
函数定义旳一般形式为: 类型标识符 函数名(类型 形式参数, 类型 形式参数,…) {
申明部分 执行部分 }
阐明:
类型标识符用来定义函数类型,即指定函数返回值旳类型。 函数类型应根据详细函数旳功能拟定。默认类型标识符为 int类型。
函数值经过return语句返回。函数执行时一旦遇到return 语句,则结束目前函数旳执行,返回到主调函数旳调用点。
【例7.8】 调用函数返回两个数中旳较大者。
#include <stdio.h> int max(float x,float y)
{ float z; z=x>y?x:y; return(z);
} void main()
{float a,b; int c; scanf("%f,%f",&a,&b); c=max(a,b); printf("较大旳是%d\n”,c); }
【例7.5】 分析下列程序旳运营成果。(值传递方式)
#include <stdio.h>
void swap(float x,float y) /* 定义互换变量x,y值旳函数 */
{ float temp;
temp=x; x=y; y=temp;
printf("x=%.2f y=%.2f\n",x,y);
main函数
fa函数
fb函数
调用fa函数
结束
调用fb函数
fa函数结束
fb函数结束
7.4.2 函数旳递归调用
递归调用:一种函数直接或间接地调用此函数本身。
用递归求解问题旳过程分为两个阶段: 1.递推阶段:将原问题不断地转化成子问题。逐渐从未知向已

《C语言程序设计》第七章函数

《C语言程序设计》第七章函数

《C语言程序设计》第七章函数函数是C语言中的重要概念,是一段可重用的、功能独立的代码块,用于执行特定的任务。

在C语言中,函数具有以下几个重要的特点:1.函数定义和调用:函数通常包含函数头和函数体两个部分。

函数头包括函数的返回类型、函数名和参数列表,函数体则包含具体的执行语句。

函数定义后,就可以在其他地方调用这个函数来执行对应的任务。

2. 函数的返回值:函数可以有返回值,用于将执行结果返回给调用函数。

返回值可以是任意的基本数据类型或者自定义的结构体。

在函数定义时,需要声明函数的返回类型,并使用关键字``return``将返回值返回给调用方。

3.函数的参数:函数可以有零个或多个参数,用于接收调用方传递给函数的数据。

参数可以是任意的基本数据类型或者自定义的结构体。

在函数定义时,需要声明参数的类型和名称,在函数调用时,需要传入对应类型和数量的参数。

4.函数的递归调用:函数可以调用其他函数,也可以调用自己,这种调用方式称为递归调用。

递归函数通常有一个或多个递归终止条件,用于结束递归的过程。

5.函数的作用域:函数可以创建局部变量,这些变量的作用范围称为函数的作用域。

在函数外部无法访问函数内部的局部变量,但可以通过参数传递和返回值来实现数据的传递。

函数在程序设计中有着至关重要的作用,它可以将一个大的任务分解成多个小的子任务,并通过函数间的调用来解决问题。

通过合理地设计和使用函数,可以提高代码的复用性、可读性和可维护性,为程序的开发和维护带来便利。

在C语言中,函数的设计应遵循以下几个原则:1.单一职责原则:一个函数应该只负责一个具体的任务,保持函数的功能独立性,便于测试和重用。

2.函数参数的合理设计:函数的参数应该根据具体的功能需求来设计,尽量减少参数的数量和复杂度,以提高函数的可读性和易用性。

3.函数的返回值:函数的返回值应该在有需要的情况下使用,而不是为了返回单纯的状态信息或错误码。

合理设计返回值可以提高函数的灵活性和可重用性。

C语言第7章 函数

C语言第7章 函数

函数的 参数?
int main() {
int a=12, b=24; … printf("%d\n", Average(a, b)); … return 0; }
int Average(int x, int y) {
int result;
result = (x + y) / 2;
return result; }
C语言程序设计
22/114
7.3.1 函数调用
每次执行函数调用时
现场保护并为函数的内部变量(包括形参)分配内存 把实参值复制给形参,单向传值(实参形参) 实参与形参数目一致,类型匹配(否则类型自动转换)
int main()
{

int a=12, b=24,ave;

ave = Average(a, b);
21
1*2
3 (1*2)
(1*2)*3
}
4 (1*2*3)
(1*2*3)*4
return result;
……

}
n (1*2*3*4*…)
(1*2*3*4*…)*n
C语言程序设计
监视窗(Watches)
26/114
7.3.2函数原型
第7章 函数
函数原型(Function Prototype)
调用函数前先声明返回值类型、函数名和形参类型
Function Call?
int main() {
int a=12, b=24, ave; … ave = Average(a, b); … return 0; }
int Average(int x, int y) {
int result;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四、变量的存储特性
• 从变量值存在的时间(即生存期)角度来分,可以分为静 态存储方式和动态存储方式。
静态存储方式:类型的变量的生存期为程序执行的整个过程,在
该过程中占有固定的存储空间,通常称它们为永久存储。
动态存储方式:变量只生存在某一段时间内。例如,函数的形参
和函数体或分程序中定义的变量, 只是在程序进入该函数或分程序 时才分配存储空间, 当该函数或分程序执行完后,变量对应的存储 空间又被撤销了。
c语言中每一个变量有两个属性:数据类型,存储特性 完整的变量定义: [存储特性] [数据类型] 变量名;
变量的存储特性:. 1. 自动型 2. 静态型 3. 寄存器型 4. 外部型 auto static register extern
(1) auto型 每次进入程序是自动分配内存,不长期占用内存例如:形式 参数,自动型局部变量. 实际上 auto可以省略。
(n=0,1) (n>1)
5! = 5 * 4! = 5*4* 3! =5*4*3* 2! =5*4*3*2* 1!
公式的每一步中都有调用求阶乘函数的操作
结束条件
参考代码
long fac(long x) { long a; if(x==1) a=1; else a=x*fac(x-1); return a; } main( ) { long n; scanf(“%ld”,&n); printf(“\n%ld”,fac(n)); }
与全局变量同名的局部变量
运行结果 Enter a,b:5,3↙ swap:a=3,b=5 main:a=5,b=3
} main() { printf("Enter a,b:"); scanf("%d,%d", &a, &b); swap(a,b); printf ("main:a=%d,b=%d\n",a,b); }
b(int z) { } a(int y) { b(y); } main() { int x; a(x); }
例一
计算s=22!+32!
例题分析: 本题可编写两个函数,一个是用来计算平方值的 函数f1,另一个是用来计算阶乘值的函数f2。
1、主函数main中调用f1计算出平方值,并设定循环接收f1返 回值用于计算累加和。 2、f1中计算平方值,并以平方值为实参调用f2,同时将f2返 回的值返回给主函数。 3、f2中计算阶乘值然后返回f1。
三、变量的作用域
根据变量的作用范围,可分为局部变量和全局变量。
变量类型 局部变量(内部变量)
定义位置 函数或复合语句内
作用域 从定义处到本函数结 束或到本复合语句结 束 从定义处到本源文件 结束
全局变量(外部变量)
函数体外
不同函数中同名局部变量互不干扰 全局变量与局部变量同名时,局部变量屏蔽全局变量
/*局部变量的作用范围*/
如果在全局变量定义之前的函数想引用该外部变量,则应该 在该函数中用关键字extern作“外部变量说明”。
#include <stdio.h> int max(int x,int y) { int z; z=x>y?x:y; return(z); } main() { extern int a,b; /*外部变量说明*/ printf("%d\n",max(a,b)); } int a=20,b=-10; /*外部变量定义在主函数之后*/
另一种解法
#include <stdio.h> long f1(int x) { return x*x; } long f2(int y) { long j,p=1; for(j=1;j<=f1(x);j++) p*=j; return p; } long f3(int x,int y) { long s=0; s=f2(x)+f2(y); return s; } main() { long sum; sum=f3(2,3); printf("%ld\n",sum); }
例三 编写实现两个数交换的程序
#include <stdio.h> int a, b; void swap( ) { int t; t = a; a = b; b = t; printf("swap:a=%d,b=%d\n",a,b); } main() { printf("Enter a,b:"); scanf("%d,%d", &a, &b); swap( ); printf ("main:a=%d,b=%d\n",a,b); }

作用域是自出现点到源程序的末尾。
• 预处理命令包括执行宏定义(宏替换)、包含文件和条件编
译。
1.宏定义
a) 不带参数宏定义 用于定义符号常量。 格式: #define 宏名 串 (宏体) • 如: #define PI 3.14159
说明: 1)宏名一般使用大写字母,以便与变量区别。 2)预编译时不作任何语法检查。 如:#define PI 3.l4l59 字母l 3) 不必在行末加分号 4) 作用范围在整个文件 5) 可用#undef命令终止其作用域 6) 宏定义可嵌套使用
int f(int a) /*定义f函数,a为参数*/ { auto int b,c=3; /*定义b,c自动变量*/ …… } a是形参,b,c是自动变量,对c赋初值3。执行完f函数后,自动 释放a,b,c所占的存储单元。 关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属 于动态存储方式。
# define R 3.0 # define PI 3.1415926 # define L 2*PI*R /*宏体是表达式*/ # define S PI*R*R main ( ) { printf ("L=%f\nS=%f\n",L,S); /*2*PI*R替换L, PI*R*R替换S */ } 程序运行结果如下: L=18.849556 S=28.2743334
参考代码
#include <stdio.h> long f2(int y) { int i,p=1; for(i=1;i<=y;i++) p*=i; return p; } long f1(int x) { return(f2(x*x)); } main() { int i; long s=0; for(i=2;i<=3;i++) s=s+f1(i); printf("s=%ld\n",s); }
静态变量只初始化一次 结果: • • • 2 1 4 7 2 1 5
printf("%5d%5d%5d\n",a,b,c); return(a+b+c); } main() {int a=2,k; for(k=0;k<3;k++) printf("%5d\n",f(a)); }
8
2 1 6 9
(3) register型
#include<stdio.h> long f(int n) { long s; if(n==1||n==2) s=1; else s=f(n-1)+f(n-2); return s; } main() { int i; scanf("%d",&i); printf("%ld\n",f(i)); }
二、递归调用
• 一个函数在它的函数体内调用它自身称为递归调用。这种 函数称为递归函数。C语言允许函行递归函数将反复调 用其自身,每调用一次就进入新的一层。
函数调用它本身,称为递归。直接在函数内调用自己为 直接递归,通过别的函数调用自己为间接递归。
(2) static型 有时希望函数中的局部变量的值在函数调用结束后不消失 而保留原值,这时就应该指定局部变量为“静态局部变 量”,用关键字static进行声明。
①局部静态变量 ②全局静态变量 长期占用内存
分析执行结果 f(int a) {int b=0; static int c=3; b++;c++;
求阶乘
int fac(int n) {register int i,f=1; for(i=1;i<=n;i++) f=f*i; return(f); } main() {int i; for(i=0;i<=5;i++) printf("%d!=%d\n",i,fac(i)); }
(4)extern型
将使用频率高的局部变量定义为register型, 可以提高运行速度. 数据 内存 运算器 运算器 结果 控制器
寄存器
数据
寄存器变量只限于整型、字符型、指针型的局部变量。 寄存器变量是动态变量,而且数目有限, 一般仅允许说明两个寄存 器变量。 例如: register int d; register char c;
test2.c文件中代码 extern int a,b; /*外部变量声明*/ int max() { return(a>b?a:b); }
四、编译预处理
“编译预处理”是C语言编译系统的 一个组成部分。是在 编译前由编译系统中的预处理程序对源程序的预处理命令 进行加工。 • 源程序中的预处理命令均以“#”开头,结束不加分号,以 区别源程序中的语句,它们可以写在程序中的任何位置,
例3:求兔子问题
求兔子问题 • 第1个月有1对兔子 • 每对兔子从出生后第3个月起,就可每个月生1对兔子 • 问第n个月有多少对兔子?
算法分析: 设第n个月有f(n)对兔子 根据题意有 f(1)=1, f(2)=1
相关文档
最新文档