开源杯程序设计大赛

大二了!!

开学了哦!好开心。又可以开始上课,学习新知识了,转眼都已经大二了,想想刚踏进大学校园的心情,心慌、期待、遗憾、奋起.....

回顾过去的一年,第一个学期觉得各种惊奇、大学生活的自由,时间由自己支配,现在回忆却又没有觉得自己是真正利用好了时间,迷迷糊糊就

过了第一个学期,第一个学期的专业知识就是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 << "\n";
        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 << "错误!未找到文件!\n\n" << 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 << "\n";
    }
    else {
        for (int i = 0; i < 3; i++)
        {

            cout << "+——————————————+\n";
            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 << "+——————————————+\n";
        }
    }
    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 << "------------------------\n";
    }

    return OK;
}

用户显示

Status DisplayUser(LinkList L)
{
    cout << "+——————————————————————————————————+\n";
    LNode *p;
    p = L->next;
    while (p != L && p != NULL) {
        cout << p->data;
        p = p->next;
    }
    cout << "+——————————————————————————————————+\n";
    return OK;
}
View Code

用户数量

int Usernumber(LinkList L) {
    int i = 0;
    LNode *p = L->next;
    while (p != NULL) {
        ++i;
        p = p->next;
    }
    return i;
}
View Code

下面这个函数是将数字字符串转化为整型的数字,这里是将奖品数量转化为整型数字,方便后面循环抽奖次数

//奖品数量转化为整型
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 << "+————————————————————————————+\n";
        cout << "|                                                        |\n";
        cout << "|         按p键暂停    Press ‘p’ key to BackUp         |\n";
        cout << "|                                                        |\n";
        cout << "|          Who Will Be The Luck Student ?                |\n";
        cout << "+————————————————————————————+\n";
        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("文件打开失败!\n");
        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, "\n");
        }
        p = p->next;
    }
    fclose(fp1);
    return OK;
}
View Code

获奖用户数据保存(和上一个函数没啥区别,多了一个成员即中奖信息,写入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("文件打开失败!\n");
        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, "\n");
        }
        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 << "+————————————————————————————+\n";
        cout << "|                                                        |\n";
        cout << "|         按p键暂停    Press ‘p’ key to Suspend        |\n";
        cout << "|                                                        |\n";
        cout << "|          Who Is The Luck Student ?                     |\n";
        cout << "|                                                        |\n";
        cout << "+————————————————————————————+\n";
        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");
    }
}
View Code

多组抽奖(每一种奖品数量一次抽完)

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 << "+————————————————————————————+\n";
        cout << "|                                                        |\n";
        cout << "|         按p键暂停    Press ‘p’ key to Suspend        |\n";
        cout << "|                                                        |\n";
        cout << "|          Who Will Be The Luck Students ?               |\n";
        cout << "|                                                        |\n";
        cout << "+————————————————————————————+\n";

        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");
    }
}
View Code

抽奖功能

//抽奖
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 << "+——————————————+\n";
            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 << "+——————————————+\n";

            cout << "<1> 单组抽奖  <2> 多组抽奖\n";
            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;
}
View Code

中奖用户信息、中奖用户显示

//中奖用户信息
Status LuckUser(LinkList &L)
{
    fstream file;
    file.open("LuckUser.txt");
    if (!file) {
        cout << "暂无中奖信息!\n\n" << 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 << "+————————————————————————————————————————+\n";
    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 << "+————————————————————————————————————————+\n";
    return OK;
}
View Code

清楚中奖记录

//清楚中奖记录
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("文件打开失败!\n");
        exit(0);
    }
    if (p == NULL) {
        fprintf(fp1, "  ");
    }
    fclose(fp1);
    return OK;
}
View Code

功能键设置

//功能函数
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>退出\n";
                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 << "报名成功!祝你好运!\n";
                }
                else if (m == 4)
                    break;
            }
        }
        else if (a == 'd') {
            if (!strcmp(prize[0].prizename, "0"))
            {
                cout << "请设置奖项。" << endl;
                cout << "\n";
                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;
        }
    }
}
View Code

差不多就已经完成了。下面main:

int main()
{

    LinkList L;
    InitList(L);
    CreateList(L);
    Function(L);
    system("cls");
    return 0;
}

运行结果就算了,懒得写了,有时间再说吧

猜你喜欢

转载自www.cnblogs.com/cjwen/p/11487046.html
今日推荐