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; //初始化第一个除数为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语言教程(七):函数相关推荐
- c语言第七章函数笔记,我的C语学习笔记-C语言教程(七).doc
我的C语学习笔记- C语言教程(七) C语言教程---第一章: C语言概论 C语言教程---第二章: 数据类型.运算符.表达式 C语言教程---第三章: C语言程序设计初步 C语言教程---第四章: ...
- Swift2.0语言教程之函数嵌套调用形式
Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还可以调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其他函数:另 ...
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- c语言实验七 函数实验报告,C语言实验七函数实验报告.doc
C语言实验七函数实验报告 C语言程序设计 实 验 报 告 实验题目 实验七 函数 实验目的 掌握函数定义的方法: 掌握函数实参与形参的对应关系,以及值传递的方式. 掌握函数的嵌套调用和递归调用的方法: ...
- 高级C语言教程-sscanf()函数使用方式
C语言支持可变参数的函数,这需要采用 #include <stdio.h>int main( void ) {char tokenstring[] = "15 12 14...& ...
- 二十万字带你入门C语言-史上最强C语言教程(汇总篇)
一.前言 至此,史上最强C语言教程系列已经全部完成,今天是给大家来做一个汇总,笔者目前已经完成了C语言阶段的学习,一直以来感谢大家的陪伴与支持,笔者后续还会继续更新C++.数据结构.Linux.Mys ...
- 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 ...
- C语言 const 修饰函数返回值 - C语言零基础入门教程
目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 二.const 修饰在函数名前面 三.const 修饰在函数名后面 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...
- c语言prime函数怎么用_C语言教程_v20201106
编程基础 1.1 通俗地理解什么是编程语言 1.2 C语言究竟是一门怎样的语言? 1.6 初中毕业能学会编程吗? 1.7 C和C++到底有什么关系? 1.8 学了 C 语 ...
- C语言第七讲,函数入门.
C语言第七讲,函数入门. 一丶了解面向过程和面向对象的区别. 为什么要先讲面向过程和面向对象的区别? 面向过程,就是什么都要自己做. 比如你要吃饭. 那么你得自己做饭. 面向对象, 面向对象就是我要 ...
最新文章
- 计算机软件考试预测,2020年计算机软件水平考试信息技术处理员预测试题及参考答案...
- 【Windows 逆向】CE 地址遍历工具 ( CE 结构剖析工具 | 尝试进行瞬移操作 | 尝试查找飞天漏洞 )
- poj2019(二维RMQ)
- 用计算机弹生僻字乐谱,生僻字 E调 (拇指琴卡林巴琴弹奏谱)_谱友园地_中国曲谱网...
- Linux 技巧: Bash 参数和参数扩展 (Shell)
- css flex布局
- Illustrator 教程,如何在 Illustrator 中创建画板?
- OS X中的bundle
- 凯西·奥尼尔:盲目信仰大数据的时代必须结束 | 算法密码
- Linux系统TTY串口驱动实例详解
- OFDM子载波频率 知乎_SDR (软件无线电)
- 计算机字体管理软件,字体管理软件有哪些?字体管理软件推荐
- 微信小程序点击按钮弹出弹窗_微信小程序弹窗,微信小程序页面跳转、弹出框...
- 【建行】龙支付新老用户赚200元详细教程
- ASO优化之新人必备的基础知识技能
- Premiere导入视频之后音频轨没有内容
- 假设检验实例(python)
- Unbuntu下U盘突然权限只读,无法重命名和复制粘贴文件的问题修复
- JS 函数参数及其传递
- Python 求一元二次方程的解
热门文章
- OPPOR8107_官方线刷包_救砖包_解账户锁
- HDFS、Ceph文件系统以及Hbase、Cassendra、TiDB比较
- 虚幻4游戏引擎的安装
- Java学习-面向对象进阶二
- 新媒体时代下如何践行网络口碑营销?
- 【前端GUI】——网站设计的重要知识点总结思维导图(二)
- 201771010101 白玛次仁
- Spring Boot启动报错问题: The Bean Validation API is on the classpath but no implementation could be found
- VMware ESXI上开虚机玩KVM
- 2019年最新网盘搜索引擎汇总