學生資訊管理系統(c語言實訓)

life4711發表於2014-06-26

C語言實訓,老師讓寫一個學生資訊管理系統,要求如下:

注:本文非ACM題目,用到最多的東西是關於連結串列和指標的操作。

       對於連結串列的排序我用的是交換節點的內容選擇排序。本來想著用改變指標的方法,寫了一半腦子就亂了T_T                                            

我的程式碼:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define N 1000
using namespace std;

void start()
{
    cout<<endl<<"     ==================================================================="<<endl;
    cout<<endl<<"    |   ★    ★    ★    ★     ★    ★     ★     ★    ★     ★    |"<<endl;
    cout<<endl<<"    |              歡迎來到 **東北林業高中** 教育資訊平臺               |"<<endl;
    cout<<endl<<"    |                                                                   |"<<endl;
    cout<<endl<<"    |                                Author---計算機(2)班 王小二      |"<<endl;
    cout<<endl<<"      ================================================================== "<<endl;
    cout<<endl<<"     您可以根據以下提示進行您所需要的操作:"<<endl;
    cout<<endl<<"     增加學生資訊----------------1          顯示學生資訊----------------2"<<endl;
    cout<<endl<<"     修改學生資訊----------------3          查詢學生資訊----------------4"<<endl;
    cout<<endl<<"     刪除學生資訊----------------5          對學生資訊進行排序----------6"<<endl;
    cout<<endl<<"     儲存學生資訊至記錄檔案------7          從記錄檔案讀取學生資訊------8"<<endl;
    cout<<endl<<"     新建學生資訊檔案------------9          執行結束-------------------10"<<endl<<endl;
}
struct student
{
    int num;
    char name[20];
    char sex[20];
    int math,chinese,english,computer,PE;
    double ave;
    int sum;
    int rank;
    student *next;
};
student *h,*t;
void creatLink()
{
    void sort();
    student *p1,*p2;
    int n=0;
    p1=(struct student *)malloc(sizeof(struct student));
    h=NULL;
    p1->next=NULL;
    printf("請輸入資訊(輸入0,結束輸入):(例如:lvshubao man 20130000)\n");
    scanf("%s",&p1->name);
    if(p1->name[0]=='0')
        return;
    scanf("%s%d",&p1->sex,&p1->num);
    printf("請輸入成績依次是:math,chinese,english,computer,PE\n");
    scanf("%d%d%d%d%d",&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE);
    h=p1;
    // printf("%d\n",h->num);
    // printf("%d\n",p1->num);
    p2=p1;
    p2->next=NULL;
    p1->ave=(p1->math+p1->chinese+p1->english+p1->computer+p1->PE)/5;
    p1->sum=p1->math+p1->chinese+p1->english+p1->computer+p1->PE;
    //printf("%d\n",p1->sum);
    p1=(struct student *)malloc(sizeof(struct student));
    p2->next=p1;
    printf("請再次輸入資訊:\n");
    scanf("%s",&p1->name);
    while(p1->name[0]!='0')
    {
        scanf("%s%d",&p1->sex,&p1->num);
        printf("請再次輸入成績\n");
        scanf("%d%d%d%d%d",&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE);
        p1->ave=(p1->math+p1->chinese+p1->english+p1->computer+p1->PE)/5;
        p1->sum=p1->math+p1->chinese+p1->english+p1->computer+p1->PE;
        p2=p1;
        p1=(struct student *)malloc(sizeof(struct student));
        p2->next=p1;
        printf("請再次輸入資訊:\n");
        scanf("%s",&p1->name);
    }
    t=p2;
    p2->next=NULL;
    sort();
    /*for(p1=h;p1!=NULL;p1=p1->next)
    {
        printf("%s\n",p1->name);
    }*/
}
void show1()
{
    student *p;
    for(p=h; p!=NULL; p=p->next)
    {
        printf("        姓名:%s 性別:%s  學號:%d\n",p->name,p->sex,p->num);
        printf("        數學:%d 語文:%d  英語:%d  計算機:%d  體育:%d\n",p->math,p->chinese,p->english,p->computer,p->PE);
        printf("        總成績: %d  平均成績: %.2f  排名:%d\n\n",p->sum,p->ave,p->rank);
    }
}
void sw(student *x,student *y)
{
    swap(x->name,y->name);
    swap(x->sex,y->sex);
    swap(x->num,y->num);
    swap(x->math,y->math);
    swap(x->english,y->english);
    swap(x->chinese,y->chinese);
    swap(x->computer,y->computer);
    swap(x->ave,y->ave);
    swap(x->PE,y->PE);
    swap(x->sum,y->sum);
    swap(x->rank,y->rank);
}
void sort()//名次遞增
{
    student *p,*q,*m;
    int maxx;
    for(p=h; p!=NULL; p=p->next)
    {
        maxx=p->sum;
        for(q=p->next; q!=NULL; q=q->next)
        {
            if(q->sum>maxx)
            {
                maxx=q->sum;
                m=q;
            }
        }
        if(maxx>p->sum)
            sw(p,m);
    }
    int ip=1;
    for(p=h; p!=NULL; p=p->next)
    {
        p->rank=ip++;
    }
}

void sort3()//名次遞減
{
    student *p,*q,*m;
    int maxx;
    for(p=h; p!=NULL; p=p->next)
    {
        maxx=p->sum;
        for(q=p->next; q!=NULL; q=q->next)
        {
            if(q->sum<maxx)
            {
                maxx=q->sum;
                m=q;
            }
        }
        if(maxx<p->sum)
            sw(p,m);
    }
}
void sort1()//學號遞減
{
    student *p,*q,*m;
    int maxx;
    for(p=h; p!=NULL; p=p->next)
    {
        maxx=p->num;
        for(q=p->next; q!=NULL; q=q->next)
        {
            if(q->num<maxx)
            {
                maxx=q->num;
                m=q;
            }
        }
        if(maxx<p->num)
            sw(p,m);
    }
}

void sort2()//學號遞增
{
    student *p,*q,*m;
    int maxx;
    for(p=h; p!=NULL; p=p->next)
    {
        maxx=p->num;
        for(q=p->next; q!=NULL; q=q->next)
        {
            if(q->num>maxx)
            {
                maxx=q->num;
                m=q;
            }
        }
        if(maxx>p->num)
            sw(p,m);
    }
}

void sort5()//姓名遞增
{
    student *p,*q,*m;
    char maxx[30];
    for(p=h; p!=NULL; p=p->next)
    {
        memset(maxx,0,sizeof(maxx));
        strcpy(maxx,p->name);
        for(q=p->next; q!=NULL; q=q->next)
        {
            if(strcmp(maxx,q->name)>0)
            {
                memset(maxx,0,sizeof(maxx));
                strcpy(maxx,q->name);
                m=q;
            }
        }
        if(strcmp(maxx,p->name)<0)
            sw(p,m);
    }
}

void sort6()//姓名遞減
{
    student *p,*q,*m;
    char maxx[30];
    for(p=h; p!=NULL; p=p->next)
    {
        memset(maxx,0,sizeof(maxx));
        strcpy(maxx,p->name);
        for(q=p->next; q!=NULL; q=q->next)
        {
            if(strcmp(maxx,q->name)<0)
            {
                memset(maxx,0,sizeof(maxx));
                strcpy(maxx,q->name);
                m=q;
            }
        }
        if(strcmp(maxx,p->name)>0)
            sw(p,m);
    }
}
void show()
{
    student *p;
    p=h;
    // printf("%d\n",h->num);
    //printf("%d\n",p->num);
    printf("按學號查詢請輸入1,按姓名查詢請輸入2,按名次查詢請輸入3\n");
    int x,y;
    scanf("%d",&x);
    if(x==1)
    {
        printf("請輸入學號: ");
        scanf("%d",&y);
        p=h;
        while(y!=p->num)
        {
            p=p->next;
        }
    }
    else if(x==3)
    {
        printf("請輸入名次: ");
        scanf("%d",&y);
        p=h;
        while(y!=p->rank)
        {
            p=p->next;
        }
    }
    else
    {
        printf("請輸入姓名: ");
        char s[20];
        scanf("%s",s);
        p=h;
        while(strcmp(s,p->name))
        {
            p=p->next;
        }
    }
    printf("\n查詢結果如下:\n");
    printf("    姓名:%s   性別:%s 學號:%d\n",p->name,p->sex,p->num);
    printf("    數學:%d   語文:%d 英語:%d 計算機:%d 體育:%d\n",p->math,p->chinese,p->english,p->computer,p->PE);
    printf("    總成績: %d 平均成績: %.2f 排名:%d\n\n",p->sum,p->ave,p->rank);
}
void create_file()
{
    FILE *fp;

    student *p;
    fp=fopen("d:\\data.txt","w");
    p=h;
    while(1)
    {
        fprintf(fp,"%s %s %d %d %d %d %d %d %.2f %d %d\n",p->name,p->sex,p->num,p->math,p->chinese,p->english,p->computer,p->PE,p->ave,p->sum,p->rank);
        if(p->next==NULL)
            break;
        p=p->next;
    }
    fclose(fp);
}
void read_file()
{
    FILE *fp;
    student *p1,*p2;
    fp=fopen("d:\\data.txt","r");
    int d=1;
    h=p2=(struct student *)malloc(sizeof(struct student));
    fscanf(fp,"%s %s %d %d %d %d %d %d %lf %d %d\n",p2->name,p2->sex,&p2->num,&p2->math,&p2->chinese,&p2->english,&p2->computer,&p2->PE,&p2->ave,&p2->sum,&p2->rank);
    while(!feof(fp))
    {
        p1=(struct student *)malloc(sizeof(struct student));
        fscanf(fp,"%s %s %d %d %d %d %d %d %lf %d %d\n",p1->name,p1->sex,&p1->num,&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE,&p1->ave,&p1->sum,&p1->rank);
        p2->next=p1;
        p2=p1;
    }
    p2->next=NULL;
    fclose(fp);
}
void delet()
{
    student *p,*q;
    printf("請輸入要刪除學生的學號:\n");
    int x;
    scanf("%d",&x);
    int flag=1;
    if(h->num==x)
    {
        h=h->next;
        for(p=h;p!=NULL;p=p->next)
           --(p->rank);
        return;
    }
    else
    {
       for(p=h; p->next!=NULL; p=p->next)
       {
           if(p->next->num==x)
           {
                flag=0;
                break;
           }
       }
    if(flag)
    {
        printf("對不起,沒有該學生!\n");
    }
    else
    {
        if(p->next->next==NULL)
        {
            p->next=NULL;
            return;
        }
        p->next=p->next->next;
        for(p=p->next;p->next!=NULL; p=p->next)
            p->rank=p->rank-1;
    }
    }
}
void add()
{
    printf("溫馨提示: 請注意一次只能新增加一個學生,若增加多個請在主選單再次選擇“1” :)\n\n");
    student *p1,*p;
    int x;
    for(p=h;p!=NULL;p=p->next)
        t=p;
    p1=(struct student *)malloc(sizeof(struct student));
    t->next=p1;
    printf("請輸入資訊(輸入0,結束輸入):(例如:lvshubao man 20130000)\n");
    scanf("%s",&p1->name);
    scanf("%s%d",&p1->sex,&p1->num);
    printf("請輸入成績依次是:math,chinese,english,computer,PE\n");
    scanf("%d%d%d%d%d",&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE);
    p1->next=NULL;
    // printf("%d\n",h->num);
    // printf("%d\n",p1->num);
    p1->ave=(p1->math+p1->chinese+p1->english+p1->computer+p1->PE)/5;
    p1->sum=p1->math+p1->chinese+p1->english+p1->computer+p1->PE;
    sort();
}

void xiugai()
{
    student *p,*q,*p1;
    printf("請輸入要修改學生的學號:\n");
    int x;
    scanf("%d",&x);
    int flag=1;
    for(p=h; p!=NULL; p=p->next)
    {
        if(p->num==x)
        {
            flag=0;
            break;
        }
    }
    if(flag)
    {
        printf("對不起,沒有該學生!\n");
    }
    else
    {
        p1=p;
        printf("重新輸入該學生的資訊(例如:lvshubao man 20130000)\n\n");
        scanf("%s",&p1->name);
        scanf("%s%d",&p1->sex,&p1->num);
        printf("請輸入成績依次是:math,chinese,english,computer,PE\n");
        scanf("%d%d%d%d%d",&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE);
        p1->ave=(p1->math+p1->chinese+p1->english+p1->computer+p1->PE)/5;
        p1->sum=p1->math+p1->chinese+p1->english+p1->computer+p1->PE;
    }
}
int main()
{
    start();
    int x;
    int flag;
    printf("您當前的位置是主選單,請輸入您所需要的操作所對應的數字:\n");
    while(~scanf("%d",&x))
    {
        flag=1;
        if(x==1)
            add();
        else  if(x==2)
            show1();
        else if(x==3)
            xiugai();
        else if(x==4)
            show();
        else if(x==5)
            delet();
        else if(x==6)
        {
            printf("請根據提示選擇您想要的排序要求:\n");
            cout<<endl<<"     學號升序----------------1           學號降序----------------2"<<endl;
            cout<<endl<<"     名次降序----------------3           名次升序----------------4"<<endl;
            cout<<endl<<"     姓名升序----------------5           姓名降序----------------6"<<endl;
            int y;
            scanf("%d",&y);
            if(y==1)
                sort1();
            else if(y==2)
                sort2();
            else if(y==3)
                sort3();
            else if(y==4)
                sort();
            else if(y==5)
                sort5();
            else if(y==6)
                sort6();
            else
            {
                printf("輸入錯誤,將返回主選單!\n");
            }
        }
        else if(x==7)
            create_file();
        else if(x==8)
            read_file();
        else if(x==9)
            creatLink();
        else if(x==10)
            break;
        else
        {
            printf("輸入有誤,請重新輸入!\n");
            flag=0;
            continue;
        }
        if(flag==1)
            printf("您當前的位置是主選單,請輸入您所需要的操作所對應的數字:\n");
    }
    return 0;
}



本文__Yran原創,轉載請標明出處

相關文章