C语言教程(七):函数

参考:

  • 《标准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. 结语

关于函数我们就说这么多吧,其实函数的存在是为了让开发人员更加方便地阅读代码,编写代码,调试代码,善于封装函数我发现是个很优秀的习惯。好啦,大家可以在自己写代码的时候多多尝试编写函数。大家有什么问题可以在下方评论,我会尽力去回答大家的。

发布了16 篇原创文章 · 获赞 11 · 访问量 1132

猜你喜欢

转载自blog.csdn.net/bjtu_linxinyu/article/details/104133530