C语言 写一个函数:1.判断一个数是不是素数;2.判断一年是不是闰年;3.实现一个整型有序数组的二分查找;4.每调用一次这个函数,就会将num的值增加1。

目录

练习1:写一个函数判断一个数是不是素数。

练习2:写一个函数,判断是不是闰年。

练习3:写一个函数,实现一个整型有序数组的二分查找。

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


练习1:写一个函数判断一个数是不是素数。

不用函数方法如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>

int main(void)
{
	int i;
	int k = 2;
	int flag = 1;  //假设n就是素数
	scanf("%d", &i);
	while (i > 1)
	{
		//m = a * b
	    //a和b中一定至少有一个数字是 <= 开平方m的
	    //比如 16 = 2*8 = 4*4
		//所以下面用sqrt()开平方函数可以减少运算时间

		for (k = 2; k <= sqrt(i); k++)   
			//sqrt()是开平方函数,需要头文件#include<math.h>
		{
			if (i % k == 0)
			{
				flag = 0;
				//printf("%d\n", k);  //这行我用来测试 
				break;   
			//此处加break的作用是,只要能被k整除就可以断定不是素数了,不需要继续k++去判断
			//比如45,能被3整除,就可以判断不是素数了,不需要再用k=4,k=5……判断
			}
		}
		if (flag == 1) 
        {
			printf("%d是素数", i);
			break;
		}
		else 
        {
			printf("%d不是素数", i);
			break;
		}
	}
	if (i <= 1)
		printf("%d不是素数", i);
	return 0;
}

使用函数方法如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int is_primer(int n)
{
	int k = 2;
	int flag = 1;  //假设n就是素数
		
	//m = a * b
	//a和b中一定至少有一个数字是 <= 开平方m的
	//比如 16 = 2*8 = 4*4
	//所以下面用sqrt()开平方函数可以减少运算时间

	for (k = 2; k <= sqrt(n); k++)
		//sqrt()是开平方函数,需要头文件#include<math.h>
	{
		if (n % k == 0)
		{
			flag = 0;
			//printf("%d\n", k);   //这行我用来测试
			break;
			//此处加break的作用是,只要能被k整除就可以断定不是素数了,不需要继续k++去判断
			//比如45,能被3整除,就可以判断不是素数了,不需要再用k=4,k=5……判断
		}
	}
	return flag;
}
int main(void)
{
	int i;
	
	scanf("%d", &i);
	while (i > 1)
	{
		if (is_primer(i) == 1) 
		{
			printf("%d是素数", i);
			break;
		}
		else 
		{
			printf("%d不是素数", i);
			break;
		}
	}
	if (i <= 1)
		printf("%d不是素数", i);
	return 0;
}

练习2:写一个函数,判断是不是闰年。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//一个函数如果不写返回类型,默认返回int类型
void is_leapyear(int n)
{
	//能被4整除且不能被100整除的是闰年或者是能被400整除的是闰年
	if ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0))
		printf("%d是闰年\n", n);
	else
		printf("%d不是闰年\n", n);
}
int main(void)
{
	int year;
	scanf("%d", &year);
	is_leapyear(year);
	return 0;
}

练习3:写一个函数,实现一个整型有序数组的二分查找。

分析:先把框架搭好:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int key = 7;   //假设查询7
	//找到了就返回找到的位置的下标
	//找不到返回-1
	//创建key_search(),将其找到的值传给ret
	int ret = key_search(); 
	if (-1 == ret)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}
	return 0;
}

key_search()函数的参数怎么设置?

    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int key = 7;   //假设查询7
	int sz = sizeof(arr) / sizeof(arr[0]); //求数组元素个数
	//找到了就返回找到的位置的下标
	//找不到返回-1
	//创建key_search(),将其找到的值传给ret
	int ret = key_search(arr, key, sz); 
	//要在arr数组的sz个元素里面找到key

下面设计函数:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//返回的是下标,所以函数类型是int类型
int key_search(int a[], int k, int s)
//此处写a[]只是为了告诉我们这是个数组
{
	int left = 0;
	int right = s - 1;
	while (left <= right) 
		//必须left<=right, 确保中间有元素
	{
		int mid = (left + right) / 2;
		if (a[mid] > k)
		{
			right = mid - 1;
		}
		else if (a[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
	}
	return - 1;  //查完了也找不到
}
int main(void)
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int key = 7;   //假设查询7
	int sz = sizeof(arr) / sizeof(arr[0]); //求数组元素个数
	//找到了就返回找到的位置的下标
	//找不到返回-1
	//创建key_search(),将其找到的值传给ret
	int ret = key_search(arr, key, sz); 
    //为什么不写arr[],因为能代表数组的只有数组名
	//要在arr数组的sz个元素里面找到key
	if (-1 == ret)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}
	return 0;
}

参数非得加上sz吗?

int key_search(int a[], int k, int s)
int ret = key_search(arr, key, sz); 

元素个数不做为参数传进去,直接在函数里面求元素个数试试?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//返回的是下标,所以函数类型是int类型
int key_search(int a[], int k)
{
	//不把元素个数传进去就直接在函数里面求
	int sz = sizeof(a) / sizeof(a[0]); //求数组元素个数

	int left = 0;
	int right = sz - 1;
	while (left <= right) 
		//必须left<=right, 确保中间有元素
	{
		int mid = (left + right) / 2;
		if (a[mid] > k)
		{
			right = mid - 1;
		}
		else if (a[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
	}
	return - 1;  //查完了也找不到
}
int main(void)
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int key = 7;   //假设查询7
	//找到了就返回找到的位置的下标
	//找不到返回-1
	//创建key_search(),将其找到的值传给ret
	int ret = key_search(arr, key); 
	//要在arr数组的sz个元素里面找到key
	if (-1 == ret)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}
	return 0;
}

答案是:找不到,为什么呢?

为什么不能在函数内部求元素个数呢?因为数组传参数的时候不会把整个数组传进去,传的仅仅是数组首元素的地址,那函数里传的就是指针,既然是指针就意味着求不出元素个数。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//返回的是下标,所以函数类型是int类型
int key_search(int a[], int k)
//这里的int a[]本质上是个指针
//相当于int key_search(int* a, int k)
{
	//所以sizeof(a)=4,sizeof(a[0])=4, sz = 1
	int sz = sizeof(a) / sizeof(a[0]); 

	int left = 0;
	int right = sz - 1;
	while (left <= right) 
		//必须left<=right, 确保中间有元素
	{
		int mid = (left + right) / 2;
		if (a[mid] > k)
		{
			right = mid - 1;
		}
		else if (a[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
	}
	return - 1;  //查完了也找不到
}
int main(void)
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int key = 7;   //假设查询7
	//找到了就返回找到的位置的下标
	//找不到返回-1
	//创建key_search(),将其找到的值传给ret
	//数组arr传参,实际传递的不是数组的本身
	//仅仅传过去了数组首元素的地址
	//(只把起始元素1的地址传过去了)
	//上面创建函数的时候相当于这样写的:
	//int key_search(int* a, int k)
	int ret = key_search(arr, key); 
	//要在arr数组的sz个元素里面找到key
	if (-1 == ret)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}
	return 0;
}

注意:如果函数内部需要参数部分传过来某个数组的元素个数,一定是要在外边求好元素个数,再以参数形式把元素个数传进去。想在函数内部求元素个数,做不到。

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

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int num = 0;
	//每调用一次函数,使得num增加1
	add(); //这个函数改变一次会改变num
	return 0;
}

add()想改变num,怎么改呢?把num的地址传给add()函数:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void add(int* p)
{
	(*p)++;   //*p就是num了
}
int main(void)
{
	int num = 0;
	//每调用一次函数,使得num增加1
	add(&num); //这个函数改变一次会改变num
	return 0;
}

检测一下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void add(int* p)
{
	(*p)++;   //*p就是num了
}
int main(void)
{
	int num = 0;
	//每调用一次函数,使得num增加1
	add(&num); //这个函数改变一次会改变num
	printf("%d\n", num);  //1

	add(&num);
	printf("%d\n", num);  //2

	add(&num);
	printf("%d\n", num);  //3
	return 0;
}

注意:想要在函数里面改变函数外部某些变量的时候,需要传地址过去。一旦传地址过去,就涉及到指针。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值