C语言设计程序-函数

合集下载

C语言程序设计教程(第5章 函数)

C语言程序设计教程(第5章 函数)

22
信息科学与工程学院
作用域(可用域)与生存期
C语言中定义的变量都有一个起作用的范 围,称为变量的作用域。 程序运行时,变量被创建和被删除的时间 段,称为变量的生存期。
23
信息科学与工程学院
局部变量和全局变量
在一个函数内部定义的变量是内部变量, 它只在本函数内部范围内有效。也就是说 只有在本函数内才能使用它们。这些变量 称为“局部变量”。 在函数之外定义的变量称为外部变量,也 称为全局变量,在文件内的所有函数都能 使用它。它的有效范围为从定义变量的位 置开始到文件的结束。
4
信息科学与工程学院
5.1 问题的提出
C语言程序是由什么构成的? 函数 什么是函数?
能完成特定功能的功能块; 一般有输入参数 和返回值; 一次定义,可以调用多次。
一个C语言程序为什么需要不同的函数?
一个函数过大难于编写和维护; 一个函数的程序不利于协作; 代码和功能共享的需要。
5
信息科学与工程学院
6. 函数调用举例分析(见下页)
15
信息科学与工程学院
实参到形参是单向值传递 例2 求两个整数中的最大值
int max(int x,int y) /*函数定义*/ { int temp; if (x>y) temp=x; else temp = y; COPY return temp; } void main() { int a,b; scanf("%d,%d",&a,&b); a = max(a,b); /*函数调用*/ printf("\n max= %d \n",a); }
2
信息科学与工程学院
第5章 函数
本章需要掌握的知识点: 函数定义 函数说明 函数调用 形参和实参的关系 变量的存储类别

大学C语言程序设计 第六章

大学C语言程序设计 第六章

2.函数表达式: 2.函数表达式: 函数表达式
功能:将函数作为表达式的一部分。 功能:将函数作为表达式的一部分。 如: c=2*max(a,b); 要点:要求函数带回一个确定的值,以参加表达式的运算。 要点:要求函数带回一个确定的值,以参加表达式的运算。
3.一个函数作为另一个函数的参数: 3.一个函数作为另一个函数的参数: 一个函数作为另一个函数的参数
若不需要函数带回任何值,可使用: 若不需要函数带回任何值,可使用:
void printstar(){ …} } void print_message(){…} print_message(){ }
例exp6_5:函数返回值的类型与其定义的 exp6_5:函数返回值的类型与其定义的 类型不符的情况。 类型不符的情况。
一函数的定义重点二函数的调用重点1函数的一般调用2函数的嵌套调用3函数的递归调用三数组作为函数的参数难点四局部变量与全局变量难点五变量的存储类别难点六内部函数与外部函数1概述2函数定义的方法重点3函数的参数难点4函数的返回值难点1c程序的基本结构回顾2什么是函数
第六章
[教学要求] 教学要求]


1.理解函数的功能。 理解函数的功能。 2.掌握函数定义的一般形式(重点)。 掌握函数定义的一般形式(重点)。 掌握函数的形参与实参的对应关系、 3.掌握函数的形参与实参的对应关系、参数传递方法及函数返回值 的概念(难点) 的概念(难点) 。 掌握函数调用的基本方法(重点) 4.掌握函数调用的基本方法(重点) 。 掌握函数嵌套调用的一般过程(重点) 5.掌握函数嵌套调用的一般过程(重点) 。 了解函数递归调用的几种形式。 6.了解函数递归调用的几种形式。 掌握数组名作为函数的参数的一些特点(难点) 7.掌握数组名作为函数的参数的一些特点(难点) 。 8.掌握局部变量与全局变量的概念及它们的使用特点(难点) 。 掌握局部变量与全局变量的概念及它们的使用特点(难点) 掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 9.掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 10.了解内部函数与外部函数的含义。 10.了解内部函数与外部函数的含义。

《C语言与程序设计》实验06---函数

《C语言与程序设计》实验06---函数

实验六函数一、实验目的1. 熟练掌握函数的定义、函数的类型和返回值。

2. 熟练掌握形式参数与实际参数、参数值的传递。

3. 掌握函数的嵌套调用与递归调用。

4.学会使用指向函数的指针变量。

5.了解指向指针的指针的概念及带参数的main函数。

6. 掌握局部变量和全局变量。

7. 掌握变量的存储类型。

8. 了解内部函数和外部函数。

二、实验学时:8课时三、预习知识1.标准库函数标准库函数是C系统提供的,这些库函数定义了一些基本的、常用的功能,用户可以使用这些库函数,但是在使用库函数之前需要用预编译命令# include将该库函数所在的头文件包含进来。

2.自定义函数定义函数一般有两种形式形式1:存储类型类型符函数名(类型符形参1,类型符形参2 ,… ) { 说明语句执行语句}形式2:存储类型类型符函数名(形参1,形参2 ,……)形参类型说明{ 说明语句执行语句}说明:①形参表中即使没有参数,函数名后的一对圆括号也不能省略。

②函数名前的类型符是用来说明函数返回值的数据类型(也作为函数的数据类型) 。

当函数值为整型时,类型符可以省略。

③当函数只完成某一特定操作不需要返回值时,可用类型标识符 void 说明,将函数定义成空类型。

④C 规定:不允许在一个函数内部再定义另外一个函数,即函数不允许嵌套定义。

⑤函数的存储类型:函数的存储类型有 extern 和 static 两种。

extern 型的函数除了可以被本程序中其它函数调用外,还可以被其它文件中的函数调用,这种函数称为外部函数,如果定义函数时省略 extern ,则隐含为外部函数。

static 型的函数只能被本源程序文件中的函数调用,称为内部函数(静态函数)。

3.函数的参数(1)在定义函数时函数名后面括号中的变量称为形参(形式参数),如果有两个以上形参,形参之间以逗号分隔。

形参是函数的内部变量,只在函数内部才有意义。

在未出现函数调用时,形参不占内存。

对每个形参必须指明其名字和数据类型。

C语言程序设计 第05章 函数

C语言程序设计 第05章 函数
❖ 函数体:一对花括号里面的内容(包括声明部分和语句 部分)又被称为函数体,当函数体为空的时候,该函数 也被叫做空函数,就是说它什么也不做。
8
计算机与信息工程学院
Page 8
C语言程序设计 第 5 章 函数
例1 计算两个整数的平均数的函数。 /* 函数功能:就算平均数 函数入口参数:整型x,存储第一个运算数
7
计算机与信息工程学院
Page 7
C语言程序设计 第 5 章 函数
❖参数:一般用于一个函数把数据传递给另一个函数(调用 者和被调用者之间),实现函数之间的通信。定义函数的 时候,函数的参数是形式参数,是对一件具体事件可能需 要数据的假设。
❖ 返回值: 即函数带回来的值。而返回值的类型是在定义函数 的时指定的,即用“返回值类型”指定函数的类型。 ❖ 1、如果类型标识符为void则表示不需要带回函数值; ❖ 2、如果没有类型标识,则为默认返回值类型,视编译 器的不同而不同。
单向传递,只由实参传给形参,而不能由形参传回 来给实参。 f) 在内存中,实参单元与形参单元是不同的单元。
13
计算机与信息工程学院
Page 13
C语言程序设计 第 5 章 函数
例2 调用函数时的数据(参数)传递。
#include <stdio.h> void main() {
int max(int x, int y); int a, b, c; scanf("%d, %d",&a, &b); c=max(a, b); printf("max is %d", c); }
计算机与信息工程学院
Page 4
C语言程序设计 第 5 章 函数
5.2.1 函数的分类

C语言函数程序设计.doc

C语言函数程序设计.doc

实 验 报 告 七一【实验目的】1.掌握定义函数的方法;2.掌握函数实参与形参的对应关系以及“值传递”的方式; 3.掌握函数的嵌套调用和递归调用的方法;4.掌握动态变量、静态局部变量与全局变量之间的概念和使用方法;二【实验内容】【实验6-1】 编写函数max :求两个数中的较大数main 函数功能:从键盘任意输入两个数,调用max 函数,并在屏幕上输出两个数中的最大数。

【实验6-2】编写函数area :计算三角形面积main 函数: 已知各条边的长度(a,b,c,d,e,f,g ),通过调用area 函数求多边形面积【实验6-3】编写power 函数,其功能是求:n 的k 次方main 函数功能: 从键盘提示并输入n ,k 的值,调用power 函数,求得k k k n +++ 21 的值并输出【实验6-4】编写函数sort :对数组a 中的数进行从小到大排序main 函数:从键盘输入N 个数存放到数组a 中,通过调用sort 函数对数组a 中的数进行从小到大排序,并将排序后的结果输出。

三【实验过程】实验1:#include<stdio.h> int max(int a,int b) { if(a>b) return a; else return b; }void main() { int m,n,maxnum;scanf("%d %d",&m,&n);maxnum=max(m,n);printf("最大值为%d\n",maxnum);}实验2:#include<stdio.h>#include<math.h>float area(float a,float b,float c){float s;float area;s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));return area;}void main(){float a,b,c,d,e,f,g,s1,s2,s3,s4;printf("请输入各条边的长度:\n");scanf("%f %f %f %f %f %f %f",&a,&b,&c,&d,&e,&f,&g);s1=area(a,b,c);s2=area(c,d,e);s3=area(e,f,g);s4=s1+s2+s3;printf("多边形面积为:%.2f\n",s4);}实验3:#include<stdio.h>int power(int n,int k){int power=n;int i;for(i=1;i<k;i++) power *= n;return power;}void main(){int s=0,i=1,n,k;printf("请分别输入n,k的值:\n");scanf("%d %d",&n,&k);for(i=1;i<=n;i++)s +=power(i, k);printf("结果=%d\n",s);}实验4:#include<stdio.h>#define N 10void sort(int a[],int n){int i,j,t;for(i=0; i<n; i++)for(j=i+1; j<n; j++){if(a[i]>a[j]){ t=a[i];a[i]=a[j];a[j]=t;}}}void main(){int a[N],i;printf("请输入十个待排序的元素:\n");for(i=0; i<N; i++)scanf("%d",&a[i]);sort(a,N);printf("排序后的结果:\n");for(i=0; i<10; i++){printf("%d ",a[i]);}printf("\n");}四【实验结论】通过这次实验,对函数的定义及其调用基本掌握,但对有些概念不是特别熟悉,还要多看书多理解。

C语言程序设计(数学库函数)

C语言程序设计(数学库函数)

4.2.2数学库函数C/C++程序通常用标准库函数和程序员编写的新函数写成。

各种C/C++版本都提供函数库,这些函数能够完成常用的数学计算、字符串操作、输入输出以及其它很多操作。

这些函数为程序员编写程序提供了很多方便,很多操作都可以调用标准库函数去完成,因此可以减少程序员的工作量。

除了库函数以外,程序员也可以自己定义一些函数完成某些特殊的任务。

下面以数学函数为例介绍库函数的使用,后面各章中也将逐步介绍其它库函数的使用。

使用库函数时,要根据函数的类别,用预处理命令#include将函数所在的头文件包含进来。

例如,使用数学库中的函数时,应该首先用预处理命令#include<math.h>指明要用到的数学函数的描述所在的头文件。

调用数学函数时,要给出函数名,后面是一对圆括号,括号内是使用函数所需的参数,参数可以是常量、变量或表达式。

例如,计算并打印2的3次方的语句可以写成:printf(“%7.2f”,pow(2.0,3.0));调用的数学函数pow需要两个参数,这两个参数都是double型的,返回值也是double 型的,语句执行结果为打印8.00。

数学库中所有函数的参数和返回值都是double类型的。

常用的数学函数见表4-2。

表4-2常用的数学函数(头文件math.h)函数原型函数功能函数返回值int abs(int x)求整数x的绝对值返回x的绝对值double fabs(double x)求实数x的绝对值返回实数x的绝对值double exp(double x)求e x返回e的x次方x,即lnx返回以e为底x的对数值double log(double x)求logedouble log10(double x)求logx返回以10为底x的对数值10求x y返回x的y次方double pow(double x,doubley)double cos(double x)求x的余弦值返回弧度x的余弦值double sin(double x)求x的正弦值返回弧度x的正弦值double tan(double x)求x的正切值返回弧度x的正切值double fmod(double x)求x/y的余数返回x/y的余数值double sqrt(double x)计算x的平方根返回x平方根值【例4-1】输入三角形的三边长,求三角形的面积。

C语言程序设计-第5章--函数

C语言程序设计-第5章--函数

实参可以是常量、变量或表达式,但要求 它们必须要有确定的值,在调用时将实参 的值赋给形参。另外,实参和形参的类型 应相同或兼容。
— 31 —
5.2 函数的参数传递和返回值
➢ 5.2.2 函数的返回值
一般情况下,主调函数调用完被调函数后,都希望能够得到一 个确定的值,这就是函数的返回值。在C语言中,函数返回值 是通过return语句来实现的。return语句的一般形式有3种:
/*函数声明*/
/*调用逆序函数,将a的逆序值赋给b*/ /*调用逆序函数,将b的逆序值赋给c */
— 23 —
5.2 函数的参数传递和返回值
➢ 5.2.1 函数的形参与实参
{
int y=0,sign=1;
/*定义sign表示x的符号,定义变量y代表逆序数据*/
if(x<0)
/*当x小于0时取符号及取反*/
— 18 —
5.1 函数的定义和调用
➢ 5.1.2 函数的调用
另外,按函数在语句中的作用来分,可以有以下3种函数调用方式:
函数表达式
函数语句
函数作为实参
函数作为表达式中的一项出 现,以函数返回值参与表达 式的运算。
函数调用的一般形式加上分 号即构成函数语句。
函数作为另一个函数调用的 实际参数出现,即把该函数 的返回值作为实参进行传送。
#include<stdio.h> int main() {
int x=0,y; y=trans(x); printf("y=%d\n",y); printf("x=%d\n",x); return 0; } trans(int a) { a++; printf("a=%d\n", a); return a; }

c语言程序设计5(函数)

c语言程序设计5(函数)

参数的传递
1. 函数调用时,被调函数中的形参被分配 临时的存储单元,实参的值赋给形参变量 2. 实参可以是常量、变量或表达式 3. 实参的个数、类型和顺序必须与形参一致 4. 形参与实参各占一个独立的存储空间,调 用结束后,形参单元被释放
形参值的改变不会影响实参-----值传递
例:P134 main( ) { int v1=10, v2=20; printf(“v1=%d v2=%d\n”,v1,v2); printf(“_ do swap _\n”); swap(v1,v2); printf(“v1=%d v2=%d\n”,v1,v2); } void swap(int x, int y) { int temp; v1=10 v2=20 temp=x; _ do swap _ x=y; y=temp; v1=10 v2=20 }
自定义函数的应用实例
P136 例3:输出“九 九表”。 它是一个
9行9列的二维表格,
加上一个行标题和一
个列标题,显示出来
应该是10行10列。
#include <stdio.h> void drawLine(int n,char ch); /* 连续显示n个ch字符 */ main() { int i,j; printf("\n 9.9 table\n"); /* 显示表名 */ drawLine(30, '='); /* 显示每列的标题 */ printf("\n 1 2 3 4 5 6 7 8 9"); drawLine(30, '='); for (i=1; i<=9; i++) { /* 显示每行的内容 */ printf("\n%3d", i); for (j=1; j<=9; j++) printf("%3d", i*j); if (i<9) drawLine(30, '-'); else drawLine(30, '='); } void drawLine(int n, char ch) /*连续显示n个ch字符*/ } { int i; putchar('\n'); /*换行*/ for (i=1; i<=n; i++) putchar(ch); /*连续显示n个字符ch*/ }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
直接调用,函数定义在调用 之后,应先进行原形说明, 才能正确调用。
#include<stdio.h> float f (float ); //参数名可省略 void main() { float x; scanf (“%f”, &x); printf (“y=%f\n”, f(x)); } float f (float x) {return 2*x*x+3*x+1;}
//在所有函数外部进行说明 int a( ); //声明函数 int b( ); void main() {…
k=a(); //调用函数 e=b(); … } int b() //定义函数 {… m=a(); //调用函数 … } int a() //定义函数 {…}
函数说明位置不同,作用 范围不同
//将n个盘从one座借助two座移到three座
2. 将第n个盘子从A移到C;
void hanoi (int n, char one, char two, char three)
{ if (n==1) move (one, three);
3. 将n-1个盘子从B移到C
else { hanoi(n-1, one, three, two);
变量的作用域——变量的作用范围
在这个范围内,变量有效存在,退出此范围变量将释放为其分配的存储空间。在
变量作用范围之外引用该变量会出错。
int a, b, c; main ( ) {
数组作为函数参数
数组用作函数参数有两种形式: 数组元素(又称下标变量)作为函数 实参使用;
数组名作为函数的形参和实参使用。
数组元素作为函数实参
数组元素就是下标变量,它与普通变量并无区别。数组
元素只能用作函数实参,其用法与普通变量完全相同:在发 生函数调用时,把数组元素的值传送给形参,实现单向值传 送。
/*求平均值函数*/ float aver (float a[ ]) { int I;
float av,s=a[0]; for(i=1;i<5;i++)
s += a[i]; av=s/5; return av; }
void main() { float sco[5],av;
int I; printf("\ninput 5 scores:\n"); for(i=0;i<5;i++) scanf(“%f”,&sco[i]); /*调用函数,实参为一数组名*/ av=aver(sco); printf("average score is %5.2f\n",av); }
用if语句控制
条件成立:进行递归 条件不成立:结束递归
函数递归调用的应用
递归: 在函数调用自身时,要给出结束递归
例1计算阶乘n! ( n ≥ 0 ) 的条件
1 (n=0,1)
①循环求n! ,即从1开始, 乘2, 乘3.... 一直到n
float fac (int n)
n!= n ·(n-1)! (n>1)
#include <stdio.h>
递归函数
int age ( int n )
的出口
{ int c ;
if ( n == 1 ) c = 10 ;
else c = age ( n - 1 ) + 2;
return c ;
}
void main ( )
{ printf ( " %d" , age ( 5 ));} 函数的调用过程
写一函数,统计字符串中字母的个数。
int isalp(char c);
#include<stdio.h> void main()
{ int i,num=0; char str[255]; printf("Input a string: "); gets(str); for(i=0;str[i]!='\0';i++) if (isalp (str[i]) ) num++; puts(str); printf("num=%d\n",num);
c = a + b;
函数定义时未说明类型,默认为int
return (c);
} void printstar( ) { printf("************\n");} …… void main( )
若函数无返回值,定义为void型(无 值型). 无参数或返回值的函数通常 是实现某一结果可预期的功能,如打 印、报警等。函数返回时,使用 return返回,也可以没有返回语句,
age ( 4 )
age ( 4 )
= age ( 3 ) + 2
= 16
age ( 3 )
age ( 3 )
= age ( 2 ) + 2
= 14
age ( 2 ) age ( 2 )
= age ( 1 ) + 2 = 12
age ( 1 )
= 10
ห้องสมุดไป่ตู้
一个递归问题可以分为“回推”和“递推”两个阶段
结束递归过程的条件:age(1)=10
(借助A);
move (one, three);
4. 重复以上步骤。
hanoi(n-1, two, one, three);
}
}
void main( ) { int m; printf ("input the number of diskes:"); scanf ("%d",&m); printf("the step to moving %3d diskes:\n", m); hanoi (m,'A','B','C'); }
void main() { float x, y;
scanf (“%f”, &x); y=sin (x*3.1415926/180); printf (“sin (%f)=%f”, x, y); }
库函数原形说明存 放在头文件中,通 过include预处理 命令将其原形说明 插入程序中
“先定义,后使用” 函数定义在调用之前,可以
计算公式:
10 ( n = 1 ) age ( n ) =
age ( n - 1 ) + 2
(n>1)
递归函数短小精悍,便于理解; 递归调用速度慢,内存开销大; 所有的递归函数都可以转化为非递归函数。
求解过程
age ( 5 )
age ( 5 )
= age( 4 ) + 2 回推阶段 递推阶段 = 18
运行结果:f=120
else printf (“%d!=%.0f\ n”, n, y); }
函数递归调用的应用
例2:有5个人坐在一起, 问第5个人多少岁? 答,比 第4个人大2岁。第4个人说他比第3个人大2岁, 第3 个人比第2个人大2岁, 第2个人比第1个人大2岁,问 第1个人时回答是10岁。第5个人到底多大?
//在某一函数内说明的函数,仅可在说明它的函 数内部被调用
//声明函数
main() { int a( ); //声明函数,仅在main()中进行说明
… k=a(); //调用函数 … } int b() //不能在函数b()中调用函数a() {… } int a() //函数a()的定义在函数b()之后 {…}
{ ……
程序执行到结尾的花括号时自动返回
n=sum(5,10);//表达式中调用 主函数.
printstar ( );//单语句调用 …… }
可有多个返回语句,可用在需要返回 的任一位置,只有一个在返回时被执 行.
return;
/*不需返回数据*/
return 表达式;/*需要返回数据*/
#include <math .h> #include<stdio .h>
C语言程序设计 函数
函数
主要内容: 函数的定义 函数参数和函数值 函数的调用(嵌套、递归) 变量的作用域及变量的存储类型 内部函数和外部函数
函数的类型指函数返回值的类型(一
…… int sum ( int a , int b ) { int c;
致)
如果调用函数时不需要传递参数,则 形参列表可省略,但括号不能省略。
目标:将所有的盘子从A移到C。 规则:
1. 每次只能移动一个盘; 2. 始终保持大盘在下,小盘在上。
算法:
#include <stdio.h> void move (char x, char y) //输出移盘方案
{printf ("%c-->%c \n", x, y);}
1. 将n-1个盘子从A移到 B(借助C);
…… z=f(y); …… }
2、间接递归调用
int f1( int x ) { int y, z ;
…… z = f2 ( y ) ; …… }
int f2 ( int t ) { int u , v ;
…… v = f1 ( u ); …… }
递归调用的方法要点:
写出递归表达式;
给出终止条件。
void main age n=5
age ( 5 ) age ( 4 )
输出结果 c = 18
age n=4 age ( 3 )
c = 16
age n=3 age ( 2 )
c = 14
age n=2 age ( 1 )
c = 12
age n=1
c = 10
例3: 汉诺塔(Hanoi)问题。
相关文档
最新文档