前言:初步认识了函数,我们来写几个函数练习题练习一下吧
文章目录:
目录
一.练习
1.写一个函数可以判断是不是素数
2.写一个函数判断一年是不是闰年
3.写一个函数,实现一个整形有序数组二分查找
4.写一个函数,每次调用num+1
先想函数怎么使用,在实现
(1)素数
素数是什么?
素数就是质数,一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数,即素数;否则称为合数
有了思路我们就可以写一下
#include<stdio.h>
#include<math.h>
int ss(int n)
{
int j = 0;
for (j = 2; j <= sqrt(n); j++) //sqrt是开平方函数头文件math.h
{
if (n%j == 0)
{
return 0;
}
return 1;
}
}
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
if (ss(i) == 1)
{
printf("素数:%d\n", i);
}
}
}
这就是使用函数调用实现素数的代码
注意事项:
- 大于1就从2开始试除
- 使用了开平方sqrt库函数需要引用头文件<math.h>
- sqrt(144)=12 就在2—12的范围试除就可以了 还可以节省空间
(2)闰年
啥是闰年?
(1)四年一闰百年不闰:即如果能够被4整除,但是不能被100整除,则是闰年。
(2)每四百年再一闰:如果能够被400整除,则是闰年
我们得知被4整除 不能被100整除 可以被400整除
有了思路我们来实现
#include<stdio.h>
int rn_year(int y)
{
if (y % 4 == 0 && y % 100 != 0| y % 400 == 0) //闰年判断
return 1;
else
return 0;
}
int main()
{
int year = 0;
for (year = 1000; year <= 2000; year++) //1000年——2000年
{
if (rn_year(year)==1) //返回值接收
{
printf("闰年%d\n", year);
}
}
}
根据题意我们就可以写出闰年函数代码
(3)每调用num+1
题目言简意赅 就是每次调用函数的时候num+1
#include<stdio.h>
void add(int*num) //指针接收
{
++*num; //++优先级更高 先++num后解引用
}
int main()
{
int num = 0;
int i = 0;
for (i = 0; i < 4; i++)
{
add(&num); //传址调用 因为要改变外部的值 不传址每次调用自动销毁
}
printf("%d", num);
return 0;
}
注意事项:
函数参数选择传址调用 因为要改变外部的值 不传址每次调用自动销毁
(4)二分查找法
之前我们学过在主函数实现二分查找
这次我们用函数调用来解决
#include<stdio.h>
int cz(int arr[], int sz, int k)
{
int left = 0; //左下标
int right = sz - 1; //右下标 因为数组从0开始要-1
while (left <=right) //要求左下标必须小于右下标
{
int mid = (left + right) / 2; //计算中间值
if (arr[mid]>k) //如果中间值大于要找的数 说明在值的右边
right = mid - 1; //右下标从中间值的左边开始
else if (arr[mid] < k)
left = mid + 1;
else
{
return mid; //其实是找到了
}
}
return 1;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; //定义
int k = 8;
int sz = sizeof(arr) / sizeof(arr[0]); //计算元素个数
int ret = cz(arr,sz,k); //调用函数
if (ret == 1) //如果函数返回的是1 打印找不到
printf("找不到\n");
else
printf("找到了%d\n", ret); //找到了,打印返回数值
return 0;
}
注意事项:
- 元素个数只能在函数外部计算 数组传参只传首元素地址 即是指针 4/4=1
- 数组下标从0开始 所以右下标要-1
- 如果中间值比求值大 就比如要求的值是4 中间值是6 所以肯定在1-5之间 所以右下标要-1
总结:
初学函数 这几个练习题值得认真思考
传值和传址要搞清楚 传值改变外部变量传值自动销毁