程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 成績管理系統改進

成績管理系統改進

編輯:C++入門知識

這次改寫了一些地方:

1:加入文件讀寫;

2:異常處理(效果是!但不是C標准庫的異常處理函數setjmp,longjmp);

3:其他一些小地方改寫;

看代碼:


[cpp] 
#include<stdio.h>  
#include<malloc.h>  
#include<string.h>  
#include<stdlib.h>  
#include<conio.h>  
typedef struct L 

    char Name[30]; 
    long long Num; 
    float English; 
    float C_language; 
    struct L *Next; 
}*Node; 
void Menu();                    //功能菜單   
void Search(Node p);            //查找   
void Name_Search(Node p);        //按姓名查找   
void Num_Search(Node p);          //按學號查找   
void Initialization(Node p);      //初始化表   
void Add(Node p);              // 添加   
void Insert(Node p);             //插入   
void Delet(Node p);               //刪除   
void Show(Node p);                 //顯示   
void Sort(Node p);            //排序   
void C_Sort(Node p);           //c成績排序   
void En_Sort(Node p);           //英語成績排序   
void Num_Sort(Node p);       // 學號排序   
void All_Sort(Node p);          //總成績排序   
void Most(Node p);                  //最大值   
void DelName(Node p);         //按姓名刪除   
void DelNum(Node p);       //按學號刪除   
void Modify(Node p);            //修改   
void Num_Modify(Node p);         //按學號修改   
void Name_Modify(Node p);       //按姓名修改   
void Menu1();                  //菜單  
void Explanation();              //說明  
void Import(Node p);           //從文件導入數據  
void Export(Node p);           //將數據導入到外部文件中  
int main() 

    Node p=new struct L; 
    system("color 1a"); 
    Initialization(p); 
    Menu(); 
    printf("\t選擇:\n"); 
    printf("\t"); 
    int m; 
    while(true) 
    { 
        scanf("%d",&m); 
            if(m==11) 
            { 
                Explanation(); 
                getch(); 
                system("cls"); 
                break; 
            } 
            else 
            { 
                printf("\t請先看說明!\n"); 
                printf("\t"); 
            }    
    } 
    Menu1(); 
    printf("\t選擇:\n"); 
    printf("\t"); 
    int n; 
    while(scanf("%d",&n)!=EOF) 
    { 
        switch(n) 
        { 
            case 1: 
                Add(p);fflush(stdin);break; 
            case 2: 
                Show(p);fflush(stdin);break; 
            case 3: 
                Insert(p);fflush(stdin);break; 
            case 4: 
                Sort(p);fflush(stdin);break; 
            case 5: 
                Delet(p);fflush(stdin);break; 
            case 6: 
                Search(p);fflush(stdin);break; 
            case 7: 
                Modify(p);fflush(stdin);break; 
            case 8: 
                fflush(stdin);return 0; 
            case 9: 
                Export(p);fflush(stdin);break; 
            case 10: 
                Import(p);fflush(stdin);break; 
            case 11: 
                Explanation();fflush(stdin);break; 
            default : 
                fflush(stdin);printf("\t沒有該選項:\n");break; 
        } 
         
        getch(); 
        printf("\t"); 
        system("cls"); 
        Menu1(); 
        printf("\t選擇:\n"); 
        printf("\t"); 
    } 
    return 0; 

void Menu() 

    printf("\n"); 
    printf("\t             成績管理系統 \3\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t1:添加\t   |\t2:輸出\t     |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t3:插入\t   |\t4:排序\t     |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t5:刪除\t   |\t6:查詢\t     |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t7:修改\t   |\t8:退出\t     |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t9:寫出到文件\t             |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t10:導入從文件\t             |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t11:說明(必看!)\t     |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t"); 
    printf("\n"); 

void Initialization(Node p) 

    p->Next=NULL; 
    p->Num=0; 

void Add(Node p) 

    long long a; 
    float b,c; 
    char na[30]; 
     
    while(p->Next!=NULL) 
    { 
        p=p->Next; 
    } 
    Node q=(Node)malloc(sizeof(struct L)); 
    printf("\t輸入姓名:\n"); 
    printf("\t"); 
    scanf("%s",&na); 
    printf("\t輸入學號:\n"); 
    printf("\t"); 
    if(scanf("%lld",&a)==0) 
    { 
        printf("\t輸入類型與要求不符合,添加失敗!!\n"); 
        getch(); 
        return ; 
    } 
    q->Num=a; 
    printf("\t輸入英語成績:\n"); 
    printf("\t"); 
    if(scanf("%f",&b)==0) 
    { 
        printf("\t輸入類型與要求不符合,添加失敗!!\n"); 
        getch(); 
        return ; 
    } 
    q->English=b; 
    printf("\t輸入C語言成績:\n"); 
    printf("\t"); 
    if(scanf("%f",&c)==0) 
    { 
        printf("\t輸入類型與要求不符合,添加失敗!!\n"); 
        getch(); 
        return ; 
    } 
    q->C_language=c; 
    strcpy(q->Name,na); 
    p->Next=q; 
    q->Next=NULL; 
    printf("\t添加成功!\n"); 
    p->Num++; 
    getch(); 

void Insert(Node p) 

    p->Num++; 
    printf("\t輸入插入位置:\n"); 
    int n; 
    printf("\t"); 
    scanf("%d",&n); 
    if(n<=0) 
    { 
        printf("位置錯誤!\n"); 
        return; 
    } 
    n-=1; 
    while(n--) 
    { 
        p=p->Next; 
    } 
    Node q=(Node)malloc(sizeof(struct L)); 
    printf("\t輸入姓名:\n"); 
    scanf("%s",&q->Name); 
    printf("\t輸入學號:\n"); 
    scanf("%lld",&q->Num); 
    printf("\t輸入英語成績:\n"); 
    scanf("%f",&q->English); 
    printf("\t輸入C語言成績:\n"); 
    scanf("%f",&q->C_language); 
    q->Next=p->Next; 
    p->Next=q; 
    printf("\t插入成功!\n"); 
    getch(); 

void Delet(Node p) 

    if(p->Num==0) 
    { 
        printf("\t沒有可刪除的數據!\n"); 
        return; 
    } 
    p->Num--; 
    printf("\t選擇:\n"); 
    printf("\t1:按姓名刪除:\n"); 
    printf("\t2:按學號刪除:\n"); 
    int n; 
    printf("\t"); 
    scanf("%d",&n); 
    switch(n) 
    { 
        case 1:DelName(p);break; 
        case 2:DelNum(p);break; 
        default:printf("\t無此選擇!\n");break; 
    } 
    printf("\t刪除成功!\n"); 
    getch(); 

void DelName(Node p) 

    char s[30]; 
    printf("\t輸入姓名:\n"); 
    printf("\t"); 
    scanf("%s",&s); 
    Node q=p; 
    for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next) 
    { 
        if(!strcmp(q->Name,s)) 
        { 
            p->Next=p->Next->Next; 
        } 
    } 
    getch(); 

void DelNum(Node p) 

    long long n; 
    printf("\t輸入學號:\n"); 
    printf("\t"); 
    scanf("%lld",&n); 
    Node q=p; 
    for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next) 
    { 
        if(q->Num==n) 
        { 
            p->Next=p->Next->Next; 
        } 
    } 
    getch(); 

void Show(Node p) 

    if(p->Num==0) 
    { 
        printf("\t沒有可顯示的數據!\n"); 
        return; 
    } 
    int len=p->Num; 
    p=p->Next; 
    for(int i=0;i<len;++i) 
    { 
        printf("        -------------------------------------------------\n"); 
        printf("\t|\t姓名:\t\t|\t%s\n",p->Name); 
        printf("        -------------------------------------------------\n"); 
        printf("\t|\t學號:\t\t|\t%lld\n",p->Num); 
        printf("        -------------------------------------------------\n"); 
        printf("\t|\t英語:\t\t|\t%.2f\n",p->English); 
        printf("        -------------------------------------------------\n"); 
        printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language); 
        printf("        -------------------------------------------------\n"); 
        printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language); 
        printf("        -------------------------------------------------\n"); 
        printf("\n"); 
        p=p->Next; 
    } 
    printf("\t顯示完!\n"); 
    getch(); 

void C_Sort(Node p) 

    Node x,y; 
    int len=p->Num; 
    for(int i=0;i<len;++i) 
    { 
        p=p->Next; 
        x=p; 
        y=p->Next; 
        for(int j=i+1;j<len;++j) 
        { 
            if(x->C_language>y->C_language) 
            { 
                x=y; 
            } 
            y=y->Next; 
        } 
            float a,b; 
            long long w; 
            char s[30]; 
            w=x->Num; 
            x->Num=p->Num; 
            p->Num=w; 
            strcpy(s,x->Name); 
            strcpy(x->Name,p->Name); 
            strcpy(p->Name,s); 
            a=x->C_language; 
            x->C_language=p->C_language; 
            p->C_language=a; 
            b=x->English; 
            x->English=p->English; 
            p->English=b; 
    } 
    printf("\t排序成功!\n"); 
    getch(); 

void Sort(Node p) 

    if(p->Num==0) 
    { 
        printf("\t沒有可排序的數據!\n"); 
        return; 
    } 
    printf(" \t選擇:\n"); 
    printf(" \t1:C語言成績從小到大排序:\n"); 
    printf(" \t2:英語成績從小到大排序:\n"); 
    printf(" \t3:總成績從小到大排序:\n"); 
    printf(" \t4:學號從小到大排序:\n"); 
    int n; 
    printf("\t"); 
    scanf("%d",&n); 
    switch(n) 
    { 
        case 1:C_Sort(p);break; 
        case 2:En_Sort(p);break; 
        case 3:All_Sort(p);break; 
        case 4:Num_Sort(p);break; 
        default:printf("\t無此選擇!\n");break; 
    } 
    getch(); 

void En_Sort(Node p) 

    Node x,y; 
    int len=p->Num; 
    for(int i=0;i<len;++i) 
    { 
        p=p->Next; 
        x=p; 
        y=p->Next; 
        for(int j=i+1;j<len;++j) 
        { 
            if(x->English>y->English) 
            { 
                x=y; 
            } 
            y=y->Next; 
        } 
            float a,b; 
            char s[30]; 
            long long w; 
            w=x->Num; 
            x->Num=p->Num; 
            p->Num=w; 
            strcpy(s,x->Name); 
            strcpy(x->Name,p->Name); 
            strcpy(p->Name,s); 
            a=x->C_language; 
            x->C_language=p->C_language; 
            p->C_language=a; 
            b=x->English; 
            x->English=p->English; 
            p->English=b; 
    } 
    printf("\t排序成功!\n"); 
    getch(); 

void Search(Node p) 

    if(p->Num==0) 
    { 
        printf("\t沒有可查找的數據!\n"); 
        return; 
    } 
    printf(" \t選擇:\n"); 
    printf(" \t1:按姓名查詢:\n"); 
    printf(" \t2:按學號查詢:\n"); 
    int n; 
    printf("\t"); 
    scanf("%d",&n); 
    switch(n) 
    { 
        case 1:Name_Search(p);break; 
        case 2:Num_Search(p);break; 
        default:printf("\t無此選擇!\n");break; 
    } 
    getch(); 

void Name_Search(Node p) 

    char ap[30]; 
    printf("\t輸入姓名:\n"); 
    printf("\t"); 
    scanf("%s",&ap); 
    int len=p->Num; 
    p=p->Next; 
    int i; 
    for(i=0;i<len;++i) 
    { 
        if(!strcmp(ap,p->Name)) 
        { 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t姓名:\t\t|\t%s\n",p->Name); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t學號:\t\t|\t%lld\n",p->Num); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t英語:\t\t|\t%.2f\n",p->English); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language); 
            printf("        -------------------------------------------------\n"); 
            break; 
        } 
        p=p->Next; 
    } 
    if(i>=len) 
    { 
        printf("\t沒有找到該學生!\n"); 
    } 
    getch(); 

void Num_Search(Node p) 

    long long sd; 
    printf("\t輸入學號:\n"); 
    printf("\t"); 
    scanf("%lld",&sd); 
    int len=p->Num; 
    p=p->Next; 
    int i; 
    for(i=0;i<len;++i) 
    { 
        if(sd==p->Num) 
        { 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t姓名:\t\t|\t%s\n",p->Name); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t學號:\t\t|\t%lld\n",p->Num); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t英語:\t\t|\t%.2f\n",p->English); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language); 
            printf("        -------------------------------------------------\n"); 
            break; 
        } 
            p=p->Next; 
    } 
    if(i>=len) 
    { 
        printf("\t沒有找到該學生!\n"); 
    } 
    getch(); 

void Modify(Node p) 

    if(p->Num==0) 
    { 
        printf("\t沒有可修改的數據!\n"); 
        return; 
    } 
    printf(" \t選擇:\n"); 
    printf(" \t1:輸入姓名修改:\n"); 
    printf(" \t2:輸入學號修改:\n"); 
    int n; 
    printf("\t"); 
    scanf("%d",&n); 
    switch(n) 
    { 
        case 1:Name_Modify(p);break; 
        case 2:Num_Modify(p);break; 
        default:printf("\t無此選擇!\n");break; 
    } 
    getch(); 

void Num_Modify(Node p) 

    long long sd; 
    printf("\t輸入學號:\n"); 
    printf("\t"); 
    scanf("%lld",&sd); 
    int len=p->Num; 
    p=p->Next; 
    int i; 
    for(i=0;i<len;++i) 
    { 
        if(sd==p->Num) 
        { 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t姓名:\t\t|\t%s\n",p->Name); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t學號:\t\t|\t%lld\n",p->Num); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t英語:\t\t|\t%.2f\n",p->English); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language); 
            printf("        -------------------------------------------------\n"); 
            printf("\t這是之前的數據!\n"); 
            printf("\t現在請更改!\n"); 
            printf("\t輸入姓名:\n"); 
            printf("\t"); 
            scanf("%s",&p->Name); 
            printf("\t輸入學號:\n"); 
            printf("\t"); 
            scanf("%lld",&p->Num); 
            printf("\t輸入英語成績:\n"); 
            printf("\t"); 
            scanf("%f",&p->English); 
            printf("\t輸入C語言成績:\n"); 
            printf("\t"); 
            scanf("%f",&p->C_language); 
            printf("\t修改成功!\n"); 
            getch(); 
            break; 
        } 
        p=p->Next; 
    } 
    if(i>=len) 
    { 
        printf("\t沒有找到該學生!\n"); 
    } 
    getch(); 
 

void Name_Modify(Node p) 

    char ap[30]; 
    printf("\t輸入姓名:\n"); 
    printf("\t"); 
    scanf("%s",&ap); 
    int len=p->Num; 
    p=p->Next; 
    int i; 
    for(i=0;i<len;++i) 
    { 
        if(!strcmp(ap,p->Name)) 
        { 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t姓名:\t\t|\t%s\n",p->Name); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t學號:\t\t|\t%lld\n",p->Num); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\t英語:\t\t|\t%.2f\n",p->English); 
            printf("        -------------------------------------------------\n"); 
            printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language); 
            printf("        -------------------------------------------------\n"); 
            printf("\t這是之前的數據!\n"); 
            printf("\t現在請更改!\n"); 
            printf("\t輸入姓名:\n"); 
            printf("\t"); 
            scanf("%s",&p->Name); 
            printf("\t輸入學號:\n"); 
            printf("\t"); 
            scanf("%lld",&p->Num); 
            printf("\t輸入英語成績:\n"); 
            printf("\t"); 
            scanf("%f",&p->English); 
            printf("\t輸入C語言成績:\n"); 
            printf("\t"); 
            scanf("%f",&p->C_language); 
            printf("\t修改成功!\n"); 
            getch(); 
            break; 
        } 
        p=p->Next; 
    } 
    if(i>=len) 
    { 
        printf("\t沒有找到該學生!\n"); 
    } 
    getch(); 
 

void All_Sort(Node p) 

    Node x,y; 
    int len=p->Num; 
    for(int i=0;i<len;++i) 
    { 
        p=p->Next; 
        x=p; 
        y=p->Next; 
        for(int j=i+1;j<len;++j) 
        { 
            if((x->English+x->C_language)>(y->English+y->C_language)) 
            { 
                x=y; 
            } 
            y=y->Next; 
        } 
        float a,b; 
        char s[30]; 
        long long w; 
        w=x->Num; 
        x->Num=p->Num; 
        p->Num=w; 
        strcpy(s,x->Name); 
        strcpy(x->Name,p->Name); 
        strcpy(p->Name,s); 
        a=x->C_language; 
        x->C_language=p->C_language; 
        p->C_language=a; 
        b=x->English; 
        x->English=p->English; 
        p->English=b; 
    } 
    printf("\t排序成功!\n"); 
    getch(); 

void Num_Sort(Node p) 

    Node x,y; 
    int len=p->Num; 
    for(int i=0;i<len;++i) 
    { 
        p=p->Next; 
        x=p; 
        y=p->Next; 
        for(int j=i+1;j<len;++j) 
        { 
            if(x->Num>y->Num) 
            { 
                x=y; 
            } 
            y=y->Next; 
        } 
            float a,b; 
            char s[30]; 
            long long w; 
            w=x->Num; 
            x->Num=p->Num; 
            p->Num=w; 
            strcpy(s,x->Name); 
            strcpy(x->Name,p->Name); 
            strcpy(p->Name,s); 
            a=x->C_language; 
            x->C_language=p->C_language; 
            p->C_language=a; 
            b=x->English; 
            x->English=p->English; 
            p->English=b; 
    } 
    printf("\t排序成功!\n"); 
    getch(); 

void Menu1() 

    system("color 1a"); 
    printf("\n"); 
    printf("\t             成績管理系統 \3\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t1:添加\t   |\t2:輸出\t     |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t3:插入\t   |\t4:排序\t     |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t5:刪除\t   |\t6:查詢\t     |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t7:修改\t   |\t8:退出\t     |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t9:寫出到文件\t             |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t|\t10:導入從文件\t             |\n"); 
    printf("        --------------------------------------\n"); 
    printf("\t"); 
    printf("\n"); 

void Explanation() 

    system("cls"); 
    system("color 07"); 
    printf("------------------------------------------------------------------\n"); 
    printf("\t在編寫過程中有很多地方使用了getch停頓\n"); 
    printf("------------------------------------------------------------------\n"); 
    printf("\t所以經常回車要按兩次!也要看情況,有些地方一次就行了\n"); 
    printf("------------------------------------------------------------------\n"); 
    printf("\t如果按了一次回車沒有反應,那就在按一次,\n"); 
    printf("------------------------------------------------------------------\n"); 
    printf("\t在輸入文件地址的時候要輸入絕對地址\n"); 
    printf("------------------------------------------------------------------\n"); 
    printf("\t在win7下要在C盤寫文件需要用管理員權限.\n"); 
    printf("------------------------------------------------------------------\n"); 
    printf("\t"); 
    getch(); 

void Import(Node p) 

    printf("\t警告:此操作將使用文件中的數據覆蓋此時內存中的緩存數據!!\n"); 
    char ch; 
    printf("\n"); 
    printf("\t是否替換!(y/n)\n"); 
    fflush(stdin); 
    printf("\t"); 
    scanf("%c",&ch); 
    if(ch=='y'||ch=='Y') 
    { 
        p->Num=0; 
        FILE * a1; 
        char lujing[100]; 
        printf("\t輸入要導入文件的路徑!\n"); 
        fflush(stdin); 
        printf("\t"); 
        gets(lujing); 
        a1=fopen(lujing,"rb"); 
        if(a1==NULL) 
        { 
            printf("\t打開文件失敗,導入數據失敗!\n"); 
            return ; 
        } 
        Node q=p; 
        while(!feof(a1)) 
        { 
            p->Num++; 
            Node NEW =new struct L; 
            fscanf(a1,"%s%lld%f%f",NEW->Name,&NEW->Num,&NEW->English,&NEW->C_language); 
            q->Next=NEW; 
            NEW->Next=NULL; 
            q=q->Next; 
        } 
        p->Num--; 
        printf("\t操作成功!\n"); 
        fclose(a1); 
        getch(); 
        return ; 
    } 
    else if(ch=='n'||ch=='N') 
    { 
        printf("\t操作被取消!\n"); 
        getch(); 
        return ; 
    } 
    else 
    { 
        printf("\t輸入有誤!\n"); 
        getch(); 
        return ; 
    }    

void Export(Node p) 

    printf("\t警告:此操作將覆蓋源文件中的數據!!\n"); 
    char ch; 
    printf("\n"); 
    printf("\t是否替換!(y/n)\n"); 
    fflush(stdin); 
    printf("\t"); 
    scanf("%c",&ch); 
    if(ch=='y'||ch=='Y') 
    { 
        FILE * a1; 
        char lujing[100]; 
        printf("\t輸入要導出文件的路徑!\n"); 
        fflush(stdin); 
        printf("\t"); 
        gets(lujing); 
        a1=fopen(lujing,"wb"); 
        if(a1==NULL) 
        { 
            printf("\t打開文件失敗,導出數據失敗!\n"); 
            return ; 
        } 
        int len=p->Num; 
        for(int i=0;i<len;++i) 
        { 
            p=p->Next; 
            fprintf(a1,"%s %lld %.2f %.2f\n",p->Name,p->Num,p->English,p->C_language); 
        } 
        printf("\t操作成功!\n"); 
        fclose(a1); 
        getch(); 
        return ; 
    } 
    else if(ch=='n'||ch=='N') 
    { 
        printf("\t操作被取消!\n"); 
        getch(); 
        return ; 
    } 
    else 
    { 
        printf("\t輸入有誤!\n"); 
        getch(); 
        return ; 
    } 

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
typedef struct L
{
 char Name[30];
 long long Num;
 float English;
 float C_language;
 struct L *Next;
}*Node;
void Menu();                    //功能菜單
void Search(Node p);            //查找
void Name_Search(Node p);        //按姓名查找
void Num_Search(Node p);          //按學號查找
void Initialization(Node p);      //初始化表
void Add(Node p);              // 添加
void Insert(Node p);             //插入
void Delet(Node p);               //刪除
void Show(Node p);                 //顯示
void Sort(Node p);            //排序
void C_Sort(Node p);           //c成績排序
void En_Sort(Node p);           //英語成績排序
void Num_Sort(Node p);       // 學號排序
void All_Sort(Node p);          //總成績排序
void Most(Node p);                  //最大值
void DelName(Node p);         //按姓名刪除
void DelNum(Node p);       //按學號刪除
void Modify(Node p);            //修改
void Num_Modify(Node p);         //按學號修改
void Name_Modify(Node p);       //按姓名修改
void Menu1();                  //菜單
void Explanation();              //說明
void Import(Node p);           //從文件導入數據
void Export(Node p);           //將數據導入到外部文件中
int main()
{
 Node p=new struct L;
 system("color 1a");
 Initialization(p);
 Menu();
 printf("\t選擇:\n");
 printf("\t");
 int m;
 while(true)
 {
  scanf("%d",&m);
   if(m==11)
   {
    Explanation();
    getch();
    system("cls");
    break;
   }
   else
   {
    printf("\t請先看說明!\n");
    printf("\t");
   } 
 }
 Menu1();
 printf("\t選擇:\n");
 printf("\t");
 int n;
 while(scanf("%d",&n)!=EOF)
 {
  switch(n)
  {
   case 1:
    Add(p);fflush(stdin);break;
   case 2:
    Show(p);fflush(stdin);break;
   case 3:
    Insert(p);fflush(stdin);break;
   case 4:
    Sort(p);fflush(stdin);break;
   case 5:
    Delet(p);fflush(stdin);break;
   case 6:
    Search(p);fflush(stdin);break;
   case 7:
    Modify(p);fflush(stdin);break;
   case 8:
    fflush(stdin);return 0;
   case 9:
    Export(p);fflush(stdin);break;
   case 10:
    Import(p);fflush(stdin);break;
   case 11:
    Explanation();fflush(stdin);break;
   default :
    fflush(stdin);printf("\t沒有該選項:\n");break;
  }
  
  getch();
  printf("\t");
  system("cls");
  Menu1();
  printf("\t選擇:\n");
  printf("\t");
 }
 return 0;
}
void Menu()
{
 printf("\n");
 printf("\t             成績管理系統 \3\n");
 printf("        --------------------------------------\n");
 printf("\t|\t1:添加\t   |\t2:輸出\t     |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t3:插入\t   |\t4:排序\t     |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t5:刪除\t   |\t6:查詢\t     |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t7:修改\t   |\t8:退出\t     |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t9:寫出到文件\t             |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t10:導入從文件\t             |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t11:說明(必看!)\t     |\n");
 printf("        --------------------------------------\n");
 printf("\t");
 printf("\n");
}
void Initialization(Node p)
{
 p->Next=NULL;
 p->Num=0;
}
void Add(Node p)
{
 long long a;
 float b,c;
 char na[30];
 
 while(p->Next!=NULL)
 {
  p=p->Next;
 }
 Node q=(Node)malloc(sizeof(struct L));
 printf("\t輸入姓名:\n");
 printf("\t");
 scanf("%s",&na);
 printf("\t輸入學號:\n");
 printf("\t");
 if(scanf("%lld",&a)==0)
 {
  printf("\t輸入類型與要求不符合,添加失敗!!\n");
  getch();
  return ;
 }
 q->Num=a;
 printf("\t輸入英語成績:\n");
 printf("\t");
 if(scanf("%f",&b)==0)
 {
  printf("\t輸入類型與要求不符合,添加失敗!!\n");
  getch();
  return ;
 }
 q->English=b;
 printf("\t輸入C語言成績:\n");
 printf("\t");
 if(scanf("%f",&c)==0)
 {
  printf("\t輸入類型與要求不符合,添加失敗!!\n");
  getch();
  return ;
 }
 q->C_language=c;
 strcpy(q->Name,na);
 p->Next=q;
 q->Next=NULL;
 printf("\t添加成功!\n");
 p->Num++;
 getch();
}
void Insert(Node p)
{
 p->Num++;
 printf("\t輸入插入位置:\n");
 int n;
 printf("\t");
 scanf("%d",&n);
 if(n<=0)
 {
  printf("位置錯誤!\n");
  return;
 }
 n-=1;
 while(n--)
 {
  p=p->Next;
 }
 Node q=(Node)malloc(sizeof(struct L));
 printf("\t輸入姓名:\n");
 scanf("%s",&q->Name);
 printf("\t輸入學號:\n");
 scanf("%lld",&q->Num);
 printf("\t輸入英語成績:\n");
 scanf("%f",&q->English);
 printf("\t輸入C語言成績:\n");
 scanf("%f",&q->C_language);
 q->Next=p->Next;
 p->Next=q;
 printf("\t插入成功!\n");
 getch();
}
void Delet(Node p)
{
 if(p->Num==0)
 {
  printf("\t沒有可刪除的數據!\n");
  return;
 }
 p->Num--;
 printf("\t選擇:\n");
 printf("\t1:按姓名刪除:\n");
 printf("\t2:按學號刪除:\n");
 int n;
 printf("\t");
 scanf("%d",&n);
 switch(n)
 {
  case 1:DelName(p);break;
  case 2:DelNum(p);break;
  default:printf("\t無此選擇!\n");break;
 }
 printf("\t刪除成功!\n");
 getch();
}
void DelName(Node p)
{
 char s[30];
 printf("\t輸入姓名:\n");
 printf("\t");
 scanf("%s",&s);
 Node q=p;
 for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next)
 {
  if(!strcmp(q->Name,s))
  {
   p->Next=p->Next->Next;
  }
 }
 getch();
}
void DelNum(Node p)
{
 long long n;
 printf("\t輸入學號:\n");
 printf("\t");
 scanf("%lld",&n);
 Node q=p;
 for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next)
 {
  if(q->Num==n)
  {
   p->Next=p->Next->Next;
  }
 }
 getch();
}
void Show(Node p)
{
 if(p->Num==0)
 {
  printf("\t沒有可顯示的數據!\n");
  return;
 }
 int len=p->Num;
 p=p->Next;
 for(int i=0;i<len;++i)
 {
  printf("        -------------------------------------------------\n");
  printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
  printf("        -------------------------------------------------\n");
  printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
  printf("        -------------------------------------------------\n");
  printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
  printf("        -------------------------------------------------\n");
  printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
  printf("        -------------------------------------------------\n");
  printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language);
  printf("        -------------------------------------------------\n");
  printf("\n");
  p=p->Next;
 }
 printf("\t顯示完!\n");
 getch();
}
void C_Sort(Node p)
{
 Node x,y;
 int len=p->Num;
 for(int i=0;i<len;++i)
 {
  p=p->Next;
  x=p;
  y=p->Next;
  for(int j=i+1;j<len;++j)
  {
   if(x->C_language>y->C_language)
   {
    x=y;
   }
   y=y->Next;
  }
   float a,b;
   long long w;
   char s[30];
   w=x->Num;
   x->Num=p->Num;
   p->Num=w;
   strcpy(s,x->Name);
   strcpy(x->Name,p->Name);
   strcpy(p->Name,s);
   a=x->C_language;
   x->C_language=p->C_language;
   p->C_language=a;
   b=x->English;
   x->English=p->English;
   p->English=b;
 }
 printf("\t排序成功!\n");
 getch();
}
void Sort(Node p)
{
 if(p->Num==0)
 {
  printf("\t沒有可排序的數據!\n");
  return;
 }
 printf(" \t選擇:\n");
 printf(" \t1:C語言成績從小到大排序:\n");
 printf(" \t2:英語成績從小到大排序:\n");
 printf(" \t3:總成績從小到大排序:\n");
 printf(" \t4:學號從小到大排序:\n");
 int n;
 printf("\t");
 scanf("%d",&n);
 switch(n)
 {
  case 1:C_Sort(p);break;
  case 2:En_Sort(p);break;
  case 3:All_Sort(p);break;
  case 4:Num_Sort(p);break;
  default:printf("\t無此選擇!\n");break;
 }
 getch();
}
void En_Sort(Node p)
{
 Node x,y;
 int len=p->Num;
 for(int i=0;i<len;++i)
 {
  p=p->Next;
  x=p;
  y=p->Next;
  for(int j=i+1;j<len;++j)
  {
   if(x->English>y->English)
   {
    x=y;
   }
   y=y->Next;
  }
   float a,b;
   char s[30];
   long long w;
   w=x->Num;
   x->Num=p->Num;
   p->Num=w;
   strcpy(s,x->Name);
   strcpy(x->Name,p->Name);
   strcpy(p->Name,s);
   a=x->C_language;
   x->C_language=p->C_language;
   p->C_language=a;
   b=x->English;
   x->English=p->English;
   p->English=b;
 }
 printf("\t排序成功!\n");
 getch();
}
void Search(Node p)
{
 if(p->Num==0)
 {
  printf("\t沒有可查找的數據!\n");
  return;
 }
 printf(" \t選擇:\n");
 printf(" \t1:按姓名查詢:\n");
 printf(" \t2:按學號查詢:\n");
 int n;
 printf("\t");
 scanf("%d",&n);
 switch(n)
 {
  case 1:Name_Search(p);break;
  case 2:Num_Search(p);break;
  default:printf("\t無此選擇!\n");break;
 }
 getch();
}
void Name_Search(Node p)
{
 char ap[30];
 printf("\t輸入姓名:\n");
 printf("\t");
 scanf("%s",&ap);
 int len=p->Num;
 p=p->Next;
 int i;
 for(i=0;i<len;++i)
 {
  if(!strcmp(ap,p->Name))
  {
   printf("        -------------------------------------------------\n");
   printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
   printf("        -------------------------------------------------\n");
   printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
   printf("        -------------------------------------------------\n");
   printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
   printf("        -------------------------------------------------\n");
   printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
   printf("        -------------------------------------------------\n");
   printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language);
   printf("        -------------------------------------------------\n");
   break;
  }
  p=p->Next;
 }
 if(i>=len)
 {
  printf("\t沒有找到該學生!\n");
 }
 getch();
}
void Num_Search(Node p)
{
 long long sd;
 printf("\t輸入學號:\n");
 printf("\t");
 scanf("%lld",&sd);
 int len=p->Num;
 p=p->Next;
 int i;
 for(i=0;i<len;++i)
 {
  if(sd==p->Num)
  {
   printf("        -------------------------------------------------\n");
   printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
   printf("        -------------------------------------------------\n");
   printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
   printf("        -------------------------------------------------\n");
   printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
   printf("        -------------------------------------------------\n");
   printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
   printf("        -------------------------------------------------\n");
   printf("\t|\t總分:\t\t|\t%.2f\n",p->English+p->C_language);
   printf("        -------------------------------------------------\n");
   break;
  }
   p=p->Next;
 }
 if(i>=len)
 {
  printf("\t沒有找到該學生!\n");
 }
 getch();
}
void Modify(Node p)
{
 if(p->Num==0)
 {
  printf("\t沒有可修改的數據!\n");
  return;
 }
 printf(" \t選擇:\n");
 printf(" \t1:輸入姓名修改:\n");
 printf(" \t2:輸入學號修改:\n");
 int n;
 printf("\t");
 scanf("%d",&n);
 switch(n)
 {
  case 1:Name_Modify(p);break;
  case 2:Num_Modify(p);break;
  default:printf("\t無此選擇!\n");break;
 }
 getch();
}
void Num_Modify(Node p)
{
 long long sd;
 printf("\t輸入學號:\n");
 printf("\t");
 scanf("%lld",&sd);
 int len=p->Num;
 p=p->Next;
 int i;
 for(i=0;i<len;++i)
 {
  if(sd==p->Num)
  {
   printf("        -------------------------------------------------\n");
   printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
   printf("        -------------------------------------------------\n");
   printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
   printf("        -------------------------------------------------\n");
   printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
   printf("        -------------------------------------------------\n");
   printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
   printf("        -------------------------------------------------\n");
   printf("\t這是之前的數據!\n");
   printf("\t現在請更改!\n");
   printf("\t輸入姓名:\n");
   printf("\t");
   scanf("%s",&p->Name);
   printf("\t輸入學號:\n");
   printf("\t");
   scanf("%lld",&p->Num);
   printf("\t輸入英語成績:\n");
   printf("\t");
   scanf("%f",&p->English);
   printf("\t輸入C語言成績:\n");
   printf("\t");
   scanf("%f",&p->C_language);
   printf("\t修改成功!\n");
   getch();
   break;
  }
  p=p->Next;
 }
 if(i>=len)
 {
  printf("\t沒有找到該學生!\n");
 }
 getch();

}
void Name_Modify(Node p)
{
 char ap[30];
 printf("\t輸入姓名:\n");
 printf("\t");
 scanf("%s",&ap);
 int len=p->Num;
 p=p->Next;
 int i;
 for(i=0;i<len;++i)
 {
  if(!strcmp(ap,p->Name))
  {
   printf("        -------------------------------------------------\n");
   printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
   printf("        -------------------------------------------------\n");
   printf("\t|\t學號:\t\t|\t%lld\n",p->Num);
   printf("        -------------------------------------------------\n");
   printf("\t|\t英語:\t\t|\t%.2f\n",p->English);
   printf("        -------------------------------------------------\n");
   printf("\t|\tC語言:\t\t|\t%.2f\n",p->C_language);
   printf("        -------------------------------------------------\n");
   printf("\t這是之前的數據!\n");
   printf("\t現在請更改!\n");
   printf("\t輸入姓名:\n");
   printf("\t");
   scanf("%s",&p->Name);
   printf("\t輸入學號:\n");
   printf("\t");
   scanf("%lld",&p->Num);
   printf("\t輸入英語成績:\n");
   printf("\t");
   scanf("%f",&p->English);
   printf("\t輸入C語言成績:\n");
   printf("\t");
   scanf("%f",&p->C_language);
   printf("\t修改成功!\n");
   getch();
   break;
  }
  p=p->Next;
 }
 if(i>=len)
 {
  printf("\t沒有找到該學生!\n");
 }
 getch();

}
void All_Sort(Node p)
{
 Node x,y;
 int len=p->Num;
 for(int i=0;i<len;++i)
 {
  p=p->Next;
  x=p;
  y=p->Next;
  for(int j=i+1;j<len;++j)
  {
   if((x->English+x->C_language)>(y->English+y->C_language))
   {
    x=y;
   }
   y=y->Next;
  }
  float a,b;
  char s[30];
  long long w;
  w=x->Num;
  x->Num=p->Num;
  p->Num=w;
  strcpy(s,x->Name);
  strcpy(x->Name,p->Name);
  strcpy(p->Name,s);
  a=x->C_language;
  x->C_language=p->C_language;
  p->C_language=a;
  b=x->English;
  x->English=p->English;
  p->English=b;
 }
 printf("\t排序成功!\n");
 getch();
}
void Num_Sort(Node p)
{
 Node x,y;
 int len=p->Num;
 for(int i=0;i<len;++i)
 {
  p=p->Next;
  x=p;
  y=p->Next;
  for(int j=i+1;j<len;++j)
  {
   if(x->Num>y->Num)
   {
    x=y;
   }
   y=y->Next;
  }
   float a,b;
   char s[30];
   long long w;
   w=x->Num;
   x->Num=p->Num;
   p->Num=w;
   strcpy(s,x->Name);
   strcpy(x->Name,p->Name);
   strcpy(p->Name,s);
   a=x->C_language;
   x->C_language=p->C_language;
   p->C_language=a;
   b=x->English;
   x->English=p->English;
   p->English=b;
 }
 printf("\t排序成功!\n");
 getch();
}
void Menu1()
{
 system("color 1a");
 printf("\n");
 printf("\t             成績管理系統 \3\n");
 printf("        --------------------------------------\n");
 printf("\t|\t1:添加\t   |\t2:輸出\t     |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t3:插入\t   |\t4:排序\t     |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t5:刪除\t   |\t6:查詢\t     |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t7:修改\t   |\t8:退出\t     |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t9:寫出到文件\t             |\n");
 printf("        --------------------------------------\n");
 printf("\t|\t10:導入從文件\t             |\n");
 printf("        --------------------------------------\n");
 printf("\t");
 printf("\n");
}
void Explanation()
{
 system("cls");
 system("color 07");
 printf("------------------------------------------------------------------\n");
 printf("\t在編寫過程中有很多地方使用了getch停頓\n");
 printf("------------------------------------------------------------------\n");
 printf("\t所以經常回車要按兩次!也要看情況,有些地方一次就行了\n");
 printf("------------------------------------------------------------------\n");
 printf("\t如果按了一次回車沒有反應,那就在按一次,\n");
 printf("------------------------------------------------------------------\n");
 printf("\t在輸入文件地址的時候要輸入絕對地址\n");
 printf("------------------------------------------------------------------\n");
 printf("\t在win7下要在C盤寫文件需要用管理員權限.\n");
 printf("------------------------------------------------------------------\n");
 printf("\t");
 getch();
}
void Import(Node p)
{
 printf("\t警告:此操作將使用文件中的數據覆蓋此時內存中的緩存數據!!\n");
 char ch;
 printf("\n");
 printf("\t是否替換!(y/n)\n");
 fflush(stdin);
 printf("\t");
 scanf("%c",&ch);
 if(ch=='y'||ch=='Y')
 {
  p->Num=0;
  FILE * a1;
  char lujing[100];
  printf("\t輸入要導入文件的路徑!\n");
  fflush(stdin);
  printf("\t");
  gets(lujing);
  a1=fopen(lujing,"rb");
  if(a1==NULL)
  {
   printf("\t打開文件失敗,導入數據失敗!\n");
   return ;
  }
  Node q=p;
  while(!feof(a1))
  {
   p->Num++;
   Node NEW =new struct L;
   fscanf(a1,"%s%lld%f%f",NEW->Name,&NEW->Num,&NEW->English,&NEW->C_language);
   q->Next=NEW;
   NEW->Next=NULL;
   q=q->Next;
  }
  p->Num--;
  printf("\t操作成功!\n");
  fclose(a1);
  getch();
  return ;
 }
 else if(ch=='n'||ch=='N')
 {
  printf("\t操作被取消!\n");
  getch();
  return ;
 }
 else
 {
  printf("\t輸入有誤!\n");
  getch();
  return ;
 } 
}
void Export(Node p)
{
 printf("\t警告:此操作將覆蓋源文件中的數據!!\n");
 char ch;
 printf("\n");
 printf("\t是否替換!(y/n)\n");
 fflush(stdin);
 printf("\t");
 scanf("%c",&ch);
 if(ch=='y'||ch=='Y')
 {
  FILE * a1;
  char lujing[100];
  printf("\t輸入要導出文件的路徑!\n");
  fflush(stdin);
  printf("\t");
  gets(lujing);
  a1=fopen(lujing,"wb");
  if(a1==NULL)
  {
   printf("\t打開文件失敗,導出數據失敗!\n");
   return ;
  }
  int len=p->Num;
  for(int i=0;i<len;++i)
  {
   p=p->Next;
   fprintf(a1,"%s %lld %.2f %.2f\n",p->Name,p->Num,p->English,p->C_language);
  }
  printf("\t操作成功!\n");
  fclose(a1);
  getch();
  return ;
 }
 else if(ch=='n'||ch=='N')
 {
  printf("\t操作被取消!\n");
  getch();
  return ;
 }
 else
 {
  printf("\t輸入有誤!\n");
  getch();
  return ;
 }
}

原先為了解決那個輸入錯誤問題,想了很多方法,近期看一個C函數手冊發現scanf函數。。。。。。解決了!!其實scanf函數是有返回值的,

函數原型:int scanf(char *format[,argument,...]);


如果輸入有誤則返回0;否則返回輸入數據的個數,利用這點就可以解決IO異常;

以前聽一個老師講java異常的時候他說這類異常是C語言力所不能及的!!

現在才發現C語言的博大精深,很多很多不知道的C語言秘密,

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved