1.函数的介绍
- 为完成某一功能的程序指令(语句)的集合,称为函数
- 在C语言中,函数分为: 自定义函数、系统函数
2.函数的定义
2.1函数的基本语法
返回类型 函数名(形参列表){ 执行语句...; // 函数体 return 返回值; // 可选 }
- 形参列表:表示函数的输入
- 函数中的语句:表示为了实现某一功能代码块
- 函数可以有返回值,也可以没有,如果没有返回值,返回类型声明为 void
2.2函数的代码示例
#include<stdio.h> double cal(int num1, int num2, char oper) {//申明一个四则运算函数 double result = 0.0;//申明一个变量用于存放结果 int error = 0;//用于判断输入的操作符是否错误 switch (oper) {//判断oper的种类 + - * / case '+': result = (double)num1 + num2;//需要进行double的强制类型转换,否则会提示warning break; case '-': result = (double)num1 - num2; break; case '*': result = (double)num1 * num2; break; case '/': result = (double)num1 / num2; break; default://如果输入的四则运算符号,则提示错误 error = 1; result = 0.0; } if (error == 0) { printf("%d %c %d = %f", num1, oper, num2, result); } else { printf("你的输入有误,请检查!"); } return result;//返回result的值 } void main() { int num1, num2; double result; char oper; printf("请输入数字1、数字2和操作符!"); scanf_s("%d %d %c", &num1, &num2, &oper, sizeof(oper)); result = cal(num1, num2, oper); }
3.头文件
3.1头文件的基本概念
- 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件: 程序员编写的头文件和 C 标准库自带的头文件
- 在程序中要使用头文件,需要使用 C 预处理指令 #include 来引用它
- #include 叫做文件包含命令,用来引入对应的头文件(.h 文件)。#include 也是 C 语言预处理命令的一种。#include 的处理过程很简单,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源 文件,这与复制粘贴的效果相同。但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错, 特别在程序是由多个源文件组成的时候。
3.2头文件代码示例
- 头文件myFun.h
double cal(int num1, int num2, char oper);
2.源文件myFun.c
#include<stdio.h> double cal(int num1, int num2, char oper) {//申明一个四则运算函数 double result = 0.0;//申明一个变量用于存放结果 int error = 0;//用于判断输入的操作符是否错误 switch (oper) {//判断oper的种类 + - * / case '+': result = (double)num1 + num2;//需要进行double的强制类型转换,否则会提示warning break; case '-': result = (double)num1 - num2; break; case '*': result = (double)num1 * num2; break; case '/': result = (double)num1 / num2; break; default://如果输入的四则运算符号,则提示错误 error = 1; result = 0.0; } if (error == 0) { printf("%d %c %d = %f", num1, oper, num2, result); } else { printf("你的输入有误,请检查!"); } return result;//返回result的值 }
3.使用myFun.h头文件计算
#include<stdio.h> #include"myFun.h" void main() { int num1, num2; double result; char oper; printf("请输入数字1、数字2和操作符!"); scanf_s("%d %d %c", &num1, &num2, &oper, sizeof(oper)); result = cal(num1, num2, oper); }
3.3.头文件的注意事项和细节
- 引用头文件相当于复制头文件的内容
- 源文件的名字可以不和头文件一样,但是为了好管理,一般头文件名和源文件名一样
- include <>:引用的是编译器的类库路径里面的头文件,用于引用系统头文件
- include "":引用的是你程序目录的相对路径中的头文件,如果在程序目录没有找到引用的头文件则到编译器的类库路径的目录下找该头文件,用于引用用户头文件
- 引用 系统头文件,两种形式都会可以,include <> 效率高;引用 用户头文件,只能使用 include ""
- 一个 #include 命令只能包含一个头文件,多个头文件需要多个 #include 命令
- 同一个头文件如果被多次引入,多次引入的效果和一次引入的效果相同,因为头文件在代码层面有防止重复引 入的机制
4.函数调用过程
4.1.函数调用过程示例
#include<stdio.h> void cal(int num1) { int count = num1 + 2; printf("count = %d\n", count); } void main() { int num2 = 7; cal(num2); printf("ok!\n"); }
4.2.函数调用规则
- 当调用(执行)一个函数时,就会开辟一个独立的空间(栈)
- 每个栈空间是相互独立
- 当函数执行完毕后,会返回到调用函数位置,继续执行
- 如果函数有返回值,则将返回值赋给接收的变量
- 当一个函数返回后,该函数对应的栈空间也就销毁
5.函数的递归调用
5.1.递归调用的基本介绍
一个函数在函数体内又调用了本身,我们称为递归调用
5.2.递归调用代码示例
#include<stdio.h> void test(int num) { if (num >= 7) { test(num - 1); printf("num = %d\n", num); } } void main() { test(9); }
5.3.递归调用需遵守的原则
- 执行一个函数时,就创建一个新的受保护的独立空间
- 函数的局部变量是独立的,不会相互影响
- 递归必须向退出递归的条件逼近,否则就是无限递归
- 当一个函数执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁
5.4.递归练习
- 有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。 当到第十天时,想再吃时(还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子?
//有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个! //以后每天猴子都吃其中的一半,然后再多吃一个。 //当到第十天时,想再吃时(还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子? #include<stdio.h> int peachCount(int day, int peach) { if (day == 1) {//当day==1的时候跳出返回总数 return peach; } else { return peachCount(day - 1, 2 * (peach + 1));//如果day!=1则继续递归调用peachCount函数 } } void main() { int peach = 1, day = 0; printf("请输入天数:"); scanf_s("%d", &day); peach = peachCount(day, peach); printf("最初有%d个桃子", peach); }
2.已知 f(1)=3; f(n) = 2*f(n-1)+1; 请使用递归的思想编程,求出 f(n)的值?
//已知 f(1) = 3; f(n) = 2 * f(n - 1) + 1; 请使用递归的思想编程,求出 f(n)的值 ? #include<stdio.h> int cal(int n,int result) { if (n == 1) { return result; } else { cal(n - 1, 2 * result + 1); } } void main() { int num, result = 3; printf("请输入n=\n"); scanf_s("%d", &num); result = cal(num, result); printf("f(n)的结果为:%d\n", result); }
//给你一个整数 n,求出它的斐波那契数是多少? #include<stdio.h> int f(int count) { if (count == 1 || count == 2) { return 1; } else { return f(count - 1) + f(count - 2); } } void main() { int count, result; printf("请输入要计算的第几个斐波那契数:"); scanf_s("%d", &count); result = f(count); printf("%d", result); }
3.