跟着鹏哥学编程,拿一个好offer。今天开始学习函数部分。鹏哥说写函数的原则是模块化,函数的功能要单一化,才能使得函数的可移植性好。写函数要先写出如何使用函数,再去用算法实现函数的功能,这样写出的代码就不会逻辑混乱。
1.用函数实现之前写过的二分查找。
在binary_search(arr[],int k,int sz)中只实现对数组特定元素的查找,没有其他任何功能,这才是一个移植性好的函数该有的。
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 9;
int sz = sizeof(arr) / sizeof(arr[0]); //求元素个数
int binary_search(int arr[], int k, int sz);//函数声明
int ret = binary_search(arr,k,sz); //定义变量ret接收函数binary_search()返回值
if (ret)
{
printf("找到了,下标是:%d", ret);
}
else
{
printf("没找到。\n");
}
}
//用函数实现二分查找
//找到后返回元素下标,没找到返回-1
int binary_search(int arr[],int k,int sz)
{
int left = 0; //左下标
int right = sz - 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;
}
2.输出1000-2023年间所有闰年,用函数实现。
函数is_leap_year(int y)来判断实参传递过去的是否是闰年?若是,则返回该年份;若不是,则返回-1;在主函数中用变量year来接收函数返回值,若year=-1,则continue,跳过后面代码,继续循环;若否,则输出;
#include <stdio.h>
int is_leap_year(int y)
{
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
return y;
else
return -1;
}
int main()
{
//输出1000-2023年之间所有的闰年,用函数实现
int ret = 0; int year = 0;
for (ret = 1000; ret <= 2023; ret++)
{
year = is_leap_year(ret);
if (year == -1)
{
continue;
}
else
{
printf("%d ",year);
}
}
return 0;
}
3.输出0-100之间的所有素数,用函数实现
#include <stdio.h>
#include <math.h>
//试除法实现素数查找
int prime_number(int pn)
{
int i = 0;
for (i = 2; i <= sqrt(pn); i++)
{
if (pn % i == 0)
{
return -1;
}
}
return pn;
}
int main()
{
int pn = 0;
for (pn = 1; pn <= 100; pn++)
{
int ret = prime_number(pn);
if (ret == -1)
{
continue;
}
else
{
printf("%d ", ret);
}
}
return 0;
}