天天看點

學生管理系統的優化過程

  知道自己太弱,距離大神們差了十萬八千裡,但是我不希望自己将來成為一個平庸的程式員,是以希望借用部落格園這一平台來不斷發表自己的文章,進而不斷激勵自己,提升自己。-----靜平

  上學期學了C語言,一直想要寫出個東西來,以前寫過一個通訊錄,上周末花了一天時間寫了一個學生資訊管理系統。但是兩者都有一個緻命的缺點:隻能在.exe檔案中儲存和使用,卻不能儲存在電腦中。想過用檔案的方法來實作,但是苦于水準太差。今天晚上看了一下c++中的檔案,恍然大悟。于是決定利用部落格園這一平台來記錄自己将一個c程式改成c++程式并且不斷完善它的過程。

  好吧,下面先貼自己那醜的要命的代碼:(基本是用函數和switch堆砌而成的)

這部分是頭檔案部分:

#include<string.h>
#define strcpy strcpy_s  //由于是在vs上編輯的,而且前期忘了加上_s,是以隻好用define這種小聰明的辦法了
typedef struct Primary
{
    int sum;
    int grade[20];
    char subject[20][20];
    int classs;
}Primary;
struct Student
{
    Primary primary;
    int ID;
    char name[20];
};
    struct Student student[1000];
    static int i=0,count=0;
    
    void sort();
    void AddPrimary();
    void AddStudent();
    void ReaddStudent();
    void LookUp();
    void Change();
    void Delete();
    void Scan();
    void AddGrade();
    void DeleteGrade();
    void ScanGrade();
    void ChangeGrade();
    void LookupGrade();
    void Scanstatistic();
    void sorting();
    void grade();
    void information();
    void statistics();

    void information()
    {
        printf("1----錄入基礎資訊(科目)\n");
        printf("2----錄入學生資訊\n");
        printf("3----追加學生資訊\n");
        printf("4----查詢指定學生資訊\n");
        printf("5----修改指定學生資訊\n");
        printf("6----删除指定學生資訊\n");
        printf("7----浏覽學生資訊\n");
        printf("0----傳回主菜單\n");
        printf("請輸入操作子產品代号:");
        int choice1;
        while (scanf_s("%d", &choice1))
        {
            switch (choice1)
            {
            case 1:AddPrimary(); break;
            case 2:AddStudent(); break;
            case 3:ReaddStudent(); break;
            case 4:LookUp(); break;
            case 5:Change(); break;
            case 6:Delete(); break;
            case 7:Scan(); break;
            case 0:
            {
                      printf("***************學生成績管理系統主菜單*****************************************\n");
                      printf("1----學生基本資訊管理子產品(錄入、修改、查詢、删除、浏覽)\n");
                      printf("2----學生成績資訊管理子產品(錄入、修改、查詢、删除、浏覽\n");
                      printf("3----學生成績統計子產品\n");
                      printf("0----退出系統\n");
                      printf("請輸入操作子產品代号:");
                      int choice;
                      while (scanf_s("%d", &choice))
                      {
                          switch (choice)
                          {
                          case 1:information(); break;
                          case 2:grade(); break;
                          case 3:statistics(); break;
                          case 0:printf("謝謝使用,再見\n"); exit(0);
                          }

                      }
            }; break;
            }
        }
    }



    void grade()
    {
        printf("1----錄入學生成績\n");
        printf("2----查詢指定學生成績\n");
        printf("3----修改指定學生成績\n");
        printf("4----删除指定學生成績\n");
        printf("5----浏覽學生成績資訊\n");
        printf("0----傳回主菜單\n");
        printf("請輸入操作子產品代号:\n");
        int choice1;
        while (scanf_s("%d", &choice1))
        {
            switch (choice1)
            {
            case 1:AddGrade(); break;
            case 2:LookupGrade(); break;
            case 3:ChangeGrade(); break;
            case 4:DeleteGrade(); break;
            case 5:ScanGrade(); break;
            case 0:
            {
                {
                    printf("***************學生成績管理系統主菜單************************************\n");
                    printf("1----學生基本資訊管理子產品(錄入、修改、查詢、删除、浏覽)\n");
                    printf("2----學生成績資訊管理子產品(錄入、修改、查詢、删除、浏覽\n");
                    printf("3----學生成績統計子產品\n");
                    printf("0----退出系統\n");
                    printf("請輸入操作子產品代号:");
                    int choice;
                    while (scanf_s("%d", &choice))
                    {
                        switch (choice)
                        {
                        case 1:information(); break;
                        case 2:grade(); break;
                        case 3:statistics(); break;
                        case 0:printf("謝謝使用,再見\n"); exit(0);
                        }

                    }
                }; break;
            }
            }
        }
    }

    void statistics()
    {
        printf("1----按成績從高到低排序\n");
        //printf("2----統計\n");
        printf("3----浏覽\n");
        printf("0----傳回主菜單\n");
        printf("請輸入操作子產品代号:\n");
        int choice1;
        while (scanf_s("%d", &choice1))
        {
            switch (choice1)
            {
            case 1:sorting(); break;
            //case 2:statistic(); break;
            case 3:Scanstatistic(); break;
            case 0:
            {
                      printf("***************學生成績管理系統主菜單**************************************\n");
                      printf("1----學生基本資訊管理子產品(錄入、修改、查詢、删除、浏覽)\n");
                      printf("2----學生成績資訊管理子產品(錄入、修改、查詢、删除、浏覽\n");
                      printf("3----學生成績統計子產品\n");
                      printf("0----退出系統\n");
                      printf("請輸入操作子產品代号:");
                      int choice;
                      while (scanf_s("%d", &choice))
                      {
                          switch (choice)
                          {
                          case 1:information(); break;
                          case 2:grade(); break;
                          case 3:statistics(); break;
                          case 0:printf("謝謝使用,再見\n"); exit(0);
                          }

                      }
            }; break;
            }    
        }
    }



    void AddPrimary()
    {
        printf("請輸入科目;\n");
        printf("(注:當輸入科目後,如果想退出程式請按Enter鍵否則請按空格)\n");
        getchar();
        for (count = 0;; )
        {
            scanf_s("%s", student[0].primary.subject[count], sizeof(student[0].primary.subject[count]));
            count++;
            if (getchar() == '\n')break;
        }
        printf("如果您想回到上級菜單,請輸入0\n");
    }



    void AddStudent()
    {
        again6:
        printf("請依此輸入學生的ID,班級,姓名\n");
        for (;;)
        {
            scanf_s("%d", &student[i].ID, sizeof(student[i].ID));
            scanf_s("%d", &student[i].primary.classs, sizeof(student[i].primary.classs));
            scanf_s("%s", student[i].name, 20 * sizeof(student[i].name[0]) );
            i++;
            if (getchar() == '\n')break;
        }
        printf("請問您是否想要繼續添加學生資訊?(Y/N)\n");
        char choice1;
        scanf_s("%c", &choice1);
        if (choice1 == 'y' || choice1 == 'Y')
            goto again6;
        printf("如果您想回到上級菜單,請輸入0\n");
    }


    void ReaddStudent()
    {
        again1:
        printf("請輸入您要追加資訊的學生的ID以及姓名:\n");
        scanf_s("%d", &student[i].ID, sizeof(student[i].ID));
        scanf_s("%s", student[i].name, 20 * sizeof(student[i].name[0]));
        printf("是否還要繼續追加學生資訊?(Y/N)\n");
        char choice1;
        scanf_s("%c", &choice1);
        if (choice1 == 'n' || choice1 == 'N')
            return;
        if (choice1 == 'y' || choice1 == 'Y')
            goto again1;
        Scanstatistic();
    }


    void LookUp()
    {
        again5:
        printf("請輸入您要檢視的學生的ID:\n");
        int id;
        scanf_s("%d", &id);
        int k;
        int h = 1;
        for (k = 0;k<i ; k++)
        {            
            if (id == student[k].ID)
            {
                h = 0;
                printf("學生資訊:\nID:\t\t姓名:\t\t班級:\n");
                printf("%d\t\t%s\t\t%d\t\t\n", student[k].ID, student[k].name, student[k].primary.classs);
                break;
            }
        }
        if (h == 1)
        {
            printf("對不起,沒有找到您要查找的ID,請重新輸入\n");
            goto again5;
        }
        
        char choice1;
        scanf_s("%c", &choice1,sizeof(choice1));printf("請問您是否還想繼續檢視其他學生的資訊?(Y/N)\n");
        if (choice1 == 'y' || choice1 == 'Y')
            goto again5;
        else 
        printf("如果您想回到上級菜單,請輸入0\n");
    }


    void Change()
    {
        again2:
        printf("請輸入您要查詢的學生的ID:\n");
        int id,h=0;
        scanf_s("%d", &id);
        for (int k = 0; k <= i; k++)
        {
            if (id == student[k].ID)
            {
                h = 1;
                printf("請輸入您要修改的内容:\n1.姓名    2.班級    \n");
                int choice1;
                scanf_s("%d", &choice1);
                if (choice1 == 1)
                    scanf_s("%s", student[k].name);
                if (choice1 == 2)
                    scanf_s("%d", student[k].primary.classs);
                break;
            }
        }
        if (h == 0)
        {
            printf("對不起,沒有您要查找的學生ID,請重新查找\n");
            goto again2;
        }
        printf("如果您想回到上級菜單,請輸入0\n");
    }


    void Delete()
    {
        printf("請輸入您要删除的學生的ID:\n");
        int id,k;
        scanf_s("%d", &id);
        for (k = 0;; k++)
        {
            if (id == student[k].ID)
            {
                strcpy(student[k].name, "NULL");
                student[k].ID = 0;
                student[k].primary.classs = 0;
                break;
            }
        }
        printf("如果您想回到上級菜單,請輸入0\n");
    }


    void Scan()
    {
        printf("學生資訊:\nID:\t\t姓名:\t\t班級:\n");
        int k;
        for (k = 0; student[k].ID != 0; k++)
        {
            printf("%d\t\t%s\t\t%d\t\t\n", student[k].ID, student[k].name, student[k].primary.classs);
        }
        printf("如果您想回到上級菜單,請輸入0\n");
    }



    void AddGrade()
    {
        printf("請輸入您想添加的學生ID:\n");
        int id;
        scanf_s("%d", &id);
        printf("請依次輸入學生成績:\n");
        int k;
        for (int h = 0; h < i; h++)
        {
            if (id == student[h].ID)
            {
                for (k = 0; k < count; k++)
                {
                    printf("%s:", student[0].primary.subject[k]);
                    scanf_s("%d", &student[h].primary.grade[k]);
                }
            }
        }    
        printf("如果您想回到上級菜單,請輸入0\n");
    }

    

    void DeleteGrade()
    {
        printf("請輸入您要删除的學生的ID和科目成績:\n");
        int id;
        scanf_s("%d", &id);
        for (int k = 0;; k++)
        {
            if (student[k].ID == id)
            {
                for (int h = 0; h < count; h++)
                    student[k].primary.grade[h] = 0;
            }
        }
        Scanstatistic();
        printf("如果您想回到上級菜單,請輸入0\n");
    }



    void LookupGrade()
    {
        again4:
        printf("請輸入您要檢視的學生的ID:\n");
        int id;
        for (int h = 0; h < count; h++)
            printf("%s\t", student[0].primary.subject[h]);
        printf("\n");
        scanf_s("%d", &id);
        for (int h = 0; h < i; h++)
        {
            if (student[i].ID == id)
            {
                for (int hehe = 0; hehe < count; hehe++)
                {
                    printf("%d\t", student[h].primary.grade[hehe]);
                }
            }
        }
        printf("請問您還想檢視其他學生的各科成績嗎?(Y/N)\n");
        char choice1;
        scanf_s("%c", &choice1);
        if (choice1 == 'y' || choice1 == 'Y')
            goto again4;
        printf("如果您想回到上級菜單,請輸入0\n");
    }


    void ScanGrade()
    {
        int h;
        printf("下面是學生的ID、姓名以及各科成績以及總分:\n");
        printf("ID:\t姓名:\t");
        for (int hehe = 0; hehe <count; hehe++)
            printf("%s\t", student[0].primary.subject[hehe]);
        printf("總分\n");
        for (h = 0; h <= i; h++)
        {
            printf("%d\t%s\t", student[h].ID, student[h].name);
            for (int hehe = 0; hehe < count; hehe++)
                printf("%d\t", student[h].primary.grade[hehe]);
            printf("%d", student[h].primary.sum);
            printf("\n");
        }
        printf("如果您想回到上級菜單,請輸入0\n");
    }


    void ChangeGrade()
    {
        int id,chengji;
        char kemu[20];
        again3:
        printf("請輸入您要修改的學生的ID以及科目和修改後的成績:\n");
        scanf_s("%d%s%d", &id, kemu,&chengji);
        for (int h = 0; h < i; h++)
        {
            if (id == student[h].ID)
            {
                for (int w = 0; w < count; w++)
                {
                    if (strcmp(student[0].primary.subject[w], kemu) == 0)
                    {
                        student[h].primary.grade[w] = chengji;
                        break;
                    }
                }
            }
        }
        printf("請問您還要修改其他科目的成績嗎?(Y/N)\n");
        char choice1;
        scanf_s("%c", &choice1);
        if (choice1 == 'y' || choice1 == 'Y')
            goto again3;
        Scanstatistic();
        printf("如果您想回到上級菜單,請輸入0\n");
    }


    void Scanstatistic()
    {
        int sum;
        for (int h = 0; h < i; h++)
        {
            for (int hehe = 0; hehe < count; hehe++)
            {
                student[h].primary.sum += student[h].primary.grade[hehe];
            }
        }
        printf("如果您想回到上級菜單,請輸入0\n");
    }
    


    void sorting()
    {
        Scanstatistic();
        printf("下面是學生各科成績以及總分:\n");
        printf("ID:\t姓名:\t");
        for (int h = 0; h < count; h++)
            printf("%s\t", student[0].primary.subject[h]);
        printf("總分:\n");
        int k, h,num=0;
        int max=0,token;
        for (h = 0; h < i; h++)
        {
            for (k = 0; k <= i; k++)
            {
                if (student[h].primary.sum>max)
                    max = student[h].primary.sum;
            }
        }
    }


    void sort()
    {
        int k, j;
        for (k = 0; k < i; k++)
        {
            for (j = k; j <= i; j++)
            {
                if (student[k].ID>student[j].ID)
                {
                    int t;
                    char temp[20];
                    {
                        t = student[k].ID;
                        student[k].ID = student[j].ID;
                        student[j].ID = t;
                    }
                    {
                        t = student[k].primary.classs;
                        student[k].primary.classs = student[j].primary.classs;
                        student[j].primary.classs = t;
                    }
                    {
                        strcpy(temp, student[k].name);
                        strcpy(student[k].name, student[j].name);
                        strcpy(student[j].name, temp);
                    }
                    {
                        for (int h = 0; h < count;h++)
                        {
                            char temp[20];
                            strcpy(temp, student[k].primary.subject[h]);
                            strcpy(student[k].primary.subject[h], student[i].primary.subject[h]);
                            strcpy(student[i].primary.subject[h], temp);
                        }
                    }
                }
            }

        }
    }      

接下來是主函數部分:

#include<stdio.h>
#include<Windows.h>
#include"functions.h"
int main()
{
    for (int h = 0; h < 1000; h++)
        student[i].ID = 0;
    printf("***************學生成績管理系統主菜單*************************************\n");
    printf("1----學生基本資訊管理子產品(錄入、修改、查詢、删除、浏覽)\n");
    printf("2----學生成績資訊管理子產品(錄入、修改、查詢、删除、浏覽\n");
    printf("3----學生成績統計子產品\n");
    printf("0----退出系統\n");
    printf("請輸入操作子產品代号:");
    int choice;
    while (scanf_s("%d", &choice))
    {
        switch (choice)
    {
    case 1:information(); break;
    case 2:grade(); break;
    case 3:statistics(); break;
    case 0:printf("謝謝使用,再見\n"); return 0;
    }

    }
    
    system("pause");
    return 0;

}      

由于寫代碼期間有了隔斷,是以思路并不是很完整,是以出現不少思維漏洞的地方,還有的功能尚未實作。

決定周末好好的整改一下個程式。

轉載于:https://www.cnblogs.com/nkuhjp/p/5263254.html