功能比较完备学生管理系统

下面是我写的第二个管理系统,相对来说功能更完备一些:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
typedef struct student
{
 char name[10];
 char sex[4];
 int age;
 char num[10];
 int score;
}STU;//定义存储学生信息的结构体 
typedef struct jiedian
{
 STU stu;
 struct jiedian *next;
}JD;//定义结点
JD *inputstudent();
void hasnot_been_recorded();
void inputID(JD *h);
void guanliyuan();
void has_been_recorded();    
JD *readstudent1(char *a);
void record();
void addstudent(JD *h); 
void deletestudent(JD *h); 
void outputstudent2(JD *h);
void changestudent(JD *h); 
void checkstdent(JD *h);
void countstudent(JD *h);
void savestudent(JD *h);
void sortstudent(JD *h);
void gongneng_menu(JD *h);
JD *negetive_sequence(JD *h); 
JD *num_order_sequence(JD *h);
JD *sortstudent2(JD *h);
JD *sortstudent1(JD *h);
void xuesheng();
void gotoxy(int x, int y);
void destorylist(JD *h); 
void go_on_or_not(JD *h); 
void outputstudent(JD *h);
void outputstudent1(JD *h);
void code(int i,char *b); 
//1.直接输入信息函数 
JD *inputstudent()
{
 char n,a;
 printf("请输入学生信息:姓名,性别,年龄,学号,分数\n");
 printf("\n");
 printf("\n");
 printf("注意当输入的姓名为#时,结束录入!\n");
 JD *h,*p,*q;
 q=(JD *)malloc(sizeof(JD));
 h=q;
 while(1) 
 {
  p=(JD *)malloc(sizeof(JD));
  scanf("%s   %s   %d   %s   %d",p->stu.name,p->stu.sex,&p->stu.age,p->stu.num,&p->stu.score);
  q->next=p;
  q=p;
  if(strcmp(p->stu.name,"#")==0) break;
 }
 q->next=0;
 return h;//return 要放在最后面!!! 
}
//2.增
void addstudent(JD *h)
{
 JD *q,*s,*p;int i,j=1;char a[10];
 s=(JD *)malloc(sizeof(JD));
 printf("请输入新纳入学生的相关信息:\n");
 scanf("%s%s%d%s%d",s->stu.name,s->stu.sex,&s->stu.age,s->stu.num,&s->stu.score);
 printf("请输入需要插入的位置后的学生学号:");
 scanf("%s",a);
 q=h;p=h->next;
 while(p!=0)
 {
  if(strcmp(a,p->stu.num)==0) break;
  q=p;p=p->next;
 }
 s->next=q->next;
 q->next=s;
 printf("\n");
 printf("\n");
 printf("添加信息成功!\n");
}
//3.删 
void deletestudent(JD *h)
{
 int i,j=1;char a[10];
 printf("请输入将要删除的学生的学号:\n");
    scanf("%s",a);
 JD *p,*q;
 q=h;p=h->next;
 while(p!=0)
 {
  if(strcmp(a,p->stu.num)==0) break;
  q=p;p=p->next;
 }
 q->next=p->next;
 free(p);
 printf("删除信息成功!\n");
} 
//4.改
void changestudent(JD *h)
{
 printf("请输入信息需要修改的学生的学号:\n");
 int i,j=1;char a[10];
 scanf("%s",a);
 JD *p;
 p=h->next;
 while(p)
 {
  if(strcmp(a,p->stu.num)==0) break;
  p=p->next;
 }
 printf("请按姓名,性别,年龄,学号,得分的顺序重新输入该生的信息:\n");
 scanf("%s   %s   %d   %s   %d",p->stu.name,p->stu.sex,&p->stu.age,p->stu.num,&p->stu.score);
 printf("修改信息成功!\n");
} 
//5.查 
void checkstudent(JD *h)
{
 printf("请输入需要查询的学生学号:");
 int i,j=1;char a[10];
 scanf("%s",a);
 JD *p;
 p=h->next;
 while(p!=0)
 {
  if(strcmp(a,p->stu.num)==0) break;
  p=p->next;
 }
 printf("查询结果:\n");
 printf("\n");
 printf("\t\t\t姓名   性别   年龄   学号   得分\n");
 printf("\t\t\t%s   %s   %d   %s   %d",p->stu.name,p->stu.sex,p->stu.age,p->stu.num,p->stu.score);
 printf("\n");
 printf("\n");
}
//6.计数
void countstudent(JD *h)
{
 JD *p;int sum=0,count=0;double average;
 p=h->next;
 while(p)
 {
  count++;
  sum+=p->stu.score;
  p=p->next;
 }
 p=h->next;
 while(p->next!=0)
 {
  p=p->next;
 }
 count=count-1;
 sum=sum-p->stu.score;
 average=sum/count;
 printf("共%d人      总分:%d      平均分:%.2f",count,sum,average);
}
//7.打印
void outputstudent2(JD *h)
{
 JD *p;
 p=h->next;
 printf("\t\t\t姓名   性别   年龄   学号   得分\n");
 while(p!=0)
 {
  printf("\t\t\t%s       %s      %d     %s     %d\n",p->stu.name,p->stu.sex,p->stu.age,p->stu.num,p->stu.score);
  p=p->next;
 }
}
void outputstudent(JD *h)
{
 printf("\t\t\t输入1.只看学生及其成绩   2.输出所有信息\n");
 char a=getch();
 switch(a)
 {
  case '1':outputstudent1(h);break;
  case '2':outputstudent2(h);break;
  default :
   {
    printf("输入错误,请重新输入:\n");
    outputstudent(h);
   }
  } 
}
void outputstudent1(JD *h)
{
 char a[10];int i,j=1;
 printf("请输入学生学号:\n");
 scanf("%s",a);
 JD *p;
 p=h->next;
 while(p!=0)
 {
  if(strcmp(a,p->stu.num)==0) break;
  p=p->next; 
 }
 printf("\n");
 printf("\n");
 printf("\t\t\t姓名   成绩\n");
 printf("\t\t\t%s   %d",p->stu.name,p->stu.score);
}
//8.保存 
void savestudent(JD *h)
{
 FILE *fp;
 JD *p;
    p=h->next;
    fp=fopen("students.txt","w");
    if((fp=fopen("students.txt","w"))!=0)
    {
     fprintf(fp,"姓名   性别   年龄   学号   得分\n");
   while(p!=0)
        {
         fprintf(fp,"%s   %s   %d   %s   %d\n",p->stu.name,p->stu.sex,p->stu.age,p->stu.num,p->stu.score);
         p=p->next;
     }
     fclose(fp);
     printf("写入文件成功!\n");
    }
    else printf("写入文件失败!\n");
} 
//10.排序 
void sortstudent(JD *h)
{
 JD *head;
 printf("\n");
 printf("请选择排序方式:\t\t\t1.成绩按由低到高排\t\t2.成绩按由高到低来排\n");
 printf("                \t\t\t3.按学号排序      \t\t4.将当前顺序逆置\n");
 char a=getch();
 switch(a)
 {
  case '1':head=sortstudent1(h);outputstudent(head);break;
  case '2':head=sortstudent2(h);outputstudent(head);break;
  case '3':head=num_order_sequence(h);outputstudent(head);break;
  case '4':head=negetive_sequence(h);outputstudent(head);break;
 } 
}
//排1
JD *sortstudent1(JD *h)
{
 JD *q,*p,*r;
 r=(JD *)malloc(sizeof(JD));
 q=h->next;
 while(q)
 {
  p=q->next;
  while(p)
  {
   if(q->stu.score > p->stu.score)
   {
    strcpy(r->stu.name,q->stu.name);
    strcpy(r->stu.sex,q->stu.sex);
    r->stu.age=q->stu.age;
    strcpy(r->stu.num,q->stu.num);
    r->stu.score=q->stu.score;
    
    strcpy(q->stu.name,p->stu.name);
    strcpy(q->stu.sex,p->stu.sex);
    q->stu.age=p->stu.age;
    strcpy(q->stu.num,p->stu.num);
    q->stu.score=p->stu.score;
    
    strcpy(p->stu.name,r->stu.name);
    strcpy(p->stu.sex,r->stu.sex);
    p->stu.age=r->stu.age;
    strcpy(p->stu.num,r->stu.num);
    p->stu.score=r->stu.score;
   }
   p=p->next;
  }
  q=q->next;
 }
 printf("重排成功!下面是输出结果:\n");
 return h;
}
//排2
JD *sortstudent2(JD *h)
{
 JD *q,*p,*r;
 r=(JD *)malloc(sizeof(JD));
 q=h->next;
 while(q)
 {
  p=q->next;
  while(p)
  {
   if(q->stu.score < p->stu.score)
   {
    strcpy(r->stu.name,q->stu.name);
    strcpy(r->stu.sex,q->stu.sex);
    r->stu.age=q->stu.age;
    strcpy(r->stu.num,q->stu.num);
    r->stu.score=q->stu.score;
    
    strcpy(q->stu.name,p->stu.name);
    strcpy(q->stu.sex,p->stu.sex);
    q->stu.age=p->stu.age;
    strcpy(q->stu.num,p->stu.num);
    q->stu.score=p->stu.score;
    
    strcpy(p->stu.name,r->stu.name);
    strcpy(p->stu.sex,r->stu.sex);
    p->stu.age=r->stu.age;
    strcpy(p->stu.num,r->stu.num);
    p->stu.score=r->stu.score;
   }
   p=p->next;
  }
  q=q->next;
 }
 printf("重排成功!下面是输出结果:\n");
 return h;
}
//排3
JD *num_order_sequence(JD *h)
{
 JD *q,*p,*r;
 r=(JD *)malloc(sizeof(JD));
 q=h->next;
 while(q)
 {
  p=q->next;
  while(p)
  {
   if(strcmp(q->stu.num,p->stu.num)>0)
   {
    strcpy(r->stu.name,q->stu.name);
    strcpy(r->stu.sex,q->stu.sex);
    r->stu.age=q->stu.age;
    strcpy(r->stu.num,q->stu.num);
    r->stu.score=q->stu.score;
    
    strcpy(q->stu.name,p->stu.name);
    strcpy(q->stu.sex,p->stu.sex);
    q->stu.age=p->stu.age;
    strcpy(q->stu.num,p->stu.num);
    q->stu.score=p->stu.score;
    
    strcpy(p->stu.name,r->stu.name);
    strcpy(p->stu.sex,r->stu.sex);
    p->stu.age=r->stu.age;
    strcpy(p->stu.num,r->stu.num);
    p->stu.score=r->stu.score;
   }
   p=p->next;
  }
  q=q->next;
 }
 printf("重排成功!下面是输出结果:\n");
 return h;
}
//排4
JD *negetive_sequence(JD *h)
{
 JD *q,*p,*r;
 p=h->next;
 q=0;
 while(p)
 {
  r=p->next;
  p->next=q;
  q=p;
  p=r;
 }
 h->next=q;
 printf("逆置成功!下面是输出结果:\n");
 return h;
 
} 
void has_been_recorded()    
{
 char a[20];
 printf("请输入需要读取的文件名:\n");
 gets(a);
 JD *head=readstudent1(a);
 gongneng_menu(head);
 go_on_or_not(head);
}
void hasnot_been_recorded()
{
 JD*head=inputstudent();
 gongneng_menu(head);
 go_on_or_not(head);
}
void inputID()
{
 char a=getch();
 switch(a)
 {
  case '1':guanliyuan();break;
  case '2':xuesheng();break;
  default :
   {
    printf("您输入的有误,请重新输入:\n");
    inputID();
   }
 }
}
//光标
void gotoxy(int x, int y)
{
    COORD pos;
    pos.X = x - 1;
    pos.Y = y - 1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
} 
void code(int i,char *b)
{
 b[i]=getch();
 if(b[i]=='\b')
 {
  gotoxy(52+i-1,26);
  putchar(' ');
  gotoxy(52+i-1,26);
  code(i-1,b);
  code(i,b);
 }
 else
 {
  gotoxy(52+i,26);
  putchar('*');
  gotoxy(52+i+1,26);
 }
}
//管理员 
void guanliyuan()
{
 int i,j=1,k=1;char a[7],b[7],c[7]="master",d[7]="666666";
 printf("\n"); 
 printf("\n");
 gotoxy(40, 19);
 printf("            _____________\n");
 gotoxy(40, 20);
 printf(" 用户名: ||             ||\n");
 gotoxy(40, 21);
 printf("          ||_____________||\n");
 gotoxy(52, 21);
 gets(a);
 printf("\n"); 
 printf("\n");
 gotoxy(42, 24);
 printf("          _____________\n");
 gotoxy(42, 25);
 printf(" 密码: ||             ||\n");
 gotoxy(42, 26);
 printf("        ||_____________||\n");
 gotoxy(52, 26);
 for(i=0;i<6;i++)
 {
  code(i,b);
 }
 if(strcmp(a,c)==0&&strcmp(b,d)==0)
 {
  system("cls");
  printf("\n");
  printf("\n");
  printf("\n");
  printf("                           欢迎您:  master      请根据提示进行选择:              \n");
  printf("\n");
  printf("\n");
  printf("\t\t\t1.已录入学生信息并将在此基础上进行下一步\t\t\t2.将要新纳入学生信息\n"); 
     record();
 }
 else if(strcmp(a,c)!=0) 
 {
  printf("\n");
  printf("\n");
  printf("\n用户名输入错误!请重新输入:\n");
  Sleep(2000);
  system("cls");
  printf("\n");
 printf("\n");
 printf("                   ╭︿︿︿ ╮                                                            ╭︿︿︿ ╮   \n");
 printf("                   {/ @  @ /}                                                           {/ @  @ /}   \n");
 printf("                    ( (oo) )                                                             ( (oo) )   \n");
 printf("                     ︶︶︶                    欢迎使用地表最强管理系统!                 ︶︶︶    \n");
 printf("\n");
 printf("\n");
  guanliyuan();
 }
 else if(strcmp(b,d)!=0)
 {
  printf("\n");
  printf("\n");
  printf("\n密码错误!请重新输入:\n");
  Sleep(2000);
  system("cls");
  printf("\n");
 printf("\n");
 printf("                   ╭︿︿︿ ╮                                                            ╭︿︿︿ ╮   \n");
 printf("                   {/ @  @ /}                                                           {/ @  @ /}   \n");
 printf("                    ( (oo) )                                                             ( (oo) )   \n");
 printf("                     ︶︶︶                    欢迎使用地表最强管理系统!                 ︶︶︶    \n");
 printf("\n");
 printf("\n");
  guanliyuan();
 } 
}
//学生 
void xuesheng()
{
 JD *head,*p;
 char c[]="students.txt";
 head=readstudent1(c);p=head->next;
 printf("请输入你的学号:\n");
 gotoxy(40, 19);
 printf("            _____________\n");
 gotoxy(40, 20);
 printf("   学号: ||             ||\n");
 gotoxy(40, 21);
 printf("          ||_____________||\n");
 gotoxy(52, 21);
 char a[10];
 scanf("%s",a);
 while(p)
 {
  if(strcmp(p->stu.num,a)==0) break;
  p=p->next;
 }
 if(p)
    {
     printf("\t\t\t欢迎您%s同学,欢迎使用本系统!下面是你可以进行的信息查询:\n",p->stu.name);
  printf("\n");
  printf("\n"); 
     outputstudent(head);
        printf("按任意键继续:\n");
        getch();
    }
    else
    {
     printf("未找到该生,请检查并重新输入:\n");
     xuesheng();
 }
}
void record()
{
 char a=getch();
 switch(a)
 {
     case '1':has_been_recorded();break;
     case '2':hasnot_been_recorded();break;
     default :
     {
      printf("您输入的有误:请重新输入:\n");
      record();
  }
 }
}
JD *readstudent1(char *a)
{
 JD *h,*p,*q;
 q=(JD *)malloc(sizeof(JD));
 h=q;
 FILE *fp;
 fp=fopen(a,"r");
 if((fp=fopen(a,"r"))!=0)
 {
     fseek(fp,1L*sizeof("姓名   性别   年龄   学号   得分"),SEEK_SET); 
  while(1)
     {
      p=(JD *)malloc(sizeof(JD));
      fscanf(fp,"%s   %s   %d   %s   %d",p->stu.name,p->stu.sex,&p->stu.age,p->stu.num,&p->stu.score); 
   q->next=p;
   q=p;
      if(strcmp(p->stu.name,"#")==0) break;
     }
     q->next=0;
  printf("打开文件成功!\n");
    }
    else printf("打开文件失败!\n");
 fclose(fp);
 return h;
}
//摧毁链表
void destorylist(JD *h)
{
 JD *p,*r;
 p=h->next;
 while(p!=0)
 {
  r=p->next;
  free(p);
  p=r;
 }
 free(h);
 printf("摧毁信息成功!按任意键继续:\n");
 getch();
} 
void gongneng_menu(JD *h)
{
    printf("\n");
 printf("请根据您的需要输入功能列表对应的序号:\n");
 printf("\t\t\t1.添加学生\t\t2.删除学生信息\t\t3.修改学生信息\n");
    printf("\n");
 printf("\n");
 printf("\t\t\t4.查询学生信息\t\t5.统计学生人数\t\t6.打印学生信息\n");
    printf("\n");
 printf("\n");
    printf("\t\t\t7.将学生信息排序\t\t8.保存学生信息\t\t9.读取文件信息\n");
 printf("\n");
 printf("\n");
 printf("\t\t\t0.摧毁信息并退出系统\n");
 char b[]="students.txt";
 char a=getch();
    switch(a)
 {
  case '1':addstudent(h);break;     case '2':deletestudent(h);break;
        case '3':changestudent(h);break;  case '4':checkstudent(h);break;
        case '5':countstudent(h);break;   case '6':outputstudent(h);break;
        case '7':sortstudent(h);break;    case '8':savestudent(h);break;
     case '9':readstudent1(b);break;   case '0':destorylist(h);break; 
  default :
  {
   printf("您输入的有误,请重新输入!\n");
   system("cls");
   gongneng_menu(h);
  }
 }
}
//是否继续函数 
void go_on_or_not(JD *h)
{
 printf("\t\t\t按1继续    按0退出\n");
 char a=getch();
 switch(a)
 {
  case '1':
  {
   system("cls");
   gongneng_menu(h);
   go_on_or_not(h);
   break;
  }
  case '0': break;
  default:
 {
  printf("输入错误,请重新输入:\n");
  printf("\n");
  go_on_or_not(h);
 }
 }
}
main()
{
 int count=1;
 system("color 70");
 printf("\n");
 printf("\n");
 printf("                   ╭︿︿︿ ╮                                                            ╭︿︿︿ ╮   \n");
 printf("                   {/ @  @ /}                                                           {/ @  @ /}   \n");
 printf("                    ( (oo) )                                                             ( (oo) )   \n");
 printf("                     ︶︶︶                    欢迎使用地表最强管理系统!                 ︶︶︶    \n");
 printf("\n");
 printf("\n");
 while(count<=120)
 {
  printf("==");
  Sleep(30);
  count++;
 }
 printf("\n");
 printf("\n"); 
 printf("\n"); 
 printf("\n"); 
 printf("请选择身份:                                      1.管理员        2.学生\n");
 inputID();
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值