当前位置: 首页 > news >正文

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;
}

相关文章:

  • 一文讲懂Go语言如何使用配置文件连接数据库
  • DeepSeek使用教程--教师领域方面的提示词库
  • cursor终端中文乱码的解决方案
  • C# 类型转换基本概念
  • TCP三次握手,四次挥手;多进程、多线程实现并发服务器
  • 聊天服务器分布式改造
  • 春节面对大流量并发,系统该如何设计
  • HttpServletRequest 和 HttpServletResponse 区别和作用
  • 力大砖飞,纯暴力搜索——蓝桥p2110(写着玩的)
  • vue3 遇到babel问题(exports is not defined) 解决方案
  • 【水调歌头·排序篇】--体验快排与归并的奥妙
  • Mac服务器上创建Docker并安装宝塔环境
  • 2025最新软件测试面试八股文(含答案+文档)
  • Java 中数据脱敏的实现
  • 前端快速搭建Node服务(解决跨域问题)
  • MySQL进阶-关联查询优化
  • The Wedding Juicer POJ - 2227
  • linux下进程间通信方式(匿名管道)
  • 直装永久授权,最新专业版集成VB7
  • 接口-菜品分页查询
  • 建设局网站施工合同范本/福建seo快速排名优化
  • 常州做网站公司/拼多多关键词排名在哪里看
  • 北京网站搭建方案/谈谈自己对市场营销的理解
  • 政务网站建设 发言/百度浏览器网页版
  • 软件制作视频/上海专业seo排名优化
  • 大厂做网站shijuewang/发布平台有哪些