學(xué)生個(gè)人消費(fèi)管理系統(tǒng)

字號(hào):

#include
    #include
    #include
    #define LEN sizeof(struct scorenode)
    #define DEBUG
    #include
    struct scorenode
    {int number;/*學(xué)號(hào)*/
    char name[10];/*姓名*/
    float xiaofei;/*消費(fèi)情況*/
    struct scorenode *next;
    };
    typedef struct scorenode score;
    int n,k;/*n,k為全局變量,本程序中的函數(shù)均可以使用它*/
    /*===========================================*/
    score *creat2311(void)
    /*函數(shù)creat2311,功能:創(chuàng)建鏈表,此函數(shù)帶回一個(gè)指向鏈表頭的指針*/
    {
    score*head;
    score *p1,*p2,*p3,*max;
    int i,j;
    float fen;
    char t[10];
    n=0;
    p1=p2=p3=(score *)malloc(LEN);head=p3; /*開辟一個(gè)新單元*/
    printf("請(qǐng)輸入學(xué)生資料,輸0退出!\n");
    repeat1: printf("請(qǐng)輸入學(xué)生學(xué)號(hào)(學(xué)號(hào)應(yīng)大于0):");/*輸入學(xué)號(hào),學(xué)號(hào)應(yīng)大于0*/
    scanf("%d",&p1->number);
    while(p1->number<0)
    {getchar();
    printf("輸入錯(cuò)誤,請(qǐng)重新輸入學(xué)生學(xué)號(hào):");
    scanf("%d",&p1->number);}
    /*輸入學(xué)號(hào)為字符或小于0時(shí),程序報(bào)錯(cuò),提示重新輸入學(xué)號(hào)*/
    if(p1->number==0)
    goto end;/*當(dāng)輸入的學(xué)號(hào)為0時(shí),轉(zhuǎn)到末尾,結(jié)束創(chuàng)建鏈表*/
    else
    {
    p3=head;
    if(n>0)
    {for(i=0;i    {if(p1->number!=p3->number)
    p3=p3->next;
    else
    {printf("學(xué)號(hào)重復(fù),請(qǐng)重輸!\n");
    goto repeat1;
    /*當(dāng)輸入的學(xué)號(hào)已經(jīng)存在,程序報(bào)錯(cuò),返回前面重新輸入*/
    }
    }
    }
    }
    printf("請(qǐng)輸入學(xué)生姓名:");
    scanf("%s",&p1->name);/*輸入學(xué)生姓名*/
    printf("請(qǐng)輸入消費(fèi)情況:");/*輸入消費(fèi)情況;
     head=NULL;
    while(p1->number!=0)
    {
    n=n+1;
    if(n==1)
    head=p1;
    else
    p2->next=p1;
    p2=p1;
    p1=(score *)malloc(LEN);
    printf("請(qǐng)輸入學(xué)生資料,輸0退出!\n");
    repeat2:printf("請(qǐng)輸入學(xué)生學(xué)號(hào)(學(xué)號(hào)應(yīng)大于0):");
    scanf("%d",&p1->number);/*輸入學(xué)號(hào),學(xué)號(hào)應(yīng)大于0*/
    while(p1->number<0)
    {getchar();
    printf("輸入錯(cuò)誤,請(qǐng)重新輸入學(xué)生學(xué)號(hào):");
    scanf("%d",&p1->number);}
    /*輸入學(xué)號(hào)為字符或小于0時(shí),程序報(bào)錯(cuò),提示重新輸入學(xué)號(hào)*/
    if(p1->number==0)
    goto end;/*當(dāng)輸入的學(xué)號(hào)為0時(shí),轉(zhuǎn)到末尾,結(jié)束創(chuàng)建鏈表*/
    else
    {
    p3=head;
    if(n>0)
    {for(i=0;i    {if(p1->number!=p3->number)
    p3=p3->next;
    else
    {printf("學(xué)號(hào)重復(fù),請(qǐng)重輸!\n");
    goto repeat2;
    /*當(dāng)輸入的學(xué)號(hào)已經(jīng)存在,程序報(bào)錯(cuò),返回前面重新輸入*/
    }
    }
    }
    }
    printf("請(qǐng)輸入學(xué)生姓名:");
    scanf("%s",&p1->name);/*輸入學(xué)生姓名*/
    printf("請(qǐng)輸入消費(fèi)情況:");
    scanf("%f",&p1->xiaofei);/*輸入消費(fèi)情況;
    }
    end: p1=head;
    p3=p1;
    for(i=1;i    {
    for(j=i+1;j<=n;j++)
    {
    max=p1;
    p1=p1->next;
    if(max->number>p1->number)
    {
    k=max->number;
    max->number=p1->number;
    p1->number=k;
    /*交換前后結(jié)點(diǎn)中的學(xué)號(hào)值,使得學(xué)號(hào)大者移到后面的結(jié)點(diǎn)中*/
    strcpy(t,max->name);
    strcpy(max->name,p1->name);
    strcpy(p1->name,t);
    /*交換前后結(jié)點(diǎn)中的姓名,使之與學(xué)號(hào)相匹配*/
    /*交換前后結(jié)點(diǎn)中的消費(fèi)情況,使之與學(xué)號(hào)相匹配*/
    }
     }
    max=head;p1=head;/*重新使max,p指向鏈表頭*/
    }
    p2->next=NULL;/*鏈表結(jié)尾*/
    printf("輸入的學(xué)生數(shù)為:%d個(gè)!\n",n);
    return(head);
    }
    /*=====================================*/
    /*=====================================*/
    score *load2311(score *head)
    /*函數(shù)load2311,功能:從文件讀入學(xué)生記錄*/
    { score *p1,*p2;
    int m=0;
    char filepn[10];
    FILE *fp;
    printf("請(qǐng)輸入文件路徑及文件名:");
    scanf("%s",filepn);/*輸入文件路徑及名稱*/
    if((fp=fopen(filepn,"r+"))==NULL)
    {
    printf("不能打開文件!\n");
    return 0;
    }
    {
    p1=(score *)malloc(LEN); /*開辟一個(gè)新單元*/
    fscanf(fp,"%d%s%f%f%f",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue);
    printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);
    /*文件讀入與顯示*/
    head=NULL;
    do
    {
    n=n+1;
    if(n==1) head=p1;
    else p2->next=p1;
    p2=p1;
    p1=(score *)malloc(LEN); /*開辟一個(gè)新單元*/
    fscanf(fp,"%d%s%f%f%f\n",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue);
    printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);
    /*文件讀入與顯示*/
    }while(!feof(fp));
    p2->next=p1;
    p1->next=NULL;
    n=n+1;
    }printf("-----------------------------------------\n");/*表格下線*/
    fclose(fp);/*結(jié)束讀入,關(guān)閉文件*/
    return (head);
    }
    /*=====================================*/
    /*=====================================*/
    score *add2311(score *head,score *stu)
    /*函數(shù)add2311,功能:追加學(xué)生資料,并且將所有學(xué)生資料按學(xué)號(hào)排序*/
    {
    score *p0,*p1,*p2,*p3,*max;
    int i,j;
    float fen;
    char t[10];
    p3=stu=(score *)malloc(LEN);/*開辟一個(gè)新單元*/
    printf("\n輸入要增加的學(xué)生的資料!");
    repeat4: printf("請(qǐng)輸入學(xué)生學(xué)號(hào)(學(xué)號(hào)應(yīng)大于0):");
    scanf("%d",&stu->number);
    /*輸入學(xué)號(hào),學(xué)號(hào)應(yīng)大于0*/
    while(stu->number<0)
    {getchar();
    printf("輸入錯(cuò)誤,請(qǐng)重新輸入學(xué)生學(xué)號(hào):");
    scanf("%d",&stu->number);}/*輸入錯(cuò)誤,重新輸入學(xué)號(hào)*/
    /******************************************************/
    if(stu->number==0)
    goto end2;/*當(dāng)輸入的學(xué)號(hào)為0時(shí),轉(zhuǎn)到末尾,結(jié)束追加*/
    else
    {
    p3=head;
    if(n>0)
    {for(i=0;i    {if(stu->number!=p3->number)
    p3=p3->next;
    else
    {printf("學(xué)號(hào)重復(fù),請(qǐng)重輸!\n");
    goto repeat4;
    /*當(dāng)輸入的學(xué)號(hào)已經(jīng)存在,程序報(bào)錯(cuò),返回前面重新輸入*/
    }
    }
    }
     }
    /********************************/
    printf("輸入學(xué)生姓名:");
    scanf("%s",stu->name); /*輸入學(xué)生姓名*/
    printf("請(qǐng)輸入消費(fèi)情況:");
    scanf("%f",&stu->xiaofei); /*輸入消費(fèi)情況,成績(jī)應(yīng)在0-100*/
    p1=head;
    p0=stu;
    if(head==NULL)
    {head=p0;p0->next=NULL;}/*當(dāng)原來(lái)鏈表為空時(shí),從首結(jié)點(diǎn)開始存放資料*/
    else/*原來(lái)鏈表不為空*/
    {
    if(p1->next==NULL)/*找到原來(lái)鏈表的末尾*/
    {
    p1->next=p0;
    p0->next=NULL;/*將它與新開單元相連接*/
    }
    else
    {
    while(p1->next!=NULL)/*還沒(méi)找到末尾,繼續(xù)找*/
    {
    p2=p1;p1=p1->next;
    }
    p1->next=p0;
    p0->next=NULL;
    }
     }
    n=n+1;
    p1=head;
    p0=stu;
    for(i=1;i    {
    for(j=i+1;j<=n;j++)
    {
    max=p1;
    p1=p1->next;
    if(max->number>p1->number)
    {
    k=max->number;
    max->number=p1->number;
    p1->number=k;
    /*交換前后結(jié)點(diǎn)中的學(xué)號(hào)值,使得學(xué)號(hào)大者移到后面的結(jié)點(diǎn)中*/
    strcpy(t,max->name);
    strcpy(max->name,p1->name);
    strcpy(p1->name,t);
    /*交換前后結(jié)點(diǎn)中的姓名,使之與學(xué)號(hào)相匹配*/
    /*交換前后結(jié)點(diǎn)中的消費(fèi)情況,使之與學(xué)號(hào)相匹配*/
    }
    max=head;p1=head;/*重新使max,p指向鏈表頭*/
    } end2:
    printf("現(xiàn)在的學(xué)生數(shù)為:%d個(gè)!\n",n);
    return(head);
    }
    /*=========================================*/
    /*=======================================*/
    score *search2311(score *head)
    /*函數(shù)search2311,功能:查詢學(xué)生消費(fèi)情況*/
    {int number;
    score *p1,*p2;
    printf("輸入要查詢的學(xué)生的學(xué)號(hào),");
    scanf("%d",&number);
    while(number!=0)
    {
    if(head==NULL)
    {printf("\n沒(méi)有任何學(xué)生資料!\n");return(head);}
     printf("-----------------------------------------\n");
    printf("|學(xué)號(hào)\t|姓名\t|消費(fèi)情況\t \n");
    printf("-----------------------------------------\n");/*打印表格域*/
    p1=head;
    while(number!=p1->number&&p1->next!=NULL)
     {p2=p1;p1=p1->next;}
    if(number==p1->number)
    {printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue);
    printf("-----------------------------------------\n");}/*打印表格域*/
    else
    printf("%d不存在此學(xué)生!\n",number);
    printf("輸入要查詢的學(xué)生的學(xué)號(hào),");
    scanf("%d",&number);
    }
    printf("已經(jīng)退出了!\n");
    return(head);}
    /*=====================================================*/
    /*=====================================================*/
    score *del2311(score *head)/*函數(shù)del2311,功能:刪除學(xué)生資料*/
    {
    score *p1,*p2;
    int number;
    printf("輸入要?jiǎng)h除的學(xué)生的學(xué)號(hào)(輸入0時(shí)退出):");
    scanf("%d",&number);
    getchar();
    while(number!=0)/*輸入學(xué)號(hào)為0時(shí)退出*/
    {
    if(head==NULL)
    {
    printf("\n沒(méi)有任何學(xué)生資料!\n");
    return(head);
    }
     p1=head;
    while(number!=p1->number&&p1->next!=NULL)
    /*p1指向的不是所要找的首結(jié)點(diǎn),并且后面還有結(jié)點(diǎn)*/
    {
    p2=p1;p1=p1->next;
    } /*p1后移一個(gè)結(jié)點(diǎn)*/
    if(number==p1->number)
    /*找到了*/
    {
    if(p1==head)
    head=p1->next;
    /*若p1指向的是首結(jié)點(diǎn),把地二個(gè)結(jié)點(diǎn)地址賦予head*/
    else
    p2->next=p1->next;
    /*否則將下一個(gè)結(jié)點(diǎn)地址 賦給前一結(jié)點(diǎn)地址*/
    printf("刪除:%d\n",number);n=n-1;
    }
    else
    printf("%d不存在此學(xué)生!\n",number);
    /*找不到該結(jié)點(diǎn)*/
    printf("輸入要?jiǎng)h除的學(xué)生的學(xué)號(hào):");
    scanf("%d",&number);
    getchar();
    }
    #ifdef DEBUG
    printf("已經(jīng)退出了!\n");
    #endif
    printf("現(xiàn)在的學(xué)生數(shù)為:%d個(gè)!\n",n);
    return(head);
    }
     /*=============================================*/
    /*==============================================*/
    void print2311(score *head)
    /*函數(shù)print2311,功能:顯示學(xué)生成績(jī)*/
    {
    score *p;
    if(head==NULL)
    {printf("\n沒(méi)有任何學(xué)生資料!\n");}
    else
    {printf("%d\n",n);
    printf("-----------------------------------------\n");
    printf("|學(xué)號(hào)\t|姓名\t|消費(fèi)情況\t |\n");
    printf("-----------------------------------------\n");/*打印表格域*/
    p=head;
    do
    {printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue);
    printf("-----------------------------------------\n");/*打印表格域*/
    p=p->next;}while (p!=NULL);/*打印完成了*/
    }
    }
    save2311(score *p1)
    /*函數(shù)save2311,功能:保存學(xué)生的資料*/
    {
    FILE *fp;
    char filepn[20];/*用來(lái)存放文件保存路徑以及文件名*/
    printf("請(qǐng)輸入文件路徑及文件名:");
    scanf("%s",filepn);
    if((fp=fopen(filepn,"w+"))==NULL)
    {
    printf("不能打開文件!\n");
    return 0;
    }
    main() /*主函數(shù)main,功能:通過(guò)調(diào)用creat,search,del,add,print,ststistics,save,taxis等函數(shù),實(shí)現(xiàn)學(xué)生消費(fèi)情況查詢系統(tǒng)功能*/
    {score *head=0,*stu=0;
    while(1)
    {k=menu2311(k);
    switch(k)/*用switch語(yǔ)句實(shí)現(xiàn)功能選擇*/
    {case 1: head=creat2311();break;/*調(diào)用創(chuàng)建鏈表函數(shù)*/
    case 2: head=load2311(head);break;/*從文件調(diào)入記錄函數(shù)*/
    case 3: head=search2311(head);break;/*調(diào)用成績(jī)查詢函數(shù)*/
    case 4: head=del2311(head); break;/*調(diào)用刪除學(xué)生資料函數(shù)*/
    case 5: head=add2311(head,stu);break;/*調(diào)用追加學(xué)生資料函數(shù)*/
    case 6: print2311(head); break;/*調(diào)用顯示學(xué)生資料函數(shù)*/
    case 7: statistics2311(head); break;/*調(diào)用統(tǒng)計(jì)函數(shù)*/
    case 8: save2311(head);break;/*調(diào)用保存函數(shù)*/
    case 9: taxis2311(head);break;/*調(diào)用排序函數(shù)*/
    case 0: exit(0);/*退出系統(tǒng),返回主界面*/
    default: printf("輸入錯(cuò)誤,請(qǐng)重試!\n"); }
    }
    }