【C语言极简自学笔记】从C语言函数实例深入了解函数本质

一.输出100到200之间的素数

代码1

#include 
 
int main()
{
	int num = 0;
	for (num = 100; num <= 200; num++)
	{
		int i = 0;
		int flag = 1;
		for (i = 2; i < num; i++)
		{
			if (num % i == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag)
		{
			printf("%d ",num);
		}
	}
	return 0;
}

通过for循环的嵌套,当经过循环后flag仍然为1,则证明该数不可被i整除,为素数

可以将    for (num = 100; num <= 200; num++)  改为    for (num = 101; num <= 200; num+=2)

因为素数均为奇数
       将    for (i = 2; i < num; i++)      改为        for (i = 2; i < sqrt(num); i++)

因为若该数不为素数,则它的值为小于等于它的平方根的因数的乘积,因此只用判断小于它平方根的部分,使用sqrt函数时需要包含头文件 math.h

代码2

#include 
#include 
int is_prime(int n)
{
	int i = 0;
	for (i = 2; i < sqrt(n); i++)
	{
		if (n % i == 0)
		{
			return 0;
		}
 
	}
	return 1;
}
int main()
{
	int num = 0;
	for (num = 100; num <= 200; num++)
	{
		if (is_prime(num))
		{
			printf("%d ",num);
		}
		
	}
	return 0;
}

通过声明函数is_prime,若函数的返回值为1,证明是素数,打印;若返回值为0,则不是素数。

 二.判断闰年

代码1

#include 

int main()
{
	int year = 0;
	printf("输入一个年份:");
	scanf("%d",&year);
	if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
	{
		printf("%d年是闰年\n", year);
	}
	else
		printf("%d年不是闰年\n", year);
	return 0;
}

根据闰年的两个判断方法:
1.能够被4整除,且不能被100整除
2.能够被400整除
再通过使用if语句即可进行判断

代码2

#include 

int is_leap_year(int n)
{
	if (((n % 4 == 0) && (n % 100 != 0)) || (n % 400 == 0))
	{
		return 1;
	}
	else
		return 0;
}
int main()
{
	int year = 0;
	printf("输入一个年份:");
	scanf("%d", &year);
	if (is_leap_year(year))
	{
		printf("%d年是闰年\n", year);
	}
	else
		printf("%d年不是闰年\n", year);
	return 0;
}

通过声明is_leap_year函数,然后在主函数中调用,当函数返回值为1时,表明是闰年,执行if语句进行判断;当函数返回值为0时,表明不是闰年。

还可以输出两个年份之间的闰年,代码分别如下

#include 

int main()
{
	int year = 0;
	for (year = 1900; year <= 2000; year++)
	{
		if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
		{
			printf("%d  ", year);
		}
		
	}
	return 0;
}
#include 
int is_lead_year(int n)
{
	if (((n % 4 == 0) && (n % 100 != 0)) || (n % 400 == 0))
	{
		return 1;
	}
	else
		return 0;
}
int main()
{
	int year = 0;
	for (year = 1900; year <= 2000; year++)
	{
		if (is_lead_year(year))
			printf("%d ",year);
	}

	return 0;
}

三.整型有序数组的二分查找

代码1

#include 

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

根据二分法来查找数组中的元素,通过比较中间数值与目标元素的大小来不断的更新左右下标,直至找到目标元素,若遍历至左侧下标大于右侧下标,则表明该元素不存在于该数组中。

代码2

#include 
int binary_search(int arr[], int k, int sz)//形参和实参的名字可以相同也可以不同
{
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (k < arr[mid])
		{
			right = mid - 1;
		}
		else if (k > arr[mid])
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
	}
	if (left > right)
		return -1;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 17;
	int sz = sizeof(arr) / sizeof(arr[1]);
	
	int ret = binary_search(arr, k, sz);
	if (ret == -1)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标为%d\n",ret);
	}

	return 0;
}

通过声明函数binary_search,判断目标元素于数组中间元素的大小,然后不断更新左右下标,若最终使得目标元素于中间元素相等,则返回中间元素下标给主函数,主函数打印元素下标;若遍历完后使得左下标大于右下标,则表明找不到,返回-1。

注意,以下代码是错误的

int binary_search(int arr[], int k)
{
	int sz = sizeof(arr) / sizeof(arr[1]);
	int left = 0;
	int right = sz - 1;
}

 形参arr看上去是数组,实际上是指针变量

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

你可能感兴趣的:(学习笔记,c语言,算法,开发语言)