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*/ }

C语言_实验四、函数程序设计

C语言_实验四、函数程序设计

实验四函数一、实验目的1.掌握函数的定义、函数的说明和调用。

2.掌握函数的参数及其传递方式,函数值的正确返回。

二、实验内容1.[目的]掌握标准库函数的说明和调用方法。

[题目内容]编写一个程序,首先显示一个菜单,然后根据用户的选择,输入数据后,执行相应的操作。

[输入]用户选择和函数自变量值[输出]如下菜单:=======MENU======1.。

sin2.。

cos3.。

pow4.。

sqrt0.。

exit==================[提示]使用标准库函数、多分支选择结构。

2.[目的]掌握用户自定义函数的定义、函数的说明和调用方法。

[题目内容]编写一个用户自定义函数,该函数有一个整型参数,函数的功能是:当这个整型数的值是偶数时,函数的返回值为0,当这个整型数的值是奇数时,返回值为1 。

编写一个程序,从键盘输入任意10个整数,分别调用用户自定义函数来判断这10个整数的奇偶性。

[输入]任意10个整数[输出]这10个整数的奇偶性[提示]在主函数中使用循环结构输入10个整数。

根据子函数的返回值输出相应的判断结果信息。

3.[目的]掌握用户自定义函数的定义、函数的说明和调用方法。

[题目内容]编写一个用户自定义函数,该函数有三个整数参数,函数的功能是:求解这三个整数的最大值,函数的返回值为三个参数的最大值。

编写一个程序,从键盘输入任意5个整数,分别两次调用用户自定义函数来求出这5个整数中的最大值。

[输入]任意5个整数[输出]这5个整数的最大值[提示]先用前三个整数调用函数,求出的最大值作为参数之一,再与另两个整数一起求出最大值即为所求。

4.[目的]掌握用户自定义函数的定义、函数的说明和调用方法。

[题目内容]nA表示从m各元素中抽出n个元素的排列的个数。

它的计算公式为:m)!(!n m m A n m -=。

编写一个用户自定义函数,该函数有一个整数参数,函数的功能是:求解这个整数的阶乘,函数的返回值为这个整数的阶乘。

c语言程序设计——标准输入函数

c语言程序设计——标准输入函数

c语言程序设计——标准输入函数
scanf(),printf(),均定义在文件stdio.h中,需要在程序开头做预处理声明#include<stdio.h>一、标准输入函数
scanf() 是格式化输入函数,它从标准输入设备读取输入的信息。

1.scanf()的调用格式:scanf(格式化字符串,变量地址表);
2.scanf()使用说明
①scanf()在读操作中自动忽略一个或多个空白字符
②scanf()在读操作中忽略与一个非空白字符相同的字符
③格式化说明符:%开始,后面跟一个或几个规定字符来确定输入输出的内容格式
3.变量地址表:
①变量地址表是需要读入的所有变量的地址,各变量地址之间用逗号隔开,“&”是取
地址符
②对于各个变量,类型说明符是什么,对应的格式化说明符就应该是什么,否则程序会
出现错误或者实际输入的数据与预期输入的数据不同。

③对于数组或者字符串变量,由于数组名和指针本身就是地址,所以在scanf()函数中不
需要加取地址符。

④可以在格式化字符串中的“%”和格式化规定符之间加入一个数字,表示输入读取的
最大位数。

⑤当使用多个scanf()连续输入多个字符变量时,会出现错误。

(完成一次输入时,按下
回车键,此时回车符在缓冲区,在进行下一次输入时,回车符被赋给下一个变量)解决办法:在输入函数之前加入清除函数fflush(),或者在第二个scanf();之前加一个getchar();。

C语言程序设计 第3版 第8章 函数

C语言程序设计 第3版 第8章 函数

s=a+b;
return s;
}
main()
//主函数
{
int s;
s=sum();
printf("s=%d\n",s);
}
运行结果
2 3↙ s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名(形式参数表列) {
函数体; return 表达式; }
调用方式
函数调用的一般形式:
函数名(实际参数表) 实际参数表中的参数可以是常数、变量或表达式,各实参之间用逗号分隔。
调用方式:
(1)函数表达式:函数作为表达式中的一项出现在表达式中,这种方式要求函数有返回值。 例如:s=sum(x,y);把sum的返回值赋予变量s。
(2)函数语句:函数调用的一般形式加上分号即构成函数语句,这种方式不要求函数有返回值。 例如:sum(x,y);以函数语句的方式调用函数。
void sum(int a,int b) //自定义函数
{
int s;
s=a+b;
ห้องสมุดไป่ตู้
printf("s=%d\n",s);
} main()
//主函数
{
int x=2,y=3;
sum(x,y);
}
运行结果
s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名( ) {
函数体; return 表达式; }
注意说明:
(1)函数的类型实际上是函数返回值的类型。

电子科技大学《C语言程序设计》课件-第5章函数

电子科技大学《C语言程序设计》课件-第5章函数

三,局部变量(Local Variable) 局部变量 在函数(模块)内部定义的变量称为局部变量, 在函数(模块)内部定义的变量称为局部变量,其 生命期和作用域均为局部的.即在函数(模块)内可见, 生命期和作用域均为局部的.即在函数(模块)内可见, 作用域为函数内部. 作用域为函数内部. 局部变量存放在栈区中,函数被调用时, 局部变量存放在栈区中,函数被调用时,局部变量 在栈区被分配存储空间,函数调用结束时, 在栈区被分配存储空间,函数调用结束时,局部变量随 之消失,其值不能保存.生命期是在函数调用期间. 之消失,其值不能保存.生命期是在函数调用期间. 局部变量在C++中没有缺省初值,未被显式初始化, 中没有缺省初值,未被显式初始化, 局部变量在 中没有缺省初值 其值不确定. 其值不确定.
int area_s(int a ,int b) { return(a*b) }
二,函数调用 (1)函数调用的形式: )函数调用的形式: 函数名(实参数表 函数名 实参数表); 实参数表 (2)调用实质: )调用实质: 程序执行流程转向由函数名指定的被调用函数. 程序执行流程转向由函数名指定的被调用函数. 实参数一一对应地传递给函数定义中的形参数. 实参数一一对应地传递给函数定义中的形参数. 执行函数定义中的函数体. 执行函数定义中的函数体. 执行结束,通过 语句将值返回到调用处. 执行结束,通过return语句将值返回到调用处. 语句将值返回到调用处 程序执行流程返回调用处.执行后面的语句. 程序执行流程返回调用处.执行后面的语句.
结果: 结果: b : -6 b : 10
n:1 n : 13 n : 13 n : 35
(2) 静态全局变量(Static Global Variable) 静态全局变量(Static 在函数之外定义的静态变量称为静态全局变量. 在函数之外定义的静态变量称为静态全局变量. 静态全局变量与全局变量的作用域和生命期都是全局的. 静态全局变量与全局变量的作用域和生命期都是全局的. 其主要区别是:前者作用域为定义该静态全局变量的源 其主要区别是: 程序文件,后者作用域为组成程序的所有源程序文件. 程序文件,后者作用域为组成程序的所有源程序文件.

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语言程序设计》课件-第5章 函数

四川大学《c语言程序设计》课件-第5章 函数

用void定义参数 ,表示没有参数
void 函数名(void)
{ 声明语句序列 可执行语句序列 return ;
}
return语句后无需 任何表达式
【例】 计算整数n的阶乘n!
/* 函数功能: 用迭代法计算n!
返回值函数类入型口参数:函整数型名变量说n明表示阶乘的形阶参数表,函
函数返回值: 函返数回的n!功的能值
函数定义(Function definition)
返回值 类型
函数名标识符, 说明运算规则
参数表相当于 运算的操作数
类型 函数名(类型 参数1, 类型 参数2, ……)
{ 声明语句序列
可执行语句序列 return 表达式;
}
函数出口
返回运算的结果
函数定义(Function definition)
因变量
函数名
自变量
程序设计中的函数
程序设计中的函数不局限于计算 –计算类,如打印阶乘表的程序…… –判断推理类,如排序、查找……
问题的提出
读多少行的程序能让你不头疼? 假如系统提供的函数printf()由10行代码替换,那么你编过的程 序会成什么样子?
–实际上一个printf()有上千行代码 main()中能放多少行代码? 如果所有代码都在main()中,怎么团队合作? 如果代码都在一个文件中,怎么团队合作?
C程序的存储类别 – auto型(自动变量) – static型(静态变量) – extern型(外部变量) – register型(寄存器变量)
变量的存储类型( Storage Class)
变量的生存期(Lifetime )
The lifetime of a variable is the period of time during which memory is allocated to the variable

C语言程序设计实验报告(函数)

C语言程序设计实验报告(函数)

C语言程序设计实验报告(实验名称:函数)1实验目的(1)掌握函数的定义方法、调用方法、参数说明以及返回值;(2)掌握实参与形参的对应关系,以及参数之间的“值传递”的方式;(3)掌握函数的嵌套调用及递归调用的用的设计方法;(4)在编程过程中加深理解函数调用的程序设计思想。

2实验内容(1)编写一个函数primeNum(int x),功能是判别一个数是否为素数。

要求:①在主函数中输入一个整数x(直接赋值或从键盘输入);②函数类型为空值(void),调用primeNum( )函数后,在函数中输出x是否为素数的信息,输出格式为“x is a prime number”或”x is not aprime number”;③分别输入一下数据:0,1,2,5,9,13,59,121,并运行程序,检查结果是否正确。

(2)编写函数 mulNum(int a,int b),它的功能是用来确定a和b是否是整数倍的关系。

如果a是b的整数倍,则函数返回值为1,否则函数返回值为0。

要求:①在主函数中从键盘输入一对整型数据a和b;②调用函数后,根据返回值对a和b的关系进行说明。

例如,在主函数中输入:10,5,则输出“10 is a multiple of 5”;③分别输入下面几组数据进行函数的正确性测试:1与5,5与5,6与2,6与4,20与4,37与9。

3算法描述流程图(1)primeNum(int x)(判别一个数是否是素数)函数流程图①主函数流程图:②判断素数函数流程图:(2)mulNum(int a,int b)(确定a和b是否是整数倍的关系)函数流程图①主函数流程图:②判断倍数流程图:4源程序(1)判断某个数是否是素数#include <stdio.h>int primNum(int x) /*编写函数判断某个数是否是素数*/ {int i;if (x==0||x==1) /*当x等于1或等于0时判断是否为素数*/return 0;for (i=2;i<x;i++) /* 当x大于2时判断不为素数的数*/{if (x%i==0)return 0;}if (x%i) /* 当x等于2或不满足上述条件时时判断出该数是素数*/ return 1;}void main(){int n ;printf("Please input an integer:"); /* 提示从键盘输入一个数x */scanf("%d",&n);if (primNum(n)==1) /* 调用定义的函数*/ printf("%d is a prime number\n",n); /* 由函数得出结论判断是否为素数*/ elseprintf("%d is not a prime number\n",n);}(2)个数是否是整数倍关系#include <stdio.h>int mulNum(int a,int b)/* 定义函数确定两个数是否有整数倍关系*/{if (a%b==0) /* 判断出a是b的整数*/return 1;else /* 判断出a不是b的整数*/return 0;}void main (){int m,n;printf ("please input tow integers:\n"); /*提示从键盘输入两个数*/scanf ("%d%d",&m,&n); /*从键盘输入两个数的值*/if(mulNum(m,n)==1) /*调用定义的函数并判断输出相应的结果*/printf("%d is a multiple of %d\n",m,n);elseprintf("%d is not a multiple of %d\n",m,n);}5测试数据(1)实验(1)测试数据为0,1,2,5,9,13,59,121 运行结果当测试数据0时当测试数据1时当测试数据2时当测试数据5时当测试数据9时当测试数据13时当测试数据59时当测试数据121时(2)实验2测试的数据1与5,5与5,6与2,6与4,20与4,37与9。

C语言程序设计(第3版)何钦铭-颜-晖-第5章--函数

C语言程序设计(第3版)何钦铭-颜-晖-第5章--函数

第5章函数【练习5-1】使用函数求1到n之和:输入一个正整数n,输出1〜n之和。

要求自定义和调用函数sum(n)求1〜n之和。

若要计算m〜n(m<n)之和,又该如何定义函数?试编写相应程序。

解答:#include<stdio.h>intsum(intn);intmain(void){intn;intsum;printf("Entern:")scanf("%d",&n);printf("sum=%d\n",sum(n));return0;}intsum(intn){intresult,i;result=0;for(i=1;i<=n;i++)result=result+i;returnresult;}若要计算m〜n(m<n)之和,则需要在main()中定义2个变量m和n:scanf("%d%d",&m,&n);printf("sum=%d\n",sum(m,n));同时在函数定义时需设置2个形参:intsum(intm,intn){intresult,i;result=0;for(i=m;i<=n;i++)result=result+i;returnresult;}【练习5-2】使用函数找最大值:输入2个数,输出其中较大的数。

要求定义和调用函数max(a,b)找出并返回a、b中较大的数。

试编写相应程序。

解答:#include<stdio.h>doublemax(doublea,doubleb);intmain(void)inta,b;printf(“Inputaandb:”);scanf("%lf%lf",&a,&b);printf("max=%lf\n",max(a,b));return0;}doublemax(doublea,doubleb){if(a>b)returna;elsereturnb;}【练习5-3】数字金字塔:输入一个正整数n,输出n行数字金字塔。

c函数式程序设计

c函数式程序设计

c函数式程序设计C函数式程序设计是一种编程范式,它侧重于使用函数作为程序的基本构建块。

在C语言中,函数是执行特定任务的代码块,可以接收输入(参数)并产生输出(返回值)。

函数式程序设计强调的是函数的抽象和复用,以及避免副作用(即函数不修改外部状态)。

函数的定义和声明在C语言中,函数的定义通常包括返回类型、函数名、参数列表和函数体。

例如:```cint add(int a, int b) {return a + b;}```这里定义了一个名为`add`的函数,它接受两个整数参数`a`和`b`,并返回它们的和。

函数的声明则是告诉编译器函数的存在,但不需要提供函数体。

声明通常放在头文件中,以便其他文件包含和使用。

```cint add(int, int);```函数的参数和返回值参数是函数的输入,可以是值传递或引用传递。

C语言默认使用值传递,即传递给函数的是参数的一个副本。

返回值是函数的输出,它告诉调用者函数执行的结果。

递归函数递归函数是调用自身的函数。

递归是解决问题的一种强大工具,特别是对于自然递归定义的问题,如阶乘、斐波那契数列等。

```cint factorial(int n) {if (n == 0)return 1;elsereturn n * factorial(n - 1);}```指针和函数指针在函数式程序设计中扮演着重要角色。

通过指针,函数可以修改其参数的值,或者操作更复杂的数据结构。

```cvoid swap(int *x, int *y) {int temp = *x;*x = *y;*y = temp;}```函数指针函数指针是指向函数的指针变量。

它允许将函数作为参数传递给其他函数,或者作为返回值从函数返回。

```cvoid (*functionPointer)(int *, int *) = swap;```高阶函数高阶函数是接受其他函数作为参数或返回函数的函数。

这在C语言中不常见,因为C语言没有内建的函数作为一等公民的支持,但可以通过函数指针来实现类似的概念。

  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)问题。
相关文档
最新文档