参考:
- 《标准C语言基础教程》(第四版)[美] Gary J.Bronson 著 张永健 等译
- r0nny的博客:https://blog.csdn.net/qq_42471423/article/details/88345341
1. 前文回顾
关于上篇文章最后的问题,我其实在之前的一篇文章里详细讲过如何计算100以内的所有质数,大家可以直接跳转到另一篇我的文章:如何寻找100以内的质数。
2. 本文概述
在本篇文章我将讲述关于函数的一系列知识点,我觉得函数的知识点比较琐碎,所以我尽可能有逻辑地表述函数的相关内容。
3. 什么是函数
想了想,我个人觉得函数可以理解为:为了完成某项功能的所有代码的集合。举个例子,我想比较两个数的大小,那么我就可以将比较大小的相关代码写在一个函数里面;或者在一个比较大的项目中,计算质数是某项功能,那么我就可以将这个相关代码写成一个函数。没有懂?没关系,先往下看!
4. 自定义函数
我想大家最常见的就是main()
函数了吧,其实我一直在为大家渗透函数的思想,接下来我们看看函数都是怎么组成的。
函数类型 函数名(参数列表){ //这一行被称为函数头
函数体;
return 返回值;//属于函数体的一部分,如果函数类型是void,就没有这行代码
}
4.1 函数类型
目前的C语言的函数类型其实就那么几个(可能没说全):void, int, float, double, char, 地址
。关于地址我觉得这时C语言的灵魂,我们下次单独去说他。
4.2 参数列表和返回值
所有的函数,every!!! 可以有若干个参数,即传入的值是不限数量的,0,1,2 …都可以,但是!!**返回值只能由一个,或者没有!**返回值的类型要和函数类型一致哦!
4.3 函数命名
这个我就不多说了,只要符合命名规则和规范就好啦!
5. 函数应用
为了让大家更加直观的理解什么是函数,我决定写一个建议的数学计算器(无界面)。主要的功能就是:询问用户需要哪种操作,1-5个选项,对应不同的功能,其中选项5是退出。
5.1 代码展示
#include <stdio.h>
int main() {
//函数声明
void add();
void multiply(double firstMulNum,double secondMulNum);
double compare(double firstNum,double secondNum);
int isPrime(int num);
int isContinue=1;//声明变量,判断是否继续
int choice;//声明变量,选择
double firstNum,secondNum;
int num;
//为了使程序有价值,让程序可多次运行,设置循环
do{
printf("***********************\n");
printf("这是一个简易版计算器!\n");
printf("1)加法\n");
printf("2)乘法\n");
printf("3)输出较小的数\n");
printf("4)判断是不是质数\n");
printf("5)退出程序\n");
printf("请输入你要进行操作的编号:");
scanf("%d",&choice);
switch (choice){
case 1:
add();
break;
case 2:
printf("现在进行的是乘法操作。\n请输入第一个乘数:");
scanf("%lf",&firstNum);
printf("请输入第二个乘数:");
scanf("%lf",&secondNum);
multiply(firstNum,secondNum);
break;
case 3:
printf("现在进行的是比较大小操作。\n请输入第一个数:");
scanf("%lf",&firstNum);
printf("请输入第二个数:");
scanf("%lf",&secondNum);
printf("较小的数是:%.2lf\n",compare(firstNum,secondNum));
break;
case 4:
printf("请输入你要判断的数值:");
scanf("%d",&num);
if(isPrime(num)){
printf("%d是质数。\n",num);
}else{
printf("%d不是质数。\n",num);
}
break;
case 5:
isContinue=0;
break;
default:
printf("输入选项无效。\n");
break;
}
}while(isContinue);
return 0;
}
/**
* 计算加法
* 无参数传入
* 无返回
* 仅被main函数调用
*/
void add(){
double firstNum,secondNum;
printf("现在进行的是加法操作。\n请输入第一个加数:");
scanf("%lf",&firstNum);
printf("请输入第二个加数:");
scanf("%lf",&secondNum);
printf("计算的结果为:%.2lf\n",firstNum + secondNum);
}
/**
* 计算乘法
* 参数传入:double firstMulNum,double secondMulNum
* 无返回
* 由main函数调用,并传入两个参数
*/
void multiply(double firstMulNum,double secondMulNum){
printf("计算的结果为:%.2lf\n",firstMulNum*secondMulNum);
}
/**
* 返回较小的数
* 参数传入:double firstNum,double secondNum
* 返回:较小的数值
* 由main函数调用,并传入两个参数,此函数返回给main一个double数值
*/
double compare(double firstNum,double secondNum){
double result;
if(firstNum<=secondNum){
result=firstNum;
}else{
result=secondNum;
}
return result;
}
/**
* 返回是否为质数,是-1,否-0
* 参数传入:int num
* 返回:1/0
* 由main函数调用,并传入一个参数,此函数返回给main一个int数值
*/
int isPrime(int num){
int factor = 1; //初始化第一个除数为1
while(factor <= num) //判断除数是否小于被除数
{
if((num % factor) == 0) //判断是否可以整除
{
if(factor != num && factor != 1) //如果除数不为1或者自己本身,则不是质数,返回0
return 0;
}
factor++;
}
return 1;
}
5.2 输出结果
***********************
这是一个简易版计算器!
1)加法
2)乘法
3)输出较小的数
4)判断是不是质数
5)退出程序
请输入你要进行操作的编号:1
现在进行的是加法操作。
请输入第一个加数:2
请输入第二个加数:3
计算的结果为:5.00
***********************
这是一个简易版计算器!
1)加法
2)乘法
3)输出较小的数
4)判断是不是质数
5)退出程序
请输入你要进行操作的编号:2
现在进行的是乘法操作。
请输入第一个乘数:3
请输入第二个乘数:5
计算的结果为:15.00
***********************
这是一个简易版计算器!
1)加法
2)乘法
3)输出较小的数
4)判断是不是质数
5)退出程序
请输入你要进行操作的编号:3
现在进行的是比较大小操作。
请输入第一个数:6
请输入第二个数:2
较小的数是:2.00
***********************
这是一个简易版计算器!
1)加法
2)乘法
3)输出较小的数
4)判断是不是质数
5)退出程序
请输入你要进行操作的编号:4
请输入你要判断的数值:2
2是质数。
***********************
这是一个简易版计算器!
1)加法
2)乘法
3)输出较小的数
4)判断是不是质数
5)退出程序
请输入你要进行操作的编号:5
Process finished with exit code 0
5.3 函数声明
当你的自定义函数写在了main()
函数的后面,你如果不像我一样在前面写出他的声明,你的程序是会报错的,因为机器还没有运行到你写的自定义函数,所以他不知道你的函数的存在,所以你需要提前告知机器,我写了这个函数,在下面,你去看看。声明语句很简单,就是函数头+;
,看我的代码就能明白啦。
5.4 自定义函数1:add()
函数
这个函数很简单,在确认选项1的时候,程序会执行29行的代码,单纯的调用它而已,然后程序就会跳转到这个函数所在的位置,也就是72行。然后一直运行到79行结束,此时,计算机就会继续执行main()
函数的30行。
5.5 自定义函数2:multiply()
函数
这个函数较add()
函数来讲复杂了一丢丢,但是还好,它多了参数列表,即可以传入参数到函数中。确认是选项2后,程序运行32行-37行,从键盘读取两个双精度浮点数,并传入到mutiply()
函数中,程序在运行到36行时,发现这是一个自定义函数,程序跳转到对应位置87行,然后运行88行,大家可能发现这里的两个变量名和main()
函数中对应的变量名不一样。这就涉及到一个知识点:变量的作用范围。这里我引用r0nny的一篇博客C语言的作用域。
5.6 自定义函数3:compare()
函数
这个函数就更666了,它不仅由参数列表可以传入参数,还可以返回一个值给调用这个函数的函数(这里就是main()
函数)。既然有了返回值,而且我们知道,一个函数如果有返回值的话只有一个,那么这个函数可以当成一个“伪变量”来用,或者说当成一个“数”来使用。
5.7 自定义函数4:isPrime()
函数
这里我就说一下这个函数的调用,我在调用这个函数的时候和往常不一样,我把它当成一个判断条件来调用,即程序运行48行时,会跳到113行,当得出结果后,作为if语句
的条件来用。
6. “官方”函数
我不正规的称函数为官方函数,因为这些都是存在C语言的某些库文件中的,像我们之前用到的printf(), scanf()
,比较常用的还有随机数函数
,大家可以用到他们在网上搜索,我不就过多的展开了。
7. 结语
关于函数我们就说这么多吧,其实函数的存在是为了让开发人员更加方便地阅读代码,编写代码,调试代码,善于封装函数我发现是个很优秀的习惯。好啦,大家可以在自己写代码的时候多多尝试编写函数。大家有什么问题可以在下方评论,我会尽力去回答大家的。