当前位置: 首页 > article >正文

初阶c语言(函数练习)

目录

第一题,写一个函数来判断是否是闰年

最终代码

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

实现代码

第三题,写一个函数,每调用这个函数,这个值都会加一

实现代码


前言:

对应b站鹏哥视频41集

内容:

第一题,写一个函数来判断是否是闰年

其实我都是跟着老师写的,然后整理下思路

就是说,首先知道什么是闰年,就是可以被4整除,不能被100整除,如果他能直接被400整除也算闰年

然后就是注意if else语句,如果进入了if语句了,就不会再进入else if语句了

就是说

这里的2000进入了第一个if语句,就是说满足了第一个if语句,就不会执行第二个else if语句

if(year % 4 == 0)
{   if(year % 100 != 0)
    {
        printf("%d ", year);
    }		
}
else if(year % 400 == 0)
{
	printf("%d ", year);
}

所以要改成这个,第一个if语句做不到,那就再用一个if语句,就是在重新把for循环的数字,再重新判断一遍

if(year % 4 == 0)
{   if(year % 100 != 0)
    {
        printf("%d ", year);
    }		
}
else if(year % 400 == 0)
{
	printf("%d ", year);
}

 可以直接这样写也可以,因为这样第一个if语句就不会成立,就会执行第二个else if语句

因为2000模100等于0,所以第一个if语句不成立,就跳转到else if语句了

		if((year % 4 == 0) && (year % 100 != 0))
		{
			printf("%d ", year);
			
		}
		else if (year % 400 == 0)
		{
			printf("%d ", year);
		}

当然也可以直接这样 || 表示或

		if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
		{
			printf("%d ", year);
			
		}

 代码实现

#include <stdio.h>
int main()
{
	int year =0;
	for(year =1000; year <= 2000; year ++)
	{
		if((year % 4 == 0) && (year % 100 != 0))
		{
			printf("%d ", year);
			
		}
		if(year % 400 == 0)
		{
			printf("%d ", year);
		}
	}
	return 0;
 } 

那如果需要写一个函数来实现这个功能,该怎么写,就是说,

这个函数的功能是判断是否是闰年就可以了,是判断是,不是判断否

然后用一个if语句接收这个返回值,然后打印,不用在函数里打印,因为函数功能需要单一

然后就可以这样写,然后调用函数,接收一个year值就好了

最终代码

#include <stdio.h>

int is_leap_year(int x)
{
	if((x % 4 == 0) && (x % 100 != 0) || (x % 400 == 0))
	{
	return 1;	
	}
	else
	{
		return 0;
	}
}
int main()
{
	int year =0;
	
	for(year =1000; year <= 2000; year ++)
	{
		if(is_leap_year(year)) 
		{
			printf("%d ", year);
		}

		
	}
	return 0;
 } 

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

函数,函数的功能实现,就是需要判断是否判断这个数的下标,然后找到了就返回这个下标

	int left = 0;
	int right = zs-1;
	while(left <= right)
	{
		int mid = (right - left)/2 + left;	
		if(arr[mid] > k)
		{
			right = mid - 1;
		 } 
		else if(arr[mid] < k)
		{
			left = mid + 1;
		 } 
		else
		{
			return mid;
		 }
	}

在主函数调用这个函数,来实现这个功能

就是说,注意问题就是

形参是实参的临时拷贝,但是对于数组的话就不是这样的,因为数组太大了话,当临时拷贝的话,全部拷贝过来太大了,所以形参存的实际是数组的第一个元素的地址

int binary_search(int arr[], int k, int zs) 

//这里的arr是一个指针变量,就是存数组的第一个元素的地址

因为数组里的元素的地址都是连续存放的,所以通过第一个地址,就能找到后面的地址

所以不能在自定义函数计算数组的元素个数

int main()
{
	int k = 7;
	int arr[] = {1,2,3,4,5,6,7,8,9,10};

	int zs = sizeof(arr) / sizeof(arr[0]);

	int m = binary_search(arr, k, zs);
	
	printf("找到了,这个数的下标为:%d", m);
	
	return 0;
}

这里漏写了判断语句,就是如果没找到该如何输出,就是说

用if语句,这个只需要有一个值是固定的就好了,就是-1是固定的,然后其他的就直接输出

代码在下面了

实现代码

int binary_search(int arr[], int k, int zs)  //这里的arr是一个指针变量,就是存数组的第一个元素的地址
{
	int left = 0;
	int right = zs-1;
	while(left <= right)
	{
		int mid = (right - left)/2 + left;	
		if(arr[mid] > k)
		{
			right = mid - 1;
		 } 
		else if(arr[mid] < k)
		{
			left = mid + 1;
		 } 
		else
		{
			return mid;
		 }
	}
	return -1;
}

int main()
{
	int k = 16;
	int arr[] = {1,2,3,4,5,6,7,8,9,10};

	int zs = sizeof(arr) / sizeof(arr[0]);
	int m = binary_search(arr, k, zs);
	
	if (m == -1)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,这个数的下标为:%d", m);
	}
	
	return 0;
}

扩展知识讲解,将布尔类型

布尔类型,就是c99才有的,大小为一个字节,然后他的类型为bool,然后它接受的就是faluse和true

使用这个类型,需要包含头文件,

#include <stdbool.h>

false相当于0

true相当于1

当然也可以直接return 0或者return 1;

#include <stdbool.h>
#include <stdio.h>
int is_prime(int n)
{
	int j = 0;
	for(j =2; j < sqrt(n); j++)
	{
		if(n % j == 0)
		{
			return false; 
		}
	}
	return true;
}

int main()
{
	
	return 0;
}

第三题,写一个函数,每调用这个函数,这个值都会加一

这个考的有点多,就是说,调用过去的值不会改变,不是指针的话

但是可以在主函数里改啊

就是说主函数接收了这个值,并且保存了,下次调用在保存;

然后还有一个问题就是说

n++和++n的规则

如果是这样的return n++;    //就是说先使用了n,就是说先将n使用了,也就是返回了,然后再加,加的值并没有返回

return ++n;      //就是先加加,加完之后的结果返回回来

int add(int n)
{
	return ++n;
}

int main()
{
	int num = 0;
	num = add(num);  //利用原来的数接收最值,这个值就发生改变了,并不是在自定义函数改变的
	printf("%d\n", num);
	num = add(num);
	printf("%d\n", num);
	num = add(num);
	printf("%d\n", num);
	return 0;
}

利用指针的方法相加

看下这个大佬讲的吧,在别的评论区找到的    qzxcde

简单来说就是不能用

*p++;  //这个应该是对地址进行加加

(*p)++;    //就是对他的值进行加加

由于不需要返回值,就不用int类型,用无返回类类型就行

因为这个调用这个函数,这个地址的值就发生改变了,就不需要在接受参数了

实现代码

void add(int *p)
{
	(*p)++;
}

int main()
{
	int num = 0;
	add(&num);
	printf("%d\n", num);
	add(&num);
	printf("%d\n", num);
	
	//num = add(num);
	//printf("%d\n", num);
	
	return 0;
}


http://www.kler.cn/a/551123.html

相关文章:

  • STM32 CubeMx配置串口收发使用DMA并调用Idle模式(一)
  • Ubuntu如何利用.ibd文件恢复MySQL数据?
  • 单例模式的使用方式
  • 【Python】循环语句详解:for语句、while语句
  • JavaScript设计模式 -- 观察者模式
  • 如何将ubuntu下的一个目录,保存目录结构为一个git仓库并上传
  • React源码揭秘 | 启动入口
  • 房屋全生命周期自动化监测系统详解
  • 【Python】利用 Emoji 隐藏数据
  • Qt CMake 参考网址
  • 【Zookeeper如何实现分布式锁?】
  • 机器学习实战(4):逻辑回归——分类问题的基础
  • Docker 存储管理:卷、绑定挂载、临时存储
  • 50道题快速复习MySQL之准备篇
  • node的内置对象,vue的内置对象
  • 高通推出骁龙游戏超级分辨率™:充分释放移动游戏性能,带来更持久的续航
  • windows在wsl ubuntu环境中启用cuda加速AI推理和训练
  • 【DeepSeek 行业赋能】从金融到医疗:探索 DeepSeek 在垂直领域的无限潜力
  • UART(一)——UART基础
  • 云贝餐饮连锁V3独立版全开源+vue源码