數據結構課程設計——CET-6報名管理系統

/*                      
 * Copyright (c) 2017,煙臺大學計算機學院                  
 * All right reserved.                      
 * 文件名稱:DS+           
 * 作者:尹娜                     
 * 完成日期:2017年12月21日                      
 * 版本號:v1.0                                       
 * 問題描述:CET-6考試報名管理系統
 * 輸入描述:考生信息輸入                     
 * 程序輸出:測試結果輸出      
*/

1.頭文件:DS+.h

typedef struct student
{
    char name[20];////考生姓名
    char num[20];/////考生准考證號
    char  id[20];/////考生身份證號
    int score;/////四級成績

}ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LinkList;
void InitList(LinkList *&L);//////初始化線性表
void DestroyList(LinkList *&L);//////銷燬線性表
void CreateListR(LinkList *&L);///////尾插法創建
void displist(LinkList *L);/////顯示考生信息(輸出線性表)
void SortList(LinkList *&L);//////排序考生信息(按准考證號/四級成績排序)
void LocateElem(LinkList *L);/////查詢考生信息(按元素值查找,(准考證號))
void change(LinkList *&L);////////修改考生信息
void Delete(LinkList *&L);/////刪除考生信息
void menu();///////創建菜單
void display(LinkList *&L);////////顯示菜單
void writedata(LinkList *&L);


2.主函數:main.cpp

#include<iostream>
using namespace std;
#include<windows.h>
#include"DS+.h"
/***********************************************************
* 功能描述:主函數
* 輸入參數:無
* 輸出參數:系統首頁
* 返回值  :無
* 其他說明:無
************************************************************/
int main()
{
    system("color 1B");
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<"\t\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
    cout<<"\t\t\t\t☆ ☆"<<endl;
    cout<<"\t\t\t\t★ ***********************★"<<endl;
    cout<<"\t\t\t\t☆ *歡迎進入 CET-6考試報名管理系統!*☆"<<endl;
    cout<<"\t\t\t\t★ ***********************★"<<endl;
    cout<<"\t\t\t\t☆ ☆"<<endl;
    cout<<"\t\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
    system("pause");
    system("cls");
    LinkList *L;
    InitList(L);//////初始化線性表
    display(L);///////顯示菜單
    DestroyList(L);/////銷燬線性表
    return 0;
}

3.外部函數:DS+.cpp

#include<iostream>
#include<string.h>
#include<malloc.h>
#include<cstring>
#include <conio.h>//用getch();
#include<fstream>//文件
#include<windows.h>//顏色
#include"DS+.h"
using namespace std;
ElemType e;
/***********************************************************
* 功能描述:初始化線性表
* 輸入參數:鏈表L
* 輸出參數:無
* 返回值  :無
* 其他說明:無
************************************************************/
void InitList(LinkList*&L)
{
    L=(LinkList*)malloc(sizeof(LinkList));
    L->next=NULL;//創建頭結點,其next域置爲NULL
}
/***********************************************************
* 功能描述:銷燬線性表
* 輸入參數:鏈表L
* 輸出參數:空鏈表
* 返回值  :無
* 其他說明:無
************************************************************/
void DestroyList(LinkList*&L)
{
    LinkList*p=L,*q=p->next;//p指向q的前驅節點
    while(q!=NULL)//掃描單鏈表
    {
        free(p);//釋放p節點
        p=q;//p, q同步後移一個節點
        q=p->next;
    }
    free(p);//循環結束時,q爲NULL,p指向尾節點,釋放p
    cout<<"\t\t\t此鏈表爲空,請重新選擇,創建鏈表"<<endl;
}
/***********************************************************
* 功能描述:採用尾插法增加考生信息
* 輸入參數:該鏈表的總人數n
* 輸出參數:無
* 返回值  :無
* 其它說明:無
************************************************************/
void CreateListR(LinkList*&L)
{
    int i,n;//n爲報考人數
    ofstream file("考生信息.txt",ios::app);
    if(!file)
    {
        cerr<<"文件打開失敗。出現未知錯誤。"<<endl;
        exit(1);
    }
    LinkList *p=L,*s;//p始終是尾節點,s爲要插入節點
    L=(LinkList*)malloc(sizeof(LinkList));
    p=L;
    cout<<"\t\t\t請輸入報考人數:";
    cin>>n;
    for(i=0; i<n; i++)
    {
        s=(LinkList*)malloc(sizeof(LinkList));
        cout<<"\t\t\t請輸入四級成績:";
        cin>>s->data.score;
        if(s->data.score<425)
        {
            cout<<"\t\t\t對不起,您暫時不能報考六級考試:"<<endl;
        }
        else
        {
            {
                cout<<"\t\t\t請輸入姓名:";
                cin>>s->data.name;
                cout<<"\t\t\t請輸入准考證號:";
                cin>>s->data.num;
                cout<<"\t\t\t請輸入身份證號:";
                cin>>s->data.id;
                file<<"姓名"<<"\t"<<"准考證號"<<"\t\t"<<"身份證號"<<"\t\t"<<"四級成績"<<"\n";
                file<<s->data.name<<"\t"<<s->data.num<<"\t\t"<<s->data.id<<"\t\t"<<s->data.score<<"\n";
                p->next=s;//將節點s插入到p後邊
                p=s;
            }
            p->next=NULL;//尾節點的next置爲NULL
            cout<<"\t\t\t報名成功"<<endl;
        }
    }
    file.close();
}
/***********************************************************
* 功能描述:顯示考生信息
* 輸入參數:無
* 輸出參數:考生信息
* 返回值  :無
* 其它說明:無
************************************************************/
void displist(LinkList*L)
{
    int i=0;
    LinkList *p=L->next;//p指向首節點
    if(p==NULL)
    {
        cout<<"\t\t\t無考生信息"<<endl;
    }
    while(p!=NULL)//循環鏈表
    {
        cout<<"\t\t\t姓名:"<<p->data.name<<endl;
        cout<<"\t\t\t准考證號:"<<p->data.num<<endl;
        cout<<"\t\t\t身份證號:"<<p->data.id<<endl;
        cout<<"\t\t\t四級成績:"<<p->data.score<<endl;
        p=p->next;//p後移
        i++;//人數加一
    }
    cout<<"\t\t\t六級報考總人數:"<<i<<"人"<<endl;
    cout<<endl;
}
/***********************************************************
* 功能描述:排序考生信息(根據准考證號或者四級成績排序)
* 輸入參數:排序後的考生信息
* 輸出參數:無
* 返回值  :無
* 其他說明:無
************************************************************/
void SortList(LinkList*&L)
{
    LinkList *p=L->next,*q,*r;
    if(p==NULL)
    {
        cout<<"\t\t\t無考生信息"<<endl;
    }
    else
    {
        for(p=L->next; p!=NULL; p=p->next)//遍歷鏈表
        {
            r=p;//記錄最小值
            q=p->next;
            for(q=p->next; q!=NULL; q=q->next)//在無序區找小於r的元素
            {
                int x;
                cout<<"\t\t\t請選擇排序類型:"<<endl;
                cout<<"\t\t\t1.按准考證號排序 2.按四級成績排序 請選擇:";
                cin>>x;
                switch(x)
                {
                    case 1:
                    if(strcmp(q->data.num,r->data.num)<0);//按考生准考證號比較
                    break;
                    case 2:
                    if(q->data.score<r->data.score);//按四級成績排序
                    break;
                }
                r=q;//記錄無序區中最小值
            }
            if(r!=p)//r ,p 兩元素交換
            {
                ElemType tmp;
                tmp=p->data;
                p->data=r->data;
                r->data=tmp;
            }
        }
        displist(L);
    }
    writedata(L);//寫入文件
}
/***********************************************************
* 功能描述:查詢考生信息
* 輸入參數:要查找的准考證號e.num
* 輸出參數:考生信息
* 返回值  :無
* 其他說明:無
************************************************************/
void LocateElem(LinkList*L)
{
    LinkList*p=L->next;
    if(p==NULL)
        cout<<"\t\t\t無考生信息"<<endl;
    else
    {
        cout<<"\t\t\t請輸入准考證號:";
        cin>>e.num;
        while(p!=NULL&&(strcmp(p->data.num,e.num)>0||strcmp(p->data.num,e.num)<0))//遍歷鏈表,比較
        {
            p=p->next;
        }
        if(p==NULL)
        {
            cout<<"\t\t\t未找到該考生准考證號";
        }
        else
        {
            cout<<"\t\t\t姓名:"<<p->data.name<<endl;
            cout<<"\t\t\t准考證號:"<<p->data.num<<endl;
            cout<<"\t\t\t身份證號:"<<p->data.id<<endl;
            cout<<"\t\t\t四級成績:"<<p->data.score<<endl;
        }
    }
}
/***********************************************************
* 功能描述:修改考生信息
* 輸入參數:要修改的考生的姓名,身份證號
* 輸出參數:修改成功
* 返回值  :無
* 其他說明:無
************************************************************/
void change(LinkList*&L)
{
    LinkList*p=L;//p指向頭節點
    if(p->next==NULL)
    {
        cout<<"\t\t\t無考生信息"<<endl;
    }
    else
    {
        cout<<"\t\t\t請輸入要修改人的准考證號:";
        cin>>e.num;//輸入准考證號
        while(p!=NULL&&(strcmp(p->data.num,e.num)>0||strcmp(p->data.num,e.num)<0))//遍歷鏈表,比較
        {
            p=p->next;
        }
        if(p==NULL)
        {
            cout<<"\t\t\t未找到該考生准考證號"<<endl;
        }
        else
        {
            cout<<"\t\t\t輸出修改前的考生信息"<<endl;
            LocateElem(L);
            cout<<"\t\t\t請再次輸入要修改人的准考證號:";
            cin>>e.num;
            if((strcmp(p->data.num,e.num)==0))
            {
                cout<<"\t\t\t請輸入要修改的姓名:";
                cin>>p->data.name;
                cout<<"\t\t\t請輸入要修改的身份證號:";
                cin>>p->data.id;
                cout<<"\t\t\t修改成功"<<endl;
                cout<<"\t\t\t輸出修改後的學生信息:"<<endl;
                LocateElem(L);
            }
            else
            {
                cout<<"\t\t\t輸入考號不同,不能修改,請重新輸入"<<endl;
                change(L);//遞歸修改
            }
        }
    }
    writedata(L);
}
/***********************************************************
* 功能描述:刪除考生信息
* 輸入參數:要刪除的考生的准考證號e.num
* 輸出參數:刪除成功
* 返回值  :無
* 其他說明:無
************************************************************/
void Delete(LinkList*&L)
{
    LinkList*p=L,*q;
    if(p->next==NULL)
    {
        cout<<"\t\t\t無考生信息"<<endl;
    }
    else
    {
        cout<<"\t\t\t請輸入要刪除的考生准考證號:";
        cin>>e.num;
        while(p->next!=NULL&&(strcmp(p->next->data.num,e.num)>0||strcmp(p->next->data.num,e.num)<0))//找與此准考證號相等的前一個節點
        {
            p=p->next;
        }
        if(p->next==NULL)
        {
            cout<<"\t\t\t未找到該考生准考證號";
        }
        else
        {
            q=p->next;//q指向存要刪除考生信息的節點
            if(q==NULL)
            {
                cout<<"\t\t\t未找到該考生准考證號";
            }
            e=q->data;
            p->next=q->next;//從鏈表中刪除q
            free(q);//釋放節點q
            cout<<"\t\t\t刪除成功"<<endl;
        }
    }
    writedata(L);
}
/***********************************************************
* 功能描述:菜單函數
* 輸入參數:無
* 輸出參數:無
* 返回值  :無
* 其他說明:無
************************************************************/
void menu()
{
    system("color 1B");
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<"\t\t\t\t◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆"<<endl;
    cout<<"\t\t\t\t║                                                ║"<<endl;
    cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳ ★CET-6考試報名管理系統★ ╳╳╳╳╳╳╳╳╳ ║"<<endl;
    cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 1.增加考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
    cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 2.顯示考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
    cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 3.排序考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
    cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 4.查詢考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
    cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 5.修改考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
    cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 6.刪除考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
    cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 0.安全退出系統 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
    cout<<"\t\t\t\t║                                                ║"<<endl;
    cout<<"\t\t\t\t◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆"<<endl;
    cout<<"\n\t\t\n\t\t\t請選擇:";
}
/***********************************************************
* 功能描述:功能選擇函數
* 輸入參數:功能序號
* 輸出參數:無
* 返回值  :無
* 其他說明:無
************************************************************/
void display(LinkList*&L)
{
    while(true)
    {
        menu();
        int x;
        cin>>x;
        switch(x)
        {
        case 1:
            CreateListR(L);//增加考生信息
            break;
        case 2:
            displist(L);//顯示考生信息
            break;
        case 3:
            SortList(L);//排序考生信息
            break;
        case 4:
            LocateElem(L);//查詢考生信息
            break;
        case 5:
            change(L);//修改考生信息
            break;
        case 6:
            Delete(L);//刪除考生信息
            break;
        case 0:
            {
                system("cls");
                cout<<endl;
                cout<<endl;
                cout<<endl;
                cout<<endl;
                cout<<endl;
                cout<<endl;
                cout<<endl;
                cout<<endl;
                cout<<"\t\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
                cout<<"\t\t\t\t☆ ☆"<<endl;
                cout<<"\t\t\t\t★ ***********************★"<<endl;
                cout<<"\t\t\t\t☆ *歡迎再次進入考試報名管理系統!*☆"<<endl;
                cout<<"\t\t\t\t★ ***********************★"<<endl;
                cout<<"\t\t\t\t☆ ☆"<<endl;
                cout<<"\t\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
                exit(0);
                break;
            }
        }
    }
}
/***********************************************************
* 功能描述:文件函數(將考生信息錄入文件)
* 輸入參數:無
* 輸出參數:無
* 返回值  :無
* 其他說明:無
************************************************************/
void writedata(LinkList*&L)
{
    LinkList*p=L->next;
    ofstream file("考生信息.txt",ios::out|ios::ate);
    if(!file)
    {
        cerr<<"文件打開失敗。"<<endl;
        exit(0);
    }
    while(p!=NULL)
    {
        file<<"姓名"<<"\t"<<"准考證號"<<"\t"<<"身份證號"<<"\t"<<"四級成績"<<endl;
        file <<p->data.name<<"\t"<<p->data.num<<"\t"<<p->data.id<<"\t"<<p->data.score<<endl;//將輸入的考生信息存入文件中
        p=p->next;
    }
    file.close();
}

運行結果:

開始界面:


(1)增加考生信息


文件:


(2)顯示考生信息


(4)查詢考生信息


(5)修改考生信息


文件:


(3)排序考生信息

a.根據考生准考證號排序:


文件:


b.根據四級成績排序:


文件:


(6)刪除考生信息:


(0)結束界面:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章