大二了!!
开学了哦!好开心。又可以开始上课,学习新知识了,转眼都已经大二了,想想刚踏进大学校园的心情,心慌、期待、遗憾、奋起.....
回顾过去的一年,第一个学期觉得各种惊奇、大学生活的自由,时间由自己支配,现在回忆却又没有觉得自己是真正利用好了时间,迷迷糊糊就
过了第一个学期,第一个学期的专业知识就是Linux中命令行学习C语言,初步了解编程语言。
转眼啊就是大一下了,第二个学期,每周课程有点多但是还好,我喜欢忙碌的感觉。这学期啊我遇到了一个很棒的老师,也是好朋友吧。
今天!已经大二成为学长了,但我深深感觉到了自己的垃圾,一点成绩都没有。算了吧,慢慢来。刚开学便是两周的实训课,要求从四道题中选一题。
第一个是 编写一个命令行下局域网p2p聊天程序。但是我们还没怎么接触过网络程序,所以暂时放一放。等我完成任务后再去了解一下。
第二个是 一个抽奖程序(我们组就是选的这个)
第三个:演示二叉树,要求画出来。(我刚开始看到这个题,就是感叹这个世界好巧啊,上学期数据结构学到二叉树时,我就不满意二叉树显示的时候
只能是按顺序输出节点值,不能直观的展示一颗二叉树。于是我就向老师提出能不能把树画出来,做了一些想法,应该不难,没想到今儿个开学就碰上了这
题,算是我押中题目了吗哈哈哈哈)
还有一个第四题,我觉得很简单就算了吧,懒得说了。
这是以小组(5~6人)为单位,在两周之内必须要拿出一个大概的程序(可以有瑕疵),在第六周之前必须完善并完成报告问答同时进行答辩。
好了,不多BB了,进正题。
我们这个抽奖程序的要求在上面已经介绍了。
首先是结构体定义,顺便符号重载,方便后面输入,这里成员都是char型,方便后面写入文件保存。
//抽奖用户结构体定义 typedef struct Student { char name[30]; char id[15]; char grade[10]; char major[30]; char Class[30]; char status[30]= { "0" };//是否中奖 //符号重载 friend ostream &operator << (ostream &i, Student& b) { cout << "|" << b.id << setw(15) <<b.name << setw(15)<< b.grade << setw(15) << b.major << setw(10) << b.Class << "|" << endl; return i; } friend istream &operator >> (istream &i, Student& b) { cout << "请输入学号:"; i >> b.id; cout << "请输入姓名:"; i >> b.name; cout << "请输入专业:"; i >> b.major; cout << "请输入年级:"; i >> b.grade; cout << "请输入班级:"; i >> b.Class; cout << " "; return i; } }Student;
typedef struct Prize { char prizename[30];//奖品等级 char content[100];//奖品内容 char num[3];//奖品数量 }Prize;
下面就是基本操作了,单链表存储用户数据
//单链表存储数据 typedef struct LNode { Student data; struct LNode *next; }LNode, *LinkList; //初始化链表 Status InitList(LinkList &L) { L = new LNode; L->next = NULL; return OK; } //链表删除 Status ListDelete(LinkList &L) { LNode *p; p = L->next; while (p != NULL) { LNode *q; q = p; p = p->next; delete q; } delete p; return OK; }
从User.txt文件中读取参与抽奖用户的信息:
//从Uer.txt文件读入用户信息 Status CreateList(LinkList &L) { fstream file; file.open("User.txt"); if (!file) { cout << "错误!未找到文件! " << endl; exit(ERROR); } LNode *p, *r; r = new LNode; r = L; while (file.peek() != EOF) { p = new LNode; file >> p->data.id >> p->data.name >> p->data.major >> p->data.grade >> p->data.Class; r->next = p; p->next = NULL; r = p; } return OK; }
抽奖项目信息简介
Status Information(Prize prize[]) { cout << ("+----------------------------------------------------------------------------------------------+") << endl; cout << ("| 抽奖信息简介 |") << endl; cout << ("| 为回馈大家消费,本APP开展一次面向学生的抽奖活动。只需输入个人姓名,性别,学号, |") << endl; cout << ("| 年级系别和个人简介,你就有机会在每次消费后获得一次抽奖机会!有一等、二等、三等三种奖项, |") << endl; cout << ("| 奖品丰厚,数量有限! |") << endl; cout << ("+----------------------------------------------------------------------------------------------+") << endl; if (!strcmp(prize[0].prizename, "0")) { cout << "请设置奖项。" << endl; cout << " "; } else { for (int i = 0; i < 3; i++) { cout << "+——————————————+ "; cout << "|奖品等级:" << setfill(' ') << setw(15) << prize[i].prizename << setfill(' ') << setw(4) << "|" << endl; cout << "|" << setfill(' ') << setw(29) << "|" << endl; cout << "|内容:" << setfill(' ') << setw(18) << prize[i].content << setfill(' ') << setw(5) << "|" << endl; cout << "|" << setfill(' ') << setw(29) << "|" << endl; cout << "|数量:" << setfill(' ') << setw(18) << prize[i].num << setfill(' ') << setw(5) << "|" << endl; cout << "+——————————————+ "; } } return OK; }
录入奖品信息:
Status CreatePrize(Prize prize[]) { cout << "设置奖项:" << endl; for (int i = 0; i < 3; i++) { cout << "请输入奖品等级:" << endl << endl; cin >> prize[i].prizename; cout << endl << "请输入奖品内容:" << endl << endl; cin >> prize[i].content; cout << endl << "请输入数目:" << endl << endl; cin >> prize[i].num; cout << "------------------------ "; } return OK; }
用户显示
Status DisplayUser(LinkList L) { cout << "+——————————————————————————————————+ "; LNode *p; p = L->next; while (p != L && p != NULL) { cout << p->data; p = p->next; } cout << "+——————————————————————————————————+ "; return OK; }
用户数量
int Usernumber(LinkList L) { int i = 0; LNode *p = L->next; while (p != NULL) { ++i; p = p->next; } return i; }
下面这个函数是将数字字符串转化为整型的数字,这里是将奖品数量转化为整型数字,方便后面循环抽奖次数
//奖品数量转化为整型 int Change(Prize prize[]) { int prizenum[3]; for (int i = 0; i <= 2; i++) { const char *ptr = prize->num; int prizeNum = 0; while (*ptr) { prizeNum *= 10; prizeNum += *ptr - '0'; ptr++; } prizenum[i] = prizeNum; } return *prizenum; }
滚动显示用户,这里用了系统函数:system("cls"); Sleep(100);//进程暂停100ms
第一个是清屏函数,第二个是程序暂停函数,配合使用可以展示出闪烁显示的效果。
//滚动显示 Status DynamicDisplay(LinkList L, int x) { LNode *p; srand((int)time(0));//生成随机数种子 int Num = 0; system("cls"); while (1) { cout << "+————————————————————————————+ "; cout << "| | "; cout << "| 按p键暂停 Press ‘p’ key to BackUp | "; cout << "| | "; cout << "| Who Will Be The Luck Student ? | "; cout << "+————————————————————————————+ "; for (int group = 1; group <= 4; group++) { Num = random(x); p = L->next; for (int i = 1; i < Num + 1; i++) { p = p->next; } cout << " " << p->data.id << " " << p->data.name << endl; } Sleep(100);//进程暂停100ms if (GetAsyncKeyState('P')) { system("pause"); system("cls"); break; } system("cls"); } return OK; }
用户数据保存
Status SaveData(LinkList L) { LNode *p; p = L->next; FILE* fp1; errno_t err; err = fopen_s(&fp1, "User.txt", "w"); if (err != 0) { printf("文件打开失败! "); exit(0); } while (p != NULL) { fputs(p->data.id , fp1); fprintf(fp1, " "); fputs(p->data.name, fp1); fprintf(fp1, " "); fputs(p->data.major, fp1); fprintf(fp1, " "); fputs(p->data.grade, fp1); fprintf(fp1, " "); fputs(p->data.Class, fp1); if (p->next != NULL) { fprintf(fp1, " "); } p = p->next; } fclose(fp1); return OK; }
获奖用户数据保存(和上一个函数没啥区别,多了一个成员即中奖信息,写入LuckUser.txt文件中)
Status SaveLuckData(LinkList L) { LNode *p; p = L->next; FILE* fp1; errno_t err; err = fopen_s(&fp1, "LuckUser.txt", "w"); if (err != 0) { printf("文件打开失败! "); exit(0); } while (p != NULL) { fputs(p->data.id, fp1); fprintf(fp1, " "); fputs(p->data.name, fp1); fprintf(fp1, " "); fputs(p->data.major, fp1); fprintf(fp1, " "); fputs(p->data.grade, fp1); fprintf(fp1, " "); fputs(p->data.Class, fp1); fprintf(fp1, " "); fputs(p->data.status , fp1); if (p->next != NULL) { fprintf(fp1, " "); } p = p->next; } fclose(fp1); return OK; }
单组抽奖(一次抽一个人,滚动效果显示)
LinkList SingleUnit(LinkList L, int x,Prize prize[]) { LinkList L1;//中奖用户存储在L1; InitList(L1); LNode *r = new LNode; r = L1; LNode *p; //int n = Usernumber(L); srand((int)time(0));//生成随机数种子 int Num = 0; int i = 0; while (1) { Num = random(x); p = L->next; for (int i=1; i < Num + 1; i++) { p = p->next; } //已中奖用户排除 if (strcmp(p->data.status, "0")) { if (p->next == NULL) p = L->next; else p = p->next; } cout << "+————————————————————————————+ "; cout << "| | "; cout << "| 按p键暂停 Press ‘p’ key to Suspend | "; cout << "| | "; cout << "| Who Is The Luck Student ? | "; cout << "| | "; cout << "+————————————————————————————+ "; cout << " " << p->data.id << " " << p->data.name << endl; Sleep(20);//进程暂停30ms if (GetAsyncKeyState('P')) { system("pause"); strcpy_s(p->data.status, prize->prizename);//中奖 LNode *q = new LNode; q->data = p->data; r->next = q; q->next = NULL; r = q; i++; if (i == Change(prize)) return L1->next ; } system("cls"); } }
多组抽奖(每一种奖品数量一次抽完)
LinkList MultiGroup(LinkList L,int x,Prize prize[] ) { LinkList L1;//中奖用户存储在L1; InitList(L1); LNode *r = new LNode; LNode *p; int n = Usernumber(L); srand((int)time(0));//生成随机数种子 int Num = 0; int i = 0; while (1) { r = L1; cout << "+————————————————————————————+ "; cout << "| | "; cout << "| 按p键暂停 Press ‘p’ key to Suspend | "; cout << "| | "; cout << "| Who Will Be The Luck Students ? | "; cout << "| | "; cout << "+————————————————————————————+ "; for (int group = 1; group <= Change(prize); group++) { Num = random(x); p = L->next; for (int i = 1; i < Num + 1; i++) { p = p->next; } //已中奖用户排除 if (strcmp(p->data.status, "0")) { if (p->next == NULL) p = L->next; else p = p->next; } LNode *q = new LNode; q->data = p->data; r->next = q; q->next = NULL; r = q; cout << " " << p->data.id << " " << p->data.name << endl; } Sleep(20);//进程暂停30ms if (GetAsyncKeyState('P')) { system("pause"); LNode *q = new LNode; q = L1->next; while (q != NULL) { strcpy_s(q->data.status, prize->prizename);//中奖 q = q->next; } return L1->next; } ListDelete(L1); system("cls"); } }
抽奖功能
//抽奖 LinkList Lottery(LinkList L, Prize prize[]) { LinkList L1;//中奖用户存储在L1 InitList(L1); LNode *r = new LNode; r = L1; for (int i = 2; i >=0 ; i--) { cout << "+——————————————+ "; cout << "|奖品等级:" << setfill(' ') << setw(15) << prize[i].prizename << setfill(' ') << setw(4) << "|" << endl; cout << "|" << setfill(' ') << setw(29) << "|" << endl; cout << "|内容:" << setfill(' ') << setw(18) << prize[i].content << setfill(' ') << setw(5) << "|" << endl; cout << "|" << setfill(' ') << setw(29) << "|" << endl; cout << "|数量:" << setfill(' ') << setw(18) << prize[i].num << setfill(' ') << setw(5) << "|" << endl; cout << "+——————————————+ "; cout << "<1> 单组抽奖 <2> 多组抽奖 "; int m, n; n = Usernumber(L); cin >> m; while (r->next != NULL) r = r->next; if (m == 1) {//单抽 r->next = SingleUnit(L, n, prize + i);//prize+i为奖项等级 system("cls"); } else if (m == 2) {//多抽 r->next = MultiGroup(L, n, prize + i); system("cls"); } } return L1; }
中奖用户信息、中奖用户显示
//中奖用户信息 Status LuckUser(LinkList &L) { fstream file; file.open("LuckUser.txt"); if (!file) { cout << "暂无中奖信息! " << endl; exit(ERROR); } LNode *p, *r; r = new LNode; r = L; while (file.peek() != EOF) { p = new LNode; file >> p->data.id >> p->data.name >> p->data.major >> p->data.grade >> p->data.Class >> p->data.status; r->next = p; p->next = NULL; r = p; } } //中奖用户显示 Status DisplayLuckUser(LinkList L) { cout << "+————————————————————————————————————————+ "; LNode *p; p = L->next; while (p != L && p != NULL) { cout << "|" << p->data.id << setw(15) << p->data.name << setw(15) << p->data.grade << setw(15) << p->data.major << setw(10) << p->data.Class << setw(8)<<p->data .status <<"|" << endl; p = p->next; } cout << "+————————————————————————————————————————+ "; return OK; }
清楚中奖记录
//清楚中奖记录 Status DeleteLuckData(LinkList L) { LNode *p; p = L->next; FILE* fp1; errno_t err; err = fopen_s(&fp1, "LuckUser.txt", "w"); if (err != 0) { printf("文件打开失败! "); exit(0); } if (p == NULL) { fprintf(fp1, " "); } fclose(fp1); return OK; }
功能键设置
//功能函数 void Function(LinkList L) { Prize prize[3] = { "0" }; while (1) { cout << "a信息简介 b 奖项设置 c参与者 d 抽奖 e 中奖记录 f 退出" << endl; char a; a = _getwch(); system("cls"); if (a == 'a') {//信息简介 Information(prize); } else if (a == 'b') {//奖项设置 CreatePrize(prize); cout << "奖品录入成功!" << endl; _getwch(); system("cls"); } else if (a == 'c') {//显示参与者信息 int m; while (1) { cout << " <1> 直接显示 <2> 滚动显示 <3>报名参与 <4>退出 "; cin >> m; system("cls"); if (m == 1) {//直接显示 DisplayUser(L); } else if (m == 2)//滚动显示 { DynamicDisplay(L, Usernumber(L)); } else if (m == 3) {//增加用户并保存数据 LNode *p = L->next; LNode *q = new LNode; cin >> q->data; while (p->next != NULL) p = p->next; p->next = q; q->next = NULL; SaveData(L); cout << "报名成功!祝你好运! "; } else if (m == 4) break; } } else if (a == 'd') { if (!strcmp(prize[0].prizename, "0")) { cout << "请设置奖项。" << endl; cout << " "; CreatePrize(prize); cout << "奖品录入成功!" << endl; _getwch(); system("cls"); } SaveLuckData(Lottery(L, prize)); } else if (a == 'e') {//中奖记录查询 LinkList L1; InitList(L1); LuckUser(L1); DisplayLuckUser(L1); cout << "是否清除历史中奖记录? y/n" << endl; char ch = _getwch(); if (ch == 'y') { ListDelete(L1); DeleteLuckData(L1); } } else if (a == 'f') {//退出 break; } } }
差不多就已经完成了。下面main:
int main() { LinkList L; InitList(L); CreateList(L); Function(L); system("cls"); return 0; }
运行结果就算了,懒得写了,有时间再说吧