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

📄 z.c

📁 用C写的一个简单的学生成绩管理系统 有功能选择的截面
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"               /*屏幕操作函数*/
#include "mem.h"                 /*内存操作函数*/
#include "ctype.h"               /*字符操作函数*/
#include "alloc.h"               /*动态地址分配函数*/
#define N 3
typedef struct
{
    char Num[6];                 /*学生学号*/
    char Name[6];                /*学生名字*/
    int Age;                     /*学生年龄*/
    char Sex[6];                 /*学生性别*/
}stuifo;
typedef struct z1
{
   char no[6];                   /*学生学号*/
   char name[6];                 /*学生名字*/
   char grade[5];                /*学生年级*/
   char sub[9];                  /*学生专业*/
   int score[N];                 /*学生分数*/
   float sum;                    /*学生总分*/
   float average;                /*学生均分*/
   int order;                    /*学生排名*/
   struct z1 *next;              
 }STUDENT;
typedef struct node              /*排序二叉树*/
{
    stuifo data;                 /*二叉树关键字*/
    struct node *lchild,*rchild;
}bstnode;

int menu_select();               /*菜单函数*/
void append();                   /*追加记录*/
void print(STUDENT *h);          /* 显示所有记录*/
void save(STUDENT *h);           /*追加记录*/
void computer(STUDENT *h);       /*计算总分和均分*/
void search(STUDENT *h);         /*按名称查找*/
STUDENT *init();                 /*初始化函数*/
STUDENT *create();               /*创建链表*/
STUDENT *delete(STUDENT *h);     /*删除记录*/
STUDENT *insert(STUDENT *h);     /*插入记录*/
STUDENT *load();                 /*读入记录*/
STUDENT *sort(STUDENT *h);       /*排序*/
bstnode *CREATBST();
bstnode *INSERTBST(bstnode *t,bstnode *s);
bstnode *BSTSEARCH(bstnode *t,char k);
/*主函数*/
main()
{  bstnode *t;
   int i;char k;
   STUDENT *head;  /*链表定义头指针*/
   head=init();    /*初始化链表*/
   clrscr();


   for(;;)         /*无限循环*/
   {  
      switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
      {
     case 0:head=init();break;        /*初始化*/
     case 1:head=create();break;      /*创建链表*/
     case 2:head=delete(head);break;  /*删除*/
     case 3:head=insert(head);break;  /*插入*/
     case 4:print(head);break;        /*打印*/
     case 5:search(head);break;       /*搜索*/
     case 6:save(head);break;         /*保存到文件*/
     case 7:head=load(); break;       /*读取于文件*/
     case 8:computer(head);break;     /*计算*/
     case 9:head=sort(head);break;    /*排序*/
     case 10:append();break;          /*追加到文件*/
     case 11:BSTSEARCH(t,k);          /*学生信息显示*/
     case 12:exit(0);                 /*退出*/
      }
   }
}
/*菜单函数*/
menu_select()
{
  char *menu[]={"*************************MENU*************************",
"|      0. Clean list                                 |",
"|      1. Enter list                                 |",
"|      2. Del a data from list                       |",
"|      3. Insert a data to list                      |",
"|      4. Print a list of all student                |",
"|      5. Search a data on name by one student       |",
"|      6. Save the file                              |",
"|      7. Load the file                              |",
"|      8. Count the score by grade and course        |",
"|      9. Sort to make new file                      |",
"|      10. Add a record to file                      |",
"|      11. Display the student's data                |",
"|      12. Quit the system                           |",
                 "******************************************************"};
   char s[3];    /*以字符形式保存选择号*/
   int c,i;
   gotoxy(1,25); /*移动光标*/   printf("press any key enter menu......\n");
   textcolor(2);
   getch();      /*输入任一键*/
   clrscr();     /*清屏幕*/
   gotoxy(10,2); /*移动光标*/
   clrscr();     /*清屏*/
/*输出主菜单数组*/
   for(i=0;i<15;i++)
   {
      gotoxy(10,i+1);
      cprintf("%s",menu[i]);
   }
   gotoxy(10,16);
   do{
      printf("\n     Enter you choice(0~12):");
      scanf("%s",s); /*输入选择项*/
      c=atoi(s);     /*将输入的字符串转化为整形数*/
   }while(c<0||c>12);
   return c;         /*返回选择项,主程序根据该数调用相应的函数*/
}
/*初始化函数*/
STUDENT *init()
{return NULL;}
/*创建链表*/
STUDENT *create()
{  int i; int s;
   STUDENT *h=NULL,*info;                  /*STUDENT指向结构体的指针*/
   bstnode *t;
   for(;;)
   {
      info=(STUDENT *)malloc(sizeof(STUDENT));/*申请空间*/
      if(!info)                            /*如果指针info为空*/
      {
     printf("\nout of memory");            /*输出内存溢出*/
     return NULL;
      }
      inputs("enter no:",info->no,6);      /*输入学号并校验*/
      if(info->no[0]=='+')break;           /*如果学号首字符为+则结束输入*/
      inputs("enter name:",info->name,6);  /*输入姓名,并进行校验*/
      inputs("enter grade:",info->grade,5);/*提示开始输入年级*/
      inputs("enter sub:",info->sub,9);    /*提示开始输入专业*/
      t=CREATBST(info);                    /*学生信息读入树*/
      printf("please input %d score \n",N);/*提示开始输入成绩*/
      s=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);
}
/*将结点插入树*/
bstnode *INSERTBST(bstnode *t,bstnode *s)
  {bstnode *f,*p;
    p=t;
    while(p!=NULL)
    {f=p;
    if(!strcmp(s->data.Name,p->data.Name)) return t;
    if(strcmp(s->data.Name,p->data.Name)<0)  p=p->lchild;
    else p=p->rchild;
    }
    if(t==NULL) return s;
    if(strcmp(s->data.Name,f->data.Name)<0) f->lchild=s;
    else f->rchild=s;
    return t;

      }
/*创建学生信息的树*/
bstnode *CREATBST(STUDENT *info)
{   bstnode *t,*s;
    STUDENT *h;
    char *endflag="0";
    stuifo tempdata;
    t=NULL;
    strcpy(tempdata.Name,info->name);
    if(strcmp(tempdata.Name,endflag)!=0)
    {s=malloc(sizeof(bstnode));
    s->lchild=s->rchild=NULL;
    strcpy(s->data.Name,tempdata.Name);
    strcpy(tempdata.Num,info->no);
    strcpy(s->data.Num,tempdata.Num);
    printf("Input the student's sex:");
    scanf("%s",tempdata.Sex);
    strcpy(s->data.Sex,tempdata.Sex);
    printf("Input the student's age:");
    scanf("%d",&tempdata.Age);
    s->data.Age=tempdata.Age;
    t=INSERTBST(t,s);          /*引用插入函数*/
    }
    return t;
}
bstnode *BSTSEARCH(bstnode *t,char k)
{
        do{
printf("\nplease input a name of the student whose score you want to see: \n");
scanf("%s",k);
while(t!=NULL)
    {if(strcmp(t->data.Name,k)==0)break;
     if(strcmp(t->data.Name,k)>0)t=t->lchild;
    else t=t->rchild;
    }
printf("\n--Num:%ld, Name:%s, Age;%d, Sex:%s \n",t->data.Num,t->data.Name,
t->data.Age,t->data.Sex);getch();
          }while(k!=0);
}

/*输入字符串,并进行长度验证*/
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"); 
   }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  |grade|   sub   | sc1| sc2| sc3|   sum  |  ave  |order|\n");
   printf("|---|------|------|-----|---------|----|----|----|--------|-------|-----|\n");
   while(p!=NULL)
   {
       i++;
   printf("|%2d |%-6s|%-6s|%-5s|%-9s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", i,
   p->no,p->name,p->grade,p->sub,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[6];           /*存放学号*/
   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 |grade|   sub   | sc1| sc2| sc3|   sum  |  ave  |order|\n");
      printf("|------|------|-----|---------|----|----|----|--------|-------|-----|\n");
      printf("|%-6s|%-6s|%-5s|%-9s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
       p->name,p->grade,p->sub,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[6];           /*存放姓名的字符数组*/

⌨️ 快捷键说明

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