模拟微信红包,实现同学群红包金额生成功能。 编程要求: 1、同学群的基本信息存放在一文本文件中,包括每位同学的学号、姓名; 2、每位同学都要能够得到红包; 3、每位同学得到的红包金额随机; 4、每位同学得到的红包金额总和=总金额; 5、程序交互界面显示: 1)录入红包总金额 2)显示最佳手气者(显示:学号 姓名 红包金额) 3)按学号显示红包金额(升序显示:学号 姓名 红包金额) 4)按手气显示红包金额(降序显示:学号 姓名 红包金额) 5)退出 6、每位同学得到的红包金额存入另一文本文件,内容包括每位同学的学号、姓名、红包金额。
时间: 2024-03-02 22:53:51 浏览: 97
模拟(模仿)微信抢红包
好的,要实现同学群红包金额生成功能,我们可以按照以下步骤进行:
1. 定义一个学生结构体,包括学号、姓名和红包金额三个成员。
2. 读取存放同学信息的文本文件,将每位同学的学号、姓名存入一个结构体数组中,并初始化每位同学的红包金额为0。
3. 录入红包总金额,并根据学生人数随机生成每位同学的红包金额。
4. 将每位同学的红包金额按照学号升序或手气降序排列,并输出。
5. 将每位同学的学号、姓名和红包金额存入另一个文本文件中。
具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最大同学数
// 学生结构体
typedef struct {
char id[20]; // 学号
char name[20]; // 姓名
double redPacket; // 红包金额
} Student;
// 读取同学信息
int readStudentInfo(Student students[]) {
int n = 0; // 学生数量
FILE *fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("无法打开文件!\n");
exit(1);
}
while (fscanf(fp, "%s %s", students[n].id, students[n].name) != EOF) {
students[n].redPacket = 0.0;
n++;
}
fclose(fp);
return n;
}
// 发红包
void sendRedPacket(double totalMoney, int num, Student students[]) {
// 定义随机数序列
double randNum[num];
double sum = 0.0;
// 生成随机数序列
for (int i = 0; i < num; i++) {
randNum[i] = (double)rand() / RAND_MAX;
sum += randNum[i];
}
// 按照随机数分配红包金额
double leftMoney = totalMoney;
for (int i = 0; i < num; i++) {
students[i].redPacket = leftMoney * randNum[i] / sum;
leftMoney -= students[i].redPacket;
}
}
// 按学号升序排列
void sortByID(Student students[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if (strcmp(students[i].id, students[j].id) > 0) {
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
}
// 按手气降序排列
void sortByRedPacket(Student students[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if (students[i].redPacket < students[j].redPacket) {
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
}
// 显示最佳手气者
void showBestLuck(Student students[], int n) {
int bestLuck = 0;
for (int i = 1; i < n; i++) {
if (students[i].redPacket > students[bestLuck].redPacket) {
bestLuck = i;
}
}
printf("最佳手气者:学号 %s 姓名 %s 红包金额 %.2f 元\n", students[bestLuck].id, students[bestLuck].name, students[bestLuck].redPacket);
}
// 按学号显示红包金额
void showByStudentID(Student students[], int n) {
sortByID(students, n);
printf("按学号显示:\n");
for (int i = 0; i < n; i++) {
printf("学号 %s 姓名 %s 红包金额 %.2f 元\n", students[i].id, students[i].name, students[i].redPacket);
}
}
// 按手气显示红包金额
void showByRedPacket(Student students[], int n) {
sortByRedPacket(students, n);
printf("按手气显示:\n");
for (int i = 0; i < n; i++) {
printf("学号 %s 姓名 %s 红包金额 %.2f 元\n", students[i].id, students[i].name, students[i].redPacket);
}
}
// 存储红包金额
void saveRedPacket(Student students[], int n) {
FILE *fp = fopen("redpacket.txt", "w");
if (fp == NULL) {
printf("无法打开文件!\n");
exit(1);
}
for (int i = 0; i < n; i++) {
fprintf(fp, "%s %s %.2f\n", students[i].id, students[i].name, students[i].redPacket);
}
fclose(fp);
}
int main() {
srand((unsigned)time(NULL)); // 初始化随机数种子
Student students[MAX_STUDENT_NUM]; // 学生数组
int n = readStudentInfo(students); // 读取学生信息
double totalMoney; // 红包总金额
printf("请输入红包总金额:");
scanf("%lf", &totalMoney);
sendRedPacket(totalMoney, n, students); // 发红包
saveRedPacket(students, n); // 存储红包金额
int choice;
do {
printf("\n");
printf("请选择操作:\n");
printf("1. 显示最佳手气者\n");
printf("2. 按学号显示红包金额\n");
printf("3. 按手气显示红包金额\n");
printf("4. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
showBestLuck(students, n);
break;
case 2:
showByStudentID(students, n);
break;
case 3:
showByRedPacket(students, n);
break;
case 4:
break;
default:
printf("无效的选择,请重新输入!\n");
break;
}
} while (choice != 4);
return 0;
}
```
运行代码后,即可录入红包总金额,随机生成每位同学的红包金额,并进行操作选择,输出相应结果。
阅读全文