
函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种。
自定义函数:
函数类型 函数名(形式参数表){
函数实现过程
}
1.函数首部
函数首部由函数类型、函数名和形式参数表组成。函数类型指函数返回结果的类型,一般与return语句中表达的类型一致。
参数表中给出函数计算所用到的相关已知条件,以类似变量定义的形式给出,例如:
double cylinder(double r, double h)
表示函数类型是double,也是函数的结果类型;函数名为cylinder,两个形参r和h的类型都是double,在cylinder()函数被调用时,两个形参的值将由主调函数给出。
注:形参不能写成 double r,h !!!
2.函数体由一对大括号和里面的若干条语句组成,用以计算,或完成特定的工作,并使用return语句返回运算结果
5.1.3 函数的调用定义一个函数后,就可以在程序中调用这个函数,在C语言中,调用标准函数库时,只需要在程序最前面用#include 命令包含相应的头文件,调用自定义函数时,程序中要有与调用函数对应的函数定义。
...
3.参数传递
定义函数中double cylinder(double r, double h)指明两个形参r和h,而main()函数中volume=double cylinder(redius, height);中的redius和height是实参,实参redius和height的值将会传递给形参r和h。
实参要和形参一一对应,数量应该相同,顺序一致
...
注:return只能返回一个值
5.函数原型声明
C语言要求函数先定义后调用,如果自定义函数被放在主调函数的后面,就需要在函数调用前,加上函数原型声明。
函数声明一般格式为:
函数类型 函数名(参数表);
即与函数定义中的第一行(函数首部)相同,并且以分号结束
注:如果在调用函数前,既不定义,也不声明,程序编译时会出错。
练习5-1(1)使用函数求1到n之和:输入一个正整数n,输出1~n之和。要求定义和调用函数sum(n)求1~n之和。
#includeint sum(int n); int main(void){ int n; printf("n="); scanf("%d",&n); printf("%d",sum(n)); return 0; } int sum(int n){ int i,sum=0; for(i=1;i<=n;i++){ sum+=i; } return sum; }
(2)若要计算m~n(m 使用函数找最大值:输入2个数,输出其中较大的数,要求定义函数max(a, b)找出并返回a、b中较大的数。 不返回结果的函数定义: 函数类型为void,表示不返回结果,函数体中可以使用没有表达式的return语句,也可以省略return。void类型的函数虽然不直接返回一个值,但它的作用通常以屏幕输出等方式体现。 在不返回结果的函数定义中,void不能省略,否则将会被默认定义成int。 一. 自顶向下分析问题的方法 二. 模块化设计 三. 结构化编码主要原则 字符金字塔:输入一个正整数n和一个字符ch,输出n行由字符ch构成的字符金字塔。 至于第九行的“scanf(" %c",&ch);”的%号前面为什么要加空格,是因为不加空格运行会出问题,具体原因还木有研究透,研究可参考别人写的博客文章:scanf()函数对字符输入的一些问题_Lemon的博客-CSDN博客_scanf字符输入https://blog.csdn.net/qq_41282102/article/details/80246701 1.局部变量 在程序中使用的变量都定义在函数的内部,它们的有效使用范围被局限在所在的函数内。保证了各函数之间的独立性,避免函数之间互相干扰。 C语言将定义在函数内部的变量成为局部变量,形参也是局部变量 除作用于函数的局部变量,C语言还允许定义作用于复合语句中的局部变量,有效范围被局限在复合语句内: 局部变量一般定义在函数和复合语句的开始处,标准的C语言规定不能定义在中间位置 2.全局变量 局部变量保证了函数的独立性,但程序设计有时还要考虑不同函数之间的数据交流,以及函数的某些统一设置,当一些变量需要被多个函数共同使用时,会受到很大的限制,为了解决多喝函数间的变量共用,C语言中允许定义全局变量。 全局变量格式与局部变量完全一致,但是它定义的位置不同,可以定义在程序的头部,也可以定义在两个函数的中间或者程序尾部,只要在函数外部即可。(但一般情况下把全局变量定义在程序的最前面) 虽然全局变量自由度大,但是在合作开发的程序中,每个人都按照自己的想法使用全局变量,可能产生互相的干扰,一般情况下,尽量使用局部变量和函数参数 1.变量生存周期 一般程序而言,计算机都是从主函数开始的,使得main()函数中所有的局部变量一开始就在内存数据区中分配了储存单元。而其他函数在被调用之前,其局部变量并未分配储存单元,只有当函数被调用时,其形参和局部变量才被分配相应的储存单元,一旦函数调用结束返回主调函数,在函数定义的所有形参和局部变量将不复存在,相应的储存单元由系统收回,根据特性,把局部变量称为自动变量,即函数被调用时,系统自动为其局部变量的单元由系统自动回收 变量从定义开始分配储存单元,到运行结束存储单元被回收,整个过程就称为变量生存周期 自动变量的定义形式为: 在自动变量定义时,auto可以省略,其形式与以前定义的普通变量完全相同,也就是定义的局部变量都是自动变量 当main()函数调用其他函数时,由于main()还未运行结束,其局部变量仍然存在,还在生存周期中,但由于变量的作用范围,使得main()中的局部变量单元不能再其他函数中使用,只有回到主函数后,那些局部变量才能继续使用。变量的作用范围和生存周期是两个不同的概念,要区分清楚 2.变量储存的内存分布 自动变量和全局变量的生存周期不同,为了便于计算机存储管理,C语言把保存所有变量的数据区分成动态储存区和静态储存区。 它们的管理方式完全不同,动态存储区是使用堆栈来管理的,适合函数动态分配和回收存储单元。而静态储存区相对固定的,管理较简单,它用于存放全局变量和静态变量。 3.静态变量 静态局部变量存放在静态储存区,不会像普通局部变量那样因为函数调用结束而被系统回收,它的生存周期会持续到程序结束,由于储存单元被保留,一旦含有静态局部变量的函数被再次调用,则静态局部变量会被重新激活,上一次函数调用后的值依然保存着,可供本次调用继续使用 静态变量定义格式: 例5-9: fact_s()函数并没有循环语句,而是考静态变量 f 保存上次函数调用时计算的到的 (n-1)! 的值,再乘上 n ,实现 n! 的计算 静态变量赋初值只在函数第一次调用时起作用,若没有赋初值,系统将自动赋值为 0 将例5-9中的静态变量 f 定义为普通局部变量,还能实现计算 n! 吗?请上级检验。若把 f 换成全局变量又会如何? 答:当定义为普通局部变量时,每次调用函数时变量 f 都会是1,既无法实现计算 n! ,若将 f 换成全局变量,变量 f 的值不会随函数的调用而使它的值变为1,所以当变量 f 换成全局变量时,可以实现 n! 的计算 使用函数计算分段函数的值:输入x,计算并输出下列分段函数f(x)的值,要求定义和调用函数sign(x)实现该分段函数。 0 & \ 0 & x=0 & \ -1 & x<0 & end{matrix}right." src="https://latex.codecogs.com/gif.latex?f%28x%29%3D%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%201%20%26%20x%3E0%20%26%20%5C%5C%200%20%26%20x%3D0%20%26%20%5C%5C%20-1%20%26%20x%3C0%20%26%20%5Cend%7Bmatrix%7D%5Cright." /> 使用函数求奇数和:输入一批正整数(以零或者负数为结束标志),求其中的奇数和。要求定义和调用函数even(n)判断的奇偶性,当n为偶数时返回1,否则返回0 使用函数计算两点间的距离:给定平面任意两点的坐标(x1, y1)和(x2, y2),求这两点之间的距离(保留两位小数)。要求定义和调用函数dist(x1, y1, x2, y2)计算两点间的距离 利用函数计算素数个数并求和:输入两个正整数m和n(1<=m,n<=500),统计并输出m和n之间的素数的个数以及这些素数的和。要求定义函数prime(m)判断m是否为素数。 使用函数统计指定数字的个数:读入一个整数,统计并输出该数中“2”的个数,要求定义并调用函数countdigit(number, digit),它的功能是统计整数number中的数字digit的个数。 (感觉可以再优化优化的... 使用函数输出水仙花数:输入两个正整数m和n(1≤m,n≤1000),输出m~n之间的所有满足各位数字的立方等于它本身的数,要求定义并调用函数is(number)判断number的各位数字的立方和是否等于它本身。 使用函数求余弦函数的近似值:输入精度e,用下列公式求cosx的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数funcos(e,x)求余弦函数的近似值。 输入一个正整数n,输出n行空心的数字金字塔。要求定义和调用函数hollow_pyramid(n)输出n行空心的数字金字塔。当n=5时,5行空心的金字塔如下所示: - 第5章结束 - (多学习,多练习,多注意细节) 整理自书籍《C语言程序设计》 如有错误,欢迎纠正! 欢迎分享,转载请注明来源:内存溢出#include
练习5-2
#include
5.2
5.2.2 不返回结果的函数
void 函数名(形参表){
函数实现过程
}
练习5-3
#include
int main(void){
int a=1;
{
int b=2;
...
}
printf("%d", a);
return 0;
}
auto 类型名 变量表;
如:
auto int a, b;
static 类型名 变量表
#include
#include
程序设计题2
#include
程序设计题3
#include
程序设计题4
#include
#include
#include
程序设计题7
#include
程序设计题8
#include
微信扫一扫
支付宝扫一扫
评论列表(0条)