初阶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;
}