参考:

  • 《标准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;           //初始化第一个除数为1while(factor <= num)        //判断除数是否小于被除数{if((num % factor) == 0) //判断是否可以整除{if(factor != num && factor != 1)    //如果除数不为1或者自己本身,则不是质数,返回0return 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)退出程序
请输入你要进行操作的编号:5Process 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. 结语

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

C语言教程(七):函数相关推荐

  1. c语言第七章函数笔记,我的C语学习笔记-C语言教程(七).doc

    我的C语学习笔记- C语言教程(七) C语言教程---第一章: C语言概论 C语言教程---第二章: 数据类型.运算符.表达式 C语言教程---第三章: C语言程序设计初步 C语言教程---第四章: ...

  2. Swift2.0语言教程之函数嵌套调用形式

    Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还可以调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其他函数:另 ...

  3. Swift2.0语言教程之函数的返回值与函数类型

    Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...

  4. c语言实验七 函数实验报告,C语言实验七函数实验报告.doc

    C语言实验七函数实验报告 C语言程序设计 实 验 报 告 实验题目 实验七 函数 实验目的 掌握函数定义的方法: 掌握函数实参与形参的对应关系,以及值传递的方式. 掌握函数的嵌套调用和递归调用的方法: ...

  5. 高级C语言教程-sscanf()函数使用方式

    C语言支持可变参数的函数,这需要采用 #include <stdio.h>int main( void ) {char tokenstring[] = "15 12 14...& ...

  6. 二十万字带你入门C语言-史上最强C语言教程(汇总篇)

    一.前言 至此,史上最强C语言教程系列已经全部完成,今天是给大家来做一个汇总,笔者目前已经完成了C语言阶段的学习,一直以来感谢大家的陪伴与支持,笔者后续还会继续更新C++.数据结构.Linux.Mys ...

  7. c语言return 11,二级C语言教程章节测试11.对函数的进一步讨论

    一.选择题 (1)有以下程序 # include void f(char *s, char *t) { char k; k=*s; *s=*t; *t=k; s++; t--; if (*s) f(s ...

  8. C语言 const 修饰函数返回值 - C语言零基础入门教程

    目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 二.const 修饰在函数名前面 三.const 修饰在函数名后面 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...

  9. c语言prime函数怎么用_C语言教程_v20201106

    编程基础 1.1    通俗地理解什么是编程语言 1.2    C语言究竟是一门怎样的语言? 1.6    初中毕业能学会编程吗? 1.7    C和C++到底有什么关系? 1.8    学了 C 语 ...

  10. C语言第七讲,函数入门.

    C语言第七讲,函数入门. 一丶了解面向过程和面向对象的区别. 为什么要先讲面向过程和面向对象的区别? 面向过程,就是什么都要自己做.  比如你要吃饭. 那么你得自己做饭. 面向对象, 面向对象就是我要 ...

最新文章

  1. 计算机软件考试预测,2020年计算机软件水平考试信息技术处理员预测试题及参考答案...
  2. 【Windows 逆向】CE 地址遍历工具 ( CE 结构剖析工具 | 尝试进行瞬移操作 | 尝试查找飞天漏洞 )
  3. poj2019(二维RMQ)
  4. 用计算机弹生僻字乐谱,生僻字 E调 (拇指琴卡林巴琴弹奏谱)_谱友园地_中国曲谱网...
  5. Linux 技巧: Bash 参数和参数扩展 (Shell)
  6. css flex布局
  7. Illustrator 教程,如何在 Illustrator 中创建画板?
  8. OS X中的bundle
  9. 凯西·奥尼尔:盲目信仰大数据的时代必须结束 | 算法密码
  10. Linux系统TTY串口驱动实例详解
  11. OFDM子载波频率 知乎_SDR (软件无线电)
  12. 计算机字体管理软件,字体管理软件有哪些?字体管理软件推荐
  13. 微信小程序点击按钮弹出弹窗_微信小程序弹窗,微信小程序页面跳转、弹出框...
  14. 【建行】龙支付新老用户赚200元详细教程
  15. ASO优化之新人必备的基础知识技能
  16. Premiere导入视频之后音频轨没有内容
  17. 假设检验实例(python)
  18. Unbuntu下U盘突然权限只读,无法重命名和复制粘贴文件的问题修复
  19. JS 函数参数及其传递
  20. Python 求一元二次方程的解

热门文章

  1. OPPOR8107_官方线刷包_救砖包_解账户锁
  2. HDFS、Ceph文件系统以及Hbase、Cassendra、TiDB比较
  3. 虚幻4游戏引擎的安装
  4. Java学习-面向对象进阶二
  5. 新媒体时代下如何践行网络口碑营销?
  6. 【前端GUI】——网站设计的重要知识点总结思维导图(二)
  7. 201771010101 白玛次仁
  8. Spring Boot启动报错问题: The Bean Validation API is on the classpath but no implementation could be found
  9. VMware ESXI上开虚机玩KVM
  10. 2019年最新网盘搜索引擎汇总