C语言实现简单的抽奖系统

橘子海
橘子海
发布时间:2026-10-16 | 4人浏览过
原创

这是一个使用 C语言 编写的命令行彩票与抽奖管理程序。它主要解决了如何从外部数据源导入名单、控制奖项数量并安全地随机选出多位不重复获奖者的问题。

功能概览

该程序包含三个核心模块:

  • 人员库管理:支持从一个名为“抽奖人员名单.txt”的文件中加载参与者的编号与姓名。
  • 奖项配置:用户可以在运行时动态设定一、二、三等奖的对应名额,并具备防止超额抽取的保护机制。
  • 抽奖执行逻辑:在确定奖项人数后,利用系统时间种子生成伪随机序列,逐个抽选并移除名单中的获奖者,直到奖项满额。

准备条件

1. 开发环境:任意标准的 C/C++ 编译器(如 GCC/MinGW、Visual Studio 等)。

2. 运行环境:代码中大量使用了 Windows API 函数(如 conio.h、windows.h),因此最适合在 Windows 平台编译和运行。

3. 依赖文件:确保程序可执行文件同一目录下存在一份格式正确的“抽奖人员名单.txt”。文本格式要求每行两个字符串(ID 和 名字),中间以空格或换行分隔。

核心实现步骤

第 1 步:定义数据结构与环境变量

首先构建用于存储信息的基础结构体 struct data,并为人员列表和三个级别的获奖数组分配内存空间。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
 
struct data{
   char id[20];
   char name[20];
};
 
// 全局变量声明
int people=0; // 记录总参与人数
int people1=0, people2=0, people3=0; // 各级奖项已抽出的计数
char strid[20]; // 临时缓存用于查找匹配的中奖 ID

第 2 步:导入名单数据

启动时调用 fopen 打开本地文本文件,循环读取每一行的编号和姓名,填入到 information 数组中。这是后续操作的数据基础。

void Read_information() {
   FILE *fp = fopen("抽奖人员名单.txt","r");
   while(!feof(fp)) {
      fscanf(fp,"%s%s",information[people].id, information[people].name);
      people++;
   }
   fclose(fp);
}

第 3 步:搭建控制台菜单交互界面

为了保持命令行界面的整洁,利用 system("cls") 清理屏幕。主循环 while(1) 持续监听用户的输入:

  • 选项 1 触发抽奖逻辑。
  • 选项 2 进入子菜单,依次确认三等奖、二等奖和一等奖的人数。
  • 选项 0 退出循环结束程序。

第 4 步:实施核心抽签算法

这是系统的精髓部分。为了保证公平性和流程顺序,程序依次从最低奖项开始抽取:

  1. 防冲突校验:检查设置的奖项总人数是否超过了当前总参与人数。
  2. 伪随机生成:每次抽取前重新使用 `srand((unsigned)time(0));` 初始化随机数种子,并计算 `t=rand()%people;` 获取当前名单内的随机索引。
  3. 结果落盘与去重:找到该索引对应的记录存入对应奖项数组,随后立即调用 Delet_information() 将该人从主列表中删除(通过元素覆盖移动实现)。这确保了同一个人绝对不会在同一轮中被重复抽出。

关键函数与参数说明

在处理人员池变动时,以下函数的设计值得注意:

  • Set_awards():负责拦截非法输入(如小于0或大于总人数的奖项数)。
  • Delet_information():当找到匹配的 strid 后,直接减少全局计数器 people--,并使用 for 循环将后面的元素向前移动一位填补空缺,维持数组的连续性。

简要总结

以上就是C语言实现简单的抽奖系统的具体代码。这段源码完整展示了 C语言 中如何处理文件 I/O、指针式的数据移动以及利用 rand/srand 进行概率性抽取的方法。更多关于 C/C++ 算法开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表