一、函数
什么是函数:function
函数就是一段具有某一项功能的代码集合,它是C语言中管理代码的最小单位,把具有某项功能的若干行代码封装在函数中方便管理代码且方便重复调用。
函数的分类:
标准库函数:
C语言标准委员会为C语言以函数形式提供了一些基础功能,这些函数被封装在libc.so库文件中,使用时需要导入对应的头文件,它们的详细介绍在man手册的第3章节。
系统函数:
操作系统为程序员提供了一些系统API,可以以函数形式调用,但它们不是真正的函数,讲UNIX系统环境编程时会详细讲解,它们的详细介绍在man手册的第2章节。
第三方库函数:
一些公司或开源组织实现的一些常用工具供程序员使用。
MD5 、 JSON 序列化反序列化、XML配置文件
自定义函数:
为了更方便的管理、调用代码,降低开发难度,程序员自己封装的一些函数。
常用标准库函数介绍:
标准库中除上封装了函数,还提供一些头文件,里面是对函数的说明。
stdio.h 输入输出相关功能的函数:
int printf(const char *format, ...);
功能:输出数据到终端
format:提示信息+占位符+转义字符组成
...:若干个变量名或数据
返回值:成功输出的字符个数
int scanf(const char *format, ...);
功能:从终端读取数据
format:一般情况下,只需要占位符即可,除了占位符以外的信息,在输入数据时要原样补出。
...:若干个变量的地址
返回值:成功读取的变量个数
int getchar(void);
int putchar(int c);
int puts(const char *s);
stdlib.h 实用的库函数:
int system(const char *command);
功能:调用系统命令,命令执行完成后,该函数才返回
返回值:成功返回0,失败返回-1。
system("clear"); // 清屏命令
int rand(void);
功能:从系统中获取随机数 0~RAND_MAX
返回值:都是正整数,如果需要负数或浮点数,需要程序员自已处理。
void srand(unsigned int seed);
功能:所谓的随机数就是把所有整数打乱顺序,从某个位置获取,默认从1位置获取,程序运行时如果"位置"不改变,获取随机数与上次一样,为了保证每次运行时,提供的位置都发生变化,一般把time函数的返回值提供给srand作为随机数的种子。
srand(time(NULL));
int abs(int j);
功能:计算并返回j的绝对值
ctype.h 字符类型的判断函数:
int isdigit( int ch );
功能:判断是否是数字字符
int islower( int ch );
功能:判断是否是小写字母
int isupper( int ch );
功能:判断是否是大写字母
time.h 时间日期相关的函数:
time_t time(time_t *tloc);
功能:获取当前系统的时间,返回自 1970年1月1日 00:00:00 到现在一共过了多少秒,格林时间+8小时就是北京时间。
time(NULL)
struct tm *localtime(const time_t *timep);
功能:把秒数据时间转换成年月日、时分秒
math.h 数学相关的函数 :
double pow(double x, double y);
功能:计算出x的y次数
double sqrt(double x);
功能:计算x的平方根
double ceil(double x);
功能:向上取整,返回大于x的最小整数
double floor(double x);
功能:向下取整,返回小于x的最大整数
注意:使用这些函数在编译时必须有-lm参数 libm.so
练习1:根据time(NULL)的返回值,计算出北京时间 yyyy-mm-dd hh:mm:ss
秒数换算成天数-》
#include <stdio.h> #include <stdbool.h> #include <time.h> int main(int argc,const char* argv[]) { int sec = time(NULL); int day = (sec/3600+8)/24+1; int year = 1970; bool is_leap = 0==year%4 && 0!=year%100 || 0==year%400; while(day >= 365+is_leap) { year++; day -= 365+is_leap; is_leap = 0==year%4 && 0!=year%100 || 0==year%400; } char arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; arr[2] += is_leap; int month = 1; while(day > arr[month]) { day -= arr[month++]; } printf("%d-%d-%d %d:%d:%d\n",year,month,day, (sec/3600+8)%24,sec/60%60,sec%60); }
练习2:随机产生10个[100,1000]之间的随机数,只允许调用10次rand
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc,const char* argv[]) { srand(time(NULL)); for(int i=0; i<10; i++) { printf("%d\n",rand() % 901 + 100); // [a,b] rand()%(b-a+1)+a } }
作业1:实现一个双色球的机选功能,红球1-33,选出6个不能重复,蓝球1-16选出一个
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc,const char* argv[]) { srand(time(NULL)); char red[6] = {},cnt = 0; printf("red:"); while(cnt < 6) { int num = rand()%33+1; int i=0; for(i=0; i<cnt; i++) { if(num == red[i]) break; } if(i == cnt) { red[cnt++] = num; printf("%d ",num); } } printf("blue: %d\n",rand()%16+1); }