C语言-函数练习1

以下是我初学C语言的笔记记录,欢迎评论区留言补充

【共有三道题】

一,写一个函数,能够判断出100-200之间的素数

【判断方法】

只能被1或是它本身整除;
意味着比如素数7,只能被1或是它本身整除,或是讲,它不能被2-6整除

不用函数,有三种思路做法

(1)

cs 复制代码
//方法一(不是函数的方法)

int main()
{
	int i = 0;
	for (i = 100;i <= 200; i++)
	{
		int j = 0;
		int flag = 1;//1为素数,0不是素数
		for (j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (1 == flag)
			printf("是素数%d ",i);
	}
	return 0;
}

(2)

cs 复制代码
//方法2 (不是函数的方法)
//思路:如果不是素数,比如16 = 2*8 = 4*4 = a*b
//则必然a或是b有一个数<= sqrt(16) = 4

#include<math.h>
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		int j = 0;
		int flag = 1;
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (1 == flag)
		{
			printf("是素数%d ", i);
		}
	}
	return 0;
}

(3)

cs 复制代码
//方法三(不是函数的方法)
//思路:是素数的话,意味着奇数
int main()
{
	int i = 0;
	for (i = 101;i <= 200; i+=2)
	{
		int j = 0;
		int flag = 1;//1为素数,0不是素数
		for (j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (1 == flag)
			printf("是素数%d ",i);
	}
	return 0;
}

用函数

cs 复制代码
//用函数
//如果是素数,返回1;不是返回0

int is_prime(int n)
{
	int j = 0;
	for (j = 2; j <= n - 1; j++)
	{
		if (n % j == 0)
			return 0;
	}
	return 1;
}
int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		if (is_prime(i))
		{
			count++;
			printf("素数为:%d\n", i);
		}
	}
	printf("\n总共:%d", count);
	return 0;
}

当然,也可以进行优化,比如用上面(2)(3)的思路

二, 写一个函数判断是不是闰年,2000-2040年

【判断方法】

第一种:能被4整除,但是不能被100整除;

第二种:能被400整除

不用函数的方法,有两种思路

(1)

cs 复制代码
int main()
{
	int year = 0;
	int count = 0;
	for (year = 2000; year <= 2040; year++)
	{
	    if (year % 4 == 0 && year % 100 != 0)
		{
			printf("是闰年%d\n", year);
			count++;
		}
		if (year % 400 == 0)
		{
			printf("是闰年%d\n", year);
			count++;
		}
	}
	printf("\ncount=%d", count);
	return 0;

}

(2)

cs 复制代码
int main()
{
	int year = 0;
	int count = 0;
	for (year = 2000; year <= 2040; year++)
	{
		if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		{
			printf("是闰年%d\n", year);
			count++;
		}
	}
	printf("总共:%d", count);
	return 0;
}

用函数

cs 复制代码
int is_leap_year(int year)
{
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		return 1;
	else
		return 0;
}
int main()
{
	int year = 0;
	int count = 0;
	for (year = 2000; year <= 2040; year++)
	{
		if (is_leap_year(year))
		{
			printf("是闰年:%d\n", year);
			count++;
		}
	}
	printf("总共:%d", count);
	return 0;
}

三, 写一个函数,实现一个整形有序数组的二分查找

【判断方法】左右下标,与左右整除出来的下标mid 的关系

不用函数

cs 复制代码
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int sz = 0;
	int left = 0;
	int mid = 0;
	int right = 0;
	sz = sizeof(arr) / sizeof(arr[0]);
	right = sz - 1;
	

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

//mid 需要放在while里面,
//如果在外面,则while里对mid的修改不起效,那么就没有结果输出

		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标为:%d", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到了");
	}
	
	return 0;
}

用函数

cs 复制代码
int is_find(int arr[], int k, int sz)
{
	//mid,left,right
	//k,sz
	int left = 0;
	int right = 0;
	
	right = sz - 1;
	while (left <= right)
	{
		int mid = 0;
		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[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int sz = 0;
	sz = sizeof(arr) / sizeof(arr[0]);
	
	//查找k
	int a = 0;
	a = is_find(arr, k, sz);
	if (a == -1)
		printf("没找到");
	else
		printf("找到,下标:%d", a);

	//这里在main函数中,要引用mid,是没法的
	//可以将mid设为函数的返回值,并且在main函数中
	//定义一个变量a来存储返回值

	return 0;
}

【注意】

*

main函数中没法直接引用自定义函数中的量,需要想办法,比如自定义函数返回值,且让main函数中有一个变量可以进行接收

*

sz不可以放在自定义函数中进行计算,原因:数组传参实际上传给形参的是数组第一个元素的地址,即形参此时的参数是一个指针变量,如果在这样的条件下,还进行sz大小的计算,那么结果可能是1或是2,即用指针变量的大小 / 一个整形数组的元素,由于指针变量大小可能是4或是8个字节,所以结果是1或是2

*

数组传参实际上是传递的是数组首个元素的地址,而不是整个数组,所以在函数内部计算一个函数参数部分的数组的元素个数是不靠谱的

【琐碎记录】

  1. 布尔类型c99后,值为true,false,类型是bool,应用stdbool.h的头文件,大小一个字节

2 .for(;;)

  1. return的作用大于break;break只是结束一个循环,而return就是已经出结论的程度,函数直接结束;

  2. if,else if ,如果一个条件满足第一个if,则不会走else if,但是如果都是if , if那么就算符合第一个if也是要再走下一个if的条件;

相关推荐
jerry6097 分钟前
c++流对象
开发语言·c++·算法
fmdpenny7 分钟前
用python写一个相机选型的简易程序
开发语言·python·数码相机
崔高杰32 分钟前
On the Biology of a Large Language Model——Claude团队的模型理解文章【论文阅读笔记】其一CLT与LLM知识推理
论文阅读·人工智能·笔记·语言模型·自然语言处理
海盗强1 小时前
Babel、core-js、Loader之间的关系和作用全解析
开发语言·前端·javascript
猿榜编程1 小时前
python基础-requests结合AI实现自动化数据抓取
开发语言·python·自动化
0509151 小时前
测试基础笔记第十四天
笔记
我最厉害。,。1 小时前
PHP 反序列化&原生类 TIPS&字符串逃逸&CVE 绕过漏洞&属性类型特征
android·开发语言·php
爱编程的鱼1 小时前
C# 类(Class)教程
开发语言·c#
2301_817031651 小时前
C语言-- 深入理解指针(4)
c语言·开发语言·算法
superior tigre1 小时前
C++学习:六个月从基础到就业——模板编程:模板特化
开发语言·c++·学习