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

📄 chengji.txt

📁 学生成绩管理系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#include "stdio.h"    /*I/O函数*/
#include "stdlib.h"   /*其它说明*/
#include "string.h"   /*字符串函数*/
#include "conio.h"   /*屏幕操作函数*/
#include "mem.h"   /*内存操作函数*/
#include "ctype.h"   /*字符操作函数*/
#include "alloc.h"   /*动态地址分配函数*/
#define N 3       /*定义常数*/
typedef struct z1   /*定义数据结构*/
{
   char no[11];
   char name[15];
   int score[N];
   float sum;
   float average;
   int order;
   struct z1 *next;
 }STUDENT;
/*以下是函数原型*/
STUDENT  *init();      /*初始化函数*/
STUDENT *create();   /*创建链表*/
STUDENT *delete(STUDENT *h);   /*删除记录*/
void print(STUDENT *h);   /* 显示所有记录*/
void search(STUDENT *h);    /*查找*/
void save(STUDENT *h);     /*保存*/
STUDENT *load();        /*读入记录*/
void computer(STUDENT *h);  /*计算总分和均分*/
STUDENT *insert(STUDENT *h);   /*插入记录*/
void append();            /*追加记录*/
void copy();            /*复制文件*/
STUDENT *sort(STUDENT *h);    /*排序*/
STUDENT *index(STUDENT *h);  /*索引*/
void total(STUDENT *h);       /*分类合计*/
int menu_select();            /*菜单函数*/
/******主函数开始*******/
main()
{
   int i;
   STUDENT *head;     /*链表定义头指针*/
   head=init();          /*初始化链表*/
   clrscr();            /*清屏*/
   for(;;)             /*无限循环*/
   {
      switch(menu_select())     /*调用主菜单函数,返回值整数作开关语句的条件*/
      {                     /*值不同,执行的函数不同,break 不能省略*/
	 case 0:head=init();break;   /*执行初始化*/
	 case 1:head=create();break; /*创建链表*/
	 case 2:head=delete(head);break; /*删除记录*/
	 case 3:print(head);break;   /*显示全部记录*/
	 case 4:search(head);break;  /*查找记录*/
	 case 5:save(head);break;  /*保存文件*/
	 case 6:head=load(); break;  /*读文件*/
	 case 7:computer(head);break;  /*计算总分和均分*/
	 case 8:head=insert(head);  break; /*插入记录*/
	 case 9:copy();break;    /*复制文件*/
	 case 10:head=sort(head);break;  /*排序*/
	 case 11:append();break;     /*追加记录*/
	 case 12:head=index(head);break;  /*索引*/
	 case 13:total(head);break;   /*分类合计*/
	 case 14:exit(0);       /*如菜单返回值为14程序结束*/
      }
   }
}
/*菜单函数,返回值为整数*/
menu_select()
{
   char *menu[]={"***************MENU***************",  /*定义菜单字符串数组*/
   " 0. init list",    /*初始化*/
   " 1. Enter list",   /*输入记录*/
   " 2. Delete a record from list",  /*从表中删除记录*/
   " 3. print list ",       /*显示单链表中所有记录*/
   " 4. Search record on name",   /*按照姓名查找记录*/
   " 5. Save the file",          /*将单链表中记录保存到文件中*/
   " 6. Load the file",        /*从文件中读入记录*/
   " 7. compute the score",    /*计算所有学生的总分和均分*/
   " 8. insert record to list ",   /*插入记录到表中*/
   " 9. copy the file to new file",   /*复制文件*/
   " 10. sort to make new file",   /*排序*/
   " 11. append  record to file",   /*追加记录到文件中*/
   " 12. index on nomber",       /*索引*/
   " 13. total on nomber",      /*分类合计*/
   " 14. Quit"};              /*退出*/
   char s[3];       /*以字符形式保存选择号*/
   int c,i;        /*定义整形变量*/
   gotoxy(1,25);        /*移动光标*/
   printf("press any key enter menu......\n");   /*压任一键进入主菜单*/
   getch();                       /*输入任一键*/
   clrscr();                     /*清屏幕*/
   gotoxy(1,1);             /*移动光标*/
   textcolor(YELLOW);   /*设置文本显示颜色为黄色*/
   textbackground(BLUE);   /*设置背景颜色为蓝色*/
   gotoxy(10,2);          /*移动光标*/
   putch(0xc9);        /*输出左上角边框┏*/
   for(i=1;i<44;i++)
      putch(0xcd);    /*输出上边框水平线*/
   putch(0xbb);            /*输出右上角边框  ┓*/
   for(i=3;i<20;i++)
   {
      gotoxy(10,i);putch(0xba);   /*输出左垂直线*/
      gotoxy(54,i);putch(0xba);
   }   /*输出右垂直线*/
   gotoxy(10,20);putch(0xc8);  /*输出左上角边框┗*/
   for(i=1;i<44;i++)
      putch(0xcd);      /*输出下边框水平线*/
   putch(0xbc);                 /*输出右下角边框┛*/
   window(11,3,53,19);       /* 制作显示菜单的窗口,大小根据菜单条数设计*/
   clrscr();              /*清屏*/
   for(i=0;i<16;i++)       /*输出主菜单数组*/
   {
      gotoxy(10,i+1);
      cprintf("%s",menu[i]);
   }
   textbackground(BLACK);   /*设置背景颜色为黑色*/
   window(1,1,80,25);       /*恢复原窗口大小*/
   gotoxy(10,21);       /*移动光标*/
   do{
      printf("\n	 Enter you choice(0~14):");    /*在菜单窗口外显示提示信息*/
      scanf("%s",s);           /*输入选择项*/
      c=atoi(s);            /*将输入的字符串转化为整形数*/
   }while(c<0||c>14);    /*选择项不在0~14之间重输*/
   return c;              /*返回选择项,主程序根据该数调用相应的函数*/
}
STUDENT *init()
{
   return NULL;
}

/*创建链表*/
STUDENT *create()
{
   int i; int s;
   STUDENT *h=NULL,*info;  /* STUDENT指向结构体的指针*/
   for(;;)
   {
      info=(STUDENT *)malloc(sizeof(STUDENT));  /*申请空间*/
      if(!info)   /*如果指针info为空*/
      {
	 printf("\nout of memory");   /*输出内存溢出*/
	 return NULL;           /*返回空指针*/
      }
      inputs("enter no:",info->no,11);   /*输入学号并校验*/
      if(info->no[0]=='@') break;    /*如果学号首字符为@则结束输入*/
      inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/
      printf("please input %d score \n",N);  /*提示开始输入成绩*/
      s=0;         /*计算每个学生的总分,初值为0*/
      for(i=0;i<N;i++)    /*N门课程循环N次*/
      {
	 do{
	    printf("score%d:",i+1);    /*提示输入第几门课程*/
	    scanf("%d",&info->score[i]);    /*输入成绩*/
	    if(info->score[i]>100||info->score[i]<0) /*确保成绩在0~100之间*/
	    printf("bad data,repeat input\n");  /*出错提示信息*/
	 }while(info->score[i]>100||info->score[i]<0);
	 s=s+info->score[i];   /*累加各门课程成绩*/
      }
      info->sum=s;    /*将总分保存*/
      info->average=(float)s/N;  /*求出平均值*/
      info->order=0;    /*未排序前此值为0*/
      info->next=h;   /*将头结点做为新输入结点的后继结点*/
      h=info;    /*新输入结点为新的头结点*/
   }
   return(h);   /*返回头指针*/
}
/*输入字符串,并进行长度验证*/
inputs(char *prompt, char *s, int count)
{
   char p[255];
   do{
      printf(prompt);  /*显示提示信息*/
      scanf("%s",p);  /*输入字符串*/
      if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/
   }while(strlen(p)>count);
   strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
/*输出链表中结点信息*/
void print(STUDENT *h)
{
   int i=0;     /* 统计记录条数*/
   STUDENT *p;  /*移动指针*/
   clrscr();     /*清屏*/
   p=h;      /*初值为头指针*/
   printf("\n\n\n****************************STUDENT********************************\n");
   printf("|rec|nO        |      name     | sc1| sc2| sc3|   sum  |  ave  |order|\n");
   printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n");
   while(p!=NULL)
   {
       i++;
       printf("|%3d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],
p->score[2],p->sum,p->average,p->order);
       p=p->next;
   }
   printf("**********************************end*********************************\n");
}
/*删除记录*/
STUDENT *delete(STUDENT *h)
{
   STUDENT *p,*q;  /*p为查找到要删除的结点指针,q为其前驱指针*/
   char s[11];     /*存放学号*/
   clrscr();       /*清屏*/
   printf("please deleted no\n");      /*显示提示信息*/
   scanf("%s",s);   /*输入要删除记录的学号*/
   q=p=h;    /*给q和p赋初值头指针*/
   while(strcmp(p->no,s)&&p!=NULL)   /*当记录的学号不是要找的,或指针不为空时*/
   {
      q=p;       /*将p指针值赋给q作为p的前驱指针*/
      p=p->next;      /*将p指针指向下一条记录*/
   }
   if(p==NULL)     /*如果p为空,说明链表中没有该结点*/
      printf("\nlist no %s student\n",s);
   else       /*p不为空,显示找到的记录信息*/
   {
      printf("*****************************have found***************************\n");
      printf("|no        |      name     | sc1| sc2| sc3|   sum  |  ave  |order|\n");
      printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
      printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
       p->name,p->score[0],p->score[1],p->score[2],p->sum,
       p->average,p->order);
      printf("********************************end*******************************\n");
      getch();      /*压任一键后,开始删除*/
      if(p==h)    /*如果p==h,说明被删结点是头结点*/
	 h=p->next;     /*修改头指针指向下一条记录*/
      else
	 q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/
      free(p);          /*释放p所指结点空间*/
      printf("\n have deleted No %s student\n",s);
      printf("Don't forget save\n");/*提示删除后不要忘记保存文件*/
   }
   return(h);      /*返回头指针*/
}
/*查找记录*/
void search(STUDENT *h)
{
   STUDENT *p;    /*  移动指针*/
   char s[15];    /*存放姓名的字符数组*/
   clrscr();    /*清屏幕*/
   printf("please enter name for search\n");
   scanf("%s",s);    /*输入姓名*/
   p=h;    /*将头指针赋给p*/
   while(strcmp(p->name,s)&&p!=NULL)  /*当记录的姓名不是要找的,或指针不为空时*/
   p=p->next;     /*移动指针,指向下一结点*/
   if(p==NULL)         /*如果指针为空*/
      printf("\nlist no %s student\n",s);   /*显示没有该学生*/
   else           /*显示找到的记录信息*/
   {
      printf("\n\n*****************************havefound***************************\n");
      printf("|nO        |      name     | sc1| sc2| sc3|   sum  |  ave  |order|\n");
      printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
      printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
      printf("********************************end*******************************\n");
   }
}
/*插入记录*/
STUDENT  *insert(STUDENT *h)
{
   STUDENT *p,*q,*info; /*p指向插入位置,q是其前驱,info指新插入记录*/
   char s[11];  /*保存插入点位置的学号*/
   int s1,i;
   printf("please enter location  before the no\n");
   scanf("%s",s);   /*输入插入点学号*/
   printf("\nplease new record\n");      /*提示输入记录信息*/
   info=(STUDENT *)malloc(sizeof(STUDENT));   /*申请空间*/
   if(!info)
   {
      printf("\nout of memory");   /*如没有申请到,内存溢出*/
      return NULL;             /*返回空指针*/
   }
   inputs("enter no:",info->no,11); /*输入学号*/
   inputs("enter name:",info->name,15); /*输入姓名*/
   printf("please input %d score \n",N);  /*提示输入分数*/
   s1=0;    /*保存新记录的总分,初值为0*/
   for(i=0;i<N;i++)    /*N门课程循环N次输入成绩*/
   {
      do{        /*对数据进行验证,保证在0~100之间*/
	 printf("score%d:",i+1);
	 scanf("%d",&info->score[i]);
	 if(info->score[i]>100||info->score[i]<0)
	    printf("bad data,repeat input\n");
      }while(info->score[i]>100||info->score[i]<0);
      s1=s1+info->score[i];    /*计算总分*/
   }
   info->sum=s1;    /*将总分存入新记录中*/
   info->average=(float)s1/N;  /*计算均分*/
   info->order=0;         /*名次赋值0*/
   info->next=NULL;     /*设后继指针为空*/
   p=h;               /*将指针赋值给p*/
   q=h;             /*将指针赋值给q*/
   while(strcmp(p->no,s)&&p!=NULL)    /*查找插入位置*/
   {

⌨️ 快捷键说明

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