学生管理系统源代码

来源:互联网 发布:获取端口号 编辑:程序博客网 时间:2024/05/16 16:18
/*
 * xjgl.h
 *
 *  Created on: 2014-12-5
 *      Author: yao
 */
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
//#include"stu.c"
//#include"tea.c"
//学生结构体
typedef struct student
{
    int id;
    struct stuname
    {
    int passwd;
    char class[20];
    char name[20];
    char sex;
    int age;
    }stuna;
    float math;
    float c;
    float yuwen;
    float ave;
struct student *next;
}students;
typedef struct teacher{                        //教师结构体
    int tid;
    int tpasswd;
    char tsex;
    int tage;
    char tname[20];
    struct teacher *next;
}teachers;
students *listtofile_stu(students *phead);
students  *filetolist_stu();
teachers *listtofile_tea(teachers *phead);
teachers  *filetolist_tea();
 struct student *create();
 void serch_xh(students *phead);
void serch_xm(struct student *phead);
void chazhao_stu(struct student *phead);
struct student *add_stu(students *phead);
struct student *change_stu(students *phead);
void xianshi_stu(students *phead);
void del_stuxh(students *phead);
void del_stuxm(students *phead);
void del_stubj(students *phead);
void del_stu(students *phead);
void xs_stu_xh( students *phead );
void xs_stu_mc( students *phead );
void xs_stu_cj( students *phead );
struct teacher *tcreate();
struct teacher *add_tea(teachers *thead);
struct teacher *del_tea(teachers *thead);
void del_tea_gh(teachers *thead);
void del_teaxm(teachers *thead);
struct teacher *change_tea(teachers *thead);
void tprintall( teachers *head );
struct teacher *xianshi_tea(teachers *thead);
void xs_tea_gh( teachers *thead );
void manager(teachers *tphead,students *phead);
void caozuo_stu(students *phead);
void caozuo_tea(teachers *phead);
void print( students *head );
 void tprint( teachers *head );
void chazhao_tea(teachers *thead);
void serch_gh(teachers *thead);
void serch_txm( teachers *thead);
teachers *teacher(teachers *tphead,students *phead);
void tea_change(teachers *phead);
 void tea_change_tea(teachers *phead);
void tea_change_stu(students *phead);
 void tea_changestu(students *phead);
students *student(students *phead);
 void stu_change(students *phead);


========================================================
/*
 *
 *stu.c
 *  Created on: 2014-12-5
 *      Author: yaoshenjie
 */
#include"xjgl.h"
students *listtofile_stu(students *phead)
{

    FILE *fp;
    students *tmp;
     if((fp=fopen("student","wb"))==NULL)   /*打开文件*/
     {    printf("cannot open file\n");
        return 0;
     }
     for(tmp = phead;tmp != NULL;tmp = tmp->next)   /*遍历链表*/
     {
         fwrite(tmp,sizeof(students),1,fp); /*把数据写入文件*/
     }
     fclose(fp);
     return phead;
}
//从文件读入链表
students  *filetolist_stu(){
    FILE *fp=NULL;
    students *p,*p1;
    students *head;
     head = NULL;
    if((fp = fopen("student","rb"))==NULL)
     {
         printf("cannot open flie\n");
        return 0;
     }
    char c;
    c=fgetc(fp);
    if(c==EOF){return NULL;}
    else{rewind(fp);}
    p=malloc(sizeof(students));
    fread(p,sizeof(students),1,fp);
     while(!feof(fp))
     {
        // p = malloc(sizeof(students));
        // fread(p,sizeof(students),1,fp);
        if(head==NULL) {
            head=p;
            p->next=NULL;
         }
        else{
                    p1=head;
                    while(p1->next!=NULL){                    //求得尾指针p1
                                    p1=p1->next;
                                }

                    p1->next = p;
                    p->next = NULL;
                    p = malloc(sizeof(students));
                    fread(p,sizeof(students),1,fp);
                }
     }

    free(p);
    fclose(fp);
    return head;
}
//添加学生
struct student *add_stu(students *phead)
{
    FILE *fp=NULL;
    students *p;
    students *s,*r;
    p=phead;
    int nid,flag=0;
    int flag2=1;
    /*while(p->next!=NULL){            //求得尾指针
          p=p->next;
    }
    r=p;
    p=phead;*/
      fp=fopen("student","wb");
    while(flag==0)                             //控制是否继续添加
     {
        p=phead;
    printf("输入你要添加学生的学号\n");
      scanf("%d",&nid);
      while(p!=NULL){                      //是否存在重学号
           if(nid==p->id){
           printf("用户已存在,重新输入学号\n");flag2=0;
           break;
              }else{
              flag2=1;
              }
              p=p->next;
          }
            if(flag2==1){
                int nid,npasswd,nage;
                char nsex,nclass[20], nam[20];
                float ma,cyuy,yw;
                getchar();
                fflush(stdin);
                printf("请输入学生的学号,姓名,密码,性别,年龄,班级,"
                            "数学成绩,c语言成绩,语文成绩\n");
                scanf("%d",&nid);
                while(getchar()!='\n');
                gets(nam);
                scanf("%d",&npasswd);
                while(getchar()!='\n');
                nsex=getchar();
                scanf("%d",&nage);
                while(getchar()!='\n');
                gets(nclass);
                scanf("%f",&ma);
                scanf("%f",&cyuy);
                scanf("%f",&yw);
                s=malloc(sizeof(students));            //动态创建内存
                s->id=nid;
                s->stuna.passwd=npasswd;
                s->stuna.sex=nsex;
                s->stuna.age=nage;
                strcpy(s->stuna.class,nclass);
                strcpy(s->stuna.name,nam);
                s->math=ma;
                s->c=cyuy;s->yuwen=yw;
            //    fwrite(s,sizeof(students),1,fp);
            //    s=m;
                if(phead==NULL)
                {
                    phead=s;
                    phead->next=NULL;
                }
                else
                {
                    r=phead;
                    while(r->next!=NULL){            //求得尾指针
                              r=r->next;
                        }
                    r->next=s;
                    s->next=NULL;
                }
                //    printf("是否保存信息y/n\n");
                //    if(getchar()=='y'||getchar()=='Y'){listtofile_stu(r);}
                 }
               printf("是否继续插入学生信息y/n\n");
               while(getchar()!='\n');     //防止下面getchar取得\n
                    if((getchar()=='n')||(getchar()=='N')){
                        flag=1;break;
                        }
      }
                listtofile_stu(s);
                    fclose(fp);
                //    stu_listtofile(phead->next,"student");
                    return phead;
}
//修改学生信息
 students *change_stu(students *phead){
    students *p;
    students *r;
//    FILE *fp=NULL;
//    fp=fopen("student","wb");
    int nid;
    int flag=0;
    int flag2=0;
    while(flag==0){
    printf("输入要修改学生学号\n");
    scanf("%d",&nid);
    //while(getchar()!='\n');
    p = phead;
     while(p!=NULL){                                                    //是否存在此学生
        // fread(p,sizeof(students),1,fp);
               if(nid==p->id){
              flag2=0;
               break;
                  }else{
              flag2=1;                                        //不存在此学生
                  }
                  p=p->next;
              }r=p;    p=phead;
     if(flag2==1){
         printf("此学生不存在\n");
     }
     else{
                      int num;
                      int npasswd=0,nage=0;
                      char nsex,nclass[20],nam[20];
                        float ma=0,cyuy=0,yw=0;
                        printf("输入要修改学生的信息1.学号2.姓名,3.密码,4.性别,5.年龄,6.班级"
                                "7.数学成绩,8.c成绩,9.语文成绩\n");
                     scanf("%d",&num);
                     switch(num){
                     case 1:printf("输入新的学号\n");
                                scanf("%d",&nid);
                                 r->id=nid;//free(r);
                                break;
                     case 2:printf("输入新的姓名\n");
                                 scanf("%s",nam);
                                 strcpy(r->stuna.name,nam);
                                 break;
                     case 3:printf("输入新的密码\n");
                               scanf("%d",&npasswd);r->stuna.passwd=npasswd;
                               break;
                     case 4:printf("输入新的性别\n");
                                    while(getchar()!='\n');
                                   nsex=getchar();r->stuna.sex=nsex;
                                    break;
                     case 5:printf("输入新的年龄\n");
                                    scanf("%d",&nage);r->stuna.age=nage;
                                    break;
                     case 6:printf("输入新的班级名\n");
                                    scanf("%s",nclass);
                                    strcpy(r->stuna.class,nclass);//free(r);
                                    break;
                     case 7:printf("输入新的数学成绩\n");
                                scanf("%f",&ma);
                                r->math=ma;//free(r);
                                break;
                     case 8:printf("输入新的c语言成绩\n");
                                scanf("%f",&cyuy);
                                r->c=cyuy;//free(r);
                                break;
                     case 9:printf("输入新的语文成绩\n");
                                scanf("%f",&yw);
                                r->yuwen=yw;//free(r);
                                break;
                     default :printf("不做修改\n");break;
                     }

                //     fwrite(r,sizeof(students),1,fp);
                     //free(r);
                    // r=NULL;
          }            // getchar();
                     //   getchar();
                    //    fflush(stdin);
                         //     listtofile_stu(r);
                              printf("修改成功\n");
                       printf("是否继续修改学生信息y/n\n");
                       while(getchar()!='\n');     //防止下面getchar取得\n
                            if((getchar()=='n')||(getchar()=='N')){
                                break;
                    }else{
                        flag=0;
                    }
    }
    //fclose(fp);
    return phead;
}
 //删除学生
void del_stu(students *phead){
    students *p;
    //students *r=NULL;
    int num;
    p=phead;
    //FILE *fp=NULL;
    //fp=fopen("student","wb");
    //char nname[20],nclass[20];
    int flag=0;
while(flag==0){
    p=phead;
    printf("输入要删除学生学号或姓名或班级名\n1.按学号删除\t2.按姓名删除\t3.按班级删除\n");
    scanf("%d",&num);
    switch(num){
    case 1:
        del_stuxh(p);break;
    case 2:
        del_stuxm(p);break;
    case 3:
        del_stubj(p);break;
    default :
        printf("不删除学生\n");break;
            }
         printf("是否继续删除学生y/n\n");
                              while(getchar()!='\n');     //防止下面getchar取得\n
                                    if((getchar()=='n')||(getchar()=='N')){
                                        flag=1;break;
                                    }else{flag=0;}
       }
         //    return phead;
    //        fclose(fp);
}
//按学号删除学生
void del_stuxh(students *phead){
    int flag2,nid;
    students *p;
    students *r;
    students *q;
    p=phead;
    q=phead;
    printf("输入你要删除学生的学号\n");
    scanf("%d",&nid);
     while(p!=NULL){                                      //是否存在此学生
                   if(nid==p->id){
                  flag2=0;
                 r=p;
              //    p=phead;
                   break;
                      }else{
                  flag2=1;
                      }
                   q=p;
                      p=p->next;
                  }
         if(flag2==1){
             printf("此学生不存在\n");
         }else{
             printf("确定删除此学生y/n\n");
             while(getchar()!='\n');
             if(getchar()=='y'||getchar()=='Y'){
                if(r==phead)
                {
                    phead=phead->next;
                }
                else
                {
                     r=r->next;
                     q->next=r;
                     free(r);
                }
              }else{
                 printf("不删除此学生\n");
                    }
         }
}
//按姓名删除学生
void del_stuxm(students *phead){
    int flag2;
    char nname[20];
    students *p;
    students *r;
    students *q;
    p=phead;
    q=phead;
    printf("输入你要删除学生的姓名\n");
    gets(nname);
     while(p!=NULL){                                      //是否存在此学生
              if(strcmp(p->stuna.name,nname)==0){
                  flag2=0;
                 r=p;
              //    p=phead;
                   break;
                      }else{
                  flag2=1;
                      }
                   q=p;
                      p=p->next;
                  }
         if(flag2==1){
             printf("此学生不存在\n");
         }else{
             printf("确定删除此学生y/n\n");
             while(getchar()!='\n');
             if(getchar()=='y'||getchar()=='Y'){
                if(r==phead)
                {
                    phead=phead->next;
                }
                else
                {
                     r=r->next;
                     q->next=r;
                     free(r);
                }
              }else{
                 printf("不删除此学生\n");
                    }
         }
}
//按班级删除学生
void del_stubj(students *phead){
    int flag2;
    char nclass[20];
    students *p;
    students *r;
    students *q;
    p=phead;
    q=phead;
    printf("输入你要删除学生的姓名\n");
    gets(nclass);
     while(p!=NULL){                                      //是否存在此学生
              if(strcmp(p->stuna.name,nclass)==0){
                  flag2=0;
                 r=p;
              //    p=phead;
                   break;
                      }else{
                  flag2=1;
                      }
                   q=p;
                      p=p->next;
                  }
         if(flag2==1){
             printf("此学生不存在\n");
         }else{
             printf("确定删除此学生y/n\n");
             while(getchar()!='\n');
             if(getchar()=='y'||getchar()=='Y'){
                if(r==phead)
                {
                    phead=phead->next;
                }
                else
                {
                     r=r->next;
                     q->next=r;
                     free(r);
                }
              }else{
                 printf("不删除此学生\n");
                    }
         }
}
//查询学生信息
//按学号查询
 void serch_xh(students *phead)
{
    int nid;
    int flag=1;
    students *p;
    p=phead;
    printf("输入你要查找学生的学号\n");
    scanf("%d",&nid);
    while(p!=NULL)
    {
        if(p->id!=nid){
        flag=0;
        }else{
            //fread(p,sizeof(students),1,fp);
            printf("\t学号\t姓名\t密码\t性别\t年龄\t班级\t数学成绩\tc语言成绩\t语文成绩\t\n");
                printf("\t%d\t\t%s\t\t%d\t\t%c\t\t%d\t\t%s\t%f\t%f\t%f\t\n",p->id,p->stuna.name,p->stuna.passwd,p->stuna.sex,
                        p->stuna.age,p->stuna.class,p->math,p->c,p->yuwen);
            flag=1;
        break;
        }
        p=p->next;
    }
    if(flag==0){
        printf("用户不存在\n");
       }
}
//按姓名查询
 void serch_xm( students *phead)
{
    char nname[20];
    int flag=1;
     students * p;
    p=phead;
    printf("输入你要查找学生的姓名\n");
    while(getchar()!='\n');
        gets(nname);
    while(p!=NULL)
    {
        if(strcmp(p->stuna.name,nname)!=0){
        flag=0;
         }else
        {
            // fread(p,sizeof(students),1,fp);
                printf("\t学号\t姓名\t密码\t性别\t年龄\t班级\t数学成绩\tc语言成绩\t语文成绩\t\n");
                printf("\t%d\t\t%s\t\t%d\t\t%c\t\t%d\t\t%s\t%f\t%f\t%f\t\n",p->id,p->stuna.name,p->stuna.passwd,p->stuna.sex,
                                    p->stuna.age,p->stuna.class,p->math,p->c,p->yuwen);
        flag=1;
        break;
        }
        p=p->next;
    }
    if(flag==0){
        printf("用户不存在\n");
        }
}

//查询学生
void chazhao_stu( students *phead)
{
    //int flag=1;
    int num;
    while(1)
    {
    printf("查询学生\n1.按学号\t2.按姓名\n");
    scanf("%d",&num);
    switch(num){
    case 1:serch_xh(phead);break;
    case 2:serch_xm(phead);break;
    //case 3:serch_cj(phead);break;
    default:printf("输入错误\n");break;
         }
    //getchar();
    printf("是否继续查询y/n\n");
    while(getchar()!='\n');
    if((getchar()=='n')||(getchar()=='N')){
        break;
       }
    //else{flag=1;}
    }
}
//显示全部学生
void xianshi_stu(students *phead)
{
    students *p;
    p=phead;
    int num;

    while(1){
    printf("显示学生信息\n1.按学号排序\t\n2.按名次排序\t\n3.按成绩排序\t\n");
    scanf("%d",&num);
    switch(num){
        case 1:xs_stu_xh(p);//printall(phead);
        break;
        case 2:xs_stu_mc(p);//printall(phead);
        break;
        case 3:xs_stu_cj(p);//printall(phead);
        break;
        default :printf("此次不显示了\n");break;
        }
    printf("是否继续显示学生信息y/n\n");
             while(getchar()!='\n');     //防止下面getchar取得\n
                    if((getchar()=='n')||(getchar()=='N')){
                        break;
                        }
    }
}
// 按学号排序
void xs_stu_xh( students *phead )
{
        students *p,*q, *p_min, *tail,*first,*min;
        first=p=NULL;
    //    fread(phead,sizeof(students),1,fp);
// 选择排序
        q=phead;
                while(q!=NULL){
                    for(p=q,min=q;p->next!=NULL;p=p->next){
                        if(p->next->id<min->id){
                            p_min=p;
                            min=p->next;
                        }
                    }//结束for循环
                    if(first==NULL){
                        first=min;
                        tail=min;
                    }
                    else{
                        tail->next=min;
                        tail=min;
                    }
                    if(min==q){
                        q=q->next;
                    }
                    else{
                        p_min->next=min->next;
                    }
                }//结束while循环
                if(first!=NULL){
                    tail->next=NULL;
                }
    printf("\t学号\t姓名\t密码\t性别\t年龄\t班级\t数学成绩\tc语言成绩\t语文成绩\t\n");
    for(p=first;p!=NULL;p=p->next)
    {
        printf("\t%d\t\t%s\t\t%d\t\t%c\t\t%d\t\t%s\t%f\t%f\t%f\t\n",p->id,p->stuna.name,p->stuna.passwd,p->stuna.sex,
                            p->stuna.age,p->stuna.class,p->math,p->c,p->yuwen);
               //p = head->next;
    }
}
//按名次排序
void xs_stu_mc( students *phead )
{
    students *p,*q, *p_max, *tail,*first,*max;
        //tail = NULL;
        first=p=NULL;
    //    fread(phead,sizeof(students),1,fp);
// 选择排序
        q=phead;
                while(q!=NULL){
                    for(p=q,max=q;p->next!=NULL;p=p->next){
                         if( p-> ave> p->next->ave ){
                            p_max=p;
                            max=p->next;
                        }
                    }//结束for循环
                    if(first==NULL){
                        first=max;
                        tail=max;
                    }
                    else{
                        tail->next=max;
                        tail=max;
                    }
                    if(max==q){
                        q=q->next;
                    }
                    else{
                        p_max->next=max->next;
                    }
                }//结束while循环
                if(first!=NULL){
                    tail->next=NULL;
                }
    printf("\t学号\t姓名\t密码\t性别\t年龄\t班级\t数学成绩\tc语言成绩\t语文成绩\t\n");
    for(p=first;p!=NULL;p=p->next)
    {
        printf("\t%d\t\t%s\t\t%d\t\t%c\t\t%d\t\t%s\t%f\t%f\t%f\t\n",p->id,p->stuna.name,p->stuna.passwd,p->stuna.sex,
                            p->stuna.age,p->stuna.class,p->math,p->c,p->yuwen);
               //p = head->next;
    }
}
//按成绩排序
void xs_stu_cj( students *phead )
{
    students *p,*q, *p_max, *tail,*first,*max;
                //tail = NULL;
                first=p=NULL;
    int num;
    printf("输入按成绩排序1.c语言成绩\t\n2.数学成绩\t\n3.语文成绩\n");
    scanf("%d",&num);
    switch(num)
  {
    case 1:                            //c成绩排序
        q=phead;
                while(q!=NULL){
                    for(p=q,max=q;p->next!=NULL;p=p->next){
                        if(p->next->c>max->c){
                            p_max=p;
                            max=p->next;
                        }
                    }//结束for循环
                    if(first==NULL){
                        first=max;
                        tail=max;
                    }
                    else{
                        tail->next=max;
                        tail=max;
                    }
                    if(max==q){
                        q=q->next;
                    }
                    else{
                        p_max->next=max->next;
                    }
                }//结束while循环
                if(first!=NULL){
                    tail->next=NULL;
                }
            printf("\t学号\t姓名\t密码\t性别\t年龄\t班级\t数学成绩\tc语言成绩\t语文成绩\t\n");
            for(p=first;p!=NULL;p=p->next)
            {
                printf("\t%d\t\t%s\t\t%d\t\t%c\t\t%d\t\t%s\t%f\t%f\t%f\t\n",p->id,p->stuna.name,p->stuna.passwd,p->stuna.sex,
                                    p->stuna.age,p->stuna.class,p->math,p->c,p->yuwen);
                       //p = head->next;
        }break;
    case 2:                                    //数学成绩排序
        q=phead;
                while(q!=NULL){
                    for(p=q,max=q;p->next!=NULL;p=p->next){
                        if(p->next->math>max->math){
                            p_max=p;
                            max=p->next;
                        }
                    }//结束for循环
                    if(first==NULL){
                        first=max;
                        tail=max;
                    }
                    else{
                        tail->next=max;
                        tail=max;
                    }
                    if(max==q){
                        q=q->next;
                    }
                    else{
                        p_max->next=max->next;
                    }
                }//结束while循环
                if(first!=NULL){
                    tail->next=NULL;
                }
                    printf("\t学号\t姓名\t密码\t性别\t年龄\t班级\t数学成绩\tc语言成绩\t语文成绩\t\n");
                    for(p=first;p!=NULL;p=p->next)
                    {
                        printf("\t%d\t\t%s\t\t%d\t\t%c\t\t%d\t\t%s\t%f\t%f\t%f\t\n",p->id,p->stuna.name,p->stuna.passwd,p->stuna.sex,
                                            p->stuna.age,p->stuna.class,p->math,p->c,p->yuwen);
        }break;
    case 3:
        q=phead;
                while(q!=NULL){
                    for(p=q,max=q;p->next!=NULL;p=p->next){
                        if(p->next->yuwen>max->yuwen){
                            p_max=p;
                            max=p->next;
                        }
                    }//结束for循环
                    if(first==NULL){
                        first=max;
                        tail=max;
                    }
                    else{
                        tail->next=max;
                        tail=max;
                    }
                    if(max==q){
                        q=q->next;
                    }
                    else{
                        p_max->next=max->next;
                    }
                }//结束while循环
                if(first!=NULL){
                    tail->next=NULL;
                }
                    printf("\t学号\t姓名\t密码\t性别\t年龄\t班级\t数学成绩\tc语言成绩\t语文成绩\t\n");
                    for(p=first;p!=NULL;p=p->next)
                    {
                        printf("\t%d\t\t%s\t\t%d\t\t%c\t\t%d\t\t%s\t%f\t%f\t%f\t\n",p->id,p->stuna.name,p->stuna.passwd,p->stuna.sex,
                                            p->stuna.age,p->stuna.class,p->math,p->c,p->yuwen);
        }break;
    default :printf("不查询了\n");break;
  }
}
//输出学生信息显示函数
void print( students *head )
{
//    fread(head,sizeof(students),1,fp);
        printf("\t学号\t姓名\t密码\t性别\t年龄\t班级\t数学成绩\tc语言成绩\t语文成绩\t\n");
        printf("\t%d\t\t%s\t\t%d\t\t%c\t\t%d\t\t%s\t%f\t%f\t%f\t\n",head->id,head->stuna.name,head->stuna.passwd,head->stuna.sex,
                    head->stuna.age,head->stuna.class,head->math,head->c,head->yuwen);
       // head = head->next;
}


===============================================================================
/*
 * tea.c
 *
 *  Created on: 2014-12-5
 *      Author: yao
 */
#include"xjgl.h"
#include<stdio.h>
//教师链表保存到文件
teachers *listtofile_tea(teachers *phead)
{
    FILE *fp;
    teachers *tmp;
     if((fp=fopen("teacher","wb"))==NULL)   /*打开文件*/
     {    printf("cannot open file\n");
        return 0;
     }
     for(tmp = phead;tmp != NULL;tmp = tmp->next)   /*遍历链表*/
     {
         fwrite(tmp,sizeof(teachers),1,fp); /*把数据写入文件*/
     }
     fclose(fp);
     return phead;
}
//从文件读入链表
teachers  *filetolist_tea(){
    FILE *fp=NULL;
    teachers *p,*p1;
    teachers *head=NULL;
    // head = (teachers *)malloc(sizeof(teachers));
    if((fp = fopen("teacher","rb"))==NULL)
     {
         printf("cannot open flie\n");
        return 0;
     }
    char c;
        c=fgetc(fp);
        if(c==EOF){return NULL;}
        else{rewind(fp);}
        p=malloc(sizeof(teachers));
        fread(p,sizeof(teachers),1,fp);
         while(!feof(fp))
         {
            if(head==NULL) {
                head=p;
                p->next=NULL;
             }
            else{
                        p1=head;
                        while(p1->next!=NULL){                    //求得尾指针p1
                                        p1=p1->next;
                                    }
                            p1->next = p;
                            p->next = NULL;
                            p = malloc(sizeof(teachers));
                            fread(p,sizeof(teachers),1,fp);
                    }
         }
        free(p);
        fclose(fp);
    return head;
}
//添加老师
 teachers *add_tea(teachers *thead)
{
    teachers *p;
    teachers *s,*r;
    p=thead;
    int ntid,flag=0;
    int flag2=1;
    FILE *fp=NULL;
    fp=fopen("teacher","wb");
/*    while(p->next!=NULL){            //求得尾指针
          p=p->next;
    }
    r=p;
    p=thead;*/
    while(flag==0)
     {             //控制是否继续添加
    printf("输入你要添加老师的工号\n");
      scanf("%d",&ntid);
      while(p!=NULL){                                      //是否存在重工号
           if(ntid==p->tid){
           printf("用户已存在,重新输入工号\n");flag2=0;
           break;
              }else{
              flag2=1;
              }
              p=p->next;
          }
            if(flag2==1){
                char ntnam[20];
                int ntpasswd,ntage;
                char ntsex;
            //    getchar();
            //    fflush(stdin);
                    printf("请插入老师的工号,姓名,密码,性别,年龄\n");
                    scanf("%d",&ntid);
                    while(getchar()!='\n');
                    gets(ntnam);
                    scanf("%d",&ntpasswd);
                    while(getchar()!='\n');
                    ntsex=getchar();
                    scanf("%d",&ntage);
                    //scanf("%d%s%d%c%d",&ntid,ntnam,&ntpasswd,&ntsex,&ntage);
                    s=malloc(sizeof(teachers));
                    s->tid=ntid;
                    strcpy(s->tname,ntnam);
                    s->tpasswd=ntpasswd;
                    s->tage=ntage;
                    s->tsex=ntsex;
                    //fp=fopen("teacher","wb");
                //    fwrite(s,sizeof(teachers),1,fp);
                    if(thead==NULL)
                                    {
                                        thead=s;
                                        thead->next=NULL;
                                    }
                                    else
                                    {
                                        r=thead;
                                        while(r->next!=NULL){            //求得尾指针
                                                  r=r->next;
                                            }
                                        r->next=s;
                                        s->next=NULL;
                                    }
                 }
                    printf("是否继续添加老师信息y/n\n");
                    while(getchar()!='\n');     //防止下面getchar取得\n
                    if((getchar()=='n')||(getchar()=='N')){
                        flag=1;break;
                        }
      }
                    listtofile_tea(s);
                    fclose(fp);
                    return thead;
}
 //修改教师信息
  teachers *change_tea(teachers *thead){
     teachers *p;
     teachers *r;
     int ntid;
     //int flag=0;
     int flag2=0;
     while(1){
     printf("输入要修改教师工号\n");
     scanf("%d",&ntid);
     while(getchar()!='\n');
     p = thead;
      while(p!=NULL){                                      //是否存在此教师
                if(ntid==p->tid){
               flag2=0;
                break;
                   }else{
               flag2=1;
                   }
                   p=p->next;
               }r=p;    p=thead;
      if(flag2==1){
          printf("此教师不存在\n");
      }
      else{
                       int num;
                       int ntpasswd=0,ntage=0;
                       char ntsex,ntnam[20];
                             printf("输入要修改教师的信息1.工号\t2.姓名\t3.密码\t4.性别\t5.年龄\n");
                      scanf("%d",&num);
                      switch(num){
                      case 1:printf("输入新的工号\n");
                                 scanf("%d",&ntid);
                                  r->tid=ntid;//free(r);
                                 break;
                      case 2:printf("输入新的姓名\n");
                                  scanf("%s",ntnam);
                                  strcpy(r->tname,ntnam);//free(r);
                                  break;
                      case 3:printf("输入新的密码\n");
                                scanf("%d",&ntpasswd);r->tpasswd=ntpasswd;//free(r);
                                break;
                      case 4:printf("输入新的性别\n");
                                     scanf("%c",&ntsex);r->tsex=ntsex;//free(r);
                                     break;
                      case 5:printf("输入新的年龄\n");
                                     scanf("%d",&ntage);r->tage=ntage;//free(r);
                                     break;
                      default :printf("不做修改\n");break;
                      }
      }
                        printf("是否继续修改教师信息y/n\n");
                        while(getchar()!='\n');     //防止下面getchar取得\n
                             if((getchar()=='n')||(getchar()=='N')){
                                 break;
                             }
     }
     return thead;
 }
  //删除老师
 teachers *del_tea(teachers *thead){
    teachers *p;
    //students *r=NULL;
      int num;
    p=thead;
    //char nname[20],nclass[20];
    int flag=0;
while(flag==0){
    printf("输入要删除老师的工号或姓名\n1.按工号删除\t2.按姓名删除\t\n");
    scanf("%d",&num);
    switch(num){
    case 1:
        del_tea_gh(p);break;                                //按工号删除
    case 2:
        del_teaxm(p);break;                                //按姓名删除
    default :
        printf("不删除老师\n");break;
            }
         printf("是否继续删除教师y/n\n");
                              while(getchar()!='\n');     //防止下面getchar取得\n
                                    if((getchar()=='n')||(getchar()=='N')){
                                        break;
                            }
       }
             return thead;
}
//按工号删除教师
void del_tea_gh(teachers *thead){
    int flag2,ntid;
        teachers *p;
        teachers *r;
        teachers *q;
        p=thead;
        q=thead;
        printf("输入你要删除教师的工号\n");
        scanf("%d",&ntid);
         while(p!=NULL){                                      //是否存在此教师
                       if(ntid==p->tid){
                      flag2=0;
                     r=p;
                  //    p=phead;
                       break;
                          }else{
                      flag2=1;
                          }
                       q=p;
                          p=p->next;
                      }
             if(flag2==1){
                 printf("此教师不存在\n");
             }else{
                 printf("确定删除此教师y/n\n");
                 while(getchar()!='\n');
                 if(getchar()=='y'||getchar()=='Y'){
                    if(r==thead)
                    {
                        thead=thead->next;
                    }
                    else
                    {
                         r=r->next;
                         q->next=r;
                         free(r);
                    }
                  }else{
                     printf("不删除此教师\n");
                        }
             }
}
//按姓名删除教师
void del_teaxm(teachers *thead)
{
        int flag2;
        char ntname[20];
            teachers *p;
            teachers *r;
            teachers *q;
            p=thead;
            q=thead;
            printf("输入你要删除教师的姓名\n");
            scanf("%s",ntname);
             while(p!=NULL)
             {                                      //是否存在此教师
                    if(strcmp(p->tname,ntname)==0)
                    {
                          flag2=0;
                         r=p;
                      //    p=phead;
                           break;
                      }
                    else
                    {
                          flag2=1;
                     }
                           q=p;
                          p=p->next;
            }
                 if(flag2==1)
                 {
                     printf("此教师不存在\n");
                 }
                 else
                 {
                     printf("确定删除此教师y/n\n");
                     while(getchar()!='\n');
                     if(getchar()=='y'||getchar()=='Y')
                     {
                        if(r==thead)
                        {
                            thead=thead->next;
                        }
                        else
                        {
                             r=r->next;
                             q->next=r;
                             free(r);
                        }
                      }
                     else{
                         printf("不删除此教师\n");
                            }
                 }
}
//按工号查询
 void serch_gh(teachers *thead)
{
    int ntid;
    int flag=1;
    teachers *p;
    p=thead;
    printf("输入你要查找教师的工号\n");
    scanf("%d",&ntid);
    while(p!=NULL)
    {
        if(p->tid!=ntid){
        flag=0;
        }else{
            //fread(p,sizeof(students),1,fp);
            printf("工号\t姓名\t密码\t性别\t年龄\n");
            printf("%d\t\t%s\t\t%d\t\t%c\t\t%d\t\n",p->tid,p->tname,p->tpasswd,p->tsex,    p->tage);
            flag=1;
        break;
        }
        p=p->next;
    }
    if(flag==0){
        printf("用户不存在\n");
       }
}
//按姓名查询
 void serch_txm( teachers *thead)
{
    char ntname[20];
    int flag=1;
     teachers * p;
    p=thead;
    printf("输入你要查找教师的姓名\n");
    while(getchar()!='\n');
        gets(ntname);
    while(p!=NULL)
    {
        if(strcmp(p->tname,ntname)!=0){
        flag=0;
         }else
        {
            // fread(p,sizeof(students),1,fp);
             printf("工号\t姓名\t密码\t性别\t年龄\n");
             printf("%d\t\t%s\t\t%d\t\t%c\t\t%d\t\n",p->tid,p->tname,p->tpasswd,p->tsex,p->tage);
        flag=1;
        break;
        }
        p=p->next;
    }
    if(flag==0){
        printf("用户不存在\n");
        }
}

//查询教师
void chazhao_tea(teachers *thead)
{
    //int flag=1;
    int num;
    while(1)
    {
    printf("查询教师\n1.按工号\t2.按姓名\n");
    scanf("%d",&num);
    switch(num){
    case 1:serch_gh(thead);break;
    case 2:serch_txm(thead);break;
    //case 3:serch_cj(phead);break;
    default:printf("输入错误\n");break;
         }
    //getchar();
    printf("是否继续查询y/n\n");
    while(getchar()!='\n');
    if((getchar()=='n')||(getchar()=='N')){
        break;
       }
    //else{flag=1;}
    }
}
//显示全部教师信息
 teachers *xianshi_tea(teachers *thead)
{
    int flag=0;
    while(flag==0){
    printf("显示教师信息\n");
        xs_tea_gh(thead);
        //tprintall(thead);
    printf("是否继续显示教师信息y/n\n");
             while(getchar()!='\n');     //防止下面getchar取得\n
                    if((getchar()=='n')||(getchar()=='N')){
                        flag=1;break;
                        }
    }
        return thead;
}
// 按工号排序
void xs_tea_gh( teachers *thead )
{
    teachers *p,*q, *p_min, *tail,*first,*min;
            //tail = NULL;
            first=p=NULL;
        //    fread(phead,sizeof(students),1,fp);
    // 选择排序
            q=thead;
                            while(q!=NULL){
                                for(p=q,min=q;p->next!=NULL;p=p->next){
                                    if(p->next->tid<min->tid){
                                        p_min=p;
                                        min=p->next;
                                    }
                                }//结束for循环
                                if(first==NULL){
                                    first=min;
                                    tail=min;
                                }
                                else{
                                    tail->next=min;
                                    tail=min;
                                }
                                if(min==q){
                                    q=q->next;
                                }
                                else{
                                    p_min->next=min->next;
                                }
                            }//结束while循环
                            if(first!=NULL){
                                tail->next=NULL;
                            }
                 printf("工号\t姓名\t密码\t性别\t年龄\n");
        for(p=first;p!=NULL;p=p->next)
        {
             printf("%d\t\t%s\t\t%d\t\t%c\t\t%d\t\n",p->tid,p->tname,p->tpasswd,p->tsex,p->tage);
        }
}
//显示教师信息
void tprint( teachers *head )
{
     printf("工号\t姓名\t密码\t性别\t年龄\n");
    printf("%d\t\t%s\t\t%d\t\t%c\t\t%d\t\n",head->tid,head->tname,head->tpasswd,head->tsex,
                    head->tage);

}


===================================================================================

/*
 * main.c
 *
 *  Created on: 2014-12-5
 *      Author: yao
 */
#include"xjgl.h"
//#include"tea.c"
//#include"stu.c"
//管理员操作

//void caozuo_stu(students *);
//void caozuo_tea(teachers *);
void manager(teachers *tphead,students *phead)
{
         int ntid,ntpasswd;
         int num;
         int flag=0,flag2=0,flag3=0;
         students *ps=NULL;
         teachers *pt=NULL;
     //    ps=stu_filetolist("student");
     //    pt=tea_filetolist("teacher");
         ps=phead;
         pt=tphead;

         printf("欢迎管理员\n");
         while(flag==0)
         {
             printf("输入你的帐号和密码\n");
                 scanf("%d%d",&ntid,&ntpasswd);
             //printf("输入你的帐号和密码\n");
             //scanf("%d%d",&ntid,&ntpasswd);
                 if((123!=ntid)||(123!=ntpasswd))
                 {
                     flag=1;
                 }
                 else{
                     while(flag2==0)
                         {
                             ps=phead;
                              pt=tphead;
                              printf("1.操作学生信息\n2.操作教师信息\n0.返回\n");
                              scanf("%d",&num);
                              switch(num)
                                  {
                                      case 0:flag3=1;break;
                                      case 1:caozuo_stu(ps);break;                        //操作学生信息
                                      case 2:caozuo_tea(pt);break;                    //操作教师信息
                                      default :printf("不做任何行为\n");break;
                                  }
                              if(flag3==1){break;}
                              printf("是否继续操作y/n\n");
                              while(getchar()!='\n');
                              if(getchar()=='n'||getchar()=='N'){flag2=1;break;}
                              else{flag2=0;}
                          }
                     }
                     if(flag==1)
                         {
                             printf("密码错误,是否重新输入y/n\n");
                             if(getchar()=='n'||getchar()=='N'){break;}
                             else{flag=0;}
                         }
                     if(flag2==1)break;
                     if(flag3==1){break;}
             }
}
//操作学生
void caozuo_stu(students *phead)
{
    students *p=NULL;
    //p=phead;
        int num,flag=0,flag2=0;
        while(flag==0){
            p=phead;
            printf("*************************\n");
        printf("1.添加学生        \t2.删除学生\n3.修改学生信息\t4.查找学生\n5.显示全部学生\t0.返回\n");
            printf("*************************\n");
        scanf("%d",&num);
        switch(num)
            {
            case 0:flag2=1;break;
            case 1:add_stu(p);break;
            case 2:del_stu(p);break;
            case 3:change_stu(p);break;
            case 4:chazhao_stu(p);break;
            case 5:xianshi_stu(p);break;
            default :printf("不操作学生信息\n");break;
            }
                if(flag2==1){break;}
            printf("是否继续操作学生y/n\n");
                while(getchar()!='\n');
                if(getchar()=='n'||getchar()=='N'){flag=1;break;}
        }
}
//操作教师
void caozuo_tea(teachers *phead)
{
    teachers *p=NULL;
    //p=phead;
    int num,flag=1,flag2=0;
    while(flag){
        p=phead;
        printf("***************\n");
        printf("1.添加教师\n2.删除教师\n3.修改教师信息\n4.显示教师\n5.查找教师\n0.返回\n");
        printf("***************\n");
        scanf("%d",&num);
        switch(num)
        {
        case 0:flag2=1;break;
        case 1:add_tea(p);break;
        case 2:del_tea(p);break;
        case 3:change_tea(p);break;
        case 4:xianshi_tea(p);break;
        case 5:chazhao_tea(p);break;
        default :printf("不操作教师\n");break;
        }
        if(flag2==1){break;}
        printf("是否继续操作教师y/n\n");
        while(getchar()!='\n');
        if(getchar()=='n'||getchar()=='N'){flag=0;break;}
    }
}
//教师登录操作
//显示教师信息
teachers *teacher(teachers *tphead,students *phead){
     int ntid,ntpasswd;
     int num;
     int flag=0,flag2=1;
     teachers *pt;
     students *ps;
     pt=tphead;
     ps=phead;
     while(1)
     {    pt=tphead;
         printf("输入你的工号和密码\n");
         scanf("%d%d",&ntid,&ntpasswd);
         while(pt!=NULL)                    //检测密码是否正确
         {
             //fread(pt,sizeof(teachers),1,fp);
             if((pt->tid!=ntid)||(pt->tpasswd!=ntpasswd))
             {
                 flag=1;                                //密码不正确
             }
             else{
                         flag=0;break;                            //密码正确
                     }
                 pt=pt->next;
         }

         if(flag==1)
              {
                  printf("你输入的工号或密码有误,是否重新输入y/n\n");
                  if(getchar()=='n'||getchar()=='N'){break;}
                  //else{flag2=0;}
              }
         if(flag==0)
                               {
                                       printf("欢迎%s老师\n",pt->tname);
                                       while(1)
                                       {
                                           printf("1.查看或修改自己信息\t\n2.查看或修改学生信息\n0.返回主菜单\n");
                                           scanf("%d",&num);
                                           switch(num)
                                               {
                                               case 0:flag2=0;break;
                                               case 1:tea_change(pt);break;                        //修改或查看自己信息
                                               case 2:tea_change_stu(ps);break;                    //查看或修改学生信息
                                               default :printf("不做任何行为\n");break;
                                               }
                                         if(flag2==0){break;}
                                         printf("是否继续操作y/n\n");
                                         while(getchar()!='\n');
                                         if(getchar()=='n'||getchar()=='N'){break;}
                                       }
                                     if(flag2==0){break;}
                                       //else{flag=0;}
                               }
     }
     return tphead;
 }
 //查看或修改自己信息
 void tea_change(teachers *phead)
 {
     teachers *p=NULL;
     p=phead;
     int num;
     printf("1.查看自己信息\t\n2.修改自己信息\n");
     scanf("%d",&num);
     switch(num)
     {
     case 1:tprint(p);break;                                                    //显示自己信息
     case 2:tea_change_tea(p);tprint(p);break;                        //老师自己修改自己信息
     default :printf("不做任何操作\n");break;
     }
 }
 //老师修改自己信息
 void tea_change_tea(teachers *phead)
 {
         int num;
        int ntpasswd=0;
        char tnam[20];
            printf("输入要修改的信息1.姓名\t2.密码,0.返回\n");
         scanf("%d",&num);
         switch(num){
         case 0:break;
         case 1:printf("输入新的姓名\n");
                     scanf("%s",tnam);
                     strcpy(phead->tname,tnam);//free(r);
                     break;
         case 2:printf("输入新的密码\n");
                   scanf("%d",&ntpasswd);phead->tpasswd=ntpasswd;//free(r);
                   break;
         default :printf("不做修改\n");break;
         }
 }
 //教师查看或修改学生信息
 void tea_change_stu(students *phead)
 {
     students *p=NULL;
     p=phead;
     int num;
     printf("\n1.查看所有学生信息\t\n2.修改学生成绩\t\n3.查找学生\t\n");
     scanf("%d",&num);
     switch(num)
     {
     case 1:xianshi_stu(p);break;
     case 2:tea_changestu(p);print(p);break;
     case 3:chazhao_stu(p);break;
     default :printf("不做任何操作\n");break;
     }
 }
 ///老师修改学生成绩
 void tea_changestu(students *phead)
 {
        students *p=NULL;
        students *r=NULL;
        int nid;
        int flag=0;
        int flag2=0;
        while(flag==0){
        printf("输入要修改学生学号\n");
        scanf("%d",&nid);
        while(getchar()!='\n');
        p = phead;
         while(p!=NULL){                                      //是否存在此学生
                   if(nid==p->id){
                  flag2=0;
                   break;
                      }else{
                  flag2=1;
                      }
                      p=p->next;
                  }r=p;    p=phead;
         if(flag2==1){
             printf("此学生不存在\n");
         }
         else{
                          int num;
                            float ma=0,cyuy=0,yw=0;
                            printf("输入要修改学生的成绩1.数学成绩\t2..c成绩\t3.语文成绩\n");
                         scanf("%d",&num);
                         switch(num){
                         case 1:printf("输入新的数学成绩\n");
                                    scanf("%f",&ma);
                                    r->math=ma;//free(r);
                                    break;
                         case 2:printf("输入新的c语言成绩\n");
                                    scanf("%f",&cyuy);
                                    r->c=cyuy;//free(r);
                                    break;
                         case 3:printf("输入新的语文成绩\n");
                                    scanf("%f",&yw);
                                    r->yuwen=yw;//free(r);
                                    break;
                         default :printf("不做修改\n");break;
                         }
              }
                           printf("是否继续修改学生信息y/n\n");
                           while(getchar()!='\n');     //防止下面getchar取得\n
                                if((getchar()=='n')||(getchar()=='N')){
                                    break;
                        }else{
                            flag=0;
                        }
        }
    }
 //学生登录操作
 students *student(students *phead){
     int nid,npasswd;
     int num;
     students *p=NULL;
     p=phead;
     while(1)
     {
         p=phead;
         int flag=1,flag2=1;;
         printf("输入你的学号和密码\n");
         scanf("%d%d",&nid,&npasswd);
         while(p!=NULL)
         {

             if((p->id!=nid)||(p->stuna.passwd!=npasswd))
             {
                 flag=0;
             }
             else{
                         flag=1;break;
                     }
                 p=p->next;
         }
         if(flag==0)
         {
             printf("你输入的学号或密码有误,是否重新输入y/n\n");
             if(getchar()=='n'||getchar()=='N'){break;}
         }
         if(flag==1)
                 {
                         printf("欢迎%s同学\n\n",p->stuna.name);
             while(1){
                              printf("1.查看自己信息\t\n2.修改自己部分信息\n0.返回登录\n");
                              scanf("%d",&num);
                              switch(num)
                                  {
                                      case 0:flag2=0;break;
                                      case 1:print(p);break;
                                      case 2:stu_change(p);print(p);break;
                                      default :printf("不做任何行为\n");break;
                                  }
                              if(flag2==0){break;}
                              printf("是否继续操作y/n\n");
                              while(getchar()!='\n');
                              if(getchar()=='n'||getchar()=='N'){flag2=0;break;}
                          //    else{flag=0;}
                             }
                  }
                             if(flag2==0){break;}

     }
     return phead;
 }
 void stu_change(students *phead)
 {
     int num;
     int npasswd=0;
     char nclass[20],nam[20];
         printf("输入要修改的信息1.姓名\t2.密码\t3.班级\n");
      scanf("%d",&num);
      switch(num){
      case 1:printf("输入新的姓名\n");
                  scanf("%s",nam);
                  strcpy(phead->stuna.name,nam);//free(r);
                  break;
      case 2:printf("输入新的密码\n");
                scanf("%d",&npasswd);phead->stuna.passwd=npasswd;//free(r);
                break;
      case 3:printf("输入新的班级名\n");
                     scanf("%s",nclass);
                     strcpy(phead->stuna.class,nclass);//free(r);
                     break;
      default :printf("不做修改\n");break;
      }
 }
 void menu(){
                    printf("\n\n******** 学籍管理系统***********\t\n");
                  printf("\n1.管理员登录\t2.教师登录\t\n");
                  printf("\n3.学生登录\t0.保存退出\t\n");
                  printf("*********************************\n");
 }
 int main()
      {
           int sel,flag=0;
           students *ls=NULL;
           teachers *lt=NULL;
           ls=filetolist_stu();
           lt=filetolist_tea();

          while(1)
          {
              menu();
              printf("请你选择操作:");
              scanf("%d",&sel);
              switch(sel)
              {
              case 0:flag=1;break;
              case 1:manager(lt,ls);break;
              case 2:lt=teacher(lt,ls);break;
              case 3:ls=student(ls);break;
              default: printf("........\n");break;
              }
                  if(flag==1){break;}
          }
                      listtofile_stu(ls);
                      listtofile_tea(lt);
          return 0;
  }


0 0
原创粉丝点击