C语言--函数

本文介绍了C语言中的库函数,如strcpy和memset的使用,并通过示例展示了如何自定义函数来实现特定功能,如求最大值和交换数值。同时,解释了函数参数的概念,包括实参和形参的区别,并通过Swap函数的两种调用方式(传值调用和传址调用)进行了说明。最后,提供了若干编程练习,包括打印素数、判断闰年和实现二分查找等。
摘要由CSDN通过智能技术生成

目录

库函数

自定义函数

函数参数

函数调用

库函数

为什么会有库函数?

  1. 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能将信息按照一定的格 式打印到屏幕上(printf)。
  2. 在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。
  3. 在编程是我们也计算,总是会计算nk次方这样的运算(pow)。

C语言中的库函数很多,我们并不需要全部记住,,而是要学会网上查找,下面我们举几个简单的例子:

1.strcpy--字符串拷贝

int main()
{
	char arr1[20] = { 0 };//目标空间
	char arr2[] = "hello";
	char* ret = strcpy(arr1, arr2);
	printf("%s\n", arr1);
	printf("%s\n", ret);
	return 0;
}

2.memset--字节为单位填充

int main()
{
	char arr[] = "hello bit";//xxxxx bit
	char* ret =(char*)memset(arr, 'x', 5);
	printf("%s\n", ret);
	return 0;
}

自定义函数

自定义函数跟库函数是一样的,有函数名,返回值类型和函数参数,但自定义函数是由自己设定的。
下面有几个简单的例子。
1.利用函数求两个数的最大值
int get_max(int x, int y)
{
	if (x > y)
	{
		return x;
	}
	else
	{
		return y;
	}
}
int main()
{
	int a = 0;
	int b = 3;
	scanf("%d%d", &a, &b);
	//求两个数的较大值
	int max = get_max(a, b);
	printf("%d\n", max);
	return 0;
}

2.利用函数进行两个数的交换

先给一段代码,仔细思考一下看看能否实现两个数的交换

void Swap(int x, int y)
{
	int z = x;
	x = y;
	y = z;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("交换前:a=%d,b=%d\n", a, b);
	Swap(a, b);
	printf("交换后:a=%d,b=%d\n", a, b);
	return 0;
}

当我们运行上面这段代码时, 我们发现并不能交换两个数字,主要时因为形参x和y只是实参a和b一份临时的拷贝,改变形参x和y不会影响实参。

下面对上面代码进行修改

void Swap(int* x, int* y)
{
	int z = *x;
	*x = *y;
	*y = z;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("交换前:a=%d,b=%d\n", a, b);
	Swap(&a, &b);
	printf("交换后:a=%d,b=%d\n", a, b);
	return 0;
}

把a和b的地址传过去,利用指针进行接收,对x和y进行解引用,然后进行交换,就可以改变a和b的值。

函数参数

函数实参:真值传给函数的参数,叫做实参。实参可以是:常量、变量、表达式、函数等。例如上面例子的a和b就是实参。

函数形参:形式参数是指函数名括号中的变量。上面中x和y是形式参数。

函数调用

函数有传值调用和传址调用,举个例子:

void Swap1(int x, int y)
{
	int z = x;
	x = y;
	y = z;
}


void Swap2(int* x, int* y)
{
	int z = *x;
	*x = *y;
	*y = z;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("交换前:a=%d,b=%d\n", a, b);
	Swap2(&a, &b);//传址调用
	Swap1(&a, &b);//传值调用
	printf("交换后:a=%d,b=%d\n", a, b);
	return 0;
}

上面Swap2()函数就是传址调用,Swap1()就是传值调用。

下面练习几个题目

1.打印100-200的素数

#include <math.h>
int is_prime(int n)
{
	//试除法
	//2--n-1
	for (int j = 2; j <= sqrt(n); j++)
	{
		if (n%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);
		}
	}
	return 0;
}

2.判断闰年1000-2000

int is_leap_year(int n)
{
	if ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0))
	{
		return 1;
	}
	return 0;
}
int main()
{
	int y = 0;
	for (y = 1000; y <= 2000; y++)
	{
		//判断闰年
		//函数 是闰年返回1,不是闰年返回0
		if (is_leap_year(y) == 1)
		{
			printf("%d ", y);
		}
	}
}

2.利用函数,实现一个整型有序数组的二分查找(以前说过)

方法1:

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

方法2:

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

4.写一个函数调用一次函数num加1

void Add(int* p)
{
	*p = *p + 1;
}

int main()
{
	int num = 0;
	Add(&num);
	printf("%d\n", num);//1
	Add(&num);
	printf("%d\n", num);//2
	Add(&num);
	printf("%d\n", num);//3
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值