学生管理系统的优化过程

  知道自己太弱,距离大神们差了十万八千里,但是我不希望自己将来成为一个平庸的程序员,所以希望借用博客园这一平台来不断发表自己的文章,从而不断激励自己,提升自己。-----静平

  上学期学了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("(注:当输入科目后,如果想退出程序请按回车键否则请按空格)\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;

}

 

 

由于写代码期间有了隔断,所以思路并不是很完整,因此出现不少思维漏洞的地方,还有的功能尚未实现。

 

决定周末好好的整改一下个程序。

posted @ 2016-03-10 20:10  南以离开  阅读(350)  评论(2编辑  收藏  举报