資料結構課程設計——學生資訊管理系統

彭友程Percy發表於2016-12-29

程式區:
stud.h
#ifndef _TEST
#define _TEST
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<malloc.h>  
#define LEN sizeof(struct Student)  
  
struct Student          //學生資訊的結構體宣告  
{  
    unsigned int num;   //記錄學號  
    char grade[10];     //記錄年級  
    char name[20];      //記錄姓名  
    char born[20];      //記錄出生年月  
    char sex[10];       //記錄性別  
    char poli[20];      //記錄政治面貌  
    char phone[20];     //記錄聯絡電話  
    char addr[100];     //記錄家庭住址  
    struct Student *next;   //指向下一個結構體的指標  
};  
 
  
//******************對各功能函式的宣告***************************  
  
void show();                                                            //顯示函式的宣告  
struct Student *input();                                                   //新建學生資訊的函式宣告  
struct Student *insert(struct Student *head,struct Student *stu);       //插入學生資訊的函式宣告  
struct Student *del(struct Student *head);                              //刪除學生資訊的函式宣告  
void alter(struct Student *head);                                       //修改學生資訊的函式宣告  
void search(struct Student *head,unsigned int num);                     //查詢學生資訊的函式宣告  
void output(struct Student *head);                                      //儲存學生資訊的函式宣告  

#endif
stud.cpp
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<malloc.h>
#include"stud.h"
extern struct Student *head = NULL;  
extern unsigned int kg = 0;    
void show()  
{  
    int n,z = 1,k = 0;  
    char cho;  
    do  
    {  
        //***********顯示提示資訊**********  
        printf("                                     學生資訊管理系統                                      \n");  
        printf("                                                                                           \n");  
        printf("                             1.新建學生資訊  2.插入學生資訊                                \n");          //顯示序號1的功能  
        printf("                                                                                           \n");          //顯示序號2的功能  
        printf("                             3.刪除學生資訊  4.修改學生資訊                                \n");          //顯示序號3的功能  
        printf("                                                                                           \n");          //顯示序號4的功能  
        printf("                             5.查詢學生資訊  6.儲存學生資訊                                \n");          //顯示序號5的功能  
        printf("                                                                                           \n");          //顯示序號6的功能  
        printf("                                      0.退出系統                                           \n");          //顯示序號0的功能  
        printf("                                                                                           \n");  
  
        //********************************  
  
        printf("   請輸入功能序號: ");             //提示使用者輸入  
        while(!scanf("%d",&n))                      //接受使用者輸入的功能序號,並且進行排錯  
        {  
            printf("   輸入序號有誤,請重新輸入: ");  
            fflush(stdin);  //清空輸入緩衝區,通常是為了確保不影響後面的資料讀取
        }  
        printf("\n");                               //輸出回車  
  
        while((n < 0 || n > 6))                                       //對使用者輸入不能實現的功能序號進行處理  
        {  
            printf("   抱歉,沒有此功能,請重新輸入功能序號: ");      //提示使用者所輸入的功能序號系統不能進行處理  
            fflush(stdin);  
            while(!scanf("%d",&n))                                  //接收使用者重新輸入的功能序號  
            {  
                printf("   輸入序號有誤,請重新輸入: ");  
                fflush(stdin);  
            }                
            printf("\n");                                           //輸出回車  
        }  
  
        switch(n)                           //對使用者資訊進行功能函式的呼叫  
        {  
            case 0:  
            {  
                printf("   ");  
                if (k == 1)                 //對於沒有對資料進行存檔的情況進行對使用者提示以確認是否退出  
                {  
                    printf("資料未儲存,是否退出? Y.是 N.否 請選擇: ");  
                    fflush(stdin);  
                    cho = getchar();  
                    if (cho == 'y' || cho == 'Y')  
                    {  
                        z = 0;  
                        printf("   ");  
                    }  
                    else if (cho == 'n' || cho == 'N')  
                        {}  
                    else  
                    {  
                        printf("   無效輸入\n   ");  
                        system("pause");  
                    }  
  
                }  
                else  
                {  
                    z = 0;  
                }  
                break;  
            }  
            case 1:  
            {  
                head = input();  
                k = 1;  
                system("pause");  
                break;  
            }  
            case 2:  
            {  
                head = insert(head,NULL);  
                k = 1;  
                printf("   成功插入學生資訊\n   ");  
                system("pause");  
                break;  
            }  
            case 3:  
            {  
                head = del(head);  
                k = 1;  
                printf("   ");  
                system("pause");  
                break;  
            }  
            case 4:  
            {  
                alter(head);  
                break;  
            }  
            case 5:  
            {  
                if (head == NULL) k = 1;  
                search(head,0);  
                printf("   ");  
                system("pause");  
                break;  
            }  
            case 6:  
            {  
                k = 0;  
                output(head);  
                break;  
            }  
        }  
    }while(z == 1);  
}  
  
  
//***************************************************************  
  
  
  
struct Student *input()  
{  
    struct Student *p1,*p2; //尾插法 
    unsigned m,n,i;  
    FILE *read;  
    char filename[20];  
    head = NULL;  
  
  
        printf ("   請輸入學生人數: ");  
        while (!scanf("%u",&n))             //接收錄入學生資訊的人數,並對輸入有誤的進行排除  
        {  
            printf("   輸入有誤,請重新輸入學生人數: ");  
            fflush(stdin);  
        }  
        if (n == 0)                         //對錄入人數為0的情況進行處理  
        {  
            printf("   學生個數為0人,建立失敗\n   ");  
            return (head);  
        }  
        head = p2 = p1 = (struct Student *) malloc (LEN);                               //開闢記憶體,用於生成連結串列  
        printf("   學生個數為:%u個,請按照以下順序輸入\n",n);                           //對學生總數的提示,並且提示每個學生資訊的輸入順序  
        printf("   學號、年級、姓名、出生年月、性別、政治面貌、聯絡電話、家庭住址\n"); //每個學生資訊的輸入順序  
        for(i = 0; i < n; i++)  
        {  
            printf("   請輸入第%u個學生資訊!\n",i+1);                                    //提示接下來要輸入第幾個學生的資訊  
            printf("   ");                                                              //格式調整,輸出三個空格  
            fflush(stdin);  
            while(!scanf("%d %s %s %s %s %s %s %s",&p2->num,p2->grade,p2->name,p2->born,p2->sex,p2->poli,p2->phone,p2->addr))  
            {  
                printf("   輸入有誤,請重新輸入該學生資訊\n   ");  
                fflush(stdin);  
            }  
            if (n == 1)                                                                 //對錄入人數為1時的情況進行處理  
            {  
                p2->next = NULL;  
            }  
            else                                                                        //對錄入人數大於1的情況進行錄入,並在錄入時進行排序,每錄入一位學生資訊就開闢一個記憶體空間,用於下一個學生的錄入  
            {  
                head = insert(head,p2);  
                p2 = (struct Student *) malloc (LEN);  
            }  
        }  
  
    printf("   成功錄入學生資訊,並且學生資訊已經按學號從小到大排列\n");  
    printf("   學生資訊如下: \n");  
    search(head,1);                 //以表格的形式顯示所錄入的學生資訊  
    printf("   ");  
    return head;                    //返回*head指標的地址  
}  
  
struct Student *insert(struct Student *head,struct Student *stu)        //插入學生資訊功能函式定義  
{  
    struct Student *p1,*p2;  
    if (stu == NULL)            //對於傳入插入學生資訊為空時要求使用者輸入插入的學生資訊  
    {  
        printf("   請按照學號、年級、姓名、出生年月、性別、政治面貌、聯絡電話、家庭住址的順序輸入\n   ");  //每個學生資訊的輸入順序  
        stu = (struct Student *) malloc (LEN);  
        while(!scanf("%d %s %s %s %s %s %s %s",&stu->num,stu->grade,stu->name,stu->born,stu->sex,stu->poli,stu->phone,stu->addr))  
        {  
            printf("   輸入資訊有誤,請重新輸入\n");  
            fflush(stdin);  
        }  
    }  
    if (head == NULL)           //對於連結串列為空的情況的處理  
    {  
        head = stu;  
        head->next = NULL;  
    }  
    else                        //在連結串列中插入學生資訊  
    {  
        p1 = p2 = head;  
        while(stu->num > p2->num && p1->next != NULL)       //查詢適合位置的前一個學生  
        {  
            p2 = p1;  
            p1 = p1->next;  
        }  
        if (p2 == p1)           //插入的學生正好為連結串列頭的情況  
        {  
            if (stu->num < p2->num)            //插入在表頭前  
            {  
                head = stu;  
                stu->next = p2;  
            }  
            else                            //插入在表頭後  
            {  
                p2->next = stu;  
                stu->next = NULL;  
            }  
        }  
        else                    //插入的學生在連結串列中的情況  
        {  
            if (stu->num < p1->num)            //插入到p1指向的學生前  
            {  
                p2->next = stu;  
                stu->next= p1;  
            }  
            else                            //插入到p1指向的學生後  
            {  
                p1->next = stu;  
                stu->next =  NULL;  
            }  
        }  
    }  
    kg = 1;  
    return(head);  
}  
  
struct Student *del(struct Student *head)               //刪除學生資訊的功能函式定義  
{  
    unsigned int num,k;  
    struct Student *p1,*p2;  
    if (head == NULL)                                   //對空連結串列刪除的情況處理  
    {  
        printf("   沒有學生資訊,結束刪除\n");  
        return(head);  
    }  
    printf("   請輸入要刪除的學生學號: ");             //求使用者輸入要刪除的學生學號  
    while(!scanf("%u",&num))                            //接收學生序號並進行排錯處理  
    {  
        printf("   輸入有誤,請重新輸入學生序號: ");  
        fflush(stdin);  
    }  
    do  
    {  
        p1 = p2 = head;  
        while(num != p1->num && p1->next != NULL)     //查詢刪除位置的前一個學生  
        {  
            p2 =p1;  
            p1= p1->next;  
        }  
        if (num == p1->num)                              //對滿足要求的學生進行刪除  
        {  
            if (num == p1->num)  
            {  
                if (p1->next == NULL && p1 == head)      //對只有一個節點的連結串列進行刪除  
                {  
                    free(p1);  
                    head = NULL;  
                }  
                else if (p1->next == NULL)               //刪除連結串列尾節點  
                {  
                    free(p1);  
                    p2->next = NULL;  
                }  
                else if (head == p1)                    //刪除表頭節點  
                {  
                    head = p1->next;  
                    free(p1);  
                }  
                else                                    //刪除表中節點  
                {  
                    p2->next = p1->next;  
                    free(p1);  
                }  
            }  
            printf("   成功刪除學生資訊\n");            //提示刪除成功資訊  
        }  
        else                                            //找不到要刪除的學生時的提示  
        {  
            printf("   找不到該同學資訊\n");  
            fflush(stdin);  
        }  
        if (head == NULL)                               //對空連結串列刪除時的處理  
        {  
            printf("   沒有學生資訊,結束刪除\n");  
            return(head);  
        }  
        else                                            //提示使用者刪除後是否繼續  
        {  
            printf("   1.繼續刪除學生資訊\n");  
            printf("   2.結束刪除\n");  
            printf("   請選擇: ");  
            while(!scanf("%u",&k))                      //接收使用者選擇  
            {  
                printf("   輸入有誤,請重新輸入選擇的序號: ");  
                fflush(stdin);  
            }  
            if (k == 1)                                 //選擇繼續  
            {  
                printf("   請輸入要刪除的學生學號: ");  
                while(!scanf("%u",&num))  
                {  
                    printf("   輸入有誤,請重新輸入學生學號: ");  
                    fflush(stdin);  
                }  
            }  
            else if (k != 2)                            //對於不是選擇2的繼續迴圈提示  
            {  
                k = 1;  
            }  
        }  
    }while(k == 1);  
    return(head);       //返回表頭地址  
}  
  
void search(struct Student *head,unsigned int num)      //查詢函式的定義  
{  
    unsigned int cho,t = 0;  
    struct Student *p1;  
    if (head == NULL)       //對查詢空連結串列時的操作  
    {  
        printf("   沒有學生資訊,結束查詢\n");  
        return;  
    }  
    p1 = head;  
    if (num == 0)           //當傳入實參 num = 0 需要接受使用者需要的查詢方式(個別或者全部),不等於0則可以直接查詢個別學生資訊  
    {  
        printf("   1.查詢個別學生資訊\n");  
        printf("   2.查詢全部學生資訊\n");  
        printf("   請選擇: ");  
        while(!scanf("%u",&cho))    //對錯誤輸入資料的處理  
        {  
            printf("   輸入有誤,請重新輸入序號: ");  
            fflush(stdin);  
        }  
        while(cho != 1 && cho != 2)                                                     //處理不能處理的功能序號  
        {  
            printf("   抱歉,沒有此功能,請重新輸入功能序號: ");              //提示不能處理的資訊,並要求使用者重新輸入功能序號  
            while(!scanf("%u",&cho))                                                        //接收使用者重新輸入的功能序號  
            {  
                printf("   輸入序號有誤,請重新輸入序號: ");  
                fflush(stdin);  
            }  
            printf("\n");                                                       //輸出回車  
        }  
    }  
    else  
    {  
        cho = 1;         //設定直接查詢個別學生的開關  
    }  
    if (kg == 1)        //kg(全域性變數)為全部學生查詢的開關  kg = 1 開啟開關由下面直接進行全部學生查詢 kg = 0 關閉開關  
    {  
        cho = 2;  
    }  
    switch(cho) //查詢類別分支  
    {  
        case 1: //查詢個別學生  
        {  
            do  
            {  
                p1 = head;  
                if (num == 0 || t == 1)  
                {  
                    printf("   請輸入需要查詢的學生學號: ");  
                    while(!scanf("%u",&num))  
                    {  
                        printf("   輸入有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    t = 1;  //開啟開關,該開關為查詢完畢後 num不能作為該分支的條件(因為以下的操作會改變num的值)而建立的,並且能夠實現當傳入num不等於0時,以下詢問使用者是否繼續的分支就不用執行了  
                }  
                else  
                {  
                    cho = 2; //如果傳入的實參num不等於0  則該 DO WHILE 迴圈只做一次  
                }  
                while(p1->num != num)    //查詢查詢學生學號  
                {  
                    if (p1->next == NULL) break;  
                    p1 = p1->next;  
                }  
                if (p1->num == num)  //查詢成功一表格方式輸出該學生資訊  
                {  
                    //***********************表格頭部設計************************  
  
                    printf("   ┃學號┃年級┃  姓名  ┃出生年月┃性別┃政治面貌┃  聯絡電話  ┃              家庭住址                ┃\n");  
                    //**********************************************************  
  
                    //****************表格主體設計以及資料輸出******************  
  
                    printf("   ┃%-4d┃%-4s┃%-8s┃%-8s┃%-4s┃%-8s┃%-12s┃%-38s┃\n",p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr);  
                    //**********************************************************  
                    //***********************表格頭部設計***********************  
  
                    //*********************************************************  
                }  
                else //查詢不成功,提示使用者找不到該學生  
                {  
                    printf("   找不到該學生\n");  
                }  
                if (t == 1)  //如果傳入的num=0,則此分支有效,詢問使用者是否繼續查詢  
                {  
                    printf("   1.繼續查詢\n");  
                    printf("   2.結束查詢\n");  
                    printf("   請選擇: ");  
                    while(!scanf("%u",&cho))  //對輸入序號查錯,利用cho = 2時的情況跳出  DO WHILE 迴圈  
                    {  
                        printf("   輸入序號有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                }  
            }while (cho == 1);  
            break;  
        }  
        case 2: //查詢全部資訊  
        {  
            //***********************表格頭部設計************************  
  
            printf("   ┃學號┃年級┃  姓名  ┃出生年月┃性別┃政治面貌┃  聯絡電話  ┃              家庭住址                ┃\n");  
            //**********************************************************  
            //****************表格主體設計以及資料輸出******************  
            while(p1 != NULL)  
            {  
                //intf("   ┣━━╋━━╋━━━━╋━━━━╋━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━┫\n");  
                printf("   ┃%-4d┃%-4s┃%-8s┃%-8s┃%-4s┃%-8s┃%-12s┃%-38s┃\n",p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr);  
                p1 = p1->next;  
            }  
            //**********************************************************  
            //***********************表格頭部設計***********************  
  
            //**********************************************************  
            break;  
        }  
    }  
    if (kg == 1) kg = 0; //關閉查詢全部學生的開關,以便下一次使用  
}  
  
  
void alter(struct Student *head)  //修改學生資訊的功能函式定義  
{  
    struct Student *p1,*p2;  
    unsigned int num,cho,k,l=0;  
    if (head == NULL)   //對空連結串列的處理  
    {  
        printf("   沒有學生資訊,結束脩改\n   ");  
        system("pause");  
        return;  
    }  
    printf("   請輸入需要修改的學生學號: ");  
    while(!scanf("%u",&num))    //接受使用者輸入的學號並且進行查錯  
    {  
        printf("   輸入學號有誤,請重新輸入: ");  
        fflush(stdin);  
    }  
    do  
    {  
        p2 = p1 = head;  
        while(p1->num != num)    //查詢學生學號  
        {  
            if (p1->next == NULL)  
                break;  
            p2 = p1;  
            p1 = p1->next;  
        }  
        if (p1->num == num)      //查詢成功  
        {  
            printf("   已找到該學生,該學生的資訊為: \n");  
            search(head,num);  
            l = 0;  
            do  
            {  
                if (l == 0)     //開關,當第一次迴圈時 l=0 執行 IF 語句  
                    printf("   選擇修改的內容\n");  
                else  
                    printf("   序號輸入錯誤,請重新選擇\n");  
                l = 1;  //開啟開關,以在以下操作使用者輸入序號超出範圍時控制上面的分支語句,進而可以更好地向使用者提示資訊  
                printf("   1.學號\n");  
                printf("   2.年級\n");  
                printf("   3.姓名\n");  
                printf("   4.出生年月\n");  
                printf("   5.性別\n");  
                printf("   6.政治面貌\n");  
                printf("   7.聯絡電話\n");  
                printf("   8.家庭住址\n");  
                printf("   9.全部\n");  
                printf("   請選擇序號: ");  
                fflush(stdin);  
                while(!scanf("%u",&cho)) //接受序號並查錯  
                {  
                    printf("   輸入序號有誤,請重新輸入: ");  
                    fflush(stdin);  
                }  
            }while(cho > 9 || cho < 1);  
            switch(cho)  //對序號進行多分支處理  
            {  
                case 1:  
                {  
                    printf("   請輸入該學生改正的學號資訊: ");  
                    while(!scanf("%u",&p1->num))  
                    {  
                        printf("   輸入改正資訊有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    break;  
                }  
                case 2:  
                {  
                    printf("   請輸入該學生改正的年級資訊: ");  
                    while(!scanf("%s",p1->grade))  
                    {  
                        printf("   輸入改正資訊有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    break;  
                }  
                case 3:  
                {  
                    printf("   請輸入該學生改正的姓名資訊: ");  
                    while(!scanf("%s",p1->name))  
                    {  
                        printf("   輸入改正資訊有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    break;  
                }  
                case 4:  
                {  
                    printf("   請輸入該學生改正的出生年月資訊: ");  
                    while(!scanf("%s",p1->born))  
                    {  
                        printf("   輸入改正資訊有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    break;  
                }  
                case 5:  
                {  
                    printf("   請輸入該學生改正的性別資訊: ");  
                    while(!scanf("%s",p1->sex))  
                    {  
                        printf("   輸入改正資訊有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    break;  
                }  
                case 6:  
                {  
                    printf("   請輸入該學生改正的政治面貌資訊: ");  
                    while(!scanf("%s",p1->poli))  
                    {  
                        printf("   輸入改正資訊有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    break;  
                }  
                case 7:  
                {  
                    printf("   請輸入該學生改正的聯絡電話資訊: ");  
                    while(!scanf("%s",p1->phone))  
                    {  
                        printf("   輸入改正資訊有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    break;  
                }  
                case 8:  
                {  
                    printf("   請輸入該學生改正的家庭住址資訊: ");  
                    while(!scanf("%s",p1->addr))  
                    {  
                        printf("   輸入改正資訊有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    break;  
                }  
                case 9:  
                {  
                    printf("   請輸入該學生全部要改正的資訊: ");  
                    while(!scanf("%u %s %s %s %s %s %s %s",&p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr))  
                    {  
                        printf("   輸入改正資訊有誤,請重新輸入: ");  
                        fflush(stdin);  
                    }  
                    break;  
                }  
            }  
            if (cho == 1 || cho == 9)   //對修改過學號的學生進行重新排序  
            {  
                if (p1 == head) //當該學生在連結串列頭時,刪除連結串列頭節點  
                {  
                    head = head->next;  
                }  
                else if (p1->next == NULL) //當該學生在連結串列尾時,刪除連結串列尾節點  
                {  
                    p2->next = NULL;  
                }  
                else    //當該學生在連結串列中時,刪除該學生對應的節點  
                {  
                    p2->next = p1->next;  
                }  
                head = insert(head,p1); //利用插入學生資訊功能函式,進行該學生的重新排序  
            }  
            printf("   修改成功,該學生改正後的資訊為: \n");  
            search(head,p1->num);    //顯示以下修改後的學生資訊  
  
            //詢問使用者是否繼續  
            printf("   1.繼續修改其他學生資訊\n");  
            printf("   2.退出修改\n");  
            printf("   請選擇: ");  
            while(!scanf("%u",&k))      //接受使用者輸入的序號,並進行排錯  
            {  
                printf("   輸入序號有誤,請重新輸入: ");  
                fflush(stdin);  
            }  
            if (k == 1) //接受下一次修改的學生學號  
            {  
                printf("   請輸入需要修改的學生學號: ");  
                while(!scanf("%u",&num))  
                {  
                    printf("   輸入修改資訊有誤,請重新輸入: ");  
                    fflush(stdin);  
                }  
            }  
            else if (k != 2) //排錯  
            {  
                printf("   輸入有誤,請重新輸入\n");  
            }  
        }  
        else    //查詢不到學生時要求使用者進行重新輸入學生序號  
        {  
            k = 1;  
            printf("   找不到該學生資訊,請重新輸入需要修改的學生學號: ");  
            fflush(stdin);  
            while(!scanf("%u",&num));  //接受使用者重新輸入的學號並進行排錯  
            {  
                printf("   輸入修改資訊有誤,請重新輸入: ");  
                fflush(stdin);  
            }  
        }  
    }while(k == 1);  
    printf("   ");  
    system("pause");  
}  
  
  
void output(struct Student *head)   //儲存學生資訊到txt檔案功能函式  
{  
    FILE *write;  
    char filename[20];  
    struct Student *p1,*p2;  
    unsigned int cho,n;  
    if (head == NULL)   //對空連結串列進行處理  
    {  
        printf("   沒有學生資訊,儲存失敗\n   ");  
        system("pause");  
        return;  
    }  
    p1 = p2 = head;  
    printf("   請輸入儲存的檔名(如save): ");  
    while(!scanf("%s",filename))    //接受檔名,並進行排錯(幾乎不會出現錯誤的現象,慎重而設)  
    {  
        printf("   輸入的檔名有誤,請重新輸入:");  
        fflush(stdin);  
    }  
    strcat(filename,".txt");    //連結字尾名  
    write = fopen(filename,"w");    //以寫入方式開啟檔案  
  
    //詢問使用者用哪種方式儲存  
    printf("   1.以表格形式儲存(不可重新錄入)\n");    
    printf("   請按1進行確認  : ");  
    while(!scanf("%u",&cho))    //接受使用者輸入的序號並進行排錯  
    {  
        printf("   輸入序號有誤,請重新輸入: ");  
        fflush(stdin);  
    }  
    while(cho < 1 || cho > 1) //對超出範圍的序號進行排錯  
    {  
        printf("   輸入序號有誤,請重新輸入: ");  
        while(!scanf("%u",&cho))  
        {  
            printf("   輸入序號有誤,請重新輸入: ");    //對輸入錯誤的序號進行排錯  
            fflush(stdin);  
        }  
    }  
    if (cho == 1)   //以表格形式儲存  
    {  
        //***********************表格頭部設計************************  
  
        fprintf(write,"   ┃學號┃年級┃  姓名  ┃出生年月┃性別┃政治面貌┃  聯絡電話  ┃              家庭住址                ┃\n");  
        //**********************************************************  
        //****************表格主體設計以及資料輸出******************  
        while(p1 != NULL)  
        {  
        ;  
            fprintf(write,"   ┃%-4d┃%-4s┃%-8s┃%-8s┃%-4s┃%-8s┃%-12s┃%-38s┃\n",p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr);  
            p1 = p1->next;  
        }  
        //**********************************************************  
        //***********************表格頭部設計***********************  
  
        //**********************************************************  
  
    }  
    fclose(write);  
    printf("   儲存成功\n   ");  
    system("pause");  
} 

main.cpp
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<malloc.h>  
#include"stud.h"
   
int main()  
{  
    show();     //呼叫顯示功能函式  
return 0;







相關文章