C语言-函数
C语言-函数
C语言(函数,变量作用范围)二1 C语言程序由函数组成,以下说法正确的是( A ).A)主函数可以在其它函数之前,函数内不可以嵌套定义函数B)主函数可以在其它函数之前,函数内可以嵌套定义函数C)主函数必须在其它函数之前,函数内不可以嵌套定义函数D)主函数必须在其它函数之前,函数内可以嵌套定义函数2 以下说法中不正确的是( A )。
A) 主函数main中定义的变量在整个文件或程序中有效B) 不同的函数中可以使用相同名字的变量C) 形式参数是局部变量D) 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效3 下面函数f(double x){printf(“%6d\n”,x);}的类型为( C ).A) 实型B)void 类型C)int 类型 D) A)、B)、C)均不正确4 以下说法中正确的是( C ).A)C语言程序总是从第一个定义的函数开始执行B)在C语言程序中,要调用的函数必须在main函数中定义C)C语言程序总是从main函数开始执行D)C语言程序中,main函数必须放在程序的开始部分5 以下正确的函数定义是( C ).A) double fun(int x,int y);{int z;z=x+y; return z;}B) fun(int x,y){int z; return z;}C) double fun(int x,int y){double z;z=x+y; return z;}D) double fun( x, y){int x,y;double z;z=x+y; return z;}6 定义为void类型的函数,其含义是( A ).A)调用函数后,被调用的函数没有返回值B)调用函数后,被调用的函数不返回C)调用函数后,被调用的函数的返回值为任意的类型D)以上三种说法都是错误的7 设有如下定义:int x=10,y=3,z ;则语句printf("%d\n",z=(x%y,x/y));的输出结果是( D ).A) 1 B)0 C) 4 D)38 在C语言的函数中,( C )。
《C语言函数》PPT课件
#include <stdio.h>
int sum(int a, int b)
{
a=a+b;
b=a+b;
函数被调用之前,形参和子函数中的变量
return(a);
不占内存,调用结束返回,形参所占的内存被收回.
}
实参和形参传递的是”值传递”,
void main() {
即单向传递, 只与参数相对位置有关,而与 变量名无关
void printMessage() {
printf(“Hello, world.\n”); printStar(); }
void main() {
printStar(); printMessage(); }
-
12
C语言程序设计
第 6 章 模块化程序设计--函数
函数的调用
一、函数调用一般形式
一般形式: 函数名(实参列表)
3.实参可以是常量、变量或表达式.
z=c(=x>( ya)>?bx) :?ya; :b;
因为传递过来的是具体数值.
retruertnu(rzn)(;c);
4.实参和形参类型必须一致(或可以安全转换).
} void main()
5.C语言中,实参和形参传递的是”按值传递”, {
即单向传递, 只与参数相对位置有关,而与
按生存期局部变量全局变量自动变量静态变量寄存器变量形式参数变量动态存储静态存储自动变量形式参数寄存器变量静态局部变量全局变量按变量的存放位置动态存储区静态存储区自动变量形式参数静态局部变量全局变量寄存器寄存器变量c语言程序设计模块化程序设计函数202137chenli33自定义的函数有两种
模块化程序设计
c语言中函数的定义
C语言中函数的定义一、函数的概念和作用函数是C语言中最基本的代码组织单元之一,它可以将一段可重用的代码封装起来,并给它一个合适的名字。
通过函数的调用,可以在程序中多次复用这段代码,提高代码的可读性和可维护性。
函数在C语言中具有以下作用: 1. 实现代码的模块化:将程序分解为一个个的函数,每个函数负责完成一个特定的任务,使得程序结构清晰、易于理解和维护。
2. 提高代码的重用性:将一段经常使用的代码封装为函数,通过函数的调用可以在程序中多次复用,避免了重复编写相同的代码,减少了工作量。
3. 方便调试和错误追踪:若程序中出现错误,可以通过函数调用的栈帧信息追踪错误的发生位置,便于调试和修复bug。
二、函数的基本语法C语言中函数的定义包括函数声明和函数体两部分。
1. 函数声明函数声明用于告诉编译器函数的名称、返回类型和参数列表。
函数声明的语法如下:返回类型函数名(参数列表);其中,返回类型指明了函数执行完后的返回值类型,函数名是函数的唯一标识符,参数列表指明了函数的参数类型和参数名称。
2. 函数体函数体是函数的实际执行部分,由一组语句组成。
函数体的语法如下:返回类型函数名(参数列表){// 函数体语句return返回值;}函数体中的语句用来描述函数的执行逻辑,可以包括赋值语句、控制语句、循环语句等。
函数体最后一行的return语句用于将执行结果返回给函数调用者,可以省略,省略时函数的返回类型必须为void。
三、函数的定义和调用函数的定义是指实现函数功能的具体代码,它包括函数声明和函数体。
函数的调用是指在程序中使用函数完成特定任务的过程。
下面分别介绍函数的定义和函数的调用。
1. 函数的定义函数的定义一般放在C源文件的头部,用于告诉编译器这个函数的具体实现。
函数的定义包括函数头和函数体两部分,函数头通常与函数声明相同。
下面是函数的定义示例:// 函数声明int add(int a, int b);// 函数定义int add(int a, int b){return a + b;}2. 函数的调用函数的调用是指在程序中使用函数完成特定任务的过程。
C语言库函数使用大全
C语言库函数使用大全C语言是一种面向过程的编程语言,它提供了大量的库函数来方便开发者进行各种操作。
在本篇文章中,我将介绍一些常用的C语言库函数,并说明它们的使用方法。
1.字符串处理函数:- strlen:用于计算字符串的长度。
- strcat:用于将两个字符串连接起来。
- strcpy:用于将一个字符串复制到另一个字符串中。
- strcmp:用于比较两个字符串是否相等。
2.数学函数:- abs:返回一个整数的绝对值。
- sqrt:返回一个数的平方根。
- pow:计算一个数的指定次幂。
- rand:生成一个随机数。
3.输入输出函数:- printf:用于打印输出。
- scanf:用于接受用户的输入。
- getchar:用于从输入流中读取一个字符。
- putchar:用于将一个字符输出到屏幕上。
4.内存管理函数:- malloc:用于在堆中分配指定大小的内存块。
- free:用于释放之前分配的内存。
- calloc:可以在堆中分配指定数量和大小的内存,并将每个字节初始化为0。
- realloc:用于调整之前分配的内存块的大小。
5.时间日期函数:6.文件操作函数:- fopen:用于打开一个文件。
- fclose:用于关闭一个文件。
- fgets:从文件中读取一行字符串。
- fputs:向文件中写入一行字符串。
7.数组处理函数:- memset:将一个数组的所有元素设置为指定的值。
- memcpy:将一个数组的内容复制到另一个数组中。
- memmove:将一个数组的内容移动到另一个数组中,处理重叠情况。
- qsort:用于对数组进行快速排序。
这只是C语言库函数的一小部分,还有很多其他函数可供使用。
在实际开发中,根据需求选择适合的函数,可以提高代码的效率和可读性。
总结:C语言库函数提供了丰富的功能,可以帮助开发者简化编程过程。
在使用库函数时,需要仔细阅读函数的说明文档,并根据需求选择适合的函数和参数。
通过充分利用库函数,可以提高代码的开发效率和质量。
c语言常用函数大全及详解
C语言常用函数包括:1.printf函数:用于在控制台输出数据。
2.scanf函数:用于从控制台读取用户输入的数据。
3.strlen函数:用于计算字符串的长度。
4.strcmp函数:用于比较两个字符串的大小。
5.strcpy函数:用于将一个字符串复制到另一个字符串中。
6.strcat函数:用于将一个字符串连接到另一个字符串的末尾。
7.strchr函数:用于查找字符串中指定字符的位置。
8.strstr函数:用于查找字符串中指定子串的位置。
9.atoi函数:用于将字符串转换为整数。
10.atof函数:用于将字符串转换为浮点数。
11.malloc函数:用于动态分配内存空间。
12.free函数:用于释放动态分配的内存空间。
13.memcpy函数:用于将一段内存区域的数据复制到另一段内存区域。
14.memset函数:用于将一段内存区域的数据设置为指定的值。
15.abs函数:用于计算整数的绝对值。
16.rand函数:用于生成随机数。
17.srand函数:用于设置随机数生成器的种子。
18.time函数:用于获取当前的系统时间。
19.localtime函数:用于将时间戳转换为本地时间。
20.strtol函数:用于将字符串转换为长整型数。
21.strtod函数:用于将字符串转换为双精度浮点数。
22.fprintf函数:用于将数据格式化输出到文件中。
23.fscanf函数:用于从文件中读取格式化的数据。
24.fgets函数:用于从文件中读取一行数据。
25.fputs函数:用于将数据写入文件中。
26.fopen函数:用于打开文件。
27.fclose函数:用于关闭文件。
28.feof函数:用于判断文件是否已经到达文件末尾。
29.ferror函数:用于判断文件操作是否发生错误。
30.fprintf函数:用于将数据格式化输出到文件中。
C语言--函数
函数返回值示例
内存 #include <stdio.h> age1 age2 age3 int get_age(); void main() 78 54 65 { int age1, age2, age3; int get_age() age1 = get_age(); { age2 = get_age(); int age; age3 = get_age(); printf("\n请输入年龄: "); if ( (age1 > age2) && (age1 > age3)) scanf("%d",&age); printf("\n年龄为 %d 的人最大\n", age1); return age; else if( (age2 > age1) && (age2 > age3)) } printf("\n年龄为 %d 的人最大\n", age2); else if( (age3 > age1) && (age3 > age2)) 请输入年龄:65 printf("\n年龄为 %d 的人最大\n", age2);请输入年龄:78 请输入年龄:54 } 年龄为 78 岁的人最大
14
函数参数和函数的值
形参与实参
形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式
例 比较两个数并输出大者
main() { int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); (main 函数) c=max(a,b); printf("Max is %d",c); max(int x, int y) (max 函数) { int z; } z=x>y?x:y; max(int x, int y) return(z); { int z; } z=x>y?x:y; return(z); }
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语言--函数
C语⾔--函数⼀、PTA实验作业题⽬1:使⽤函数输出⽔仙花数1. 本题PTA提交列表(要提交列表,不是结果)2. 设计思路判断是否为⽔仙花数的函数设计思路:1、定义整型变量result=0表⽰计算结果、count=0表⽰次幂、digit表⽰取个位、flag表⽰中介变量、i表⽰循环计数、pow个位数的count次幂;2、for flag=number to flag>=1;3、flag=flag/10,count++;4、end flag;5、for flag=number to flag>=1;6、digit=flag%10;7、pow=1,for i=1 to i<=count;8、pow=pow*digit;9、end i;10、result=result+pow;11、end flag;12、若result=number,返回1,否则返回0;输出m~n(不包括m、n)之间所有⽔仙花数的函数设计思路:1、定义整型变量number_1表⽰要判断的数;2、for number_1=m+1 to number_1<n;3、若 narcissistic(number_1) 为真,输出number_1;3.本题调试过程碰到问题及PTA提交列表情况说明。
问题1:我的错误代码:改正之后代码:错误原因:pow赋初值的位置错了解决办法:调试,跟踪变量题⽬2:使⽤函数输出指定范围内的Fibonacci数1. 本题PTA提交列表2. 设计思路返回第n项斐波那契数的函数设计思路:1、定义整型变量 fib=2 表⽰斐波那契数、i 表⽰项数计数、fib_n=1表⽰前⼀项斐波那契数;2、若n=1或n=2,返回1,若n=3,返回2,否则执⾏下⼀步;3、for i=4 to i<=n;4、fib=fib+fib_n,fib_n=fib-fib_n;5、end i;6、返回fib输出m~n之间所有斐波那契数的函数设计思路:1、定义整型变量fib表⽰斐波那契数,i 表⽰计斐波那契数有⼏个,fib_n表⽰前⼀项斐波那契数;2、若m=n=1,则i=2并输出“1 1”,否则执⾏下⼀步;3、for fib=1 to fib<=n,fib=fib+fib_n;4、若m=n=fib,则i=1,输出m并跳到步骤9,否则执⾏下⼀步;5、若fib>=m,则i++,执⾏下⼀步,否则调到步骤7;6、若i=1,则输出fib,否则输出⼀个空格加fib并执⾏下⼀步;7、fib_n=fib-fib_n;8、end fib;9、若i=0,输出"No Fibonacci number "3.本题调试过程碰到问题及PTA提交列表情况说明。
c语言数学函数大全及详解
c语言数学函数大全及详解C语言提供了一系列的数学函数,这些函数包含在`math.h` 头文件中。
以下是一些常见的C 语言数学函数及其简要说明:1. fabs:-函数原型:`double fabs(double x);`-描述:返回`x` 的绝对值。
2. sqrt:-函数原型:`double sqrt(double x);`-描述:返回`x` 的平方根。
3. pow:-函数原型:`double pow(double x, double y);`-描述:返回`x` 的`y` 次方。
4. exp:-函数原型:`double exp(double x);`-描述:返回自然对数的底`e` 的`x` 次方。
5. log:-函数原型:`double log(double x);`-描述:返回`x` 的自然对数。
6. sin, cos, tan:-函数原型:- `double sin(double x);`- `double cos(double x);`- `double tan(double x);`-描述:分别返回`x` 的正弦、余弦和正切值。
这些函数中`x` 的单位是弧度。
7. asin, acos, atan:-函数原型:- `double asin(double x);`- `double acos(double x);`- `double atan(double x);`-描述:分别返回`x` 的反正弦、反余弦和反正切值。
返回的值是弧度。
8. sinh, cosh, tanh:-函数原型:- `double sinh(double x);`- `double cosh(double x);`- `double tanh(double x);`-描述:分别返回`x` 的双曲正弦、双曲余弦和双曲正切值。
9. ceil:-函数原型:`double ceil(double x);`-描述:返回不小于`x` 的最小整数值。
C语言-字符串函数大全和详解
函数返回strDestination值.
char *strncat(char *strDestination, const char *strSource, size_t count);
将源串strSource开始的count个字符添加到目标串strDest后. 源串strSource的字符会覆盖目标串strDestination后面的结束符NULL. 如果count大于源串长度, 则会用源串的长度值替换count值. 得到的新串后面会自动加上NULL结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠的情况.
函数返回strDestination值.
char *strset(char *string, int c);
将string串的所有字符设置为字符c, 遇到NULL结束符停止.
函数返回内容调整后的string指针.
char *strnset(char *string, int c, size_t count);
char *strcat(char *strDestination, const char *strSource);
将源串strSource添加到目标串strDestination后面, 并在得到的新串后面加上NULL结束符. 源串strSource的字符会覆盖目标串strDestination后面的结束符NULL. 在字符串的复制或添加过程中没有溢出检查, 所以要保证目标串空间足够大. 不能处理源串与目标串重叠的情况.
获取字符串长度, 字符串结束符NULL不计算在内.
没有返回值指示操作错误.
char *strrev(char *string);
将字符串string中的字符顺序颠倒过来. NULL结束符位置不变.
C语言中常用函数大全
(三)文件函数
mode: r:打开已存在文件,准备从文件中读取数据 ,不能写入 r+ :可读可写
w:创建一个新文件,准备写入;如文件已存在,此文件将被 空文件覆盖 w+:增加“读取”操作
2;字符ar(int c) 正常返回字 符代码值,出错返回 E OF (2)int putc(int c,FILE*strea m) 正常返回字 符代码值,出错返回 E OF strea m==stdou t(1)=(2) (3)int puts(char*strea m) 自动回车换 行
a:打开已存在文件,准备在文件尾部追加数 据,不能读取。 如文件不存在,侧创建此文 件,准备写入。
a+:增加“读取”
t:打开一个文 本文件(缺省值) b:打开一个二 进制文件
一:文件的打开 与关闭 1:打开文件 FILE * fopen (char*filen ame, char*mode) Filename:是字符串,表示打开的文件名,文件名前可 以带路径。 Mode:也是字符串,表示打开文 件的方式。 功能----按指定方式 打开文件。 返回值----如果文件打开成功,返回“文件结构体 指针”,否者返回 N ULL(如:文件不存在 或则 写文件时不能创建 )。 Fopen(“A:\\user\\asd.txt”,”r+”); 2:关闭文件 Int*fclos e(FILE*filen ame) 正常关闭返 回0;否者返回 非 0。
With:指定输入数 据的宽度,遇空格、Tab、\n 结束
C语言中常用函数大全
(一)输入输出常用函数1,printf(1)有符号int%[-][+][0][width][.precision][l][h] d-:左对齐+:正数前加‘+’0:右对齐,acwidth<width,左补零.precision:至少输出位数。
若实际的位数>.precision,按实际输出,否者左边补零(2)无符号int%[-][#][0][width][.precision][l][h] u|o|x|X#:”%o %x/X”输出0,0x,0X.precision:同上,TC/BC包含0x/X,VC下不包含(3)实数输出%[-][+][#][0][width][.precision][l][L] f|e|E|g|G#:必须输出小数点.precision:小数位数(四舍五入)(4)字符和字符串的输出%[-][0][width] c %[-][0][width] [.precision] s.precision:S的前precision位2,scanf%[*][width] [l][h]TypeWith:指定输入数据的宽度,遇空格、Tab、\n结束*:抑制符scanf(“%2d%*2d%3d”,&num1,&num2) 输入123456789\n;num1==12,num2==567.注意:(1)指定width时,读取相应width位,但按需赋值Scanf(“%3c%3c”,&ch1,&ch2)输入a bc d efg ch1==a ch2==d(2)%c 输入单字符时“空格、转义字符”均是有效字符(二)ascll字符/字符串/文件函数1;字符非格式化输入函数(1)int getchar(void) 接受字符,以回车结束,回显(2)int getc(FILE*stream) 从stream中接受字符,以回车结束,回显stream=stdin时,(1)==(2)(3)int getche(void) 直接读取字符,回显conio.h(4)int getchar(void) 直接读取字符,不回显conio.h注意:(1,2)对于回车键返回‘\n’(3,4)对于回车键返回‘\r’2;字符/串非格式化输出函数(1)int putchar(int c) 正常返回字符代码值,出错返回EOF(2)int putc(int c,FILE*stream) 正常返回字符代码值,出错返回EOF stream==stdout(1)=(2)(3)int puts(char*stream) 自动回车换行1;字符串的赋值#include< string.h memory.h >Void *memset (void *s, char ch, unsigned n)将以S为首地址的,一片连续的N个字节内存单元赋值为CH.Void *memcpy ( void *d, void*s, unsigned n)将以S为首地址的一片连续的N个字节内存单元的值拷贝到以D为首地址的一片连续的内存单元中。
C语言题库-函数
C语言函数练习题一、选择题1. 在函数的说明和定义时若没有指出函数的类型,则(A)A: 系统自动地认为函数的类型为整型。
B: 系统自动地认为函数的类型为字符型。
C: 系统自动地认为函数的类型为实型。
D: 编译时会出错。
2.下面正确的函数定义形式是( A )A:double fun(int x,int y) { }B:double fun(int x;int y) { }C:double fun(int x,int y);D:double fun(int x,y);3.若调用一个函数,且此函数中没有 return 语句,则正确的说法是:该函数( D )A:没有返回值;B:返回若干个系统默认值;C:能返回一个用户所希望的函数值;D:返回一个不确定的值4.C 语言允许函数返回值类型缺省定义,此时该函数隐含的返回值类型是( B)A: float型B: int型C:long 型D:double 型5.C 语言规定,函数返回值的类型是由( D )(二级题)A: return语句中的表达式类型所决定;B:调用该函数时的主调函数类型所决定;C:调用该函数时系统临时决定;D:在定义该函数时所指定的函数类型所决定6. 下面函数调用语句含有实参的个数为(B)func((exp1,exp2),(exp3,exp4,exp5));A: 1B: 2C: 5D: 47.以下错误的描述是( D )函数的调用可以A:出现在执行语句中;B:出现在一个表达式中;C:为一个函数的实参;D:作为一个函数的形参;8. 若函数的形参为一维数组,则下列说法中正确的是(B)A:调用函数时的对应实参必为数组名。
B:形参数组可以不指定大小。
C:形参数组的元素个数必须等于实参数组的元素个数。
D:形参数组的元素个数必须多于实参数组的元素个数。
9.下面叙述中正确的是( C )A:对于用户自己定义的函数,在使用前必须加以说明。
B:说明函数时必须明确其参数类型和返回类型。
C语言基础--函数
3.fgetc/fgets(从打开的文件中获取一个字符/字符串)
4.getc/gets()
5.fputc/fputs(表示写入文件一个字符或者一个字符串)
6.putc/puts
*7.fread
数据块读函数
size_t fread(void *ptr,int size,int nmemb,FILE *fp);
起始位置有3个
SEEK_SET --对应整数0 起始位置是文件首
SEEK_CUR --对应整数1 起始位置是当前位置
SEEK_END --对应整数2 起始位置是文件末
11.perror
12.fprintf
格式化读写函数fscanf(),fprintf()函数的读写对象不再是键盘与屏幕,而是磁盘文件
******************************************************************************
文件函数:
(stdin,stdou,stderr-->文件指针)
*1.fopen(打开文件)
FILE *fopen(const char *path,const char *mode);
两种形式:
定义如下
int abc(int a,int b)
{
//函数 abc(int a,int b);
int abc(int ,int );
3.函数调用
表示对函数的使用
返回值接收=函数名(实参列表);
2.函数名称:表示该函数的入口点;
3.形参列表:形参的类型+形参变量;
各形参间使用逗号隔开;
C语言函数的定义
C语言函数的定义C语言函数的定义引导语:函数表示每个输入值对应唯一输出值的一种对应关系。
这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素。
以下是店铺分享给大家的C语言函数的定义,欢迎参考学习!一、函数的定义一个函数包括函数头和语句体两部分。
函数头由下列三不分组成:函数返回值类型函数名参数表一个完整的函数应该是这样的:函数返回值类型函数名(参数表){语句体;}函数返回值类型可以是前面说到的某个数据类型、或者是某个数据类型的指针、指向结构的指针、指向数组的指针。
指针概念到以后再介绍。
函数名在程序中必须是唯一的,它也遵循标识符命名规则。
参数表可以没有也可以有多个,在函数调用的时候,实际参数将被拷贝到这些变量中。
语句体包括局部变量的声明和可执行代码。
我们在前面其实已经接触过函数了,如abs(),sqrt(),我们并不知道它的内部是什么,我们只要会使用它即可。
这一节主要讲解无参数无返回值的函数调用。
二、函数的声明和调用为了调用一个函数,必须事先声明该函数的返回值类型和参数类型,这和使用变量的道理是一样的(有一种可以例外,就是函数的定义在调用之前,下面再讲述)。
看一个简单的例子:void a(); /*函数声明*/main(){a(); /*函数调用*/}void a() /*函数定义*/{int num;scanf(%d,&num);printf(%d ,num);}在main()的前面声明了一个函数,函数类型是void型,函数名为a,无参数。
然后在main()函数里面调用这个函数,该函数的作用很简单,就是输入一个整数然后再显示它。
在调用函数之前声明了该函数其实它和下面这个程序的功能是一样的:main(){int num;scanf(%d,&num);printf(%d ,num);}可以看出,实际上就是把a()函数里面的所有内容直接搬到main()函数里面(注意,这句话不是绝对的。
四川大学《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语言函数大全(部分)1.分类函数,所在函数库为ctype.hint isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9')返回非0值,否则返回0int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)返回非0值,否则返回0int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0 int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0int isspace(int ch)若ch是空格(' '),水平制表符('\t'),回车符('\r'),走纸换行('\f'),垂直制表符('\v'),换行符('\n')返回非0值,否则返回0int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值,否则返回0int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z')int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')2 数学函数,所在函数库为math.h、stdlib.h、string.h、float.hint abs(int i)返回整型参数i的绝对值double cabs(struct complex znum)返回复数znum的绝对值double fabs(double x)返回双精度参数x的绝对值long labs(long n)返回长整型参数n的绝对值double exp(double x)返回指数函数ex的值double frexp(double value,int *eptr)返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp);返回value*2exp的值double log(double x)返回logex的值double log10(double x)返回log10x的值double pow(double x,double y)返回xy的值double pow10(int p)返回10p的值double sqrt(double x)返回x的开方double acos(double x)返回x的反余弦cos-1(x)值,x为弧度double asin(double x)返回x的反正弦sin-1(x)值,x为弧度double atan(double x)返回x的反正切tan-1(x)值,x为弧度double atan2(double y,double x)返回y/x的反正切tan-1(x)值,y的x为弧度double cos(double x)返回x的余弦cos(x)值,x为弧度double sin(double x)返回x的正弦sin(x)值,x为弧度double tan(double x)返回x的正切tan(x)值,x为弧度double cosh(double x)返回x的双曲余弦cosh(x)值,x为弧度double sinh(double x)返回x的双曲正弦sinh(x)值,x为弧度double tanh(double x)返回x的双曲正切tanh(x)值,x为弧度double hypot(double x,double y)返回直角三角形斜边的长度(z),x和y为直角边的长度,z2=x2+y2 double ceil(double x)返回不小于x的最小整数double floor(double x)返回不大于x的最大整数void srand(unsigned seed)初始化随机数发生器int rand()产生一个随机数并返回这个数double poly(double x,int n,double c[])从参数产生一个多项式double modf(double value,double *iptr)将双精度数value分解成尾数和阶double fmod(double x,double y)返回x/y的余数double frexp(double value,int *eptr)将双精度数value分成尾数和阶double atof(char *nptr)将字符串nptr转换成浮点数并返回这个浮点数double atoi(char *nptr)将字符串nptr转换成整数并返回这个整数double atol(char *nptr)将字符串nptr转换成长整数并返回这个整数char*ecvt(double value,int ndigit,int *decpt,int *sign)将浮点数value转换成字符串并返回该字符串char*fcvt(double value,int ndigit,int *decpt,int *sign)将浮点数value转换成字符串并返回该字符串char*gcvt(double value,int ndigit,char *buf)将数value转换成字符串并存于buf中,并返回buf的指针char*ultoa(unsigned long value,char *string,int radix)将无符号整型数value转换成字符串并返回该字符串,radix为转换时所用基数char*ltoa(long value,char *string,int radix)将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数char*itoa(int value,char *string,int radix)将整数value转换成字符串存入string,radix为转换时所用基数double atof(char *nptr) 将字符串nptr转换成双精度数,并返回这个数,错误返回0 int atoi(char *nptr) 将字符串nptr转换成整型数,并返回这个数,错误返回0 long atol(char *nptr) 将字符串nptr转换成长整型数,并返回这个数,错误返回0 double strtod(char *str,char **endptr)将字符串str转换成双精度数,并返回这个数, long strtol(char *str,char **endptr,int base)将字符串str转换成长整型数,并返回这个数,int matherr(struct exception *e)用户修改数学错误返回信息函数(没有必要使用)double_matherr(_mexcep why,char *fun,double *arg1p,double *arg2p,double retval)用户修改数学错误返回信息函数(没有必要使用)unsigned int _clear87()清除浮点状态字并返回原来的浮点状态void_fpreset()重新初使化浮点数学程序包unsigned int _status87()返回浮点状态字3 目录函数, 所在函数库为dir.h、dos.hint chdir(char *path) 使指定的目录path(如:"C:\\WPS")变成当前的工作目录,成功返回0int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功返回0pathname为指定的目录名和文件名,如"C:\\WPS\\TXT"ffblk为指定的保存文件信息的一个结构,定义如下:┏━━━━━━━━━━━━━━━━━━┓┃struct ffblk┃┃{┃┃char ff_reserved[21]; /*DOS保留字*/┃┃char ff_attrib;/*文件属性*/ ┃┃int ff_ftime;/*文件时间*/ ┃┃int ff_fdate;/*文件日期*/ ┃┃long ff_fsize;/*文件长度*/ ┃┃char ff_name[13];/*文件名*/┃┃}┃┗━━━━━━━━━━━━━━━━━━┛attrib为文件属性,由以下字符代表┏━━━━━━━━━┳━━━━━━━━┓┃FA_RDONLY 只读文件┃FA_LABEL 卷标号┃┃FA_HIDDEN 隐藏文件┃FA_DIREC目录┃┃FA_SYSTEM 系统文件┃FA_ARCH档案┃┗━━━━━━━━━┻━━━━━━━━┛例:struct ffblk ff;findfirst("*.wps",&ff,FA_RDONLY);int findnext(struct ffblk *ffblk)取匹配finddirst的文件,成功返回0void fumerge(char *path,char *drive,char *dir,char *name,char *ext) 此函数通过盘符drive(C:、A:等),路径dir(\TC、\BC\LIB等),文件名name(TC、WPS等),扩展名ext(.EXE、.COM等)组成一个文件名存与path中.int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)此函数将文件名path分解成盘符drive(C:、A:等),路径dir(\TC、\BC\LIB 等),文件名name(TC、WPS等),扩展名ext(.EXE、.COM等),并分别存入相应的变量中.int getcurdir(int drive,char *direc) 此函数返回指定驱动器的当前工作目录名称drive 指定的驱动器(0=当前,1=A,2=B,3=C等)direc 保存指定驱动器当前工作路径的变量成功返回0char *getcwd(char *buf,iint n) 此函数取当前工作目录并存入buf中,直到n个字节长为为止.错误返回NULLint getdisk() 取当前正在使用的驱动器,返回一个整数(0=A,1=B,2=C等)int setdisk(int drive) 设置要使用的驱动器drive(0=A,1=B,2=C等), 返回可使用驱动器总数int mkdir(char *pathname) 建立一个新的目录pathname,成功返回0int rmdir(char *pathname) 删除一个目录pathname,成功返回0char *mktemp(char *template) 构造一个当前目录上没有的文件名并存于template 中 char *searchpath(char *pathname) 利用MSDOS找出文件filename所在路径, 此函数使用DOS的PATH变量,未找到文件返回NULL4 进程函数,所在函数库为stdlib.h、process.hvoid abort() 此函数通过调用具有出口代码3的_exit写一个终止信息于stderr,并异常终止程序。
C语言标准库函数大全
Page 1 of 22
博客园 社区 首页 新随笔 联系 管理 订阅
随笔- 208 文章- 0 评论14
c语言库函数大全--资料收集
Turbo C 2.0 函数中文说明大全
分类函数,所在函数库为ctype.h int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0 int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非0值, 否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0 int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F),返 回非0值,否则返回0 int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0 int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值, 否则返回0 int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0 int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否 则返回0 int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0 int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换 行('\f'),垂直制表符('\v'),换行符('\n'), 返回非0值,否则返回0 int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0 int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值, 否则 返回0 int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z') int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')
c语言库函数大全
c语言库函数大全--资料收集分类函数,所在函数库为ctype.h include “stype.h”int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非0值,否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F),返回非0值,否则返回0int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0 int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n'), 返回非0值,否则返回0int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值, 否则返回0int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z')int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')数学函数,所在函数库为math.h、stdlib.h、string.h、float.hint abs(int i) 返回整型参数i的绝对值double cabs(struct com plex znum) 返回复数znum的绝对值double fabs(double x) 返回双精度参数x的绝对值long labs(long n) 返回长整型参数n的绝对值double exp(double x) 返回指数函数ex的值double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值double log(double x) 返回logex的值double log10(double x) 返回log10x的值double pow(double x,double y) 返回xy的值double pow10(int p) 返回10p的值double sqrt(double x) 返回x的开方double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度double atan(double x) 返回x的反正切tan-1(x)值,x为弧度double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度double cos(double x) 返回x的余弦cos(x)值,x为弧度double sin(double x) 返回x的正弦sin(x)值,x为弧度double tan(double x) 返回x的正切tan(x)值,x为弧度double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度double tanh(double x) 返回x的双曲正切tanh(x)值,x为弧度double hypot(double x,double y) 返回直角三角形斜边的长度(z), x和y为直角边的长度, z2=x2+y2double ceil(double x) 返回不小于x的最小整数double floor(double x) 返回不大于x的最大整数void srand(unsigned seed) 初始化随机数发生器int rand() 产生一个随机数并返回这个数double poly(double x,int n,double c[]) 从参数产生一个多项式double modf(double value,double *iptr) 将双精度数value分解成尾数和阶double fm od(double x,double y) 返回x/y的余数double frexp(double value,int *eptr) 将双精度数value分成尾数和阶double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数double atoi(char *nptr) 将字符串nptr转换成整数并返回这个整数double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数char *ecvt(double value,int ndigit,int *decpt,int *sign)将浮点数value转换成字符串并返回该字符串char *fcvt(double value,int ndigit,int *decpt,int *sign)将浮点数value转换成字符串并返回该字符串char *gcvt(double value,int ndigit,char *buf)将数value转换成字符串并存于buf中,并返回buf的指针char *ultoa(unsigned long value,char *string,int radix)将无符号整型数value转换成字符串并返回该字符串,radix为转换时所用基数char *ltoa(long value,char *string,int radix)将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数char *itoa(int value,char *string,int radix)将整数value转换成字符串存入string,radix为转换时所用基数double atof(char *nptr) 将字符串nptr转换成双精度数,并返回这个数,错误返回0int atoi(char *nptr) 将字符串npt r转换成整型数, 并返回这个数,错误返回0long atol(char *nptr) 将字符串npt r转换成长整型数,并返回这个数,错误返回0double strtod(char *str,char **endptr)将字符串st r转换成双精度数,并返回这个数, long strtol(char *str,char **endptr,int base)将字符串str转换成长整型数, 并返回这个数,int m atherr(struct exception *e) 用户修改数学错误返回信息函数(没有必要使用)double _matherr(_mexcep why,char *fun,double *arg1p, double *arg2p,double retval)用户修改数学错误返回信息函数(没有必要使用)unsigned int _clear87() 清除浮点状态字并返回原来的浮点状态void _fpreset() 重新初使化浮点数学程序包unsigned int _status87() 返回浮点状态字目录函数,所在函数库为dir.h、dos.hint chdir(char *path) 使指定的目录path(如:"C:\\WPS")变成当前的工作目录,成功返回0int findfirst(char *pathnam e,struct ffblk *ffblk,int attrib)查找指定的文件,成功返回0pathname为指定的目录名和文件名,如"C:\\WPS\\TXT"ffblk为指定的保存文件信息的一个结构,定义如下:┏━━━━━━━━━━━━━━━━━━┓┃struct ffblk ┃┃{ ┃┃char ff_reserved[21]; /*DOS保留字*/┃┃char ff_attrib; /*文件属性*/ ┃┃int ff_ftim e; /*文件时间*/ ┃┃int ff_fdate; /*文件日期*/ ┃┃long ff_fsize; /*文件长度*/ ┃┃char ff_nam e[13]; /*文件名*/ ┃┃} ┃┗━━━━━━━━━━━━━━━━━━┛attrib为文件属性,由以下字符代表┏━━━━━━━━━┳━━━━━━━━┓┃FA_RDONLY 只读文件┃FA_LABEL 卷标号┃┃FA_HIDDEN 隐藏文件┃FA_DIREC 目录┃┃FA_SYSTEM 系统文件┃FA_ARCH 档案┃┗━━━━━━━━━┻━━━━━━━━┛例:struct ffblk ff;findfirst("*.wps",&ff,FA_RDONLY);int findnext(struct ffblk *ffblk) 取匹配finddirst的文件,成功返回0void fumerge(char *path,char *drive,char *dir,char *name,char *ext)此函数通过盘符drive(C:、A:等), 路径dir(\TC、\BC\LIB等), 文件名name(TC、WPS等),扩展名ext(.EXE、.COM等)组成一个文件名存与path中.int fnsplit(char *path,char *drive,char *dir,char *nam e,char *ext)此函数将文件名path分解成盘符drive(C:、A:等), 路径dir(\TC、\BC\LIB等), 文件名na me(TC、WPS等),扩展名ext(.EXE、.COM等),并分别存入相应的变量中.int getcurdir(int drive,char *direc)此函数返回指定驱动器的当前工作目录名称。
C语言练习-函数
1. 单项选择题(1)在C语言程序中,下列叙述正确的是。
A. 函数的定义可以嵌套,但函数的调用不可以嵌套B. 函数的定义不可以嵌套,但函数的调用可以嵌套C. 函数的定义和调用都可以嵌套D. 函数的定义和调用均不可以嵌套【答】B(2)在C语言程序中,下列叙述错误的是。
A. 形参是局部变量B. 不同的函数中,可以使用相同名称的变量C. 在一个函数的内部,可以在复合语句中定义变量D. main()函数中定义的变量在整个文件或者程序中都有效【答】D(3)在C语言程序中,下列叙述正确的是。
A. 实参和对应的形参各占用独立的存储单元B. 实参和对应的形参共占用一个存储单元C. 形参是虚拟的,不占用存储单元D. 只有当实参和对应的形参同名时才共占用存储单元【答】A(4)在C语言程序中,下列叙述正确的是。
A. 实参可以是常量、变量或表达式B. 实参可以是任意类型C. 形参可以是常量、变量或表达式D. 形参与对应的实参类型要求可以不一致【答】A(5)在C语言程序中,简单变量做实参时,它和对应形参之间的数据传递方式是。
A. 地址传递B. 单向值传递C. 由用户指定传递方式D. 由实参传给形参,再由形参传回给实参【答】C语言函数调用时,只有单向的值传递,即实参将值传递给形参,传址调用也是一种单向的值传递,它是通过间接方式达到将形参回传给实参的。
本题答案为B。
(6)下列关于return语句说法正确的是。
A. 必须在每个函数中都出现B. 只能在除main()函数之外的函数中出现一次C. 可以在同一个函数中多次出现D. 在main()函数和其他函数中都可以出现【答】C(7)C语言中规定函数的返回值的类型是由。
A. return语句中的表达式类型所决定B. 调用该函数时的主调用函数类型所决定C. 调用该函数时系统临时决定D. 在定义该函数时所指定的函数类型所决定【答】D(8)如果要限制一个变量只能被本源文件中的函数使用,必须通过来实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.3.2 函数的返回值
说明 : 1. 通过 return 语句获得返回值 ;
2. 定义函数时指定函数返回值的类型;不加类型说明
的,按整型处理。
3. 函数值的类型和 return 语句中表达式的值不一
致时,以函数类型为准。 4. 被调用函数中没有 return 语句时,带回一个不
确定的值。
5. 为了明确表示“不带回值”,可以用“ void ” 定
int among(m,n) int m,n; { int k,z=0; do {k=m%10; if (n==k) {z=1; break;} m=m/10; }while(m!=0); return(z); }
例 4.统计 400~499 这些数中 4 这个数字出现 的次数,判一个数有几个数字4,用函数实现 。 num(x) int x; { int y,k=0; while (x!=0) {y=x%10; if(y==4) k++; x=x/10; } return(k); } main() {int i,k=0; for(i=400;i<=499;i++) k=k+num(i); printf ("number=%d\n",k); }
例 1:
被调用函数声明
函数声明的作用是把 函数名及函数类型、 形参个数及类型通知 编译系统,以便在调 用该函数时系统按此 进行对照检查。
main( ) float add(float,float); {float add( ); x,float y ); float add(float float a,b,c; ..... } float add(x,y) float x,y; {…}
8.3 函数参数和函数的值
8.3.1 形式参数和实际参数 形式参数 : 定义函数时,括号中说明的变量名 ; 实际参数 : 调用函数时,括号中给定的表达式 。
main( main( ) ) { int a,b,c; { int a,b,c; scanf ("%d,%d",&a,&b); scanf ("%d,%d",&a,&b); 函数调用 c=max( a ,b ); c=max( a ,b ); printf ("max is %d\n",c); printf ("max is %d\n",c); } int max( x, y ) 形参说明 int x,y; { int z; z=x>y?x:y; return (z); }
8.6 函数的递归调用
在调用一个函数的过程中又出现直接或间接地 调用该函数本身,称为函数的递归调用 。 递归问题的特点 : 1 . 把一个问题转化为一个新问题,新问题与原问 题解法相同 ,只是所处理的对象有所不同,但它们 只是有规律的递增或递减 。 2 . 必须有某个终止递归的条件。
例 1. 用递归法求 n! 1 n!= n*(n-1)!
}
1.5,2.5
Max is 2
8. 4 函数的调用
8.4.1 函数调用的一般形式
函数名(实参表列)
说明 : 1.无参函数,括号不能省 ; 2.实参表列中,各实参与形参在 个数、顺序、 类型上一一对应,参数间用逗号分隔。 注意:计算实参时的次序不同。为了提高程序 的通用性,一般都写清楚。
main( ) {int i,j,p; scanf("%d%d",&i,&j); p=f(i,j); printf ("%d",p); }
8.2 函数定义 1. 无参函数的定义 形式: 类型标识符 函数名( ) { 说明部分 语句 } 说明:若不带回函 数值,类型标识符 也可以不写,无参 函数一般用于完成 指定的一组操作。 例如: main( ) { int a=5,b=9 ; printf(" %d\n " , a*b*b ); }
第8章 函数
8.1 概述 程序结构概念 : 1)较大的程序应分为若干个程序模块 ; 2)每个模块实现单一的特定功能; 3)由主函数开始执行,主函数调用子函数; 4)子函数之间可以互相调用。
说明 : 一个源文件可由一个或多个函数组成; 一个源文件是一个编译单位; 一个 C 程序由一个或多个源文件组成。 从 main() 开始,调用其它函数后, 回到 main() 结束 ; 5. 不能嵌套定义,但可互相调用 。 6. 分类 : 1) 标准函数 和 用户自定义函数 ; 2) 无参函数 和 有参函数 。 1. 2. 3. 4.
例 6.求图形的面积 。
#include "math.h" float area1(a,b,c) float a,b,c; { float s,p; p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c)); return(s); }
float area2(d) float d; { float s; s=3.14159*(d/2)*(d/2)/2; return(s); }
已在文件 开头声明
定义 let 函数 定义f函 数 定义max函 数
main( ) 程序举例: { float x; a; 例1:求下列函数的值 int y(); scanf ("%f",&a); scanf("%f",&x); 1 x>0 printf ("%d", y(x) y(a)); y(a) } y= 0 x=0
main( ) { float a,b,c,s; scanf ("%f%f%f",&a,&b,&c); s=area1(a,b,c)+area2(a)+area2(b)+area2(c); printf ("%f\n",s); }
8.5 函数的嵌套调用
不能嵌套定义函数,可以嵌套调用函数 。
main 函数 { a 函数 { b 函数 {
float fac(n) int n; { float f; if (n==1||n==0) f=1; else f=fac(n-1)*n; return(f); 以n=4为例,执行过程如下: }
ma
{ ... f=fac(2)*3;
例 5. 找出1000之内的所有“完数”,判一个数是 否为完数,用函数实现 。 wan(x) int x; { int i,k=0; for (i=1;i<=x/2;i++) if (x%i==0) k=k+i; if (k==x) return (1); else return (0); main( ) } { int i; for (i=1;i<1000;i++) if (wan(i)) printf ("%5d",i); printf ("\n"); }
-1
x<0
a x x
5 5
int y(float x) { int z; if (x>0) z=1; else if (x<0) z=-1; else z=0; return(z); }
例 2.求5!、16!和27!
float jiec(n) int n; { float y=1; int i; for (i=1;i<=n;i++) y=y*i; return (y); }
函数定义
函数定义是指对函数功能的确 立,包括指定函数名、函数值 类型、形参个数及类型、函数 体等。它是一个完整、独立的 程序单位。
例2: float add(x,y) float x,y; { float z; z=x+y; return(z); }
main( ) { float a,b,c; scanf("%f,%f",&a,&b); c=add(a,b); printf("%f\n",c); }
义 “ 无类型 ”。
看下面例子:
main() {float a,b; int c; max(float x,float y) {float z;
z=x>y?x:y;
return (z)} 运行结果:
scanf(“%f,%f”,&a,&b);
c=max(a,b);
printf(“Max is %d\n”,c);
说明:
1. 定义函数时,形参不占内存单元 ; 调用函数时,形参才分配内存单元 ; 调用结束后,形参所占内存单元被释放。 2. 实参可以是常量、变量或表达式,但必须有确 切的值。 3. 定义函数,必须指明形参类型。 4. 实参与形参类型一致。 5. 实参变量对形参变量的数据传递是“值传递 ”, 即 单向 传递。 6. 可在“形参表列”中说明形参类型。 int max( int x , int y ) { 函数体 }
main( ) { float a,b,c; a=jiec(5); b=jiec(16); c=jiec(27); printf ("%f,%f,%f\n",a,b,c); }
例 3.编写函数,判定某数字是否在某正整数中, 若在,打印 TRUE,否则打印 FALSE, 输出结果在 主函数中完成。
main( ) {int m,n; /*判断数字n是否在数m中/ int among(int m,int n); scanf("%d %d",&m,&n); if(among(m,n)) printf("TRUE"); else printf("FALSE"); }
8.4.3 对被调用函数的声明和函数原型 1.被调函数必须存在; 2.用#include命令包含有关库函数; 3.被调用函数一般应在主调函数前定义,这样 在主调函数中可以不对调用函数类型进行声 明。否则在主调函数中必须对调用函数类型 进行声明(整型除外); 4.如果在文件开头,已声明了被调函数类型, 则主调函数中不必再作类型声明。