C语言的函数

导读:本篇文章讲解 C语言的函数,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

函数的定义

基本语法

函数-递归调用

 函数的练习

斐波那契数

 猴子吃桃子问题

函数注意事项

编写一个函数 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();
}

C语言的函数

void test(int n) {
if(n > 2) {
test(n -1);
}
printf("\nn=%d", n);
}

void main() {

test(4); //输出2

调用函数时,开辟的函数栈,都会完整的执行函数代码

C语言的函数

 函数的练习

斐波那契数

//题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语言不支持函数重载

  • 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();
}

C语言的函数

函数参数的传递方式 

C语言的函数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83271.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!