课程设计——学生成绩管理系统 C语言

课程设计——学生成绩管理系统

基本要求:

1.程序功能

编程实现一个基础的成绩管理系统。

2.设计目的

通过本程序综合掌握结构体类型、指针、函数、文件等知识的综合使用。

3.功能要求(可扩充功能)

(1)实现简单的菜单设计,如下所示:
1添加学生信息
2显示学生信息
3查找学生信息
4插入学生信息
5删除学生信息
6成绩计算
7按总分降序输出
0退出
(2)每个学生的信息至少包括姓名、学号、3门课程的成绩、班级等信息。
(3)”添加学生信息” :输入新的学生信息以后,系统将把相关信息存储到文件中。以班级为单位存放到不同的文件中。至少有3个班,每个班级至少10个学生。
(4) ”显示学生信息”:系统将从文件中读取数据,按要求显示所有的学生信息。为使界面美观,可考虑用二维表格的形式输出。
(5) “查找学生信息”:可进一 步设计,如按姓名查找或按学号查找,或者查找某门课程的最高/最低成绩、或者在所有学生中查找平均分最高/最低的学生信息等。
(6) “插入学生信息”:根据学号顺序进行插入。
(7) ”删除学生信息”:可进一步设计,根据姓名删除还是根据学号删除。删除前显示该条记录,并提交用户确认。
(8) "成绩计算”:可扩充,如计算每个学生的总分、平均分;计算每个班级每门课程的平均分。
(9) “按总分降序输出”:可扩展,按总分降序或升序。
4.要求采用模块化设计,独立的功能(如添加、显示、查询、删除等)应在各个自定义函数中实现。
5.撰写课程设计报告,内容包括:功能结构图、程序流程图、函数列表、各函数功能简介及完整的源程序(包含必要的注释),程序运行结果等。(设计报告格式自行设计)
6.原始学生数据输入后(如至少10个学生的信息),请用文件保存,以后其他操作的数据都要从文件中读出来,不允许手工再输入原始数据。其他操作对文件的读写不作特别要求。
7 请从第2页开始合理设计文档及排版。此表格内的格式请勿变动。
8 完成后的电子文档以姓名命名,如“张一一.doc”。正文采用5号宋体,1.5倍行距。

一、 流程图

课程设计——学生成绩管理系统 C语言_第1张图片

二、 函数列表及功能简介

函数名 功能说明

void load(STU *head);	从文件中载入数据
void save(STU *head);	保存此次运行所进行的操作
STU *addl(STU *head);	添加新的学生信息
void shuru(STU *head);	打印输入界面并输入数据
void chakan(STU *head);	以不同的方式查看数据
void zhuanhuan(STU *head);	把指针指向文件传递给数组
void search(STU *head);	查找学生信息
void Amend(STU* head);	修改学生信息
void menu();	主菜单的打印
void swap(STU* px);	排序交换学生信息
void Rank(STU* px);	学生信息排序
void insert(STU* head);	插入学生信息
void del(STU* head);	删除学生信息
int compare(char *a,char *b);	与密码函数并用,比较密码
void Password(int o);	密码系统,输入与修改密码
void gotopos(int x,int y);	光标到达指定位置
void Set();	系统设置,与密码,颜色修改相关
void color(int);	修改系统颜色
Int main()	主函数

三、源程序(有注释)

#include 
#include 
#include 
#include 
#include 
typedef struct Students_Information
{
    int id;
    char name[20];
    int sub[3];
    double total_score;
    struct Students_Information *next;
} STU;
typedef struct zerostu
{
    int id;
    char name[20];
    int sub[3];
    double total_score;
}zs;
zs num[30000];
int N=0;
char Right_pass[100];
STU *head,*node;
FILE *fp;
void load(STU *head);
void save(STU *head);
STU *addl(STU *head);
void shuru(STU *head);
void chakan(STU *head);
void zhuanhuan(STU *head);
void search(STU *head);
void Amend(STU* head);
void menu();
void swap(STU* px);
void Rank(STU* px);
void insert(STU* head);
void del(STU* head);
int compare(char *a,char *b);
void Password(int o);
void gotopos(int x,int y);
void Set();
void color(int);

int main()
{
   system("color F1");
    int n;
    head=(STU*)malloc(sizeof(STU));
        head->next = NULL;
    load(head);
    gets(Right_pass);
      while(1)
   {
    menu();
    scanf("%d",&n);
    printf("\n");
    switch(n)
    {
        case 1:shuru(head);break;
        case 2:chakan(head);break;
        case 3:search(head);break;
        case 4:Amend(head);break;
        case 5:insert(head);break;
        case 6:del(head);break;
        case 7:Rank(head);break;
        case 8:save(head);break;
        case 9:Set();break;
        default:return 0;break;
    }}

    return 0;
}
void menu()
{
    system("cls");
    printf("\n");
    printf("        |------------------------------------------------------|\n");
    printf("        |          ***欢迎来到学生管理系统***    数据:[%d]条    |\n",N);
    printf("        |------------------------------------------------------|\n");
    printf("        |                                                      |\n");
    printf("        |     1:           输 入 学 生 数 据                   |\n");
    printf("        |                                                      |\n");
    printf("        |     2:           查 看 学 生 信 息                   |\n");
    printf("        |                                                      |\n");
    printf("        |     3:           搜 索 学 生 信 息                   |\n");
    printf("        |                                                      |\n");
    printf("        |     4:           修 改 数 据                         |\n");
    printf("        |                                                      |\n");
    printf("        |     5:           插 入 学 生 信 息                   |\n");
    printf("        |                                                      |\n");
    printf("        |     6:           删 除 学 生 信 息                   |\n");
    printf("        |                                                      |\n");
    printf("        |     7:           进 行 排 序                         |\n");
    printf("        |                                                      |\n");
    printf("        |     8:           保 存 本 次 内 容                   |\n");
    printf("        |                                                      |\n");
    printf("        |     9:           系 统 设 置                         |\n");
    printf("        |                                                      |\n");
    printf("        |     0:           退 出 系 统                         |\n");
    printf("        |------------------------------------------------------|\n");
    printf("        |---             请输入对应数字进行操作             ---|\n");
    printf("\n");
    printf("            Enter The Number: ");
};
void load(STU *head)
{
    STU *p=NULL,*s=NULL;
    s=(STU*)malloc(sizeof(STU));
    fp=fopen("E:\\Text.dat","rb");
    while(1)
    {
        if(fread(s,sizeof(STU),1,fp)!=0)
          {
           p=addl(head);
           p->id=s->id;
        p->sub[1]=s->sub[1];
        p->sub[2]=s->sub[2];
        p->sub[0]=s->sub[0];
        p->total_score=s->total_score;
        strcpy(p->name,s->name);
        N++;
        }
    else { if(N==0) node=head;
            else node=p;
            break;}

         }
  free(s);
  fclose(fp);
    };
STU *addl(STU *head)
{
  STU *q=head;
  while(q->next!=NULL)
        q=q->next;
  q->next=(STU*)malloc(sizeof(STU));
  q->next->next=NULL;
  return q->next;
};
void save(STU *head)
{
   STU *p;
   p=head->next;
   fp=fopen("E:\\Text.dat","wb");
    while(p!= NULL)
    {
        fwrite(p, sizeof(STU), 1, fp);
        p=p->next;

    }
    printf("         -----保存成功-----\n");
    fclose(fp);
};
void shuru(STU *head)
{
     Password(0);
   STU *p,*p1,*p2,*s;
   FILE *fp;
    int id,sub1,sub2,sub3;
    char name[20];
    system("cls");
    p=node;
    printf("\n");
    printf("    ----------------------------\n");
    printf("         ^学号=0时结束^\n\n");
    printf("         -->请输入学号:");
    scanf("%d",&id);
    while(id!=0)
    {
         printf("            输入姓名:");
         scanf("%s",name);
         printf("            输入第一科成绩:");
         scanf("%d",&sub1);
          printf("            输入第二科成绩:");
         scanf("%d",&sub2);
          printf("            输入第三科成绩:");
         scanf("%d",&sub3);
         s=(STU*)malloc(sizeof(STU));
         s->id=id;
         strcpy(s->name,name);
         s->sub[0]=sub1;
         s->sub[1]=sub2;
         s->sub[2]=sub3;
         s->total_score=sub1+sub2+sub3;
         p->next=s;
         p=s;
         printf("         -->请输入学号:");
         scanf("%d",&id);
         N++;
    }
    p->next=NULL;
    fp = fopen("D:/a.txt", "wb");
    getchar();
};
void chakan(STU *head)
{
   STU *p,*s;
   char i;
   system("cls");
   p=head->next;
           printf("        |-------------------------------------------------------------------------------------------------------------|\n");
           printf("        |             学 生 学 号---------姓名---------学科一--------学科二---------学科三-----------总 成 绩         |\n\n");
   while(p!=NULL)
   {



           printf("            %20d       %6s     %8d     %9d     %10d     %13.1f            \n",p->id,p->name,p->sub[0],p->sub[1],p->sub[2],p->total_score);
           printf("        \n");
    p=p->next;
   }
            printf("        |-------------------------------------------------------------------------------------------------------------|\n\n");
            printf("                                             按1返回主菜单;按2退出系统:");
            getchar();
            scanf("%c",&i);
            if(i=='1') return;
            else exit(0);

};
void zhuanhuan(STU *head)
{
    int i=0,j;
     STU *p,*s;
   p=head->next;
   while(p!=NULL)
   {
        num[i].id=p->id;
        strcpy(num[i].name,p->name);
        for(j=0;j<3;j++)
         num[i].sub[j]=p->sub[j];
         num[i].total_score=p->total_score;
         i++;
         p=p->next;
    }

};

void search(STU* head)
{
  int i,id;
  char ch;
  STU* px;
  px=head;
  system("cls");
  printf("\n");
  printf("           ----请输入需要搜索的学生学号----\n\n");
  printf("                Enter The ID Number: ");
  scanf("%d",&id);
  printf("\n");
  for(i=0;i<N;i++)
  {
      px=px->next;
      if(id==px->id)
      {
            printf("          |----------------|\n");
            printf("            ID:   %d        \n",px->id);
            printf("            Name: %s        \n",px->name);
            printf("            Sub1: %d        \n",px->sub[0]);
            printf("            Sub2: %d        \n",px->sub[1]);
            printf("            Sub3: %d        \n",px->sub[2]);
            printf("            Toatl:%.1f     \n",px->total_score);
            printf("          |----------------|\n\n");
            break;
      }

  }
      if(i==N)
            printf("      ------没 有 这 名 学 生------\n");
            printf("          按1返回主菜单;按2退出系统:");
    getchar();
    scanf("%c",&ch);
    if(ch=='1') return;
    else  exit(0);

}
void Amend(STU* head)
{

  int i,id;
  char c;
  STU* px;
  px=head;
  Password(0);
  system("cls");
  printf("\n");
  printf("        ----请输入需要修改的学生学号----\n\n");
  printf("            Enter The ID Number: ");
  scanf("%d",&id);
  if(id==0) {printf("         无此数据!!! \n");return ;}
  for(i=0;i<N;i++)
  {
      px=px->next;
      if(id==px->id)
      {
            printf("        |----------------\n");
            printf("        |A.Name: %s        \n",px->name);
            printf("        |B.Sub1: %d        \n",px->sub[0]);
            printf("        |C.Sub2: %d        \n",px->sub[1]);
            printf("        |D.Sub3: %d        \n",px->sub[2]);
            printf("        |E.Toatl: %.1f     \n",px->total_score);
            printf("        |----------------\n\n");
            break;}}
    if(i==N)
    {printf("      ------No Such Student------\n");return ;}
            printf("        ---请输入需要修改的选项----\n");
            getchar();
            printf("        输入字母:");
            scanf("%c",&c);
            printf("       *输入新信息:");
            switch(c)
            {
            case 'A':
            case 'a':scanf("%s",px->name);break;
            case 'B':
            case 'b':scanf("%d",&px->sub[0]);break;
            case 'C':
            case 'c':scanf("%d",&px->sub[1]);break;
            case 'D':
            case 'd':scanf("%d",&px->sub[2]);break;
            case 'E':
            case 'e':scanf("%lf",&px->total_score);break;
            default : {printf("       选择错误!!\n");break;return;}

            }
            if('a'<=c&&c<='d'||'A'<=c&&c<='D')
            {px->total_score=px->sub[0]+px->sub[1]+px->sub[2];}
            printf("        修改成功!!!\n");


    getchar();

  }

void swap(STU* px)
{
    int t;
    double tem,shu1;
    STU* head;
    char tname[20];
    tem=px->total_score;
    px->total_score=px->next->total_score;
    px->next->total_score=tem;
    t=px->id;
    px->id=px->next->id;
    px->next->id=t;
    t=px->sub[0];
    px->sub[0]=px->next->sub[0];
    px->next->sub[0]=t;
    t=px->sub[1];
    px->sub[1]=px->next->sub[1];
    px->next->sub[1]=t;
    t=px->sub[2];
    px->sub[2]=px->next->sub[2];
    px->next->sub[2]=t;
    strcpy(tname,px->name);
    strcpy(px->name,px->next->name);
    strcpy(px->next->name,tname);

}


void Rank(STU* head)
{
    int i=0,j=0,t,k;
    STU* px;
    char ch;
    system("cls");
    px=head;
    printf("\n");
    printf("        |------------------------------------------------------|\n");
    printf("        |               请输入对应数字进行操作                 |\n");
    printf("        |------------------------------------------------------|\n");
    printf("        |1:                 以总分进行排序                     |\n");
    printf("        |                                                      |\n");
    printf("        |2:                 以学科一进行排序                   |\n");
    printf("        |                                                      |\n");
    printf("        |3:                 以学科二进行排序                   |\n");
    printf("        |                                                      |\n");
    printf("        |4:                 以学科三进行排序                   |\n");
    printf("        |                                                      |\n");
    printf("        |5:                 以学号进行排序                     |\n");
    printf("        |                                                      |\n");
    printf("        |6:                 返回菜单                           |\n");
    printf("        |------------------------------------------------------|\n");
    printf("        |--Please Enter the Corresponding Number to Operate----|\n");
    printf("\n");
    printf("        Enter The Number: ");
    scanf("%d",&k);
    for(i=0;i<N; i++)
    {
        px=head->next;
        for(j=0; j<N-1; j++)
        {
            if(k==1)
            {
                if((px->total_score)<(px->next->total_score))
                {
                    swap(px);
                }
            }
            else if(k==2)
            {
                if((px->sub[0])<(px->next->sub[0]))
                {
                    swap(px);
                }
            }
            else if(k==3)
            {
                if((px->sub[1])<(px->next->sub[1]))
                {
                    swap(px);
                }
            }
            else if(k==4)
            {
                if((px->sub[2])<(px->next->sub[2]))
                {
                    swap(px);
                }
            }
            else if(k==5)
            {
                if((px->id)<(px->next->id))
                {
                    swap(px);
                }
            }
           else  return ;
            px=px->next;


        }

    }
        px=head->next;
           system("cls");

           printf("        |-------------------------------------------------------------------------------------\n");
           printf("        |                ID Number-----Name-------Sub1-------Sub2-------Sub3-------Total Score\n        |\n");

        for(i=0; i<N; i++)
        {

            printf("        |Student %d: ",i+1);
            printf("     %-10d ",px->id);
            printf("     %-7s",px->name);
            printf("     %-5d",px->sub[0]);
            printf("     %-5d",px->sub[1]);
            printf("     %-5d",px->sub[2]);
            printf("     %-5.1f\n        |\n",px->total_score);
            px=px->next;


        }
         printf("        |-------------------------------------------------------------------------------------\n\n");
         printf("                      ------- %d Students In Total !!! -------\n\n",N);
         printf("                       ----->>>按1返回主菜单;按2退出系统:");
         getchar();
         scanf("%c",&ch);
         if(ch=='1') return;
         else  exit(0);


}
void insert(STU* head)
{
   Password(0);
   int num;
   STU *p1,*p2,*s;
   system("cls");
   printf("        ---请输入需要插入的学号---\n");
   printf("        Enter The Number: ");
   scanf("%d",&num);
   s=(STU*)malloc(sizeof(STU));
   s->id=num;
   printf("        输入姓名:");
   scanf("%s",s->name);
   printf("        输入第一科成绩:");
   scanf("%d",&s->sub[0]);
   printf("        输入第二科成绩:");
   scanf("%d",&s->sub[1]);
   printf("        输入第三科成绩:");
   scanf("%d",&s->sub[2]);
   s->total_score=s->sub[0]+s->sub[1]+s->sub[2];
   p1=head;p2=head->next;
   while((p2!=NULL)&&(p2->id>num))
   {
       p1=p2;p2=p2->next;
   }
   s->next=p2;p1->next=s;
 N++;
 getchar();
}
void del(STU* head)
{
   Password(0);
   int num;
   STU *p1,*p2;
   system("cls");
   printf("        ---请输入需要删除的学号---\n");
   printf("        Enter The Number: ");
   scanf("%d",&num);
   if(head==NULL) {printf("       输入错误\n");return ;}
   p1=head;
   while(num!=p1->id&&p1->next!=NULL)
   {
       p2=p1;p1=p1->next;
   }
   if(num==p1->id)
   {
       if(p1==head) head->next=p1->next;
       else p2->next=p1->next;
       printf("        ---已删除的学生学号:%d---\n",num);
        N--;
   }
   else printf("       输入错误\n");
   getchar();
}

void Password(int o)//密码系统,有三次输入机会.
{

    char pass[100],Re1[100],Re2[100];
    system("cls");
    printf("\n");
    if(o==0){
    printf("        ----------------------------------------------------------\n");
    printf("         To Continue The Operation,You Need To Input The Password \n");
    printf("        ----------------------------------------------------------\n");
    for(int i=0; i<4; i++)
    {

            printf("        |----------------%d Times Left----------------|\a\n\n",4-i);
            printf("         Please Enter The Password: ");
            gets(pass);
        if(!compare(pass,Right_pass))
        {

                printf("\n");
                printf("        |----------------Wrong !!!--------------------|\n");
                printf("\n");
            if(3-i!=0)
            {
                printf("\n");

            }
            else{
                printf("        --------Opportunities Have Been Run out!!!--------\n");
                exit(0);}
    }


        else
        {
            printf("\n");
            printf("        ---------------Password Correct !!!----------\n\n");
            if(o==1) goto PA;
            break;
        }
    }

    }
    else
    {

         Password(0);
         PA:
         printf("        输 入 新 密 码: ");
         gets(Re1);
         printf("\n");
         printf("        确 认 密 码: ");
         gets(Re2);
         printf("\n");
         if(compare(Re1,Re2)){
            strcpy(Right_pass,Re1);
            printf("        ------------密 码 修 改 成 功 !!!------------\n");
            return ;
         }
         else{
        printf("        ------前 后 密 码 不 一 致 !!!------\a\n\n");
        goto PA;}
    }
}

int compare(char *a,char *b)//密码比较函数,返回0||1
{
    for(int i=0; i<100; i++)
    {
        if(*a!=*b)
            return 0;
        a++,b++;
        if(*a==*b&&*a=='\0')
            break;

    }
    return 1;
}

void gotopos(int x,int y)
{
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);

}

void Set()
{
    system("cls");
    int ch;
    printf("        |---------------------------|\n");
    printf("        |          系统设置         |\n");
    printf("        |---------------------------|\n");
    printf("        |1:     修改密码            |\n");
    printf("        |2:     系统字体颜色设置    |\n");
    printf("        |---------------------------|\n");
    printf("        |----->>请输入对应序号: ");
    scanf("%d",&ch);
    getchar();
    switch(ch)
    {
    case 1:Password(1);break;
    case 2:color(0);break;
    default: return;
    }

}

void color(int n)
{
    int c;
    if(n==0)
    {
    for(int i=1;i<=15;i++){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),i);
    printf("         第%d号颜色\n\n",i);}

         printf("\n");
         printf("        |----->>请输入对应序号: ");
         scanf("%d",&c);
         getchar();
         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
    }

}

四、程序运行结果

4.1 输入测试

课程设计——学生成绩管理系统 C语言_第2张图片

4.2 查看信息测试

课程设计——学生成绩管理系统 C语言_第3张图片

4.3 搜索信息测试

课程设计——学生成绩管理系统 C语言_第4张图片

4.4 插入学生信息测试

课程设计——学生成绩管理系统 C语言_第5张图片

4.5 排序输出测试

课程设计——学生成绩管理系统 C语言_第6张图片

4.6 系统设置测试

课程设计——学生成绩管理系统 C语言_第7张图片
课程设计——学生成绩管理系统 C语言_第8张图片

你可能感兴趣的:(数据结构,数据结构作业,c++,c语言,数据结构,算法)