c语言学习第五天

什么是函数:
函数就一是一段具有某项功能的代码,它是C语言中管理代码的最小单位,把具有某功能的若干行代码封装在函数中方便管理代码且方便重复调用。
函数的分类:
标准库函数:C语言标准委员会为C程序员以函数形式提供了一些基础功能,这些函数被封装在libc.so库文件中。
系统函数:操作系统为程序员提供了一些系统API,可以以函数形式调用,但它们不是真正的函数,讲UNIX系统环境编程时会详细讲解。
第三方库函数:一些公司或开源组织实现的一些常用工具供程序使用。
自定义函数:为了更方便的管理、调用,程序员自己封装的一些函数。

常用标准库函数介绍:
标准库中除上封装了函数,还提供一些头文件,里面是对函数的说明:
stdio.h 输入输出相关功能的函数
int printf(const char *format, …);
功能:输出数组到终端
format:提示信息+占位符+转义字符组成
…:若干个变量名或数据
返回值:成功输出的字符个数
int scanf(const char *format, …);
功能:从终端读取数据
format:一般情况下,只需要占位符即可,除了占位符以外的信息,在输入数据时要原样补出。
…:若干个变量的地址
返回值:成功读取的变量个数
stdlib.h 实用的库函数
int system(const char *command);
功能:调用系统命令,命令执行完成后,该函数才返回
返回值:成功返回0,失败返回-1。
void srand(unsigned int seed);
功能:所谓的随机数就是把所有整数打乱顺序,从某个位置获取,默认从1位置获取,程序运行时如果"位置"不发放,获取随机数与上次一样,为了保证每个运行时,提的位置都发生变化,一般把time函数的返回值提供给srand作为随机数的种子。
int rand(void);
功能:从系统中获取随机数
返回值:都是正整数,如果需要负数或浮点数,需要程序员自已处理。
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 到现在一共过了多少秒,格林时间。
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参数

练习1:输出10个100~1000之间的随机数。
    rand() % (b-a)+a =>  [a,b)
练习2:随机生成一注福利彩票。
    红球6个,范围:1~33
    蓝球1个,范围:1~16
练习3:在10*10的二维数组中,随机生成20个地雷,在不是地雷的位置计算出周边有多少个地雷。

自定义函数:
有两情况适合把代码封装成自定义函数:
1、代码量过多,一般代码量超过50就要考虑封装成函数,方便管理代码。
2、如果一个代码需要在不同位置多次执行,为了防止出现代码冗余,就要把它封装成函数,方便重复使用。

函数声明:
返回值类型 函数名(参数列表);
1、根据函数的功能为函数取名字,在Linux系统下函数全部小写,用下划线分隔。
2、参数列表,指的是函数执行时,调用者需要传递它的数据,此时重点关注的是函数的类型,如果函数执行时不需要调用者传递数据则写void。
3、返回值类型,指的是函数的执行结果是什么类型数据,如果函数没有返回值,则写void。
4、函数声明就是告诉编译器该函数的格式,方便编译器检查调用者。

函数定义:
返回值类型 函数名(类型 参数名)
{
// 函数体
}
如果函数的定义出现在调用之前,函数声明可以省略,
注意:函数要与函数定义一起编译,防止出现声明与定义不符,导致执行结果出现问题。
函数调用:
函数名(实参);
1、调用者会把实参的值赋值给形参变量。
2、函数的返回值会放置在调用位置,可立即使用,也可用变量保存。
练习4:实现一个函数,用于判断一个年份是否是闰年,调用它计算出自公元元年到现在一共有多少个闰年。

练习5:实现一个函数,用于判断一个整数是否素数,调用它计算出100~1000之间所有的素数。

练习6:输入一个日期(yyyy-mm-dd),计算它与2008-8-1相隔多少天。

自定义函数要注意的问题:
1、函数的命名空间互相独立。

2、函数之间传参是单身值传递。

3、C语言中规则如果函数的参数列表是空的,则意味着该函数提供任意类型、多个参数都可以调用,容易给调用者造成误会,影响代码的可读性。

4、如果函数有返回值但没有写return语句,调用该函数时依然有返回值。
当调用一个有返回的函数时,系统会为调用者和被调用者约定一个空间用于存储返回值,而return语句的作用就是把一个数据存储到这个空间,如果没有写return语句,调用者依然会从共用空间读取返回值,只是读取到的数据是随机的。
gcc -Wall -Werror xxx.c 可以防止漏写return语句。
5、当使用数组作为函数的参数时,数组会蜕变成指针,无法使用sizeof计算数组的长度,需要调用者额外提供一个参数作为数组的长度。

6、当使用二维数组作为函数的参数时,C语言规则定义二维数组时必须有列数,所以要行、列数在前,数组在后,并且把列数设置给数组。

作业:
1、实现一个整型数组排序的函数。

2、实现一个合并两个有序数组的函数,让数组依然保持有序,把数组2中的数据添加到数组1中。
void merge_arr(int arr1[],size_t len1,int arr2,size_t len2);

3、实现一个对有序数组查找函数函数,返回key在数组中的位置。
int find_arr(int arr[],size_t len,int key);
返回值:找到返回 0 ~ len-1,找不到则返回-1。

4、实现一个洗牌函数。
void rand_poker(int arr[],size_t len)

5、实现一个摇奖程序,假如一家公司开年会,要抽出3个一等奖,5个二等奖,8个三等将,已知该公司员工的工号范围是1001~9999,员工不能重复得奖。

你可能感兴趣的:(c语言,学习,开发语言)