【C语言4】函数

目录

1 函数

2 函数的调用

3 函数的嵌套调用和链式访问

3.1 链式访问

4 函数的声明和定义

5 导入静态库

6 函数递归

6.1 主要思考方式

6.2 递归必要条件

6.3 调用递归时会出现的问题

6.4 递归与迭代

7 注意

7.1 快捷键

7.2 一些错误


1 函数

定义:大型程序代码中的一部分,具有相对独立性,可以封装

分类:库函数自定义函数

库函数可以在网站中学习:Reference - C++ Reference

例如:

strcpy:字符串复制(在复制时,\0也会被复制)

memset:内存设置


2 函数的调用

传值调用----值

传址调用----地址

(见习题3函数形式)


3 函数的嵌套调用和链式访问

3.1 链式访问

下例可以合并:

int len = strlen("abc");
	printf("%d\n", len);

如下:

printf("%d\n", strlen("abc"));

典型的链式访问例子:

printf("%d", printf("%d", printf("%d", 43)));

结果:4321

原因:第一个printf肯定打印43,然后printf的返回值是字符的个数


4 函数的声明和定义

1)在使用前,需要告诉主函数,有这么个函数。函数叫什么,参数是什么,返回类型是什么。

int add(int,int);//函数声明

int a=add(a,b);


int add(int x,int y){}//函数定义

2)通常将函数放在主函数之前,可以不用单独定义。

3)函数的声明一般放在头文.h中。函数的定义一般放在.c文件中。


5 导入静态库

#include "sub.h"
#pragma comment ( lib, "sub.lib")//双引号中内容是现有的文件

6 函数递归

函数直接或间接调用自己

6.1 主要思考方式

把大化小

举例1:

把输入的1234,按顺序在屏幕上打印出“1”、“2”、“3”、“4”

#include<stdio.h>

void print(unsigned int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d\t",n % 10);
}


int main()
{
	unsigned int num = 0;
	scanf_s("%u", &num);//1234

	//递归自己调用自己
	print(num);
	return 0;
}

6.2 递归必要条件

1.有条件的情况下递归,否则会死循环。

2.每次递归调用后会越来越靠近限制条件。


6.3 调用递归时会出现的问题

栈溢出

注意:除了必要条件,递归条件不能太深。

分享一个网站:Stack Overflow - Where Developers Learn, Share, & Build Careers (相当于一个程序员的知乎)

举例2:

模拟实现一个strlen函数

int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "bit";
	//模拟实现一个strlen函数
	printf("%d\n", my_strlen(arr));

	return 0;
}

改一下:不允许创建临时变量,也就是不允许创建count。

int my_strlen(char* str)
{
	if (*str != '\0')
	{
		return 1 + my_strlen(str + 1);
	}
	else
		return 0;
}

int main()
{
	char arr[] = "bit";
	//模拟实现一个strlen函数
	printf("%d\n", my_strlen(arr));

	return 0;
}

建议不要用++。

6.4 递归与迭代

举例1:求n的阶乘

int f(int n)
{
	if (n <= 1)
	{
		return 1;
	}
	else
	{
		return n * f(n - 1);
	}
}

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int i = 0;
	int ret = f(n);
	printf("%d", ret);


	return 0;
}

根据公式来写递归。


举例2:(递归)

求第n个斐波那阶数(不考虑溢出,也就是超出整型范围,数值不对)


int fib(int n)
{

	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return fib(n - 1) + fib(n - 2);
	}
}

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ret = fib(n);

	printf("%d", ret);

	return 0;
}

当输入50的时候,没有立即出现结果是因为效率太低。重复算某一次的次数太多。

改一下:(迭代---循环)

int fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n>2)
	{
		c = a + b;
		b = c;
		a = b;
		n--;
	}
	return c;
}

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ret = fib(n);

	printf("%d\n", ret);

	return 0;
}

注意:递归和迭代看情况使用。

一些经典问题:

汉诺塔

青蛙跳台阶


7 注意

7.1 快捷键

F11----逐语句

F10---逐过程


7.2 一些错误

在写if语句的时候,末尾千万不要加分号!!!这样会导致if语句变成了一句单独的语句,并且编译的时候没有逻辑上的错误,但是此时{}里面的内容不起作用,而出现错误!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值