C语言学籍管理系统

来源:互联网 发布:yum 缓存目录 编辑:程序博客网 时间:2024/04/27 17:16

 #include <stdio.h>
#include <stdlib.h>//内存分配
#include <string.h>//字符串处理
#include <conio.h>//用于getch()


typedef struct mark
{
char   num[20];//学号
int  ch;//语
int  ma;//数
int  en;//外
struct mark  *next ;
} m;

 


typedef struct student
{
char   num[20];//学号
char   name[30];//姓名
int    grade;//年级
int    cla;//班
int    jy;//检验是否建档
struct student *next ;
} s;


s  * shead=NULL;
s  * si=NULL;


m  * mhead=NULL;
m  * mi=NULL;

 

 

void  initials()
{
FILE  *fp;
fp=fopen("student.txt","r");
if(fp==NULL){  printf("/n/n学生文件不存在!/n/n");    return;                 }
fseek(fp,0,SEEK_END);
int i,n;
n=ftell(fp)/sizeof(s);
fseek(fp,0,0);//或者rewind(fp);

for(i=0;i<n;i++)
{
s  *p;
p=(s*)malloc(sizeof(s));
p->next=NULL;
fread(p,sizeof(s),1,fp);

if(shead==NULL)shead=si=p;
else  {si->next=p,si=p;}

}


//printf("/n初始化%d个学生成功!/n",n);
}

 


void  initialm()
{
FILE  *fp;
fp=fopen("mark.txt","r");
if(fp==NULL){  printf("/n/n档案文件不存在!/n/n");    return;                 }
fseek(fp,0,SEEK_END);
int i,n;
n=ftell(fp)/sizeof(m);
fseek(fp,0,0);//或者rewind(fp);

for(i=0;i<n;i++)
{
m  *p;
p=(m*)malloc(sizeof(m));
p->next=NULL;
fread(p,sizeof(m),1,fp);

if(mhead==NULL)mhead=mi=p;
else  {mi->next=p,mi=p;}

}


//printf("/n初始化%d个档案成功!/n",n);
}

 

 

 

 

void news()
{
printf("/n/n/n/n█创建学生█/n/n");
    s *p;
 p=(s *)malloc(sizeof(s));
 p->next=NULL;
    p->jy=0;//未建档
loop:

 printf("/n请输入新学号/n/n");
 scanf("%s",p->num);

 

//检验
s* pj=shead;
int y=1;
while(pj)
{
 if(strcmp(pj->num,p->num)==0){y=0;printf("/n/n错误,该学号已存在,请重新输入!");goto  loop;}
 pj=pj->next;
}//检验

 printf("/n请输入新学生姓名/n/n");
 scanf("%s",p->name);

 printf("/n请输入新学生年级/n/n");
 scanf("%d",&p->grade);

 printf("/n请输入新学生班级/n/n");
 scanf("%d",&p->cla);

 

if(shead==NULL)shead=si=p;
else { si->next=p;si=p;  }

printf("/n新学生创建成功,请创建档案!/n/n");
}

 

 


void newm()
{
printf("/n/n/n/n█创建档案█/n/n");

    m *p;
 p=(m *)malloc(sizeof(m));
 p->next=NULL;


loop:
 printf("/n请输入学生学号/n/n");
 scanf("%s",p->num);

//检验
s* pj=shead;
int y=1;
while(pj)
{
 if(strcmp(pj->num,p->num)==0){y=0;break;}
 pj=pj->next;
}//检验


if(y){
 
printf("/n/n错误,该学号不存在!");

char c;
printf("/n/n您想---重新输入(A)--退出输入(E)/n");
c=getch();

if(c=='A'||c=='a')goto loop;else  return;
}

 


if(pj->jy)
{printf("/n/n错误,该学生已经建档!");
char c;
printf("/n/n您想---重新输入(A)--退出输入(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;else  return;
}


 printf("/n请输入学生语文成绩/n/n");
 scanf("%d",&p->ch);

 printf("/n请输入数学成绩/n/n");
 scanf("%d",&p->ma);


 printf("/n请输入英语成绩/n/n");
 scanf("%d",&p->en);
 
if(mhead==NULL)mhead=mi=p;
else { mi->next=p;mi=p;  }
pj->jy=1;//建档
printf("/n学生档案创建成功/n/n");

}

 

 

 

void show()
{

s *p;
p=shead;

printf("/n/n/n                        █学生信息数据库█          ");
printf("/n|--------------------------------------------------------------------------|");
int i=0;

while(p)
{
 i++;
printf("/n|[%d]/t学号%s  /t姓名%s  /t年级%d  /t班级%d",i,p->num ,p->name ,p->grade ,p->cla);


if(p->jy){  m*p1=mhead;
            while(p1)
   {if(strcmp(p1->num,p->num)==0)printf("/n/t成绩:语 %d  /t数 %d  /t英 %d",p1->ch,p1->ma ,p1->en);  p1=p1->next;   }    

}
else printf("/t [无档案]");


printf("/n|--------------------------------------------------------------------------|");
p=p->next;
}

printf("/n█学生总数:   %d    ",i);
printf("/n|--------------------------------------------------------------------------|/n/n/n/n/n/n");

}


void saves()
{

FILE  *fp;
fp=fopen("student.txt","w");

s *p;
p=shead;

int i=0;

while(p)
{
i++;
fwrite(p,sizeof(s),1,fp);
p=p->next;
}

//printf("/n/n保存%d个学生成功!",i);
}

void savem()
{

FILE  *fp;
fp=fopen("mark.txt","w");

m *p;
p=mhead;

int i=0;

while(p)
{
i++;
fwrite(p,sizeof(m),1,fp);
p=p->next;
}

//printf("/n/n保存%d个档案成功!",i);
}

 

 


void  show_rank()
{

m  *p=mhead;
if(p==NULL){  printf("/n/n档案文件不存在!/n/n");    return;  }

int n=0;
while(p)
{n++;p=p->next;}

int i,j;
m * pp=(m*)calloc(n,sizeof(m));


//赋值
p=mhead;
for(i=0;i<n;i++)
{
pp[i]=*p;
p=p->next;
}
//赋值

 

//排序
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
{

 m  t;
 if((pp[j].ch+pp[j].ma+pp[j].en)<=(pp[j+1].ch+pp[j+1].ma+pp[j+1].en))
 {
 t=pp[j];  pp[j]=pp[j+1];   pp[j+1]=t;
 }

}

//排序


printf("/n/n/n                        █学生成绩排名█          ");
printf("/n|--------------------------------------------------------------------------|");


for(i=0;i<n;i++)
{
   printf("/n █第%d名 ",i+1);

   s * p=shead;
   while(p)
   {  if(strcmp(p->num,pp[i].num)==0)  printf("姓名%s   /t学号%s  /t年级%d  /t班级%d",p->name ,p->num ,p->grade ,p->cla);
   p=p->next;
   }
 

 printf("/n   总分%d   均分% .2f    成绩:语 %d  /t数 %d  /t英 %d",pp[i].ch+pp[i].ma+pp[i].en,float(pp[i].ch+pp[i].ma+pp[i].en)/3,pp[i].ch,pp[i].ma,pp[i].en);    

printf("/n|--------------------------------------------------------------------------|");
}

 


}

 

 


void dels()
{
printf("/n/n/n       █删除学生█          ");

loop:
printf("/n/n/n请输入要删除的学生学号:");
char n[20];
scanf("%s",n);

s *p=shead,*p1=shead;

int y=0;
int jy=1;
while(p)
{  //while 1
 y++;
   if(strcmp(n,p->num)==0)
   {  //if  1


   //删除档案
    m  *p2,*p3;
       p2=p3=mhead;  
    int y1=0;
    while(p2)
       {    y1++;       if(strcmp(p2->num,p->num)==0){   if(p2==mhead)mhead=mhead->next;   else  p3->next=p2->next;   }
                     p2=p2->next;
                     if(y1>1)p3=p3->next;
    }
      //删除档案

   
   
   
   
 if(p==shead)shead=shead->next;
 else  p1->next=p->next;
    jy=0;
  

   }//if 1
p=p->next;
if(y>1)p1=p1->next;
}//while 1

if(jy)printf("/n/n错误,要删除的学号不存在!/n/n");
else   printf("/n/n删除成功!/n/n");
char c;
printf("/n/n您想---继续删除(A)--退出删除(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;else  return;

}

 

 

 

 

 

void delm()
{
printf("/n/n/n       █删除档案█          ");

loop:
printf("/n/n/n请输入要删除档案的学号:");
char n[20];
scanf("%s",n);

m *p=mhead,*p1=mhead;

int y=0;
int jy=1;
while(p)

 y++;
   if(strcmp(n,p->num)==0)
   { 
     //*让jy为1
     s  *p2=shead;
  while(p2)
  {
   if(strcmp(p2->num,p->num)==0){  p2->jy=0;   printf("该学生的姓名为%s",p2->name);}
      p2=p2->next;
  }

    jy=0;
     if(p==mhead)mhead=mhead->next;   else  p1->next=p->next; 
   }
                     
   p=p->next;
if(y>1)p1=p1->next;

}
    

if(jy)printf("/n/n错误,要删除的不存在或者档案不存在!/n/n");
else   printf("/n/n删除成功!/n/n");
char c;
printf("/n/n您想---继续删除(A)--退出删除(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;else  return;

}

 

 

void modifym()
{
printf("/n/n/n       █修改档案█          ");

loop:
printf("/n/n/n请输入要修改档案的学号:");
char n[20];
scanf("%s",n);

m *p=mhead;

int y=1;
while(p)

   if(strcmp(n,p->num)==0)
   { 
    
        //-----------------------------------------------------------------------------
        s  *p1=shead;
     while(p1)
  {
   if(strcmp(p1->num,p->num)==0)   printf("该学生的姓名为%s",p1->name);
      p1=p1->next;
  }
        //---------------------------------------------------------------------------
     y=0;
     
    printf("/n请输入新语文成绩/n/n");
 scanf("%d",&p->ch);

 printf("/n请输入新数学成绩/n/n");
 scanf("%d",&p->ma);


 printf("/n请输入新英语成绩/n/n");
 scanf("%d",&p->en);

   }

p=p->next;

}


if(y)printf("/n/n错误,要修改的学号不存在或者档案不存在!/n/n");
else   printf("/n/n修改成功!/n/n");
char c;
printf("/n/n您想---继续修改(A)--退出修改(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;else  return;

}

 

 

 

void release()
{
shead=si=NULL;
mhead=mi=NULL;
printf("/n/n/n清空数据库成功!");
}

 

 

 

void show1()

 

printf("/n |----------------------------------------|");
printf("/n |       █ 主        菜       单█       |");             
printf("/n |----------------------------------------|");
printf("/n |          A  新   建   学   生          |"); 
printf("/n |----------------------------------------|");
printf("/n |          B  创   建   档   案          |"); 
printf("/n |----------------------------------------|");
printf("/n |          C  学   生   信   息          |");
printf("/n |----------------------------------------|");
printf("/n |          D  学   生   排   名          |");
printf("/n |----------------------------------------|");
printf("/n |          E  管   理   维   护          |");
printf("/n |----------------------------------------|");
printf("/n |          F  清   空   信   息          |");             
printf("/n |----------------------------------------|");
printf("/n |          G  退   出   程   序          |");             
printf("/n |----------------------------------------|");
printf("/n |             请您选择一个任务           |");
printf("/n |----------------------------------------|/n/n/n");
}


 
void show2()
{


printf("/n |-----------------------------|");
printf("/n |    █管  理  菜   单█      |");             
printf("/n |-----------------------------|");
printf("/n |  A   删  除  学  生         |"); 
printf("/n |-----------------------------|");
printf("/n |  B   删  除  档  案         |"); 
printf("/n |-----------------------------|");
printf("/n |  C   修  改  档  案         |"); 
printf("/n |-----------------------------|"); 
printf("/n |  D   退  出  程  序         |");
printf("/n |-----------------------------|");
printf("/n |     请您选择一个任务        |");
printf("/n |-----------------------------|/n/n/n");

}

 

void main()
{printf("/n   ★  欢迎使用学生档案管理系统 ★/n/n   ");
char ch1,ch2;
initialm();
initials(); 
do 
{

show1(); 
ch1=getch();
switch(ch1)
{

case 'A': 
case 'a':news();break;

case 'B': 
case 'b':newm(); break;

 

case 'C':
case 'c': show(); break;

 

case 'D':
case 'd':show_rank();break; 

 

 


case 'E': 

case 'e': 

 

     do{
     show2();
        ch2=getch();
      switch(ch2)
   {
case 'A': 
case 'a':dels();break;

case 'B':
case 'b': delm(); break;

 

case 'C': 
case 'c':modifym(); break;

 

case 'D':
case 'd':break; 

 

   }
 }while(ch2!='d'&&ch2!='D');  break;


case 'F':
case 'f':release();break;


case 'G':
case 'g':break;


}
 

 

 

}while(ch1!='G'&&ch1!='g');

saves();
savem();


printf("/n/n  ★ 谢谢您的使用!★");

 

 


}

原创粉丝点击