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

📄 koo.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 4       /*定义常数*/
typedef struct z1   /*定义数据结构*/
{
   char no[9];
   char name[15];
   int score[N];
   char sex[2];
   int age;
   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);   /*插入记录*/
int menu_select();            /*菜单函数*/
int submenu();




/******主函数*******/
main()
{
   int i;
   STUDENT *head;     /*链表定义头指针*/
   head=init();          /*初始化链表*/
   clrscr();            /*清屏*/
   for(;;)             /*无限循环*/
   {
      switch(menu_select())     /*调用主菜单函数,返回值整数作开关语句的条件*/
      {                     /*值不同,执行的函数不同,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:exit(0);     /*如菜单返回值为9程序结束*/
    
    }
   }
}





/******主菜单函数******/
menu_select()
{
   char *menu[]={"***************MENU***************",  /*定义菜单字符串数组*/
   " 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. Quit"};
   char s[3];       /*以字符形式保存选择号*/
   int c,i;        /*定义整形变量*/
    gotoxy(23,25);
   printf("Please press any key to enter...\n");   /*压任一键进入主菜单*/
   getch();                       /*输入任一键*/
   clrscr();                     /*清屏幕*/
   gotoxy(1,1);             /*移动光标*/
   textcolor(WHITE);   /*设置文本显示颜色为白色*/
   textbackground(RED);   /*设置背景颜色为红色*/
   gotoxy(12,6);          /*移动光标*/
   putch(0xc9);        /*输出左上角边框┏*/
   for(i=1;i<51;i++)
      putch(0xcd);    /*输出上边框水平线*/
   putch(0xbb);            /*输出右上角边框  ┓*/
   for(i=7;i<20;i++)
   {
      gotoxy(12,i);putch(0xba);   /*输出左垂直线*/
      gotoxy(63,i);putch(0xba);
   }                              /*输出右垂直线*/
   gotoxy(12,20);putch(0xc8);  /*输出左下角边框┗*/
   for(i=1;i<51;i++)
      putch(0xcd);      /*输出下边框水平线*/
   putch(0xbc);                 /*输出右下角边框┛*/
   window(13,7,62,19);       /* 制作显示菜单的窗口,大小根据菜单条数设计*/
   clrscr();              /*清屏*/
   for(i=0;i<10;i++)       /*输出主菜单数组*/
   {
      gotoxy(10,i+1);
      cprintf("%s",menu[i]);
   }
   textbackground(BLUE);   /*设置背景颜色为蓝色*/
   window(1,1,80,25);       /*恢复原窗口大小*/
   gotoxy(10,21);       /*移动光标*/
   do{

      printf("\n\t     Enter your choice(1~9) to continue...");    /*在菜单窗口外显示提示信息*/
      scanf("%s",s);           /*输入选择项*/
      c=atoi(s);            /*将输入的字符串转化为整形数*/
   }while(c<0||c>9);    /*选择项不在0~9之间重输*/
   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 the No. as 20032300.   [Type # to End Enter]:",info->no,9);   /*输入学号并校验*/
      if(info->no[0]=='#') break;    /*如果学号首字符为#则结束输入*/
      inputs("Enter name:",info->name,15); /*输入姓名,并进行校验*/
      inputs("Enter the sex M(ale) or F(emale):",info->sex,2); 
      do{
        printf("Enter the age of the student:");
        scanf("%d",&info->age);
        if(info->age<0)
        printf("\x07 AGE ERROR!!TYPE AGAIN!\n");
       }while(info->age<0);
      printf("\n\nPlease input %d scores\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("DATA ERROR!!TYPE AGAIN!\n");  /*出错提示信息*/
     }while(info->score[i]>100||info->score[i]<0);
     s=s+info->score[i];   /*累加各门课程成绩*/
      }
      info->sum=s;    /*将总分保存*/
      info->average=(float)s/N;  /*求出平均值*/
      
      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     |sex|age |sc1 |sc2 |sc3 |sc4 |   sum  |  ave  |\n");
   printf(" |---|----------|---------------|---|----|----|----|----|----|--------|-------|\n");
   while(p!=NULL)
   {
       i++;
       printf(" |%-3d|%-10s|%-15s| %1s |%4d|%4d|%4d|%4d|%4d| %4.2f | %4.2f |\n", i, p->no,p->name,p->sex,p->age,p->score[0],p->score[1],
p->score[2],p->score[3],p->sum,p->average);
       p=p->next;
   }
   printf(" ************************************end***************************************\n");
}





/*****删除记录*****/
STUDENT *delete(STUDENT *h)
{
   STUDENT *p,*q;  /*p为查找到要删除的结点指针,q为其前驱指针*/
   char s[9];     /*存放学号*/
   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("\n\n\n ***********************************STUDENT*********************************\n");
      printf(" |    No.   |      name     |sex|age |sc1 |sc2 |sc3 |sc4 |   sum  |  ave  |\n");

⌨️ 快捷键说明

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