系统学习之C复习(3)函数

本文介绍了查看英文文档、sizeof和memset的基本用法,自定义函数的传值调用与传址调用,包括素数判断、二分查找算法示例。还探讨了TDD测试驱动开发和函数递归,以及数组传递、阶乘计算和斐波那契数列的求解技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

库函数

学会查看 英文文档

sizeof 返回的类型 为 size_t

memset();填充

char arr[] = "abcdefg";
memset(arr,'X',5);
//输出为 "XXXXXfg"


char arr[] = "abcdefg";
memset(arr+1,'X',5);
//输出为 "aXXXXXg"

注意:1.设置内存的时候是以字节为单位的

            2.每个内容都是一样的。

自定义函数

        先写怎么用,在写如何实现

自定义函数中存在 实际参数(实参)形式参数(形参)

可以用指针,建立两者的联系。

当自定义函数想改变实参时,则使用指针。

        传值调用、传址调用

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

#include <stdio.h>
#include <math.h>

//判断一个数是不是素数

int is_prime(int i)
{
	//2-sqrt(i)试除
	int j = 0;
	for (j = 2; j <= sqrt(i); j++)
	{
		if (i % j == 0)
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	int i = 0;
	for (i = 100; i < 200; i++)
	{
		if (is_prime(i) == 1)
		{
			printf("%d ", i);
		}
	}
}

TDD

测试驱动开发

先写函数怎么使用

写的函数 尽量  单一 !

练习2

int binary_search(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,9,10 };
	int k = 0;
	scanf("%d", &k);	//要查找的元素
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = binary_search(arr,k,sz);
	if (-1 == ret)
	{
		printf("找不到");
	}
	else
	{
		printf("找到了,下标是 %d\n",ret);
	}
	return 0;
}

函数可以嵌套调用,但不可嵌套定义。

函数:链式访问:把一个函数的返回值作为另外一个函数的参数

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

printf("%d", printf("%d", printf("%d", 43)));
   1            2           3
结果是啥?
是 4321 

查表可得,printf 的返回值的是字符大小;
3    返回  43
2    返回  2    由于43,只有两个字符,所以返回2
1    返回  1    由于2,只有1个字符,所以返回1

如果想 分享函数代码 但又不愿意让人看见函数代码的内容。

        则可以编译成静态库。

首先鼠标右击项目名称,点击属性

在常规的配置类型里面,选择静态库

 在重新生成一边,便生成来lib文件。

使用的时候: 

        add.h 和 add.lib 。  

        add.lib        相当于隐藏内容的add.c文件

lib文件在工程中不用引入文件。

 #pragma comment(lib,"add.h")

函数递归

        程序调用自身的编程技巧。主要思想:大事化小。

        一步一步递出去,在归回来

        每次调用都会分配一个栈空间,结束后释放。

 

递归的两个必要条件

        存在限制条件,当满足限制条件,递归不再继续。

        每次递归后越来越接近限制条件

练习:不允许创建 临时变量 ,计算出字符串长度

数组传递给函数时, 传递的是地址。

#include "stdio.h"

int my_strlen(char* str)
{
    if(*str != '\0')
        return 1 + my_strlen(str + 1);
    else
        return 0; 
}
int main()
{
    char arr[] = "abcdef";
    int len = my_strlen(arr);
    printf("%d\n", len);
    return 0;
}

练习:求n的阶乘

//求 n的阶乘
int fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * fac(n - 1);
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	int ret = fac(num);
	printf("n的阶乘为: %d\n", ret);
}

练习:求斐波那契数列的 第n个数字

//求第n个斐波那契数
//递归 求第50个数字时,会消耗很长的时间。效率出现了问题。
//因为 每次递归都会全部计算一遍。
int fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return (n - 2) + (n - 1);
}
// 当递归出现了明显的效率问题,就换非递归。
int fib_1(int n)
{	
	int a = 1;
	int b = 1;
	int c = 0;
	if (1 == n || 2 == n)
	{
		return 1;
	}
	while(n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d\n", ret);
	return 0;
}

练习,汉诺塔和青蛙跳梯子问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值