用于执行某项特定任务,具有独立性的代码。
C语言中函数的分类
函数分为库函数和自定义函数
C语言是结构化的程序设计语言
一般有
-顺序结构
-选择结构
-循环结构
比如求和代码
中 定义了add函数
Add 执行 x+y=z 之后 返回 z结果
Add只是个名字 括号内的是参数 大括号内的是函数体 int是返回类型
定义好后可以反复调用
(简化版)
库函数是经常用的函数是过去经常使用的函数为了方便的积累
在网站 www.cplusplus.com/reference/ 中能查到以往的库函数
自定义函数是做库函数不能做的事情
自定义函数想库函数一样,有函数名,返回值类型和函数参数
自定义函数相对重要一些
它用于编出自己需要的函数
就是 返回类型 + 名字 +(参数A,参数B) 可以没有 一个 或者两个参数
比如取大自定义函数
如果用void就可以不返回
特殊知识点 形参 与 实在参数
在下面的a和b是实参
X,y是形参 改x和y与a和b没关系。用指针改 间接改 要改为
用指针定位可以改变(在初识已经理解了指针的用法)
但取地址后 就是 间接控制两个实参了 而且没有虚参数
又比如求和参数
这个函数不需要回地址 是因为它只要把值返回就行了
实参;也就是真的传给函数的参数是实参
它可以使 常量 变量 表达式 函数等
形参;也就是形指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化,当函数调用完以后,这个参数就被消除了
传值调用只能是返回值 或者 在自定义函数中操作出结果
但传址调用 可以 直接操纵外部变量 操纵实参
练习 打印100-200之间的素数
新知识点 开平方数学库函数 sqrt他需要的头函数是 math.h
对于这个也可以弄出基数就行了
//查是否是闰年的精简版
然后用函数来判断
函数版本其实就是给就是给里面的判断程序移出去作为一个函数运用,可以缩减主题的内容
就比如
的方法,那么之歌函数如果要调用,就会很方便了,需要函数的功能足够单一足够简单
高内聚低耦合,只用来处理单一的功能。
比如再写一个二分查找的函数
一般取名是binary_search(arr,k);
可以在主函数中写怎么用,再在外面详细的写功能代码。
提出一个功能代码
是二分代码 这个代码很重要,需要记住
然后是 这些功能尽量用 1 和 0作为返回值也就是 真 和 假
返回值是自己设计的 这里也是说明 代码风格 需要养成一个很好的代码风格
自定义函数能接收不止两个东西进行编制
在自定义函数中,因为形参的情况,建议代码功能单一化,不要集成那么多功能 因为容易出现BUG 还难找到BUG出现的原因。
比如如果
这种情况,其中 arr 只是一个指针变量
它只是指针/指针 只能等于1.
在C语言中 最开始就 char short int long longlong float double 是内置类型
在C语言最初设计中就有
但在C99中引入了布尔类型 也就是bool这个玩意
这个玩意是用来表示真假的变量
比如
Boll flaf = true;或者 boll flaf = flase
但需要引入 #include <stdbool.h>
并且返回false 和 true两个情况
但是 1可以表示真 0可以表示假
这样也可以用于判断 其实也就是给1和0封装一下罢了 bool的字节长度也是1而已
这个bool的意义不大……但是可以更精简?
作业 写个函数加一自定义函数不建议用全局变量
解释为 main调用three_lined 然后 three_line调用 new_line但是不能嵌套定义
解释不能再函数里面定义函数
把一个函数的返回值作为另一个函数的返回值
比如
这个玩意也能打印出来,可以打印出返回值
或者一个更抽象的D
当函数不屑返回类型是 默认返回int
不写返回类型的函数是很糟糕的
如果不写返回结果,自定义函数会返回最后一条函数的结果
比如这个 返回不了什么好东西
代码要写的严谨 要写的没BUG 要写的有用 (公司找了一个程序员去维护)
对于这个main函数
它也是有参数的
Main有 int argc char*argv[] char &envp[]
函数的定义与声明
应该先定义函数再用函数也就是先生们再使用
函数定义是指函数的具体实现,交代函数的功能实现,
而且函数的声明一般放在头文件
然后函数的声明放在头文件
函数的定义放在源文件里面去
然后包含这个头文件
也就是头文件也可以自定义了
包含头文件实际上是把头文件的东西复制过来
然后是编译静态库 使用静态库
编译是用属性模式lib 使用h
就是pragma comment(lib,”静态库文件“) (防小人不防君子的玩意)
分模块 能使人的思维更加清晰 更加清楚
还有个
也就是程序调用自身的编程技巧。
一边是把一个大型复杂问题转化为一个与原问题相似的规模较小的问题来求解
也就是用少量的程序来描述解题过程中需要的多次重复计算,大大减少了程序的代码量
也就是把大事化小
Eg; 接收一个整型 然后分开打印整型
(知识点再提 ,无符号整型 unsigned int 函数 用%u)
%d是打印有符号的整数 包含正负数 %u是打印无符号整数 再%u中没有负数
例子代码
我写的
但顺序都不是想要的
所以不可取
用递归法
这个是自我函数调用的递归法的展现
递归里面要嵌套条件 不然就会死循环溢出 会跳出 Stack overflow 是溢出
Eg2;
编写函数不允许创建临时变量,求字符串长度;
也就是写出 strlen函数的代码
解释一下 这个指针变量再传输的时候 其指针所指的是数组的第一个字母 然后此后过程中,增加一个数字就是算下一个字符 直到\0 但是不能有这个变量
解决方法
比如n! 计算n! 用函数的迭代来计算
下面是迭代 也就是非递归的方式
例子 求斐波那契数 这是递归
但是这玩意进行计算次数过多时就很难求出来
现在我们用迭代计算
这样可以减少计算量 ,也减少了思维量
我自己认为 迭代就是在函数中塞了个循环
递归是自己计算自己 也就是把本身当作一个循环计算
(汉诺塔问题)(青蛙跳台问题)