目录
编写一个函数 swap(int *n1, int *n2) 可以交换 n1 和 n2的值
函数的定义
- 为完成某一功能的程序指令(语句)的集合,称为函数
- 在C语言中,函数分为:自定义函数、系统函数
基本语法
返回类型 函数名(形参列表){
执行语句……;//函数体
return 返回值;//可选
}
①形参列表:表示函数的输入
②函数中的语句:表示为了实现某一功能代码块
③函数可以有返回值,也可以没有,如果没有返回值,返回类型类型为void
#include <stdio.h>
//说明
//1. 函数名 cal
//2. 有返回值 double
//3. 形参列表为 (int n1, int n2, char oper)
//4. 在函数中,我们使用的变量名需要和形参列表中的变量名一样
double cal(int n1, int n2, char oper) {
//定义一个变量 res ,保存运算的结果
double res = 0.0;
switch(oper) {
case '+' :
res = n1 + n2;
break;
case '-':
res = n1 - n2;
break;
case '*':
res = n1 * n2;
break;
case '/':
res = n1 / n2;
break;
default :
printf("你的运算符有误~");
}
printf("\n%d %c %d = %.2f\n", n1, oper, n2, res);
return res;
}
void main() {
int num1 = 10; //第一个数
int num2 = 20;//第二个数
double res = 0.0;//结果
char oper = '-'; //运算符
//我们又要接收两个数和一个运算符
int num3 = 60;
int num4 = 80;
double res2 = 0.0;
char oper2 = '*';
printf("使用函数来解决计算任务~~");
//使用函数来完成两个计算任务
res = cal(num1, num2, oper); //调用函数,使用函数
printf("cal 函数返回的结果 res = %.2f\n", res);
//使用函数完成第二个计算任务
res2 = cal(num3, num4, oper2); //调用函数,使用函数
printf("cal 函数返回的结果 res2 = %.2f", res2);
}
函数-递归调用
- 函数递归需要遵守的重要原则
①执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
②函数的局部变量是独立的,不会相互影响
③递归必须向推出递归的条件逼近,否则就是无限递归
④当一个函数执行完毕,或者遇到return,就会返回
- 函数调用的规则
①当调用(执行)一个函数时,就会开辟一个独立的空间(栈)
②每个栈空间是相互独立
③当函数执行完毕后(或者执行到return),会返回到调用函数位置,继续执行
④如果函数有返回值,则将返回值赋给接收的变量
⑤当一个函数返回后,该函数对应的栈空间也就销毁
void test(int n) {
int n2 = n + 1;
printf("n2=%d", n2);
}
void main() {
int num = 6;
test(num);
getchar();
}
void test(int n) {
if(n > 2) {
test(n -1);
}
printf("\nn=%d", n);
}
void main() {
test(4); //输出2
调用函数时,开辟的函数栈,都会完整的执行函数代码
函数的练习
斐波那契数
//题1:斐波那契数请使用递归的方式,
//求出斐波那契数1,1,2,3,5,8,13...给你一个整数n,求出它的斐波那契数是多少?
#include<stdio.h>
int fbn(int n) {
if (n == 1 || n == 2) {
return 1;
}
else {
return fbn(n - 1) + fbn(n - 2);
}
}
void main() {
int res = fbn(7); // res = 13
printf("\nres=%d", res);
getchar();
}
/*题2:求函数值已知 f(1)=3; f(n) = 2*f(n-1)+1;
请使用递归的思想编程,求出 f(n)的值?
分析:因为该题的公式已经给出,所以直接使用即可
*/
//f(1)=3; f(n) = 2*f(n-1)+1
int f(int n) {
if(n==1) {
return 3;
} else {
return 2*f(n-1)+1;
}
}
void main(){
int res2 = f(30);
printf("\nres2=%d", res2);
getchar();
}
猴子吃桃子问题
/*题3:猴子吃桃子问题有一堆桃子,猴子第一天吃了其中的一半,
并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。
当到第十天时,想再吃时(还没吃),发现只有1个桃子了。问题:最初共多少个桃子?
分析:
1. day=10 有 1个桃子
2. day=9 有 (day10 + 1) * 2 = (1+1) * 2 = 4
3. day=8 有 (day9 + 1) * 2 = (4+1) * 2 = 10
*/
int peach(int day) {
if(day == 10) {
return 1;
} else {
return (peach(day+1) + 1) * 2;
}
}
void main(){
int peachNum = peach(1);
printf("\n 第一天有%d个桃子", peachNum);
getchar();
}
函数注意事项
-
函数的形参列表可以是多个
-
C语言传递参数可以是值传递,也可以传递指针,也叫引用传递
-
函数的明明遵循标识符命名规范,首字母不能是数字,可以采用驼峰法或下划线法
-
函数中的变量是局部的,函数外不生效
-
基本数据类型默认是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值
如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内用指针的方式操作变量。从效果上看类似引用(即传递指针)
void f2(int n) {
n++;
printf("f2中n的值是%d\n", n);//10
}
void f3(int* p) {
(*p)++;//修改会对函数外的变量有影响
//main函数中的n变量也发生改变
printf("f3中n的值是%d\n", *p);//
}
void main() {
int n = 9;
f2(n);
f3(&n);
printf("main函数中的n = %d", n);//f2之后仍是9,但f3之后成为10
}
-
C语言不支持函数重载
-
C语言支持可变参数函数
编写一个函数 swap(int *n1, int *n2) 可以交换 n1 和 n2的值
#include<stdio.h>
//请编写一个函数swap(int* n1,int* n2)可以交换n1和n2的值
//形参是两个指针类型int*
void swap(int* n1, int* n2) {
int temp = *n1;//表示将n1指针指向的变量的值赋给temp
*n1 = *n2;//表示将n2指针指向的变量的值赋给n1指针指向的变量
*n2 = temp;//表示将temp的值赋给n1指针指向的变量
}
void main() {
int n1 = 1;
int n2 = 2;
swap(&n1, &n2);
printf("main n1 = %d n2 = %d", n1, n2);//n1 = 2 n2 = 1
getchar();
}
函数参数的传递方式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83271.html