C语言 第三章 函数(3)
目录
函数原型
认识:
举例:
实例1
实例2
随机数函数
重新播种
函数原型
函数必须先声明,后使用。由于程序总是先运行main()函数,所以其它函数都必须在main()之前声明。
#include <stdio.h>
void func1() {
//...
}
void func2() {
//...
}
int main() {
func1();
func2();
return 0;
}
注:上面代码中,main()函数必须在最后声明,否则编译时会产生警告,找不到func1()或func2()的声明。
#include <stdio.h>
int main() {
func1(); //报错
func2(); //报错
return 0;
}
void func1() {
//...
}
void func2() {
//...
}
- 对于函数较多的程序,保证每个函数的顺序正确,会变得很麻烦。
- C 语言提供的解决方法是,只要在程序开头处给出函数原型。
int add(int, int); //函数原型
int main() {
int m = 10, n = 20;
int sum = add(m, n);
printf("sum = %d\n", sum);
}
int add(int num1, int num2) {
return num1 + num2;
}
认识:
- 所谓函数原型(function prototype),就是函数在调用前提前告诉编译器每个函数的基本信息(它包括了返回值类型、函数名、参数个数、参数类型和参数顺序,其它信息都不需要(不用包括函数体、参数名),函数具体的实现放在哪里,就不重要了。
- 在函数调用时,检查函数原型和函数声明是否一致,只要一致就可以正确编译、调用。
- 函数原型中包括参数名也可以,虽然这样对于编译器是多余的,但是阅读代码时,有助于理解函数的意图。
int add(int, int);
// 等同于
int add(int num1, int num2);
举例:
实例1
#include <stdio.h>
// 函数原型
int add(int, int);
int main() {
int num1 = 5;
int num2 = 3;
int result = add(num1, num2); // 调用函数
printf("sum: %d\n", result);
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}
实例2
#include <stdio.h>
int add(int, int);
int max(int, int);
int main() {
int res = add(10, 15);
printf("%d", res);
return 0;
}
int add(int a, int b){
return a+b;
}
int max(int a, int b){
return (a>b)?a:b;
}
随机数函数
在实际编程中,我们经常需要生成随机数,例如,扑克牌游戏中随机发牌、猜数字等。
在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数.
它的用法为:
- int rand(void); , void 表示不需要传递参数。
rand() 会随机生成一个位于0 ~ RAND_MAX 之间的整数。
RAND_MAX 是 <stdlib.h> 头文件中的一个宏,它用来指明 rand() 所能返回的随机数的最大值。C语言标准并没有规定 RAND_MAX 的具体数值,只是规定它的值至少为32767(2^15)。
#include <stdio.h>
#include <stdlib.h>
int main() {
int a = rand();
printf("%d\n",a);
return 0;
}
多次运行上面的代码,你会发现每次产生的随机数都一样,这是怎么回事呢?为什么随机数并不随机呢?
实际上, rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”。
种子在每次启动计算机时是随机的,但是一旦计算机启动以后它就不再变化了;也就是说,每次启动计算机以后,种子就是定值了,所以根据公式推算出来的结果(也就是生成的随机数)就是固定的。
重新播种
我们可以通过 srand() 函数来重新“播种”,这样种子就会发生改变。
srand() 的用法为:
void srand(unsigned int seed);
- 它需要一个 unsigned int 类型的参数。在实际开发中,我们可以用时间作为参数,只要每次播种的时间不同,那么生成的种子就不同,最终的随机数也就不同。
- 使用 <time.h> 头文件中的 time() 函数即可得到当前的时间(精确到秒),就像下面这样:
- srand((unsigned)time(NULL));
对上面的代码进行修改,生成随机数之前先进行播种:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int a;
srand((unsigned)time(NULL));
a = rand();
printf("%d\n", a);
return 0;
}
生成一定范围内的随机数
在实际开发中,我们往往需要一定范围内的随机数,过大或者过小都不符合要求,那么,如何产生一定范围的随机数呢?我们可以利用取模的方法:
我们可以利用取模的方法:
int a = rand() % 10; //产生0-9的随机数,注意10会被整除
//如果要规定上下限:
int a = rand() % 51 + 13; //产生13-63的随机数
解析:
取模即取余,rand()%51+13我们可以看成两部分:
- rand()%51是产生0-50的随机数,
- 后面+13保证a最小只能是13,最大就是50+13=63。
最后给出产生13-63范围内随机数的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int a;
srand((unsigned)time(NULL));
a = rand() % 51 + 13;
printf("%d\n",a);
return 0;
}