c语言基础知识回顾--函数详解

函数的详解 287dffb7eeab42778a8718c39bab0ef7.png

fb14494aacc941448781e4cbfe7e9578.png

0e486e70ff1c41759192751bd2ef5b39.png

98d444cd09b443dba2eb7a2495f8bbd6.png

89afad1eab6547bd83a3df608ccbdbcc.png

当实参传递给形参的时候,形参是实参的一份临时拷贝。

对形参的修改不会影响实参。

只有通过指针来存储地址,指针来进行修改实参的值 

 a9f0304e938f4a85a2ca2aadd07b28cb.png

3da63d8266a94ee0805c0b037bdc54b7.png

a5607787ff4c4db0bb4783daa7d8b069.png

 函数题目

c7020ed33b3246c7aa3b148fb594ebd5.png

6857bb564c434c8f8dc289e5859548e8.png

bc9f5bb9b8ca4647892395716ec00c2b.png

素数,只能被1和他本身整数的数叫素数

比如7 只能被1和7整除的,拿2~(i-1)的数来试,如果发现2到(i-1)有数字来整除j,说明i不是素数。

6fde200fdb3c44a39dadb9d1aeae4c53.png

没必要从2到i-1之前来判断是不是素数,只需要判断sqrt(m)里的数是不是素数。

写一个函数可以判断一个数是不是素数。

打印100~200之间的素数
素数是只能被1和他本身整除的数
7
1和7整除
2 3 4 5 6

int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数
		//是素数就打印
		//拿2~i-1之间的数字去试除i
		int flag = 1;//flag是1,表示是素数
		int j = 0;
		for (j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}

		if (flag == 1)
		{
			count++;
			printf("%d ", i);
		}
		
	}
	printf("\ncount = %d\n", count);

	return 0;
}

#include <math.h>

sqrt是数学库函数
开平方
math.h

int main()
{
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i+=2)
	{
		//判断i是否为素数
		//是素数就打印
		//拿2~i-1之间的数字去试除i
		int flag = 1;//flag是1,表示是素数
		int j = 0;
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}

		if (flag == 1)
		{
			count++;
			printf("%d ", i);
		}

	}
	printf("\ncount = %d\n", count);

	return 0;
}


写一个函数可以判断一个数是不是素数。

是素数返回1
不是素数返回0

int is_prime(int n)
{
	int j = 0;
	for (j = 2; j <= sqrt(n); j++)
	{
		if (n % j == 0)
		{
			return 0;
		}
	}

	return 1;
}

int main()
{
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i+=2)
	{
		//判断i是否为素数
		//是素数就打印
		//拿2~i-1之间的数字去试除i
		if (is_prime(i))
		{
			printf("%d ", i);
			count++;
		}

	}
	printf("\ncount = %d\n", count);

	return 0;
}

9c85ec5b3f3a43a1b60a24938b766fe3.png

 ba2f19dfb95f460380179c09fe2360c1.png

//2. 写一个函数判断一年是不是闰年。
//能被4整除并且不能被100整除的是闰年或者被400整除的是闰年
//1000-20000
int main()
{
	int i = 0;
	for (i = 1000; i <=2000; i++)
	{
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
		{
			printf("%d ", i);
		}
	}
	printf("\n");
	
	return 0;
}
int is_leap_year(int i)
{
	if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	int i = 0;
	for (i = 1000; i <=2000; i++)
	{
		if (is_leap_year(i))
		{
			printf("%d ", i);
		}
	}
	printf("\n");
	
	return 0;
}

48f80d7c177f4afca29740147d0f83ca.png

//二分查找
int cz(int arr[], int k, int sz)
{
	int left = 0;
	int right = sz - 1;

	while(left<=right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			return mid;		
		}
	}
	return -1;	
}
int main()
{
	int arr[] = { 1,2,3,4,5 ,6,7,8};
	int k = 3;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int j = 0;
	int ret=cz(arr, k, sz);
		if (ret == -1)			
		{
			printf("找不到\n");
		}
		else
		{
			printf("找到了下标是%d\n", ret);
		}	
	return 0;
}

d838388f3c474a90a3be71ed479b5394.png

不要在函数内部求参数元素的大小

8cf6dfd786bf466dbe996305b4cfc6e0.png

//4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。
void add(int* p)
{
	(*p)++;
}
int main()
{
	int n = 0;
     add(&n);
	 printf("%d\n", n);
	 add(&n);
	 printf("%d\n", n);
	return 0;
}

 a6a4407eca1e497cb961ddd3b6b04e18.png

  

函数的嵌套

a936128777b0413790a05c34929b582d.png

链式访问。 

5e2261169d8a4679864564b41ea2bb0f.png

printf()函数返回值看字符个数,首先看最内层的函数,打印43,有二个字符,返回2,一个字符返回1

2a0a84d1a82d4c73867d7f7d605adf8b.png

虽然默认是int类型,但是不能这样做。非常不好

函数的递归

858dcd108a79425196e2631ef94bfa34.png

 de1d56b3f5da42fdb9ef00e03895b1b9.png

27b5b80369a94ad8997bb7235e5d39ec.png

这个是倒置的 

讲解递归方法 

af926da6b65c444ab40461adae725e51.png

271f0b66c7364459811e6d801966392b.png

8cd6efd019b645cf9ace9f85991e38b1.png

 24f3fb7e36cd4a8c8a3a35e68a8177aa.png

void  print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	
	}
	printf("%d ", n % 10);
	
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	print(num);
	

	return 0;
}

4bf90dddfbec44e5bbe8d4c9902b47a5.png

 a7a06c6311e6475bbb22203992dfb73f.png

1353a270a6a9457c84f71b35a1a1ef0e.png

8c618ab511c34fd295653de85a92fb56.png

8766392949124959b4802bac14d8c9bc.png

711e423280c142dda60e4b283ae5ad0a.png

这里的arr传的是首元素地址,地址就是用指针来接受,来存储,*p解引用来找到元素一直自加,直到找到\0才结束。

b12b01ac628d45b7a30ceee09639a425.png

4c8098bc583b42ef87afbc3ba08beb3a.png

这里的my_strlen(str+1),str是字符a地址,加一是字符b的地址 1+bc的长度

07b8cde2f36248829e837149ba529d13.png

d8b35cb3723041c3938b32df35a51dc2.png

76e08fc61c724968ab7d81f6c6aeaf2a.png

//实习自定义求字符串长度函数
int my_strlen(char* p)
{
	if (*p != '\0')
	{
		return 1 + my_strlen(p + 1);

	}
	else
		return 0;

}
int main()
{
	char arr[] = "abc";//[a b c\0]
	int ret=my_strlen(arr);
	printf("%d\n", ret);

	return 0;
}

aaed120eb4d94f1097f9ba2b962ef932.png


//例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
int DigitSum(int n)
{
	if (n > 9)
		return DigitSum(n / 10) + n % 10;
	else
		return 1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = DigitSum(n);
	printf("%d ", ret);
	return 0;
}

函数的迭代与递归

0e3ad94c00b94fbf98c2363b263df19f.png

1!=1,2!=2*1,3!=3*2*1...................

//利用递归求n的阶乘
int dg(int n)
{
	if (n <= 1)
	{
		return 1;
	}
	return n * dg(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret=dg(n);
	printf("%d\n", ret);
	return 0;
}

12f6e57e86d64c06a8ad9f8e9b2785c0.png

函数栈帧

每一次函数调用,都会向内存栈区申请一块空间,这一块空间主要是用来存放函数中的局部变量,和函数调用过程的上下文的信息,这个一块空间一般叫:函数的运行时堆栈,也叫函数栈帧空间编译会自动根据需要开辟空间的。

779d8e65c5c54147a170e7df3eaaaf5d.png

2599b0936aed48cb95094f53673a213d.png

         

        

斐波拉契数

c2afe21d8984433094ed56518df7c856.png

 ece9c5aad6674fef8cc148219d91b143.png

//斐波那契数
//前二个相加等于后面一个
int fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
		return fib(n - 1) + fib(n - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d", ret);
	return 0;
}

 //斐波那契数
//前二个相加等于后面一个

 1 1 2 3 5 8 13 21 34 ......

a92753f3b9a947e181d5ac9905f59025.png

88b0469a183248d292b1c40f6c3ca3cb.png

 产生新的a和b0e3ccb89bf184c61940b1e0bc764ad91.png

 e4843e1782c34701abee23fa22821fa8.png

2fc9aab2182c49a38cb7459b732bfaaa.png


//斐波那契数
//前二个相加等于后面一个
int fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 0;
	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d", ret);
	return 0;
}

辗转相除法

61ec6ee0917d4d60a2492558a9a3187d.png

 就是把a整除b的结果不等于0,就把c赋给b,b赋值给a,直到整除结果等于0,那个除的就是最大公约数。

4abbf929a4f1494a9df454cc10894441.png

 最小公倍数就是二个数相乘除以最大公约数。

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d", &a, &b);
	while (a % b) {

		c = a % b;
		a = b;
		b = c;
	
	}
	printf("最大公约数%d\n", b);
	int ret = a * b / b;
	printf("最小公倍数%d\n", ret);

	return 0;
}

dfba10f4e09743e99fd03ee0a5cd5964.png

b3db780b93e84f4d9783346757d7b266.png

 db1ec33138964af6868793b11c2cc64c.png

//计算1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 …… + 1 / 99 - 1 / 100 的值,打印出结果
//分子总是1,分母是1-100
int main()
{
	int i = 0;
	double sum = 0;
	int flag = 1;
	for (i = 1; i <= 100; i++)
	{
		sum += flag * (1.0 / i);
		flag = -flag;
	}
	printf("%lf", sum);
	return 0;
}

99乘法表

62a2936cae8f43ac810044bfb45e151a.png

66e4931cd30942e68bf8de7d08baafe7.png

 425ee53d9cc44031b5887e487c437984.png21bc6e43d4d34bce85543ced1192ca9d.png

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值