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

📄 student.c

📁 学生管理系统!&#61548 各模块的功能 1.各种基本数据的录入。如:学生基本情况录入。 2.各种基本数据的修改。即:允许对录入的数据重新进行编辑、修改。 3.各种基本数据的插入。如:在
💻 C
📖 第 1 页 / 共 2 页
字号:
/*教务信息管理源程序*/
/******头文件(.h)******/
#include "stdio.h"    /*I/O函数*/
#include "bios.h"  /*ROM基本输入输出函数*/
#include "dos.h"    /*dos接口函数*/
#include "conio.h"   /*屏幕操作函数*/
#include "stdlib.h"   /*其它说明*/
#include "string.h"  /*字符串函数*/
#include "mem.h"  /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h"  /*动态地址分配函数*/
/******变量定义******/
struct cx
{
   char xueqi[10];
   char chengji[5];
};     
struct xx   /*定义学生选修课程的基本信息数据结构*/
{
   char clsnum[11];
   char clsnam[30];
   char rebuild[1];
   int score;
   int course;
   struct cx chongxiu[10];
}; 
typedef struct stu   /*定义学生基本信息数据结构*/
{
   char no[11];
   char name[15];
   char sex[2];
   int age;
   int sum;
   float average;
   int order;
   struct xx xuanxiu[10];
   struct stu *next;/*后继指针*/
}STUDENT;
/******函数原型*********/
STUDENT *init();    /*初始化*/
STUDENT *create();  /*基本数据的录入*/
STUDENT *revise(STUDENT *h);  /*修改*/
STUDENT *insert(STUDENT *h);  /*插入*/ 
STUDENT *delete(STUDENT *h); /*删除*/
void search(); /*查找*/
void sort(STUDENT *h); /*统计每个学生各门功课的平均成绩*/
void total(STUDENT *h); /*统计并输出各班各门功课的平均成绩和总平均成绩*/
void tjxf(STUDENT *h); /*统计并输出每个同学已修学分*/
void bjg(STUDENT *h);  /*列出不及格学生清单*/
void save(STUDENT *h);/*保存文件*/
STUDENT *load();/*读取文件*/
int menu_select();  /*主菜单*/
/*******主函数开始**********/
main()
{
   int i;
   STUDENT *head;
   head=init();
   clrscr();
   for(;;)
   {
      switch(menu_select())   /*调用菜单函数返回一个整数值*/
      {
	 case 0:head=init();break;    /*初始化*/
	 case 1:head=create();break; /*基本数据的录入*/
         case 2:head=revise(head);break;  /*修改*/
	 case 3:head=insert(head);break;  /*插入*/
	 case 4:head=delete(head);break; /*删除*/
	 case 5:search(head);break; /*查找*/
         case 6:sort(head);break;
         case 7:total(head);break;
         case 8:tjxf(head);break;
         case 9:bjg(head);break;
         case 10:save(head);break;
         case 11:head=load();break;	
	 case 12:exit(0);    /*退出*/
      }
   }
}
/*菜单函数,函数返回值为整型,代表所选的菜单项*/
menu_select()
{
   char *f[]= {     /*定义菜单字符串数组*/
   "*********************MENU********************", /*菜单的标题行*/
   " 0. init list", /*初始化双链表*/
   " 1. Enter list", /*基本数据的录入,创建双链表*/
   " 2. Revise a record", /*修改记录*/
   " 3. Insert record to list",/*插入记录*/   
   " 4. Delete a record", /*删除记录*/  
   " 5. Search record", /*查找记录*/
   " 6. Count average result of each course for everyone",/*统计每个学生各门功课的平均成绩*/
   " 7. Count for each class",
   " 8. Count have had course for everyone", /*统计并输出每个同学已修学分*/
   " 9. List for not pass",/*列出不及格学生清单*/
   " 10. Save data to the file",  /*保存文件*/
   " 11. Load data from the file",/*读取文件*/
   " 12. Quit" };  /*退出*/
   char s[80];
   int  i;
   int key=0; /*记录所压键值*/
   int c=0;
   gotoxy(1,25); /*移动光标*/
   printf("press any key enter menu......\n");/*压任意键进入主菜单*/
   getch();
   clrscr();  /*清屏*/
   textcolor(YELLOW); /*设置文本颜色为黄色*/
   textbackground(BLUE);  /*设置背景颜色为兰色*/
   gotoxy(10,2);
   putch(0xda); /*输出左上角边框┏*/
   for(i=1;i<64;i++)
   putch(0xc4); /*输出上边框水平线*/
   putch(0xbf);  /*输出右上角边框  ┓*/
   for(i=3;i<22;i++)/*输出左右两边的垂直线*/
   {
      gotoxy(10,i);putch(0xb3);
      gotoxy(74,i);putch(0xb3);
   }
   gotoxy(10,22);putch(0xc0); /*输出左上角边框┗*/
   for(i=1;i<64;i++)
      putch(0xc4);  /*输出下边框水平线*/
   putch(0xd9);  /*输出右下角边框┛*/
   window(11,3,73,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/
   clrscr();   /*清屏*/
   for(i=0;i<14;i++)
   {
      gotoxy(10,i+1);
      cprintf("%s",f[i]); /*输出菜单项数组*/
   }
   i=1;
   gotoxy(10,2);  /*设置默认选项在第一项*/
   textbackground(LIGHTGREEN);/*设置背景颜色为浅绿*/
   cprintf("%s",f[1]);  /*输出菜单项,表示选中*/
   gotoxy(10,2);  /*移动光标到菜单的第一项*/
   while(key!=13)   /*所压键不是回车键时*/
   {
      while(bioskey(1)==0);  /*查询是否压下了一个键*/
      key=bioskey(0);   /*返回下一个在键盘压下的键*/
      key=key&0xff?key&0xff:key>>8; /*对所压的键进行判断*/
      gotoxy(10,i+1);
      textbackground(BLUE);/*设置背景颜色为蓝色*/
      cprintf("%s",f[i]);  /*输出菜单项*/
      if(key==72) i=i==1?13:i-1; /*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/
      if(key==80)i=i==13?1:i+1; /*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/
      gotoxy(10,i+1); /*光标移动i的下一项*/
      textbackground(LIGHTGREEN); /*将背景颜色设为浅绿*/
      cprintf("%s",f[i]);  /*输出菜单项*/
      c=i-1;  /*给代表菜单选项的整数赋值*/
   }
   textbackground(BLACK);  /*设置背景颜色为黑色*/
   window(1,1,80,25);  /*恢复原窗口大小*/
   clrscr();
   gotoxy(1,1);
   return c;  /*返回代表菜单选项的整数值*/
}
/*初始化函数*/
STUDENT *init()
{  
   return NULL;
}
/*输入数据,创建链表*/
STUDENT *create()
{
   int i,j,k,l; 
   int s;
   STUDENT *h=NULL,*info;  /* STUDENT指向结构体的指针*/
   printf("-------------------enter @ return--------------------\n");
   printf("---if you don't enter xuan xiu ke bian hao,enter @---\n");
   printf("-----if you don't enter chong xiu xue qi,enter @-----\n");
   for(;;)
   {
      info=(STUDENT *)malloc(sizeof(STUDENT));  /*申请空间*/
      if(!info)   /*如果指针info为空*/
      {
	 printf("\nout of memory");   /*输出内存溢出*/
	 exit(0);          /*返回空指针*/
      }
      inputs("enter no(enter @ return):",info->no,11);   /*输入学号并校验*/
      if(info->no[0]=='@') break;    /*如果学号首字符为@则结束输入*/
      inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/
      inputs("enter sex(0:women;1:men):",info->sex,1);
      printf("enter age:");
      scanf("%d",&info->age);
      for(k=1;k<10;k++)
      {
        info->xuanxiu[k].score=0;
        info->xuanxiu[k].course=0;
        for(l=1;l<10;l++)
        strcpy(info->xuanxiu[l].chongxiu[l].chengji,"0");
      }
      for(i=1;;)
      {
       printf("enter di %d men xuan xiu ke bian hao(enter @ return):",i);
       scanf("%s",info->xuanxiu[i].clsnum);
       if(info->xuanxiu[i].clsnum[0]=='@') break;
       inputs("enter xuan xiu ke ming cheng:",info->xuanxiu[i].clsnam,16);
       printf("enter shi fou chong xiu(n or y):");
       scanf("%s",&info->xuanxiu[i].rebuild);
       printf("enter xuan xiu ke cheng ji:");
       scanf("%d",&info->xuanxiu[i].score);
       printf("enter xuan xiu ke xue fen:");
       scanf("%d",&info->xuanxiu[i].course);
       for(j=1;;)
       {
        printf("enter di %d chi chong xiu xue qi(such as:2007/1(2);enter @ return):",j);
        scanf("%s",info->xuanxiu[i].chongxiu[j].xueqi);
        if(info->xuanxiu[i].chongxiu[j].xueqi[0]=='@') break;
        printf("enter chong xiu cheng ji:");
        scanf("%s",&info->xuanxiu[i].chongxiu[j].chengji);
        j++;
       }
       i++;
      }
      s=0;
      for(i=1;i<=3;i++)
      s+=info->xuanxiu[i].score;
      info->sum=s;
      info->average=s/3.;
      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中*/
}
/*插入记录*/
STUDENT  *insert(STUDENT *h)
{
   STUDENT *p,*q,*info; /*p指向插入位置,q是其前驱,info指新插入记录*/
   char s[11];  /*保存插入点位置的学号*/
   int s1,i,j;
   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(enter @ return):",info->no,11);   /*输入学号并校验*/
   inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/
   inputs("enter sex:",info->sex,1);
   printf("enter age:");
   scanf("%d",&info->age);
   for(i=1;;)
    {
       printf("enter di %d men xuan xiu ke bian hao(enter @ return):",i);
       scanf("%s",p->xuanxiu[i].clsnum);
       if(p->xuanxiu[i].clsnum[0]=='@') break;
       inputs("enter xuan xiu ke ming cheng:",p->xuanxiu[i].clsnam,16);
       printf("enter shi fou chong xiu(n or y):");
       scanf("%s",&p->xuanxiu[i].rebuild);
       printf("enter xuan xiu ke cheng ji:");
       scanf("%d",&p->xuanxiu[i].score);
       printf("enter xuan xiu ke xue fen:");
       scanf("%d",&p->xuanxiu[i].course);
       for(j=1;;)
       {
        printf("enter di %d chi chong xiu xue qi(such as:2007/1(2);enter @ return):",j);
        scanf("%s",p->xuanxiu[i].chongxiu[j].xueqi);
        if(p->xuanxiu[i].chongxiu[j].xueqi[0]=='@') break;
        printf("enter chong xiu cheng ji:");
        scanf("%s",&p->xuanxiu[i].chongxiu[j].chengji);
        j++;
       }
       i++;
    }
   info->next=NULL;     /*设后继指针为空*/
   p=h;               /*将指针赋值给p*/
   q=h;             /*将指针赋值给q*/
   while(strcmp(p->no,s)&&p!=NULL)    /*查找插入位置*/
   {
      q=p;                 /*保存指针p,作为下一个p的前驱*/
      p=p->next;          /*将指针p后移*/
   }
   if(p==NULL)      /*如果p指针为空,说明没有指定结点*/
      if(p==h)      /*同时p等于h,说明链表为空*/
	 h=info;   /*新记录则为头结点*/
      else
	 q->next=info;  /*p为空,但p不等于h,将新结点插在表尾*/
   else
      if(p==h)     /*p不为空,则找到了指定结点*/
      {
	 info->next=p; /*如果p等于h,则新结点插入在第一个结点之前*/
	 h=info;    /*新结点为新的头结点*/
      }
      else
      {
	 info->next=p;   /*不是头结点,则是中间某个位置,新结点的后继为p*/
	 q->next=info;  /*新结点作为q的后继结点*/
      }
   printf("\n ----have inserted %s student----\n",info->name);  
   printf("---Don't forget save---\n");     /*提示存盘*/
   return(h);         /*返回头指针*/
}
/*删除记录*/
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      | sex | age |\n");
      printf("|----------|----------------|-----|-----|\n");
      printf("|%-10s|%-16s|%5s|%5d|\n",p->no,p->name,p->sex,p->age);
      printf("*******************end*******************\n");
      getch();      /*压任一键后,开始删除*/
      if(p==h)    /*如果p==h,说明被删结点是头结点*/
	 h=p->next;     /*修改头指针指向下一条记录*/
      else
	 q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/
      free(p);          /*释放p所指结点空间*/
      printf("\nhave deleted No %s student\n",s);
      printf("Don't forget save\n");/*提示删除后不要忘记保存文件*/
   }
   return(h);      /*返回头指针*/
}
/*查找记录*/
void search(STUDENT *h)
{
   STUDENT *p;    /*  移动指针*/
   char s[15];    /*存放姓名的字符数组*/
   int j,k;
   clrscr();    /*清屏幕*/
   printf("-Please change the type of search!-\n");
   printf("----Enter 1 for search by name!----\n");
   printf("----Enter 2 for search by age!-----\n");
   printf("-----------Enter @ return!---------\n");
   scanf("%d",&j);

⌨️ 快捷键说明

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