函数:
什么是函数:是一段具有某项功能的代码,是管理C语言代码的最小单位,英语是function,早期被翻译成函数,但是与数学中的函数没有关系,而现在的编程语言都翻译为方法。
当一段代码需要在一个地方反复执行时,用循环语句解决即可,如果一段代码需要在不同的地方被多次执行,那么就应该把这段代码封装成函数,既方便管理也方便重复使用。
函数的分类:标准库函数、系统函数、第三方库函数、自定义函数。
标准库函数:
C语言标准委员会为C语言以函数形式提供的一些基础功能,这些函数被封装在libc.so库文件中,使用时需要包含相应的头文件,根据:函数名(参数) 即可调用。
输入输出类型的函数:stdio.h
int printf(const char *format, …);
功能:输出数据
format:提示信息+占位符+转义字符所组成的字符串字面值
…:若干个变量名
返回值:成功输出的字符个数。
int scanf(const char *format, …);
功能:输入数据
format:占位符
…:若干个变量地址
返回值:成功输入数据的变量个数
注意:在一些刷题的平台使用scanf函数时,如果不使用该函数的返回值,会产生警告,忽略即可。
练习1:完成PAT乙级真题练习的第一题。
int putchar(int c);
功能:输出一个字符
int getchar(void);
功能:输入一个字符
数学类型的函数:math.h 使用这些数学函数需要在编译时添加 -lm 参数
double pow(double x, double y);
功能:计算x的y次方
double sqrt(double x);
功能:对x进行开方
double floor(double x);
功能:向下取整,返回一个少于x的最大整数
double ceil(double x);
功能:向上取整,返回一个大于x的最小整数
字符判断类型的函数:
int isalnum(int c);
功能:判断字符c是否是数字或字母。
int isalpha(int c);
功能:判断字符c是否是字母
int iscntrl(int c);
功能:判断字符c是否是控制字符(0~31,127)。
int isdigit(int c);
功能:判断字符c是否是数字(48~57)
int isgraph(int c);
功能:判断字符c是否是可见字符(33~126)
int islower(int c);
功能:判断字符c是否是小字字母
int isprint(int c);
功能:判断字符c是否是可打印字符(32~126)
int ispunct(int c);
功能:判断字符c是否是标点符号
int isspace(int c);
功能:判断字符c是否是空格
int isupper(int c);
功能:判断字符c是否是大写字母
int isxdigit(int c);
功能:判断字符c是否是16进制中的字符(0~9,a~f,A~F)
字符串类型的函数:string.h
strlen/strcat/strcpy/strcmp
内存管理类型的函数:stdlib.h
malloc/calloc/realloc/free
时间类型的函数:time.h
time_t time(time_t *tloc);
功能:获取自1970年1月1日 00:00:00 到现在一共过了多少秒,格林时间+8小时=北京时间。
struct tm *localtime(const time_t *timep);
功能:获取当前系统时间
struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
其它类型的函数:stdlib.h
int system(const char *command);
功能:调用系统命令
返回值:成功返回0,失败则会根据错误原因返回一些负值
int abs(int j);
功能:计算出j的绝对值
int rand(void);
功能:获取随机数
注意:计算机中的随机数都是伪随机的,把是所有整数打乱顺序存储在计算机中,然后依次获取,默认是从头开始获取的,想要得到不同的随机数,需要设置获取随机数的位置。
void srand(unsigned int seed);
功能:设置获取随机数的位置,
seed:每次运行时都要变化,否则产生的随机数会与上次一样,最合适的就是设置为时间。
练习2:生成10个[100,666]之间的随机数。
rand()%(b-a)+a [a,b)
a=100,b=667
rand()%(667-100)+100
练习3:随机生成一注福彩双色球彩票。
红球6个,每组从1-33中抽取一个,六个互相不重复
蓝球1个,是从1-16中抽取一个数字,整个组成的一注双色球彩票
练习4:一家公司开年会,需要一个摇奖程序,已知该公司的工号范围是:1001~1266,需要抽出一等奖1名,二等奖3名,三等奖5名,且员工不能重复获奖。
系统函数:
操作系统以函数接口形式接口一些高级功能,这些功能包括:
内存管理、信号处理、文件IO、文件管理、进程管理、进程间通信、线程管理、线程同步、网络通信等。
注:该知识点会在Linux系统环境编程、Linux、windwos系统网络编程时讲解。
第三方库函数:
一些开源组织、个人和一些收费公司提供的第三方库,如:GTK、cJSON、MD5、XML、Qt。
自定义函数:
程序员为了更好的管理代码、减少代码冗余把一些经常使用代码封装成一个个函数。
函数声明:
返回值类型 函数名(参数列表);
1、函数声明是为了让编译器检查调用者的使用方法、提供的参数是否匹配,如果函数的定义语句出现在调用之前,函数声明可以省略。
2、以函数的功能为函数取名字,一般函数名小写,用下划线分隔单词。
3、如果不需要参数,参数列表写void,不要空着(参数空着不写代表任何参数都可以调用,容易让人产生误会,不要这样)。
4、如果函数不需要返回值则写void。
5、函数声明时参数列表中的变量名可以省略,因为编译器在检查参数时只需要类型符合即可,与名字无关。
6、如果函数之间出现互相调用的情况,则必须实现函数声明。
7、如果多文件编程,一般函数声明实现在头文件,函数定义实现在源文件。
函数定义:
返回值类型 函数名(参数列表)
{
// 函数体
return 数据;
}
函数调用:
函数名(实参);
函数执行完毕后,返回值会放置函数的调用位置,可以直接使用,也可以使用变量保存下来。