C语言实现简单的抽奖系统
这是一个使用 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 步:实施核心抽签算法
这是系统的精髓部分。为了保证公平性和流程顺序,程序依次从最低奖项开始抽取:
- 防冲突校验:检查设置的奖项总人数是否超过了当前总参与人数。
- 伪随机生成:每次抽取前重新使用 `srand((unsigned)time(0));` 初始化随机数种子,并计算 `t=rand()%people;` 获取当前名单内的随机索引。
- 结果落盘与去重:找到该索引对应的记录存入对应奖项数组,随后立即调用
Delet_information()将该人从主列表中删除(通过元素覆盖移动实现)。这确保了同一个人绝对不会在同一轮中被重复抽出。
关键函数与参数说明
在处理人员池变动时,以下函数的设计值得注意:
Set_awards():负责拦截非法输入(如小于0或大于总人数的奖项数)。Delet_information():当找到匹配的strid后,直接减少全局计数器people--,并使用for循环将后面的元素向前移动一位填补空缺,维持数组的连续性。
简要总结
以上就是C语言实现简单的抽奖系统的具体代码。这段源码完整展示了 C语言 中如何处理文件 I/O、指针式的数据移动以及利用 rand/srand 进行概率性抽取的方法。更多关于 C/C++ 算法开发的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













