前言
对函数的补充
一、 函数分类
系统函数:
是操作系统以函数接口形式提供的一套功能,这些功能:
内存管理、信号处理、文件IO、文件管理、进程管理、进程通信、线程管理、线程同步、网络通信
第三方库函数:
由第三方提供的,一些开源或者收费的代码
MD5 验证
JSON 序列化和反序列化
glog 日志记录
自定义函数:
为了更好地管理代码,减少冗余把代码封装成函数
注意:一个函数尽量控制在50行以内,一个函数一个功能
函数声明:函数声明的目的是为了告诉其他代码该函数的调用格式
二、返回值
返回值类型 函数名(类型1 形参名1,类型2 形参名2,…);
1、C语言中函数名全部小写,用下划线分隔
2、如果不需要参数时,建议写void,不要空着
3、如果不需要返回值,也写void,但是return后不能跟数据
隐式声明:
当调用函数之前没有声明和定义,编译器会猜测函数的格式,参数列表会根据调用时提供的实参(数据)来猜测,返回值会猜测成int类型
注意:函数定义如果在函数调用之前,可以省略函数声明
函数定义:
返回值类型 函数名(类型1 形参名1,类型2 形参名2,…)
{
函数体
return val;
}
函数调用:
函数名(实参1,实参2,…);
注意:返回值会放在调用的位置,可以立即打印显示,或者也可以用变量记录下来
三、练习
1、实现一个函数,判断整数是否是素数,调用该函数显示出100~10000之间的所有素数
2、输入两个日期,计算两个日期之间间隔了多少天
3、实现一个函数,判断整数是否是回文数,调用该函数显示出1亿-10亿之间的所有回文数
4、计算出100的阶乘
5、输入一个整数,显示该整数的补码
练习1代码如下(示例):
#include <stdio.h>
#include <stdbool.h>
bool Is_prime(int num);
int main(int argc,const char* argv[])
{
for(int i=100;i<1000;i++)
{
Is_prime(i) && printf("%d ",i);
}
}
bool Is_prime(int num)
{
for(int i=2;i<=num/2;i++)
{
if(num%i==0)
return false;
}
return true;
}
练习2代码如下(示例):
#include <stdio.h>
#include <stdlib.h>
int data(int year,int month,int day);
int main(int argc,const char* argv[])
{
printf("输入第一个日期:");
int year,month,day;
scanf("%d-%d-%d",&year,&month,&day);
int one=data(year,month,day);
printf("输入第二个日期:");
scanf("%d-%d-%d",&year,&month,&day);
int two=data(year,month,day);
printf("两个日期相隔%d天",abs(one-two));
}
int data(int year,int month,int day)
{
int sum=0;
for(int i=1;i<year;i++)
{
sum+=365+(i%4==0&&i%100==0||i%400==0);
}
for(int i=1;i<month;i++)
{
if(i==2)
sum+=28+(year%4==0&&year%100==0||year%400==0);
else if(i==4||i==6||i==9||i==11)
sum+=30;
else
sum+=31;
}
return sum+=day-1;
}
练习3代码如下(示例):
#include <stdio.h>
#include <stdbool.h>
bool is_hw(int num);
int main(int argc,const char* argv[])
{
for(int i=100000000;i<=1000000000;i++)
{
is_hw(i) && printf("%d ",i);
}
}
bool is_hw(int num)
{
int copy,new=0;
copy=num;
while(copy)
{
new=new*10+(copy%10);
copy/=10;
}
return new==num
}
练习4代码如下(示例):
#include <stdio.h>
int main(int argc,const char* argv[])
{
char rets[256]={1};
int cnt=1;//指向结果接下去要进位的下标
for(int i=2;i<=100;i++)
{
char carry=0;//进位
for(int j=0;j<cnt;j++)
{
short num =rets[j]*i+carry;
rets[j]=num%10;
carry=num/10;
}
while(carry)
{
rets[cnt++]=carry%10;
carry/=10;
}
}
while(cnt--)
{
printf("%d",rets[cnt]);
}
}
练习5代码如下(示例):
#include <stdio.h>
void bm(int num);
int main(int argc,const char* argv[])
{
printf("输入一个整数:");
int num;
scanf("%d",&num);
bm(num);
}
void bm(int num)
{
int arr[32]={};
for(int i=0;i<32;i++)
{
arr[i]=num >>i & 1;
}
for(int i=31;i>=0;i--)
{
printf("%d",arr[i]);
}
}
总结
上面的代码仅供参考,也不一定是最精简的,一些变量名命名比较随意,望大家不要模仿。