• 开源杯程序设计大赛


    大二了!!

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

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

    过了第一个学期,第一个学期的专业知识就是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;
    }
    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 << "+————————————————————————————+
    ";
            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;
    }
    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("文件打开失败!
    ");
            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");
        }
    }
    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 << "+————————————————————————————+
    ";
            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");
        }
    }
    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 << "+——————————————+
    ";
                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;
    }
    View Code

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

    //中奖用户信息
    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;
    }
    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("文件打开失败!
    ");
            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>退出
    ";
                    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;
            }
        }
    }
    View Code

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

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

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

  • 相关阅读:
    CHANGE YOUR BROWSER’S USER AGENT STRING TO VIEW IPAD READY WEBSITES
    javascript鼠标后面跟当前坐标
    四月上半月总结(雅虎面试+玩)
    the way javascript create objects
    Navigator 对象
    三月份总结(后台规范+面试)
    SVN客户端使用教程
    44种IE css bug实例测试总结(转载)
    处理兼容性问题(浮动),以及解决方法
    调用网页头部和尾部的公共部分
  • 原文地址:https://www.cnblogs.com/cjwen/p/11487046.html
Copyright © 2020-2023  润新知