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的条件;

相关推荐
巴伦是只猫1 小时前
【机器学习笔记Ⅰ】11 多项式回归
笔记·机器学习·回归
weixin_472339463 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
枯萎穿心攻击4 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
DKPT4 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
Eiceblue5 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
m0_555762906 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
巴伦是只猫6 小时前
【机器学习笔记Ⅰ】13 正则化代价函数
人工智能·笔记·机器学习
学不动CV了6 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
浪裡遊7 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
lzb_kkk8 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节