C语言详解系列——函数的认识(4)函数的声明与定义,简单练习题

函数的声明与定义

函数的声明

函数的声明概念和作用如下

1.函数的声明就是告诉编译器有一个函数叫什么,参数是什么,返回值类型是什么。但具体是不是存在,函数声明解决不了
2.函数声明一般出现在函数的使用之前。要满足先声明后使用
3.函数的声明一般在头文件中。

我们在代码中为大家演示函数声明的具体用法

int main()
{
	int num1 = 20;
	int num2 = 10;
	int max = get_max(num1, num2);
	printf("%d", max);
	return 0;
}

int get_max(int x, int y)
{
	return(x > y ? x : y);
}

还是之前使用函数求解两个数的最大值的代码,这次我们把自定义函数放在了主函数之后,我们让代码跑起来
在这里插入图片描述
虽然我们也可以得到我们的结果但是编译器会有一条警告
在这里插入图片描述
他说我们的“get_max"未定义,这里我们就需要使用函数的声明来消除这个警告。
在这里插入图片描述
当我们的自定义函数在主函数之后,我们要调用自定义函数时,需要使用函数的声明,在调用之前告诉编译器有这样一个函数,这就是:函数声明一般出现在函数的使用之前,要满足先声明后使用

函数的定义

顾名思义函数的定义就是函数的具体实现,交代函数的功能实现。当我们了解到了函数声明与定义,那么在日常的工作中我们应该怎样去写函数的声明和定义呢?在日常工作中一定不会向上面的代码一样去声明函数,函数的声明和定义一定是分开的。例如
在这里插入图片描述
我们可以看到这个源文件里面并没有定义get_max()这个函数,也没有函数的声明,但是我们执行代码依然可以得到我们想要结果这是为什么呢?原因是,我们将函数的声明和定义分成了两个部分,在不同的位置进行书写
在这里插入图片描述

在这里插入图片描述
这样写的好处是,可以将我们的需求分成多个模块进行编写,最后将他们并在一起就可以达到我们想要的效果,关于这方面我们在以后的学习当中在与大家详细的分享,今天大家只要知道什么是函数的声明和定义就好了。

简单的练习题

经过我们的分享,相信大家对函数也有了一定的认识,今天我们带领大家练习几个题目,来回顾一下之前的知识。

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

在之前的练习中我们也写过这样的题目,那么如何使用函数实现呢?

int prime_number(int x)
{
	int j = 0;
	for (j = 2; j < x; j++)
	{
		if (x % j == 0)
		{
			return 0;
		}
	}
	if (j == x)
	{
		return 1;
	}
}
int main()
{
	int num = 0;
	printf("输入一个数:");
	scanf("%d", &num);
	int i = prime_number(num);
	if (1 == i)
	{
		printf("%d是素数", num);
	}
	else
	{
		printf("%d不是素数",num);
	}
}

在这里插入图片描述

思路分析:首先我们创建变量用于接收我们输入的待判断数,将这个数传给自定义函数,进行判断如果返回值为1那么就是素数,自定义函数实现判断部分,如果是素数就返回1,不是就返回0。

写一个函数实现二分查找

//使用函数实现整形有序数组的二分查找
int binary_search(int arr[])
{
	int left = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int right = sz - 1;
	int k = 0;
	printf("请输入要查询的数组元素:");
	scanf("%d", &k);

	while (left <= right)
	{
		int mid = (right - left) / 2 + left;

		if (k > arr[mid])
		{
			left = mid + 1;
		}
		else if (k < arr[mid])
		{
			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 num = binary_search(arr);

	if (num == -1)
	{
		printf("找不到了");
	}
	else
	{
		printf("找到了,下标为%d", num);
	}
	return 0;
}

思路分析:我们首先创建一个整形有序数组,将数组传给自定义函数进行寻找,如果可以找到则返回待查值的数组下标,如果招不到返回-1,通过返回值进行选择输出,给出用户对应提示。写完后我们执行我们的代码

在这里插入图片描述
我们发现,查找数组当中存在的元素时,提示我们找不到,这是哪里出现了问题呢?我们在调试中寻找答案
在这里插入图片描述
我们发现原来是我们的right的值出现了错误,数组当中明明有10个元素,right应该等于9,为什么变成1了呢?答案就在于,数组在传递参数的时候不会把整个数组都进行传递,只需要传递数组的首元素地址就可以找到数组当中的任意元素了,所以在数组传递参数时不仅仅可以使用上面int binary_search(int arr[])这样的写法,还可以写成int binary_search(int *arr),后者比较难理解,但是揭露了本质,数组传递参数其实是数组首元素的传递。所以我们将我们的代码进行更改:

//使用函数实现整形有序数组的二分查找
int binary_search(int arr[], int sz)
{
	int left = 0;
	int right = sz - 1;
	int k = 0;
	printf("请输入要查询的数组元素:");
	scanf("%d", &k);

	while (left <= right)
	{
		int mid = (right - left) / 2 + left;

		if (k > arr[mid])
		{
			left = mid + 1;
		}
		else if (k < arr[mid])
		{
			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 sz = sizeof(arr) / sizeof(arr[0]);
	int num = binary_search(arr, sz);

	if (num == -1)
	{
		printf("找不到了");
	}
	else
	{
		printf("找到了,下标为%d", num);
	}
	return 0;
}

我们将right()这个变量的值放在主函数当中求出,之后传递给自定义函数就可以实现我们的需求了。
在这里插入图片描述

写一个函数,每调用一次这个函数,就会将 num 的值增加1。

通过题目我们知道了,需要定义一个函数来使主函数当中数的值+1,这样函数内外需要建立一定的联系,我们使用传址调用

#include<stdio.h>
void add(int* pnum)
{
	*pnum = *pnum + 1;
}

int main()
{
	int num = 0;
	add(&num);
	printf("%d", num);

	return 0;
}

在这里插入图片描述

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悲伤猪小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值