⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chencong.c

📁 实现了学生班级成绩管理
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <dos.h>                      /* 取函数 */
#include <bios.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

#define TRUE 1
#define FALSE 0                          /* 学生人数 */
#define NUMOFSTU 5
#define NUMOFCOURSE 6                  /* 课程数 */

struct student                           /* 定义学生结构类型 */
{
  int number;                            /* 名次 */
  char sn[15];                           /* 学号 */
  char name[10];                        /* 姓名 */
  char sex[6];                            /* 性别 */
  int age;                                /* 年龄 */
  char room[20];                          /* 所在寝室号 */
  char phone[15];                        /* 宿舍电话 */
  int ususcore[NUMOFCOURSE];             /* 每门课的平时成绩 */
  int textscore[NUMOFCOURSE];            /* 每门课的考试成绩 */
  float score[NUMOFCOURSE];              /* 每门课的总成绩 */
  float sum;                             /* 所有课的成绩总和 */
  float average;                         /* 所有课的平均成绩 */
  int stscore;                           /* 总学分 */
  struct student *next;                  /* 与该同学相连的下一个同学(指针) */
};
typedef struct student STU;              /* 简写 */
STU *firsthead;                         /* 定义头指针,STU类型 */
int textx,texty;                       /*光标坐标,x行,y列*/
 int i,j;                              /*常用变量*/
 char c[4096];                         /*清屏专用空间*/

void savedatas(STU *head)               /* 保存一班的数据 */
{STU *p;
 FILE *fp;                               /* 遍历指针 */
 int i;
 fp=fopen("I:\\class1.txt","w");         /* 打开C:\class1.txt文件,以写的方式 */
 for(p=head->next;p!=NULL;p=p->next)     /* 将内存中的数据写入文件 */
 {
   fprintf(fp,"\nNumber:%-4d",p->number);
      fprintf(fp,"\nStudynumber:%-15s",p->sn);
      fprintf(fp,"\nName:%-20s",p->name);
      fprintf(fp,"\nSex:%-6s",p->sex);
      fprintf(fp,"\nAge:%-8d",p->age);
      fprintf(fp,"\nRoomnumber:%-20s",p->room);
      fprintf(fp,"\nTelephone:%-15s",p->phone);

      for(i=0;i<6;i++)
      {
    fprintf(fp,"\nNO.%d\'s Usualscore:%-5d",i,p->ususcore[i]);
    fprintf(fp,"\nNO.%d\'s Textscore:%-5d",i,p->textscore[i]);
    fprintf(fp,"\nNO.%d\'s Score:%-8.2f",i,p->score[i]);
      }
      fprintf(fp,"\nSumscore:%-10.2f",p->sum);
      fprintf(fp,"\nAveragescore:%-15.2f",p->average);
      fprintf(fp,"\nStudyscore:%-10d",p->stscore);
  }
  fclose(fp);                            /* 关闭文件 */
  }
 void savedata(STU *head)                  /* 保存二班的数据 */
{STU *p;
 FILE *fp;                                  /* 遍历指针 */
 int i;
 fp=fopen("I:\\class2.txt","w");             /* 打开C:\class1.txt文件,以写的方式 */
 for(p=head->next;p!=NULL;p=p->next)          /* 将内存中的数据写入文件 */
 {
      fprintf(fp,"\nNumber:%-4d",p->number);
      fprintf(fp,"\nStudynumber:%-15s",p->sn);
      fprintf(fp,"\nName:%-20s",p->name);
      fprintf(fp,"\nSex:%-6s",p->sex);
      fprintf(fp,"\nAge:%-8d",p->age);
      fprintf(fp,"\nRoomnumber:%-20s",p->room);
      fprintf(fp,"\nTelephone:%-15s",p->phone);

      for(i=0;i<6;i++)
      {
    fprintf(fp,"\nNO.%d\'s Usualscore:%-5d",i,p->ususcore[i]);
    fprintf(fp,"\nNO.%d\'s Textscore:%-5d",i,p->textscore[i]);
    fprintf(fp,"\nNO.%d\'s Score:%-8.2f",i,p->score[i]);
      }
      fprintf(fp,"\nSumscore:%-10.2f",p->sum);
      fprintf(fp,"\nAveragescore:%-15.2f",p->average);
      fprintf(fp,"\nStudyscore:%-10d",p->stscore);
  }
  fclose(fp);
  }
 void savedatase(STU *head)                            /* 保存三班的数据 */
{STU *p;
 FILE *fp;                                            /* 遍历指针 */
 int i;
 fp=fopen("I:\\class3.txt","w");                     /* 打开C:\class1.txt文件,以写的方式 */
 for(p=head->next;p!=NULL;p=p->next)                 /* 将内存中的数据写入文件 */
 {
      fprintf(fp,"\nNumber:%-4d",p->number);
      fprintf(fp,"\nStudynumber:%-15s",p->sn);
      fprintf(fp,"\nName:%-20s",p->name);
      fprintf(fp,"\nSex:%-6s",p->sex);
      fprintf(fp,"\nAge:%-8d",p->age);
      fprintf(fp,"\nRoomnumber:%-20s",p->room);
      fprintf(fp,"\nTelephone:%-15s",p->phone);

      for(i=0;i<6;i++)
      {
      fprintf(fp,"\nNO.%d\'s Usualscore:%-5d",i,p->ususcore[i]);
      fprintf(fp,"\nNO.%d\'s Textscore:%-5d",i,p->textscore[i]);
      fprintf(fp,"\nNO.%d\'s Score:%-8.2f",i,p->score[i]);
      }
      fprintf(fp,"\nSumscore:%-10.2f",p->sum);
      fprintf(fp,"\nAveragescore:%-15.2f",p->average);
      fprintf(fp,"\nStudyscore:%-10d",p->stscore);
  }
  fclose(fp);                                         /* 关闭文件 */
  }

STU * loaddata(void)                                  /* 将磁盘数据读入内存 */
{
    FILE *fp;                                          /* 遍历指针 */
    STU *p;
    int i;
    int stscore;                                       /* 学分 */

    fp = fopen("I:\\class.txt", "r");                  /* 打开文件 */
    if (fp == NULL) return;                            /* 文件为空时返回 */
    while(!feof(fp))                                   /* 当文件没有出错时 */
    {
        p = (STU *)malloc(sizeof(STU));                /* 分配内存空间给P */
        if (p == NULL) exit(-1);
        p->next = NULL;
  fscanf(fp,"%d",&p->number);                          /* 读入数据 */
  fscanf(fp,"%s",p->sn);
  fscanf(fp,"%s",p->name);
  fscanf(fp,"%s",p->sex);
  fscanf(fp,"%d",&p->age);
  fscanf(fp,"%s",p->room);
  fscanf(fp,"%s",p->phone);
  for(i=0;i<NUMOFCOURSE;i++)
  {
    fscanf(fp,"%d",&p->ususcore[i]);
    fscanf(fp,"%d",&p->textscore[i]);
  }
    for(i=0;i<NUMOFCOURSE;i++)
  {
    fscanf(fp,"%f",&p->score[i]);
  }
   fscanf(fp,"%f",&p->sum);
   fscanf(fp,"%f",&p->average);
   fscanf(fp,"%d",&p->stscore);
}
  fclose(fp);                                            /* 关闭文件 */
   }

   
void Menu1()
{  int a;
   system("cls");                            /*调用系统的清屏命令*/
   textbackground(BLUE);                     /*将背景设置为蓝色*/
   window(1,1,25,80);
   clrscr();
   textx=3;                                  /*光标初始化位置*/
   texty=2;
   gotoxy(1,2);
   printf("%c",218);                         /*画左上角*/
   for(i=0;i<78;i++)
   printf("%c",196);                         /*画水平直线*/
   printf("%c",191);                         /*画右上角*/
   for(i=3;i<=23;i++)
   {
      gotoxy(1,i);
      printf("%c",179);                      /*画垂直线*/
      gotoxy(80,i);
      printf("%c",179);
   }
   printf("%c",192);                         /*画左下角*/
   for(i=0;i<78;i++)
      printf("%c",196);
   printf("%c",217);                         /*画右下角*/
   gotoxy(1,1);
   textcolor(7);                             /*设置灰色*/
   for(i=0;i<80;i++)
   cprintf("%c",219);                        /*用符号实现画主菜单的灰色背景区*/                            /********************************************************************/
   gettext(2,3,78,23,c);                     /*保存当前文本区域*/
}
void listfail(STU *head);                       /* 打印挂科情况 */
void allsumaverage(STU *head);                 /* 每门课的平均成绩和总成绩 */
void omain1(void);                             /* 一班的信息菜单函数 */
void omain2(void);                             /* 二班的信息菜单函数 */
void omain3(void);                             /* 三班的信息菜单函数 */
char Mainmenu(void);                           /* 初始总菜单 */
char Menu(void);                               /* 班级菜单 */
void List(STU *head);                          /* 列表所有同学成绩 */
void AppendNode(STU *head);                    /* 添加节点 */
void DeleteNode(STU *head);                    /* 删除节点 */
void ChangeNode(STU *head);                    /* 更改节点 */
void SearchNode(STU *head);                    /* 搜索节点并打印该节点 */
void Exit();                                   /* 返回到DOS */
int OkOrNot(char *name);                       /* 选择是与否 */
int GetNodeNumber(STU *head);                  /* 获得节点数目 */
void SumAverage(STU *head);                    /* 求一个学生的总分和平均分 */
void Score(STU *head);                         /* 综合平时成绩和考试成绩求最终成绩 */
void Studyscore(STU *head);                    /* 求学分 */
STU *InputNewRecord(STU *node);                /* 输入新的数据,返回数据地址 */
STU *FindOneNode(STU *head,char *name);        /* 找一个节点,返回节点地址 */
STU *FindNextNode(STU *head);                  /* 寻找下一个节点,返回节点地址 */
void Sort(STU *head);                          /* 按平均分从高到低排序 */
STU *FindPreNode(STU *head);                   /* 寻找前一个节点,返回节点地址 */

void main()                                    /* 主函数 */
{
  char c;
  STU *head;
  Menu1();                                   /*初始化界面*/
  head=(STU *)malloc(sizeof(STU));             /* 为head分配初始地址 */
  head->next=NULL;
  firsthead=head;
  while(1)                                     /* 一级菜单循环 */
  {
   c=Mainmenu();
   switch(c)
   {
     case'1':omain1();                       /* 进入一班的信息管理 */
         break;
     case'2':omain2();                        /* 进入二班的信息管理 */
         break;
     case'3':omain3();                        /* 进入三班的信息管理 */
         break;
     case'4':Exit();                          /* 返回到DOS */
         break;
     default:break;                           /* 中止本次循环 */
   }
  }
}


void omain1()                                 /* 一班菜单程序 */
{
  char c;
  STU *head;
   head=(STU *)malloc(sizeof(STU));           /* 为head分配空间 */
  head->next=NULL;
  firsthead=head;
  loaddata();                                 /* 将磁盘中的数据读入内存 */
  while(1)
  {
  printf("\nPlease choose what you want to do about Class1 as follow:");
    c=Menu();
    switch(c)
    {
      case'1':List(head);                     /* 将内存中的数据列表打印 */
          break;
      case'2':AppendNode(head);               /* 添加一个节点 */
          break;
      case'3':DeleteNode(head);               /* 删除一个节点 */
          break;
      case'4':ChangeNode(head);               /* 修改一个节点 */
          break;
      case'5':SearchNode(head);               /* 搜索一个节点 */
          break;
      case'6':Sort(head);                     /* 按平均分从大到小排序 */
          break;
      case'7':allsumaverage(head);            /* 求该学生的平均分和总分 */
          break;
      case'8':listfail(head);                     /* 打印挂科情况 */
          break;
      case'9':savedatas(head);                /* 保存数据到I:\class1.txt */
          break;
      case'0':return;                         /* 返回到上一级目录 */
      default:break;                          /* 中断本次循环 */
    }
    printf("\nPress anykey to last menu.");
    getch();                                  /* 读入字符 */
   }
}

void omain2()                                 /* 二班菜单程序 */
{
  char c;
  STU *head;

  head=(STU *)malloc(sizeof(STU));            /* 为head分配空间 */
  head->next=NULL;
  firsthead=head;
  loaddata();                                 /* 将磁盘中的数据读入内存 */
  while(1)
  {
  printf("Please choose what you want to do about Class2 as follow:");
    c=Menu();
    switch(c)
    {
      case'1':List(head);                     /* 将内存中的数据列表打印 */
          break;
      case'2':AppendNode(head);               /* 添加一个节点 */
          break;
      case'3':DeleteNode(head);               /* 删除一个节点 */
          break;
      case'4':ChangeNode(head);               /* 修改一个节点 */
          break;
      case'5':SearchNode(head);               /* 搜索一个节点 */
          break;
      case'6':Sort(head);                     /* 按平均分从大到小排序 */
          break;
      case'7':allsumaverage(head);            /* 求该学生的平均分和总分 */
          break;
      case'8':listfail(head);                  /* 打印挂科情况 */
          break;
      case'9':savedata(head);                /* 保存数据到I:\class2.txt */
          break;
      case'0':return;                         /* 返回到上一级目录 */
      default:break;                          /* 中断本次循环 */
    }
    printf("\nPress anykey to last menu.");
    getch();}
}                                             /* 读入字符 */

void omain3()                                 /* 三班菜单程序 */
{
  char c;
  STU *head;

  head=(STU *)malloc(sizeof(STU));            /* 为head分配空间 */
  head->next=NULL;
  firsthead=head;
  loaddata();                                 /* 将磁盘中的数据读入内存 */
  while(1)
  {
  printf("Please choose what you want to do about Class3 as follow:");
    c=Menu();
    switch(c)
    {
      case'1':List(head);                     /* 将内存中的数据列表打印 */
          break;
      case'2':AppendNode(head);               /* 添加一个节点 */
          break;
      case'3':DeleteNode(head);                /* 删除一个节点 */
          break;
      case'4':ChangeNode(head);                /* 修改一个节点 */
          break;
      case'5':SearchNode(head);                /* 搜索一个节点 */
          break;
      case'6':Sort(head);                      /* 按平均分从大到小排序 */
          break;
      case'7':allsumaverage(head);             /* 按平均分从大到小排序 */
          break;
      case'8':listfail(head);                    /* 打印挂科情况 */
          break;
      case'9':savedatase(head);                 /* 保存数据到I:\class3.txt */
          break;
      case'0':return;                            /* 返回到上一级目录 */
      default:break;                           /* 中断本次循环 */
    }
    printf("\nPress anykey to last menu.");
    getch();}                                  /* 读入字符 */
}

int GetNodeNumber(STU *head)                   /* 获得节点数目 */
{
 STU *p;
 int size=1;

 p=head->next;
 while(p!=NULL)
 {
   p=p->next;
   size++;
 }
 return size;                                   /* 返回数目 */
}

char Menu(void)                                /* 班级目录打印函数 */
{ printf("\n****************CLASS's INFOMATION******************************");
  printf("\n\t[1]. List record \n");
  printf("\t[2]. Append record \n");
  printf("\t[3]. Delete record \n");
  printf("\t[4]. Change record \n");
  printf("\t[5]. Search record \n");
  printf("\t[6]. Sort record according to average \n");
  printf("\t[7]. The sumscore and averagescore of every couse \n");
  printf("\t[8]. List the failed information\n");
  printf("\t[9]. Save the data \n");
  printf("\t[0]. Return to the last menu \n");
  printf("*****************************************************************\n");
  return getch();                                /* 返回读入的字符 */
}

char Mainmenu(void)                             /* 第一级目录打印函数 */
{ printf("\n\t***************STUDYING MANAGEMENT*****************\n");
  printf("\t\t[1].The information of Class One \n\n");
  printf("\t\t[2].The information of Class Two \n\n");
  printf("\t\t[3].The information of Class Three \n\n");
  printf("\t\t[4].Exit to DOS\n");
  printf("****************************************************************\n");
  return getch();                                 /* 返回读入的字符 */
}

void List(STU *head)                              /* 打印输出数据 */
{
  STU *p;
  int i;

  p=head->next;
  if(p==NULL)
  {
    printf("\nThe Record is empty!");
  }
  else
  {
    while(p!=NULL)                                /* 循环输出数据 */
    { printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
      printf("\nStudent score as follow:");
      printf("\nNumber:%-4d",p->number);
      printf("\nStudynumber:%-15s",p->sn);
      printf("\nName:%-20s",p->name);
      printf("\nSex:%-6s",p->sex);
      printf("\nAge:%-8d",p->age);
      printf("\nRoomnumber:%-20s",p->room);
      printf("\nTelephone:%-15s",p->phone);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -