weixin_38699017
weixin_38699017
2017-06-04 12:22
采纳率: 100%
浏览 978
已采纳

教务信息管理系统,一旦录入选课内容并退出系统再次运行就会出错,求大神帮忙debug,急!

教务信息管理系统,一旦录入选课内容并退出系统再次运行就会出错,求大神帮忙debug,急!

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "ctype.h"

struct stu
{
int id;//账号
char name[100];//姓名
int clas;//班级
char sex[6];//性别
int age;//年龄
int dor;//宿舍号码
char key[12];//密码
char phone[12];//电话号码
int score;
struct stu * next;
struct cla * cla;
}*p1,stu1;

struct tec //教师结构体
{
int id;
char name[100];
char sex[6];
char cla_name[100];
int cla_id;//课程编号
char phone[12];
char key[12];
int score;
char email[30];
struct cla * cla;
struct tec * next;
}tec1;

struct cla //学生课程结构体 课程编号、课程名称、考试成绩、平时成绩、综合成绩、学分、重修否
{
int id;//学生id
char name[100];
char stu_name[100];
float e_score;
float n_score;
float t_score;
int score;//学分
struct cla *next;
struct res *res;
struct cla *follow;
struct cla *tec;
}cla1;

struct res //重修结构体 重修学期、重修成绩,并且要考虑多次重修
{
int id;
char name[100]; //course name
int semester;
float score;
int times;
struct res * next;
struct res * follow;
}res1;

struct order // 为了学生成绩排名
{
struct cla *pointer;
struct order *next;
};

struct info //信息结构体
{
int num; // the amount of stu or cla or res
char key[11];
}in1,in2,in3,in4;

struct info2
{
char name[500];
char note[500];
int i;
struct info2 *next;
};

FILE *fp3,*fp1,*fp2,*fp4;

struct stu * head=NULL,*p1,*p2;
struct tec * head_tec=NULL;
struct cla * clap,*headc;
struct res * resp,*headr;

//definition
void apple_ID();//用户注册
void file_open();//用来打开文件和构建链表
void file_close();
void insert_stu(struct stu stu1);//学生结构体插入
void insert_tec(struct tec tec1);//教师结构体插入
struct cla * insert_cla1(struct cla cla1);//将课程插入学生
void insert_cla2(struct cla cp);//将课程插入教师
void insert_res(struct res res1);//插入重修
void input_stu();//学生录入
void input_tec();//教师录入
void input_cla();//课程录入
void input_res();//重修录入
void copy_tec(struct tec *p1,struct tec tec1);//用于复制 减少代码量
void copy_stu(struct stu *p1,struct stu stu1);// 用于复制 减少代码量
void del_stu();//删除学生信息
void del_tec();//删除教师信息
void del_res();//删除重修信息
void pfree_res(struct cla *p,struct res res1);//解锁及释放重修内存
void pfree_cla(struct stu *p_stu,struct tec *p_tec,struct cla cla1);//解锁及释放课程内存
void modify_stu(struct stu *p);// 学生修改自己信息
void modify_tec(struct tec *p);// 教师修改自己信息
void modify_stu_adm();//管理员进入某一学生系统 修改学生信息 如密码
void modify_tec_adm();//管理员进入某一教师系统 修改教师信息 如密码
void skim_stu(struct stu *head);//按ID或名字查看学生信息
void skim_tec(struct tec *head);//按id或名字查看教师
void skim_stu_all();//查看所有学生学分及不及格课程
void skim_tec_all();//查看所有教师
void skim_stu_course();// 根据课程查看学生 管理员功能
void skim_stu_class();// 根据班级查看学生 管理员功能
void skim_list_stu(struct tec * p);//教师查看所有选自己课的学生
struct order * list(struct cla *head);// 学生分数排序 返回链表头 to make a list of stu
void print_stu(struct stu
p1);//输出学生
void adm_ui_1();//学生界面
void adm_ui_2();//教师界面
void stu_ui(struct stu p);//管理员界面1
void tec_ui(struct tec *p);//管理员界面2
void adm_key();//管理员密码修改
void st_key_stu(struct stu *p);//学生密码修改
void st_key_tec(struct tec *p);//教师密码修改
void key_adm();//管理员密码验证 只要密码
void key_stu();//学生ID与密码验证
void key_tec();//教师ID与密码验证
void stu_score(struct tec * p);//教师查看学生分数 按id
void tec_score(struct tec *head);//give score to someone 教师给分
int score_stu(struct stu
p);// 计算学生学分
void select_s(struct stu * p);//学生选课选修
int idc(char * id);//id装换 char 到int
void key(char *key);//以星号形式接受密码并放到地址key上
struct info2 *Rfile2(struct info2 *head_note);
void Savenote(struct info2 *head_note);
struct info2 *First2(struct info2 *head_note);
void watchall(struct info2 *head_note);
struct info2 *leavenote(struct info2 *head_note);
struct info2 *notesys(struct info2 *head_note);

main()
{
int z;
system("cls");
file_open();
do
{
printf("\n\t\t\t+---------------------------+\n");
printf("\t\t\t| 欢迎使用教务信息管理系统 |\n");
printf("\t\t\t+---------------------------+\n");
printf("提示:为保证您的操作得到保存,请按正常顺序退出系统^_^\n");
printf("\n\t\t\t--------------------------------\n");
printf("\t\t\t+ 主菜单 |\n");
printf("\t\t\t--------------------------------\n");
printf("\t\t\t+ [1]----学生登录 |\n");
printf("\t\t\t+ [2]----教师登录 |\n");
printf("\t\t\t+ [3]----管理员登陆 |\n");
printf("\t\t\t+ [4]----用户注册 |\n");
printf("\t\t\t+ [0]----退出系统 |\n");
printf("\t\t\t--------------------------------\n");
printf("请输入您的选择:");
scanf("%d", &z);
switch(z)
{
case 0 : break;
case 1 :key_stu();break;
case 2 :key_tec();break;
case 3 :key_adm();break;
case 4 :apple_ID();break;
default:printf("\n无效选项!");
}
}
while(z!=0);
file_close(); // to free all the pointer and input data to file
}

void file_open() //用来打开文件和构建链表 head 和 head_tec 是全局变量
{
struct stu stu1;
struct cla cla1;
struct res res1;
struct cla *cp;
int a1=0,a2=0,a3=0,a4=0;
if((fp1=fopen("stu","rb"))==NULL||(fp2=fopen("cla","rb"))==NULL||(fp3=fopen("res","rb"))==NULL||(fp4=fopen("tec","rb"))==NULL) //can't open the file
{
if((fp1=fopen("stu","wb"))==NULL||(fp2=fopen("cla","wb"))==NULL||(fp3=fopen("res","wb"))==NULL||(fp4=fopen("tec","wb"))==NULL)
printf("\nSomething Wrong!"); exit(0);
}
else // open file successfully
{
fread(&in1,sizeof(struct info),1,fp1);
fread(&in2,sizeof(struct info),1,fp2);
fread(&in3,sizeof(struct info),1,fp3);
fread(&in4,sizeof(struct info),1,fp4);
strcpy(in2.key,"19931101");
if(in1.num==0&&in2.num==0) strcpy(in1.key,"123456");
// create a linked list
// add stu struct
while(fread(&stu1,sizeof(struct stu),1,fp1))
{
insert_stu(stu1);
}
fclose(fp1);
while(fread(&tec1,sizeof(struct tec),1,fp4))
{
insert_tec(tec1);
}
fclose(fp4);
while(fread(&cla1,sizeof(struct cla),1,fp2))
{
cp=insert_cla1(cla1);
if(cp!=NULL) insert_cla2(cp);
}
fclose(fp2);
}
while(fread(&res1,sizeof(struct res),1,fp3))
{
insert_res(res1);
}
fclose(fp3);
}

void file_close() //head和head_tec是全局变量
{
struct stu *p1,*p11;
struct cla *p2,*p21;
struct res *p3,*p31;
struct tec *p4,*p41;
fp1=fopen("stu","wb");
fp2=fopen("cla","wb");
fp3=fopen("res","wb");
fp4=fopen("tec","wb");

fwrite(&in1,sizeof(struct info),1,fp1);
fwrite(&in2,sizeof(struct info),1,fp2);
fwrite(&in3,sizeof(struct info),1,fp3);
fwrite(&in4,sizeof(struct info),1,fp4);

p1=head;
while(p1!=NULL)
{
    fwrite(&(*p1),sizeof(struct stu),1,fp1);
    p11=p1;
    p1=p1->next;
    free(p11);
}

p4=head_tec;
while(p4!=NULL)
{
    fwrite(&(*p4),sizeof(struct tec),1,fp4);
    p41=p4;
    p4=p4->next;
    free(p41);
}

p2=headc;
while(p2!=NULL)
{
    fwrite(&(*p2),sizeof(struct cla),1,fp2);
    p21=p2;
    p2=p2->follow;
    free(p21);
}
p3=headr;
while(p3!=NULL)
{
    fwrite(&(*p3),sizeof(struct res),1,fp3);
    p31=p3;
    p3=p3->follow;
    free(p31);
}
printf("\nSaved!\n");

}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • weixin_38699017
    weixin_38699017 2017-06-04 12:23
    已采纳

    完整代码在这里

    #include "stdio.h"
    #include "string.h"
    #include "stdlib.h"
    #include "ctype.h"

    struct stu // 学生结构体 学号、姓名、性别、年龄、宿舍号码、电话号码
    {
    int id;//账号
    char name[100];//姓名
    int clas;//班级
    char sex[6];//性别
    int age;//年龄
    int dor;//宿舍号码
    char key[12];//密码
    char phone[12];//电话号码
    int score;
    struct stu * next;
    struct cla * cla;
    }*p1,stu1;

    struct tec //教师结构体
    {
    int id;
    char name[100];
    char sex[6];
    char cla_name[100];
    int cla_id;//课程编号
    char phone[12];
    char key[12];
    int score;
    char email[30];
    struct cla * cla;
    struct tec * next;
    }tec1;

    struct cla //学生课程结构体 课程编号、课程名称、考试成绩、平时成绩、综合成绩、学分、重修否
    {
    int id;//学生id
    char name[100];
    char stu_name[100];
    float e_score;
    float n_score;
    float t_score;
    int score;//学分
    struct cla *next;
    struct res *res;
    struct cla *follow;
    struct cla *tec;
    }cla1;

    struct res //重修结构体 重修学期、重修成绩,并且要考虑多次重修
    {
    int id;
    char name[100]; //course name
    int semester;
    float score;
    int times;
    struct res * next;
    struct res * follow;
    }res1;

    struct order // 为了学生成绩排名
    {
    struct cla *pointer;
    struct order *next;
    };

    struct info //信息结构体
    {
    int num; // the amount of stu or cla or res
    char key[11];
    }in1,in2,in3,in4;

    struct info2
    {
    char name[500];
    char note[500];
    int i;
    struct info2 *next;
    };

    FILE *fp3,*fp1,*fp2,*fp4;

    struct stu * head=NULL,*p1,*p2;
    struct tec * head_tec=NULL;
    struct cla * clap,*headc;
    struct res * resp,*headr;

    //definition
    void apple_ID();//用户注册
    void file_open();//用来打开文件和构建链表
    void file_close();
    void insert_stu(struct stu stu1);//学生结构体插入
    void insert_tec(struct tec tec1);//教师结构体插入
    struct cla * insert_cla1(struct cla cla1);//将课程插入学生
    void insert_cla2(struct cla cp);//将课程插入教师
    void insert_res(struct res res1);//插入重修
    void input_stu();//学生录入
    void input_tec();//教师录入
    void input_cla();//课程录入
    void input_res();//重修录入
    void copy_tec(struct tec *p1,struct tec tec1);//用于复制 减少代码量
    void copy_stu(struct stu *p1,struct stu stu1);// 用于复制 减少代码量
    void del_stu();//删除学生信息
    void del_tec();//删除教师信息
    void del_res();//删除重修信息
    void pfree_res(struct cla *p,struct res res1);//解锁及释放重修内存
    void pfree_cla(struct stu *p_stu,struct tec *p_tec,struct cla cla1);//解锁及释放课程内存
    void modify_stu(struct stu *p);// 学生修改自己信息
    void modify_tec(struct tec *p);// 教师修改自己信息
    void modify_stu_adm();//管理员进入某一学生系统 修改学生信息 如密码
    void modify_tec_adm();//管理员进入某一教师系统 修改教师信息 如密码
    void skim_stu(struct stu *head);//按ID或名字查看学生信息
    void skim_tec(struct tec *head);//按id或名字查看教师
    void skim_stu_all();//查看所有学生学分及不及格课程
    void skim_tec_all();//查看所有教师
    void skim_stu_course();// 根据课程查看学生 管理员功能
    void skim_stu_class();// 根据班级查看学生 管理员功能
    void skim_list_stu(struct tec * p);//教师查看所有选自己课的学生
    struct order * list(struct cla *head);// 学生分数排序 返回链表头 to make a list of stu
    void print_stu(struct stu
    p1);//输出学生
    void adm_ui_1();//学生界面
    void adm_ui_2();//教师界面
    void stu_ui(struct stu p);//管理员界面1
    void tec_ui(struct tec *p);//管理员界面2
    void adm_key();//管理员密码修改
    void st_key_stu(struct stu *p);//学生密码修改
    void st_key_tec(struct tec *p);//教师密码修改
    void key_adm();//管理员密码验证 只要密码
    void key_stu();//学生ID与密码验证
    void key_tec();//教师ID与密码验证
    void stu_score(struct tec * p);//教师查看学生分数 按id
    void tec_score(struct tec *head);//give score to someone 教师给分
    int score_stu(struct stu
    p);// 计算学生学分
    void select_n(struct stu * p);//学生选课必修
    void select_s(struct stu * p);//学生选课选修
    int idc(char * id);//id装换 char 到int
    void key(char *key);//以星号形式接受密码并放到地址key上
    struct info2 *Rfile2(struct info2 *head_note);
    void Savenote(struct info2 *head_note);
    struct info2 *First2(struct info2 *head_note);
    void watchall(struct info2 *head_note);
    struct info2 *leavenote(struct info2 *head_note);
    struct info2 *notesys(struct info2 *head_note);

    main()
    {
    int z;
    system("cls");
    file_open();
    do
    {
    printf("\n\t\t\t+---------------------------+\n");
    printf("\t\t\t| 欢迎使用教务信息管理系统 |\n");
    printf("\t\t\t+---------------------------+\n");
    printf("提示:为保证您的操作得到保存,请按正常顺序退出系统^_^\n");
    printf("\n\t\t\t--------------------------------\n");
    printf("\t\t\t+ 主菜单 |\n");
    printf("\t\t\t--------------------------------\n");
    printf("\t\t\t+ [1]----学生登录 |\n");
    printf("\t\t\t+ [2]----教师登录 |\n");
    printf("\t\t\t+ [3]----管理员登陆 |\n");
    printf("\t\t\t+ [4]----用户注册 |\n");
    printf("\t\t\t+ [0]----退出系统 |\n");
    printf("\t\t\t--------------------------------\n");
    printf("请输入您的选择:");
    scanf("%d", &z);
    switch(z)
    {
    case 0 : break;
    case 1 :key_stu();break;
    case 2 :key_tec();break;
    case 3 :key_adm();break;
    case 4 :apple_ID();break;
    default:printf("\n无效选项!");
    }
    }
    while(z!=0);
    file_close(); // to free all the pointer and input data to file
    }

    void file_open() //用来打开文件和构建链表 head 和 head_tec 是全局变量
    {
    struct stu stu1;
    struct cla cla1;
    struct res res1;
    struct cla *cp;
    int a1=0,a2=0,a3=0,a4=0;
    if((fp1=fopen("stu","rb"))==NULL||(fp2=fopen("cla","rb"))==NULL||(fp3=fopen("res","rb"))==NULL||(fp4=fopen("tec","rb"))==NULL) //can't open the file
    {
    if((fp1=fopen("stu","wb"))==NULL||(fp2=fopen("cla","wb"))==NULL||(fp3=fopen("res","wb"))==NULL||(fp4=fopen("tec","wb"))==NULL)
    printf("\nSomething Wrong!"); exit(0);
    }
    else // open file successfully
    {
    fread(&in1,sizeof(struct info),1,fp1);
    fread(&in2,sizeof(struct info),1,fp2);
    fread(&in3,sizeof(struct info),1,fp3);
    fread(&in4,sizeof(struct info),1,fp4);
    strcpy(in2.key,"19931101");
    if(in1.num==0&&in2.num==0) strcpy(in1.key,"123456");
    // create a linked list
    // add stu struct
    while(fread(&stu1,sizeof(struct stu),1,fp1))
    {
    insert_stu(stu1);
    }
    fclose(fp1);
    while(fread(&tec1,sizeof(struct tec),1,fp4))
    {
    insert_tec(tec1);
    }
    fclose(fp4);
    while(fread(&cla1,sizeof(struct cla),1,fp2))
    {
    cp=insert_cla1(cla1);
    if(cp!=NULL) insert_cla2(cp);
    }
    fclose(fp2);
    }
    while(fread(&res1,sizeof(struct res),1,fp3))
    {
    insert_res(res1);
    }
    fclose(fp3);
    }

    void file_close() //head和head_tec是全局变量
    {
    struct stu *p1,*p11;
    struct cla *p2,*p21;
    struct res *p3,*p31;
    struct tec *p4,*p41;
    fp1=fopen("stu","wb");
    fp2=fopen("cla","wb");
    fp3=fopen("res","wb");
    fp4=fopen("tec","wb");

    fwrite(&in1,sizeof(struct info),1,fp1);
    fwrite(&in2,sizeof(struct info),1,fp2);
    fwrite(&in3,sizeof(struct info),1,fp3);
    fwrite(&in4,sizeof(struct info),1,fp4);
    
    p1=head;
    while(p1!=NULL)
    {
        fwrite(&(*p1),sizeof(struct stu),1,fp1);
        p11=p1;
        p1=p1->next;
        free(p11);
    }
    
    p4=head_tec;
    while(p4!=NULL)
    {
        fwrite(&(*p4),sizeof(struct tec),1,fp4);
        p41=p4;
        p4=p4->next;
        free(p41);
    }
    
    p2=headc;
    while(p2!=NULL)
    {
        fwrite(&(*p2),sizeof(struct cla),1,fp2);
        p21=p2;
        p2=p2->follow;
        free(p21);
    }
    p3=headr;
    while(p3!=NULL)
    {
        fwrite(&(*p3),sizeof(struct res),1,fp3);
        p31=p3;
        p3=p3->follow;
        free(p31);
    }
    printf("\nSaved!\n");
    

    }

    void apple_ID()
    {
    int z;
    file_open();

    system("cls");
    do
    {
        printf("\n\t\t\t--------------------------------\n");
        printf("\t\t\t+    华南农业大学教务处欢迎您。|\n");
        printf("\t\t\t--------------------------------\n");
        printf("\t\t\t+    [1]----学生注册           |\n");
        printf("\t\t\t+    [2]----教师注册           |\n");
        printf("\t\t\t+    [0]----返回主界面         |\n");
        printf("\t\t\t--------------------------------\n");
        printf("请输入您的选择:");
        scanf("%d", &z);
        switch(z)
        {
        case 0 :    break;
        case 1 :input_stu(head);break;
        case 2 :input_tec(head_tec);break;
        default:printf("\n无效选项!");
        }
        }while(z!=0);
    

    }

    void insert_stu(struct stu stu1) //学生结构体插入
    {
    struct stu *p2,*p3;
    if(head==NULL) // empty linked list
    {
    p1=(struct stu *)malloc(sizeof(struct stu));
    head=p1;
    copy_stu(p1,stu1);
    p1->next=NULL;
    p1->cla=NULL;
    in1.num++;
    }
    else
    {
    p2=head; p3=head;
    while(p2!=NULL)
    {
    if(p2->id>=stu1.id) break;
    p3=p2;
    p2=p2->next;
    }
    if(p2==NULL||p2->id>stu1.id)
    {
    p2=(struct stu *)head;
    if(p2->id>stu1.id) //insert at the head
    {
    p1=(struct stu *)malloc(sizeof(struct stu));
    copy_stu(p1,stu1);
    p1->next=head;
    p1->cla=NULL;
    in1.num++;
    head=p1;
    }
    else //insert at the middle or at the end
    {
    while(p2->idnext!=NULL) // to find the point to insert
    {
    if(p2->id==stu1.id) break;
    p3=p2;p2=p2->next;
    }
    if(p2->next==NULL&&p2->id {
    p1=(struct stu *)malloc(sizeof(struct stu));
    copy_stu(p1,stu1);
    p1->next=NULL;
    p1->cla=NULL;
    in1.num++;
    p2->next=p1;
    }
    else //insert at the middle
    {
    p1=(struct stu *)malloc(sizeof(struct stu));
    copy_stu(p1,stu1);
    p1->next=p2;
    p1->cla=NULL;
    in1.num++;
    p3->next=p1;
    }

             }
        }
        else printf("\n该生已存在。");
    }
    

    }

    void insert_tec(struct tec tec1) //教师结构体插入
    {
    struct tec *p1,*p2,*p3;
    if(head_tec==NULL) // empty linked list
    {
    p1=(struct tec *)malloc(sizeof(struct tec));
    head_tec=p1;
    p1->id=tec1.id;
    copy_tec(p1,tec1);
    p1->next=NULL;
    in4.num++;
    p1->cla=NULL;
    }
    else
    {
    p2=head_tec;
    p3=head_tec;
    while(p2!=NULL)
    {
    if(p2->id>=tec1.id) break;
    p3=p2;
    p2=p2->next;
    }
    if(p2==NULL||p2->id>tec1.id)
    {
    p2=(struct tec *)head_tec;
    if(p2->id>tec1.id) //insert at the head
    {
    p1=(struct tec *)malloc(sizeof(struct tec));
    p1->id=tec1.id;
    copy_tec(p1,tec1);
    p1->next=head_tec;
    p1->cla=NULL;
    in4.num++;
    head_tec=p1;
    }
    else //insert at the middle or at the end
    {
    while(p2->idnext!=NULL) // to find the point to insert
    {
    p3=p2;
    p2=p2->next;
    }

            if(p2->next==NULL&&p2->id<tec1.id) // insert at the end
            {
                p1=(struct tec *)malloc(sizeof(struct tec));
                p1->id=tec1.id;
                copy_tec(p1,tec1);
                p1->next=NULL;
                p1->cla=NULL;
                in4.num++;
                p2->next=p1;
            }
            else //insert at the middle
            {
                p1=(struct tec *)malloc(sizeof(struct tec));
                 p1->id=tec1.id;
                copy_tec(p1,tec1);
                p1->next=p2;
                p1->cla=NULL;
                in4.num++;
                p3->next=p1;
            }
        }
        }
        else printf("\n该教师已存在。");
    
    }
    

    }

    struct cla * insert_cla1(struct cla cla1) //将课程插入学生
    {
    struct cla p1,*p2,*p3;
    struct stu *p;
    p=(struct stu *)head;
    while(p->id!=cla1.id&&p->next!=NULL&&p->id {
    p=p->next;
    }
    if((p->next==NULL&&p->id!=cla1.id)||p->id>cla1.id)
    {
    printf("\n查无此生!信息没有插入!");
    }
    else
    {
    p1=(struct cla
    )p->cla;
    p3=(struct cla*)p->cla;
    while(p1!=NULL) //p3为前一个指针 p1为当前地址
    {
    if(strcmp(p1->name,cla1.name)==0) break;
    p3=p1; p1=p1->next;

        }
        if(p1!=NULL&&strcmp(p1->name,cla1.name)==0)
        {
             p1->e_score=cla1.e_score;
             p1->n_score=cla1.n_score;
             p1->t_score=cla1.t_score;
        }
        else
        {
            p2=(struct cla*)malloc(sizeof(struct cla));
            p2->id=cla1.id;
            strcpy(p2->name,cla1.name);
            strcpy(p2->stu_name,p->name);
            p2->e_score=cla1.e_score;
            p2->n_score=cla1.n_score;
            p2->t_score=cla1.t_score;
            p2->next=NULL;
            p2->res=NULL;
            if(p3==NULL) p->cla=p2;
            else p3->next=p2;
            // to make a follow
            if(in2.num==0)
            {
                headc=p2;
                clap=p2;
                p2->follow=NULL;
                in2.num++;
            }
            else
            {
                clap->follow=p2;
                clap=p2;
                p2->follow=NULL;
                in2.num++;
            }
        }
        return p2;
    }
    return NULL;
    

    }

    void insert_cla2(struct cla cp)//将课程插入教师
    {
    struct cla *p1,*p2,*p3;
    struct tec *p;
    p=(struct tec *)head_tec;
    while(strcmp(p->cla_name,cp->name)!=0&&p->next!=NULL)
    {
    p=p->next;
    }
    if(p->next==NULL&&strcmp(p->cla_name,cp->name)!=0)
    {
    printf("\n信息没有插入!");
    }
    else
    {
    p1=(struct cla
    )p->cla;
    p3=(struct cla*)p->cla;
    while(p1!=NULL)
    {
    if(p1->id==cp->id) break;
    p3=p1;
    p1=p1->tec;
    }
    if(p1!=NULL&&p1->id==cp->id)
    {
    p1->e_score=cp->e_score;
    p1->n_score=cp->n_score;
    p1->t_score=cp->t_score;
    }
    else
    {
    p2=cp;
    p2->tec=NULL;
    p2->score=p->score;
    if(p3==NULL) p->cla=p2;
    else p3->tec=p2;
    }

    }
    

    }

    void insert_res(struct res res1)//插入重修
    {
    struct stu p;
    struct res *p1,*p2,*p4;
    struct cla *p3;
    p=(struct stu *)head;
    while(p->id!=res1.id&&p->next!=NULL&&p->id {
    p=p->next;
    }
    if((p->next==NULL&&p->id!=res1.id)||p->id>res1.id)
    {
    printf("\n查无此生!信息没有插入!");
    }
    else
    {
    p3=(struct cla
    )p->cla;
    if(p3==NULL)
    {
    printf("\n该生尚无课程信息!");
    }
    else
    {
    while(strcmp(p3->name,res1.name)!=0&&p3->next!=NULL)
    {
    p3=p3->next;
    }
    if(p3->next==NULL&&strcmp(p3->name,res1.name)!=0)
    {
    printf("\n该课程不存在!");
    }
    else
    {
    p1=(struct res )p3->res;
    p4=(struct res *)p3->res;
    while(p1!=NULL)
    {
    if(p1->times==res1.times) break;
    p4=p1;
    p1=p1->next;
    }
    if(p1!=NULL&&p1->times==res1.times)
    {
    p1->score=res1.score;
    }
    else
    {
    p2=(struct res
    )malloc(sizeof(struct res));
    p2->id=res1.id;
    strcpy(p2->name,res1.name);
    p2->score=res1.score;
    p2->semester=res1.semester;
    p2->times=res1.times;
    p2->next=NULL;
    if(p4==NULL) p3->res=p2;
    else p4->next=p2;
    // to make a follow
    if(in3.num==0)
    {
    headr=p2;
    resp=p2;
    p2->follow=NULL;
    in3.num++;
    }
    else
    {
    resp->follow=p2;
    resp=p2;
    p2->follow=NULL;
    in3.num++;
    }
    }
    }
    }
    }
    }

    void input_stu() //学生录入
    {
    struct stu stu1;
    printf("\n请输入学生数据,输入0结束输入.");
    printf("\n请输入学生ID(8位数字):");
    scanf("%d",&stu1.id);
    while(stu1.id!=0)
    {
    //initialize and create
    printf("\n请输入学生姓名:");scanf("%s",stu1.name);
    printf("\n请输入学生宿舍(五位数字比如08207):");scanf("%d",&stu1.dor);
    printf("\n请输入学生班级(2位数字比如01):");scanf("%d",&stu1.clas);
    printf("\n请输入学生性别(男或女):");scanf("%s",stu1.sex);
    printf("\n请输入学生年龄:");scanf("%d",&stu1.age);
    printf("\n请输入学生电话号码(11位手机号码):");scanf("%s",stu1.phone);
    printf("\n请输入学生密码:");scanf("%s",stu1.key);
    stu1.next=NULL;stu1.cla=NULL;
    insert_stu(stu1);
    printf("\n请输入学生ID(8位数字):");scanf("%d",&stu1.id);
    }
    }

    void input_tec() //教师录入
    {
    struct tec tec1;
    printf("\n请输入教师数据,输入0结束输入.");
    printf("\n请输入教师ID(8位数字):");scanf("%d",&tec1.id);
    while(tec1.id!=0)
    {
    //initialize and create
    printf("\n请输入教师姓名:");scanf("%s",tec1.name);
    printf("\n请输入教师课程名称:");scanf("%s",tec1.cla_name);
    printf("\n请输入教师课程编号:");scanf("%d",&tec1.cla_id);
    printf("\n请输入教师性别(男或女):");scanf("%s",tec1.sex);
    printf("\n请输入教师电话号码(11位手机号码):");scanf("%s",tec1.phone);
    printf("\n请输入教师密码:");scanf("%s",tec1.key);
    printf("\n请输入学分:");scanf("%d",&tec1.score);
    printf("\n请输入教师email:");scanf("%s",tec1.email);
    tec1.next=NULL;tec1.cla=NULL;
    insert_tec(tec1);
    printf("\n请输入教师ID(8位数字):");scanf("%d",&tec1.id);
    }
    }

    void input_cla() //课程录入
    {
    struct cla cla1;
    struct cla *cp;
    printf("\n请输入学生课程数据,输入0结束输入.");
    printf("\n请输入学生ID(8位数字):");scanf("%d",&cla1.id);
    while(cla1.id!=0)
    {
    //initialize and create
    printf("\n请输入课程姓名:");scanf("%s",cla1.name);
    cla1.score=0;
    printf("\n请输入课程学生考试成绩:");scanf("%f",&cla1.e_score);
    printf("\n请输入课程学生平时成绩:");scanf("%f",&cla1.n_score);
    cla1.t_score=0.5*cla1.n_score+0.5*cla1.e_score;
    cla1.next=NULL;cla1.res=NULL; cla1.follow=NULL;
    cp=insert_cla1(cla1);
    insert_cla2(cp);
    printf("\n请输入学生ID(8位数字):");scanf("%d",&cla1.id);
    }
    }

    void input_res() //重修录入
    {
    struct res res1;
    printf("\n请输入学生重修数据,输入0结束输入.");
    printf("\n请输入学生ID(8位数字):");scanf("%d",&res1.id);
    while(res1.id!=0)
    {
    //initialize and create
    printf("\n请输入重修学期:");scanf("%d",&res1.semester);
    printf("\n请输入重修课程名称:");scanf("%s",res1.name);
    printf("\n请输入重修成绩:");scanf("%f",&res1.score);
    printf("\n请输入重修次数:");scanf("%d",&res1.times);
    res1.next=NULL;
    // res1->next=NULL;
    insert_res(res1);
    printf("\n请输入学生ID(8位数字):");scanf("%d",&res1.id);
    }
    }

    void copy_stu(struct stu *p1,struct stu stu1)// 用于复制 减少代码量
    {
    p1->age=stu1.age; p1->id=stu1.id;
    p1->dor=stu1.dor;
    strcpy(p1->phone,stu1.phone);
    strcpy(p1->sex,stu1.sex);
    strcpy(p1->key,stu1.key);
    strcpy(p1->name,stu1.name);
    p1->score=0;
    }

    void copy_tec(struct tec *p1,struct tec tec1)// 用于复制 减少代码量
    {
    strcpy(p1->email,tec1.email);
    strcpy(p1->cla_name,tec1.cla_name);
    p1->cla_id=tec1.cla_id;
    strcpy(p1->phone,tec1.phone);
    strcpy(p1->sex,tec1.sex);
    p1->score=tec1.score;
    strcpy(p1->key,tec1.key);
    strcpy(p1->name,tec1.name);
    }

    void modify_stu(struct stu p1)// 学生修改自己信息
    {
    int z;
    system("cls");
    printf("\n\t\t\t
    *************************");
    printf("\n\t\t\t**\t修改项目\t**");
    printf("\n\t\t\t**************************");
    printf("\n\t\t\t**\t(1)年龄 \t**");
    printf("\n\t\t\t**\t(2)宿舍 \t**");
    printf("\n\t\t\t**\t(3)电话号码\t**");
    printf("\n\t\t\t**************************");
    printf("\n请输入数字(输入0停止修改):");
    scanf("%d",&z);
    switch(z)
    {
    case 0: break;
    case 1: printf("请输入年龄:");scanf("%d",&p1->age); fflush(stdin);break;
    case 2: printf("请输入宿舍号码:");scanf("%d",&p1->dor); fflush(stdin);break;
    case 3: printf("请输入电话号码:");scanf("%s",p1->phone); fflush(stdin);break;
    default : printf("\n请正确输入相应数字。");fflush(stdin);break;
    }
    printf("\n已完成修改。按任意键返回。"); getchar(); getchar();

    }

    void modify_tec(struct tec *p1)// 教师修改自己信息
    {

        int z;
        system("cls");
        printf("\n\t\t\t**************************");
        printf("\n\t\t\t**\t修改项目\t**");
        printf("\n\t\t\t**************************");
        printf("\n\t\t\t**\t(1)学分 \t**");
        printf("\n\t\t\t**\t(2)email\t**");
        printf("\n\t\t\t**\t(3)电话号码\t**");
        printf("\n\t\t\t**************************");
        printf("\n请输入数字(输入0停止修改):");
        scanf("%d",&z);
            switch(z)
            {
                case 0: break;
                case 1: printf("\n请输入新的学分:"); scanf("%d",&p1->score); fflush(stdin);break;
                case 2: printf("\n请输入新的email:"); scanf("%s",p1->email); fflush(stdin);break;
                case 3: printf("\n请输入新的电话:"); scanf("%s",p1->phone); fflush(stdin);break;
                default :  printf("\n请正确输入数字。");fflush(stdin);break;
            }
         printf("\n已完成修改。按任意键返回。"); getchar(); getchar();
    

    }

    void modify_stu_adm()//管理员进入某一学生系统 修改学生信息 如密码
    {
    struct stu *p1;
    int id;
    int z=0;
    p1=head;
    system("cls");
    printf("\n你好,请输入要修改学生的ID(8位id,输入0停止输入):");
    scanf("%d",&id); fflush(stdin);
    while(p1!=NULL)
    {
    if(p1->id>=id) break; //减少检索次数
    p1=p1->next;
    }
    if(p1!=NULL)
    {
    if(p1->id==id) stu_ui(p1);
    }
    else
    printf("\n学生不存在。");

    }

    void modify_tec_adm()//管理员进入某一教师系统 修改教师信息 如密码
    {
    struct tec *p1;
    int id;
    int z=0;
    system("cls");
    p1=head_tec;
    printf("\n你好,请输入要修改教师的ID(8位id,输入0停止输入):");
    scanf("%d",&id);
    while(p1!=NULL)
    {
    if(p1->id>=id) break;
    p1=p1->next;
    }
    if(p1!=NULL)
    {
    if(p1->id==id) tec_ui(p1);
    }
    else
    printf("该教师不存在。");
    }

    void del_stu()//删除学生信息
    {
    struct stu *p1,*p11;
    struct cla *p2,*p21,*p22;
    struct tec *p3;
    int id;
    system("cls");
    printf("\n请输入要删除学生的ID(8位学号,输入0为停止删除):");
    scanf("%d",&id);fflush(stdin);
    while(id!=0)
    {
    p1=head;
    while(p1!=NULL)
    {
    if(p1->id==id) break;
    p1=p1->next;
    }
    if(p1!=NULL)
    {
    p2=p1->cla;
    while(p2!=NULL)
    {
    p3=head_tec;
    while(p3!=NULL)
    {
    p21=p3->cla;
    if(strcmp(p3->cla_name,p2->name)==0)
    {
    while(p21!=NULL)
    {
    if(p21->id==p2->id) break;
    p21=p21->tec;
    }
    }
    if(p21!=NULL&&p21->id==p2->id) break;
    p3=p3->next;
    }
    p22=p2->next;
    if(p3!=NULL)
    {
    pfree_cla(p1,p3,(*p2));
    }
    p2=p22;
    }
    printf("\n成功删除该生信息.");
    }
    p1=p11=head;
    while(p1!=NULL) //释放stu内存
    {
    if(p1->id==id)
    {
    if(p1==p11) head=p1->next;
    else
    p11->next=p1->next;
    free(p1);
    in1.num--;
    break;
    }
    p11=p1; p1=p1->next;
    }
    printf("\n请输入要删除学生的ID(8位学号,输入0为停止删除):");
    scanf("%d",&id);
    }

    }

    void del_tec()//删除教师信息
    {
    struct tec *p1,*p11;
    struct cla *p2,*p21;
    struct stu *p3;
    int id;
    system("cls");
    printf("\n请输入要删除教师的ID(8位学号,输入0为停止删除):");
    scanf("%d",&id);fflush(stdin);
    while(id!=0)
    {
    p1=head_tec;
    while(p1!=NULL)
    {
    if(p1->id==id) break;
    p1=p1->next;
    }
    if(p1!=NULL)
    {
    p2=p1->cla;
    while(p2!=NULL)
    {
    p3=head;
    while(p3!=NULL)
    {
    if(p3->id==p2->id) break;
    p3=p3->next;
    }
    p21=p2->tec;
    if(p3!=NULL)
    {
    pfree_cla(p3,p1,(*p2));
    }
    p2=p21;
    }
    }
    p1=p11=head_tec;
    while(p1!=NULL)
    {
    if(p1->id==id)
    {
    if(p1==p11) head_tec=p1->next;
    else p11->next=p1->next;
    free(p1);
    in4.num--;
    break;
    }
    p11=p1; p1=p1->next;
    }
    printf("\n请输入要删除教师的ID(8位学号,输入0为停止删除):");
    scanf("%d",&id);
    }

    }

    void del_res()//删除重修信息
    {
    struct res res1;
    struct cla *p;
    system("cls");
    printf("please input the id of stu");
    scanf("%d",&res1.id);fflush(stdin);
    printf("please input the name of course");
    scanf("%s",res1.name);fflush(stdin);
    printf("please input the times of res");
    scanf("%d",&res1.times);fflush(stdin);
    while(res1.id!=0)
    {
    p=headc;
    while(p!=NULL)
    {
    if(strcmp(res1.name,p->name)==0&&p->id==res1.id)
    {
    pfree_res(p,res1);
    break;
    }
    p=p->follow;
    }
    printf("请输入学生id");
    scanf("%d",&res1.id);
    printf("输入课程名称");
    scanf("%s",res1.name);
    printf("输入重修次数");
    scanf("%d",&res1.times);
    }

    }

    void pfree_cla(struct stu *p_stu,struct tec *p_tec,struct cla cla1)//解锁及释放课程内存
    {
    struct cla *p2,*p21;
    struct res *p3,*p31;
    p2=p21=p_stu->cla;
    while(p2!=NULL)
    {
    if(strcmp(p2->name,cla1.name)==0)
    {
    p3=p2->res; // unlock res
    while(p3!=NULL)
    {
    p31=p3->next;
    pfree_res(p2,(*p3));
    p3=p31;
    }

             if(p2==p21)
             {
                 p_stu->cla=p2->next;
             }
             else
             {
                 p21->next=p2->next;
             }
             break;
         }
         p21=p2; p2=p2->next;
     }
     p2=p21=p_tec->cla;
     while(p2!=NULL)
     {
         if(p2->id==cla1.id)
         {
             if(p2==p21)
             {
                 p_tec->cla=p2->tec;
             }
             else
             {
                 p21->tec=p2->tec;
             }
             break;
         }
         p21=p2;  p2=p2->tec;
     }
     p2=p21=headc;
     while(p2!=NULL)
     {
         if(p2->id==cla1.id&&strcmp(p2->name,cla1.name)==0)
         {
             if(p2=p21)
             {
                 headc=p2->follow;
             }
             else
             {
                 p21->follow=p2->follow;
    
             }
             free(p2);
             in2.num--;
             break;
         }
         p21=p2; p2=p2->follow;
     }
    

    }

    void pfree_res(struct cla *p,struct res res1)//解锁及释放重修内存
    {
    struct res *p2,*p21;
    p2=p21=p->res;
    while(p2!=NULL)
    {
    if(p2->times==res1.times)
    {
    if(p2==p21)
    {
    p->res=p2->next;
    }
    else
    {
    p21->next=p2->next;
    }
    break;
    }
    p21=p2; p2=p2->next;
    }
    p2=p21=headr;
    while(p2!=NULL)
    {
    if(p2->times==res1.times&&p2->id==res1.id&&strcmp(p2->name,res1.name)==0)
    {
    if(p2==p21)
    {
    headr=p2->follow;
    }
    else
    {
    p21->follow=p2->follow;
    }
    free(p2);
    in3.num--;
    break;
    }
    p21=p2;p2=p2->next;
    }
    }

    void skim_stu(struct stu *head) //按ID或名字查看学生信息
    {
    char id[9];
    int id1;
    struct stu *p1;
    system("cls");
    if(head==NULL)
    {
    printf("\n目前无学生数据,请返回录入.\n");
    }
    else
    {
    printf("\n请输入要查询的学生ID或姓名(8位数字或者汉字,输入0停止查询):");
    scanf("%s",&id);
    while(id[0]!='0')
    {
    p1=(struct stu *)head;
    if(strlen(id)==8)
    {
    id1=idc(id);
    while(p1->id!=id1&&p1->next!=NULL&&p1->id {
    p1=p1->next;
    }
    if((p1->next==NULL&&p1->id!=id1)||p1->id>id1)
    {
    printf("\n查无此生!请重新输入学生ID(8位数字,输入0停止查询):");
    scanf("%s",id);
    }
    else
    {
    print_stu(p1);
    printf("\n继续查询请再次输入学生ID或姓名(8位数字或者汉字,输入0停止查询):");
    scanf("%s",id);
    }
    }
    else
    {
    while(strcmp(id,p1->name)!=0&&p1!=NULL)
    {
    p1=p1->next;
    }
    if(strcmp(id,p1->name)==0)
    {
    print_stu(p1);
    printf("\n继续查询请再次输入学生ID或姓名(8位数字或者汉字,输入0停止查询):");
    scanf("%s",id);
    }
    else
    {
    printf("\n查无此生!请重新输入学生ID(8位数字,输入0停止查询):");
    scanf("%s",id);
    }
    }

        }
    }
    

    }

    void skim_tec(struct tec *head)//按id或名字查看教师
    {
    int id1;
    char id[9];
    struct tec *p1;
    system("cls");
    if(head==NULL)
    {
    printf("\n目前无教师数据,请返回录入.\n");
    }
    printf("\n请输入要查询的教师ID或名字(8位数字或汉字,输入0停止查询):");
    scanf("%s",id);
    while(id[0]!='0')
    {
    p1=(struct tec *)head;
    if(strlen(id)==8)
    {
    id1=idc(id);
    while(p1->id!=id1&&p1->next!=NULL&&p1->id {
    p1=p1->next;
    }
    if(id1=p1->id)
    {
    printf("\n------------------------------------------------------------");
    printf("\n名字>>>性别>课程名称>>>>>>课程编号>>>学分>>>手机号码>>>>>>>>email>>>>>>>");
    printf("\n------------------------------------------------------------");
    printf("\n%s %s %s %d %d %s %s",p1->name,p1->sex,p1->cla_name,p1->cla_id,p1->score,p1->phone,p1->email);
    printf("\n继续查询请再次输入教师ID或名字(8位数字或汉字,输入0停止查询):");
    scanf("%s",id);
    }
    else
    {
    printf("\nno data!请重新输入教师ID或名字(8位数字或汉字,输入0停止查询):");
    scanf("%s",id);
    }
    }
    else
    {
    while(strcmp(id,p1->name)!=0&&p1!=NULL)
    {
    p1=p1->next;
    }
    if(strcmp(id,p1->name)==0)
    {
    printf("\n------------------------------------------------------------");
    printf("\n名字>>>性别>课程名称>>>>>>课程名称>>>学分>>>手机号码>>>>>>>>email>>>>>>>");
    printf("\n------------------------------------------------------------");
    printf("\n%s %s %s %d %d %s %s",p1->name,p1->sex,p1->cla_name,p1->cla_id,p1->score,p1->phone,p1->email);
    printf("\n继续查询请再次输入教师ID或名字(8位数字或汉字,输入0停止查询):");
    scanf("%s",id);
    }
    else
    {
    printf("\nno data!请重新输入教师ID或名字(8位数字或汉字,输入0停止查询):");
    scanf("%s",id);
    }
    }

    }
    
    getchar(); getchar();
    

    }

    void skim_stu_all()//查看所有学生学分及不及格课程
    {
    struct stu *p1;
    struct cla *p2;
    system("cls");
    p1=head;
    printf("\n-----------------------------------------------------------------------");
    printf("\nID>>>>>>>>>学生姓名>>>>>>>学分>>不及格课程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    printf("\n-----------------------------------------------------------------------");
    while(p1!=NULL)
    {
    p1->score=score_stu(p1);
    printf("\n%d %s \t %d",p1->id,p1->name,p1->score);
    p2=p1->cla;
    while(p2!=NULL)
    {

            if(p2->e_score<60&&p2->e_score!=0)
                printf(" %s  ",p2->name);
            p2=p2->next;
        }
        p1=p1->next;
    }
    getchar(); getchar();
    

    }

    void skim_tec_all()//查看所有教师
    {
    struct tec *p1;
    system("cls");
    p1=head_tec;
    printf("\n-------------------------------------------------------------------");
    printf("\n教师姓名>>>>>>>>>课程名称>>>>>>>>课程编号>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    printf("\n-------------------------------------------------------------------");
    while(p1!=NULL)
    {
    printf("\n%-10s \t %-10s \t %-10d",p1->name,p1->cla_name,p1->cla_id);
    p1=p1->next;
    }

    getchar(); getchar();
    

    }

    void skim_stu_course() // 根据课程查看学生 管理员功能
    {
    struct tec *p;
    struct cla *p1;
    struct res *p2;
    int coursenumber;
    char course[12];
    int z=0;
    p=head_tec;
    system("cls");
    printf("\n请输入课程编号+课程名称:"); // 课程名与教师一一对应
    scanf("%d%s",&coursenumber,course);fflush(stdin);
    while(p!=NULL)
    {
    if(p->cla_id==coursenumber)
    {
    p1=p->cla;
    printf("\n---------------------------------------------------------------------");
    printf("\n学生ID>>学生姓名>>考试成绩>>>>平时成绩>>>>综合成绩>>>>重修成绩>>>>>>>>>>>>>");
    printf("\n---------------------------------------------------------------------");
    while(p1!=NULL)
    {
    if(p->cla_id==coursenumber) //输出所有选同一课程的学生
    {
    printf("\n%d \t %s %.2f \t %.2f \t %.2f \t",p1->id,p1->stu_name,p1->e_score,p1->n_score,p1->t_score);
    if(p1->res!=NULL)
    {
    p2=p1->res;
    z=1;
    while(p2!=NULL)
    {
    printf("(%d)%.2f ",z++,p2->score);
    p2=p2->next;
    }
    }
    else
    printf("无重修");
    z=1; //用来判断有无学生输出
    }
    p1=p1->tec;
    }

        }
        p=p->next;
    }
    if(z==0)
    {printf("\n无该课程信息");}
    getchar(); getchar();
    

    }

    void skim_stu_class() // 根据班级查看学生 管理员功能
    {
    struct stu *p1;
    struct cla *p2;
    int id1,id2;
    int n=0;
    p1=head;
    system("cls");
    printf("\n请输入班级编号(学号后四位如0526):");
    scanf("%d",&id1);fflush(stdin);
    id1=(int)(id1/100);
    id1=id1*100+20160000; id2=id1+100; //取学号范围确定班级
    printf("\n-------------------------------------------------------------------");
    printf("\n学生姓名>>>所选课程(考试成绩)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    printf("\n-------------------------------------------------------------------");
    while(p1!=NULL)
    {
    if(p1->idid>id1) //寻找同一班级的同学
    {
    printf("\n%s\t",p1->name);
    p2=p1->cla;
    while(p2!=NULL)
    {
    printf(" %s(%.2f)",p2->name,p2->e_score);
    p2=p2->next;
    }
    n=1; // 有班级存在 n作为判断数
    }
    p1=p1->next;
    }
    if(n==0)
    printf("\n无该班级信息");
    getchar(); getchar();

    }

    void skim_list_stu(struct tec * p) //教师查看所有选自己课的学生
    {
    struct cla *p3;
    struct order *p11,*p1,*head;
    struct res *p2;
    int z;
    p1=list(p->cla);
    head=p1;
    system("cls");
    while(p1!=NULL)
    {
    p3=p1->pointer;
    printf("\n---------------------------------------------------------------------");
    printf("\n学生ID>>学生姓名>>考试成绩>>平时成绩>>综合成绩>>>>重修成绩>>>>>>>>>>>>>");
    printf("\n---------------------------------------------------------------------");
    printf("\n%d %s %.2f \t %.2f \t %.2f \t",p3->id,p3->stu_name,p3->e_score,p3->n_score,p3->t_score);
    if(p3->res!=NULL)
    {
    p2=p3->res;
    z=1;
    while(p2!=NULL)
    {
    printf("(%d)%.2f ",z++,p2->score);
    p2=p2->next;
    }
    }

        else
        printf("无重修");
    
       p1=p1->next;
    

    }
    p1=head;
    while(p1!=NULL)
    {
    p11=p1;
    p1=p1->next;
    free(p11);
    }
    getchar(); getchar();

    }

    struct order * list(struct cla head)// 学生分数排序 返回链表头 to make a list of stu
    {
    struct order *p1=NULL,*p2,*p3,*p4;
    struct cla *p;
    p=head;
    while(p!=NULL)
    {
    if(p1==NULL)//the head
    {
    p2=(struct order
    )malloc(sizeof(struct order));
    p2->pointer=p;
    p2->next=NULL;
    p1=p2;
    }
    else
    {
    if(p->e_score>p1->pointer->e_score)
    {
    p2=(struct order*)malloc(sizeof(struct order));
    p2->pointer=p;
    p2->next=p1;
    p1=p2;
    }
    else
    {
    p3=p1;
    while(p3!=NULL)
    {
    if(p->e_score>p3->pointer->e_score) break;
    p4=p3; p3=p3->next;
    }
    p2=(struct order*)malloc(sizeof(struct order));
    p2->pointer=p;
    if(p3==NULL) p2->next=NULL;
    else p2->next=p3;
    p4->next=p2;

          }
       }
       p=p->tec;
    }
    return p1;
    

    }

    void print_stu(struct stu* p1) //输出学生
    {
    struct cla p2;
    struct res *p3;
    printf("\n------------------------------------------------------------");
    printf("\nID\t>>名字>>>性别>年龄>宿舍>>>>手机号码>>>>>>>>>");
    printf("\n------------------------------------------------------------");
    printf("\n%d %s %s %d %d %s",p1->id,p1->name,p1->sex,p1->age,p1->dor,p1->phone);
    if(p1->cla==NULL)
    {
    printf("\n暂无选课信息!");
    }
    else
    {
    p2=(struct cla
    )p1->cla;
    printf("\n------------------------------------------------------------");
    printf("\n课程名称>>>学分>>考试成绩>>平时成绩>>综合成绩>>>>");
    printf("\n------------------------------------------------------------");
    while(p2!=NULL)
    {
    printf("\n%-12s %d %.2f %.2f %.2f ",p2->name,p2->score,p2->e_score,p2->n_score,p2->t_score);
    if(p2->e_score {
    p2->t_score=p2->e_score;
    }
    else p2->t_score=(p2->e_score+p2->n_score)*0.5;
    if(p2->res==NULL)
    {
    printf("该课程无重修.");
    }
    else
    {
    p3=(struct res *)p2->res;
    while(p3!=NULL)
    {
    printf("\n------------------------------------------------------------");
    printf("\n重修学期>>>分数>>重修次数>>>>");
    printf("\n------------------------------------------------------------");
    printf("\n%d %.2f %d",p3->semester,p3->score,p3->times);
    p3=p3->next;
    }

                    }
                    p2=p2->next;
                }
    
            }
            getchar();getchar();
    

    }

    struct info2 Rfile2(struct info2 *head_note)
    {
    FILE *fr,*fw;
    char note[500];
    char name[20];
    char reply[500];
    char ch;
    int i,replied=0;
    struct info2 *p2,*p1;
    fr=fopen("note.txt","r");
    if(fr==NULL)
    {
    fw=fopen("note.txt","w");
    fr=fopen("note.txt","r");
    }
    while((ch=fgetc(fr))!=EOF)
    {
    fseek(fr,-1,SEEK_CUR);
    p1=(struct info2
    )malloc(sizeof(struct info2));
    fscanf(fr,"%d%s%s\n",&i,name,note);
    p1->i=i;
    strcpy(p1->name,name);
    strcpy(p1->note,note);
    p1->next=NULL;
    if(head_note==NULL) head_note=p1;
    else p2->next=p1;
    p2=p1;
    }
    return head_note;

    }

    void Savenote(struct info2 *head_note)
    {
    struct info2 *sp1=head_note;
    FILE *fps;
    fps=fopen("note.txt","w");
    if(fps==NULL)
    printf("\t\t\t\t\n保存失败!\n");
    while(sp1)
    {
    fprintf(fps,"%d %s %s\n",sp1->i,sp1->name,sp1->note);
    sp1=sp1->next;
    }
    printf("\t\t\t\t\n保存成功!\n\n");

    }

    struct info2 *First2(struct info2 *head_note)
    {

    struct info2 *p;
    char name[20]; //使用者名称
    char note[500]; //用途
    printf(" \t\t\t\t请输入你的姓名:\n");
    scanf("%s",name);
    printf(" \t\t\t\t请输入你的留言:\n");
    scanf("%s",note);
    p=(struct info2*)malloc(sizeof(struct info2));
    strcpy(p->name,name);
    p->i=1;
    strcpy(p->note,note);
    p->next=NULL;
    head_note=p;
    Savenote(head_note);
    return head_note;
    

    }

    void watchall(struct info2 *head_note)
    {
    struct info2 *np1=head_note;
    if(np1==NULL)
    {
    printf(" \n\t\t\t\t没有留言信息!\n");
    }
    while(np1)
    {
    printf(" \n \t\t\t\t[%d] %s: %s\n\n",np1->i,np1->name,np1->note);
    np1=np1->next;
    }
    printf(" \n \t\t\t\t以上是全部留言!\n");
    }

    struct info2 leavenote(struct info2 *head_note)
    {
    struct info2 *p,*p1,*p2;
    char note[500];
    char name[20];
    int i=1;
    p2=head_note;
    while(p2)
    {
    p1=p2;
    p2=p2->next;
    i++;
    }
    printf("\n\t\t\t\t请输入你的姓名:");
    scanf("%s",name);
    printf("\n\t\t\t\t请输入你的留言:");
    scanf("%s",note);
    p=(struct info2
    )malloc(sizeof(struct info2));
    p->i=i;
    strcpy(p->note,note);
    strcpy(p->name,name);
    p1->next=p;
    p->next=NULL;
    Savenote(head_note);
    }

    struct info2 *notesys(struct info2 *head_note)
    {
    int flag=1;
    struct info2 *np1;
    np1=head_note;
    int choice=0;
    system("cls");
    while(flag)
    {
    printf("\t\t\t\t ┏━━━━━━━━┳━━━━━━━━┓\n");
    printf("\t\t\t\t ┃[1]查看全部信息 ┃[2]留言 ┃\n");
    printf("\t\t\t\t ┣━━━━━━━━╋━━━━━━━━┫\n");
    printf("\t\t\t\t ┃ [0]退出留言系统 ┃\n");
    printf("\t\t\t\t ┗━━━━━━━━┻━━━━━━━━┛\n\n");
    printf("\t\t\t\t 请输入操作编号:");
    scanf("%d",&choice);
    switch(choice)
    {

        case 1:
            watchall(head_note);
            break;
        case 2:
            {
            if(head_note==NULL)
                    head_note=First2(head_note);
            else
            leavenote(head_note);
            break;
            }
        case 0:
            flag=0;
            break;
        default:
            printf("\n\t\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
            printf("\n\t\t\t\t┃请输入正确编号!┃\n");
            printf("\n\t\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
            break;
        }
    }
    

    }

    void stu_ui(struct stu *p)//学生界面
    {
    int z;
    system("cls");
    struct info2 *head_note=NULL;
    head_note=Rfile2(head_note);
    do
    {

        printf("\n\t\t\t--------------------------------\n");
        printf("\t\t\t+        %s,欢迎你          |\n",p->name);
        printf("\t\t\t--------------------------------\n");
        printf("\t\t\t+    [1]----修改个人信息       |\n");
        printf("\t\t\t+    [2]----选 课              |\n");
        printf("\t\t\t+    [3]----查询课程信息       |\n");
        printf("\t\t\t+    [4]----修改密码           |\n");
        printf("\t\t\t+    [5]----留言               |\n");
        printf("\t\t\t+    [0]----返回主界面         |\n");
        printf("\t\t\t--------------------------------\n");
        printf("请输入您的选择:");
        scanf("%d", &z);
        switch(z)
        {
        case 0 :break;
        case 1 :modify_stu(p);break;
        case 2 :select_s(p);break;
        case 3 :print_stu(p);break;
        case 4 :st_key_stu(p);break;
        case 5 :notesys(head_note);break;
        default:printf("\n无效选项!");
        }
     }while(z!=0);
    

    }

    void tec_ui(struct tec *p)//教师界面
    {
    int z;
    system("cls");
    do
    {
    printf("\n\t\t\t--------------------------------\n");
    printf("\t\t\t+ %s,欢迎您。 |\n",p->name);
    printf("\t\t\t--------------------------------\n");
    printf("\t\t\t+ [1]----修改个人信息 |\n");
    printf("\t\t\t+ [2]----登记学生分数 |\n");
    printf("\t\t\t+ [3]----查看所有学生 |\n");
    printf("\t\t\t+ [4]----按学号查看学生 |\n");
    printf("\t\t\t+ [5]----修改密码 |\n");
    printf("\t\t\t+ [0]----返回主界面 |\n");
    printf("\t\t\t--------------------------------\n");
    printf("请输入您的选择:");
    scanf("%d", &z);
    switch(z)
    {
    case 0 : break;
    case 1 :modify_tec(p);break;
    case 2 :tec_score(p);break;
    case 3 :skim_list_stu(p);break;
    case 4 :stu_score(p); break;
    case 5 :st_key_tec(p); break;
    default:printf("\n无效选项!");
    }
    }while(z!=0);
    }

    void adm_ui_1()//管理员界面1
    {
    int z;
    system("cls");
    do
    {
    printf("\n\t\t\t--------------------------------\n");
    printf("\t\t\t+ 管理员 |\n");
    printf("\t\t\t--------------------------------\n");
    printf("\t\t\t+ [1]----录入学生信息 |\n");
    printf("\t\t\t+ [2]----录入教师信息 |\n");
    printf("\t\t\t+ [3]----录入选课信息 |\n");
    printf("\t\t\t+ [4]----录入重修信息 |\n");
    printf("\t\t\t+ [5]----查询学生信息 |\n");
    printf("\t\t\t+ [6]----查询教师信息 |\n");
    printf("\t\t\t+ [7]----删除学生信息 |\n");
    printf("\t\t\t+ [8]----删除教师信息 |\n");
    printf("\t\t\t+ [9]----下一页 |\n");
    printf("\t\t\t+ [0]----退出系统 |\n");
    printf("\t\t\t--------------------------------\n");
    printf("请输入您的选择:");
    scanf("%d", &z);
    switch(z)
    {
    case 0 : break;
    case 1 :input_stu();break;
    case 2 :input_tec();break;
    case 3 :input_cla();break;
    case 4 :input_res(); break;
    case 5 :skim_stu(head); break;
    case 6 :skim_tec(head_tec); break;
    case 7 :del_stu(); break;
    case 8 :del_tec();break;
    case 9 :adm_ui_2();break;
    default:printf("\n无效选项!");
    }
    }
    while(z!=0);
    }

    void adm_ui_2()//管理员界面2
    {
    int z;
    system("cls");
    do
    {
    printf("\n\t\t\t--------------------------------\n");
    printf("\t\t\t+ 管理员 |\n");
    printf("\t\t\t--------------------------------\n");
    printf("\t\t\t+ [1]----删除重修信息 |\n");
    printf("\t\t\t+ [2]----修改学生信息 |\n");
    printf("\t\t\t+ [3]----修改教师信息 |\n");
    printf("\t\t\t+ [4]----按课程查看学生 |\n");
    printf("\t\t\t+ [5]----按班统计学生 |\n");
    printf("\t\t\t+ [6]----统计所有学生信息 |\n");
    printf("\t\t\t+ [7]----统计所有教师信息 |\n");
    printf("\t\t\t+ [8]----管理员密码修改 |\n");
    printf("\t\t\t+ [0]---- 上一页 |\n");
    printf("\t\t\t--------------------------------\n");
    printf("请输入您的选择:");
    scanf("%d", &z);
    switch(z)
    {
    case 0 : break;
    case 1 :del_res();break;
    case 2 :modify_stu_adm(); break;
    case 3 :modify_tec_adm(); break;
    case 4 :skim_stu_course(); break;
    case 5 :skim_stu_class(); break;
    case 6 :skim_stu_all(); break;
    case 7 :skim_tec_all();break;
    case 8 :adm_key();break;
    default:printf("\n无效选项!");
    }
    }
    while(z!=0);
    }

    void key_stu()//学生ID与密码验证
    {
    int z=0;
    z<=2;
    char key1[11];
    int id;
    struct stu p;
    do
    {
    printf("\n\t\t\t|&|
    ************学生登录*************|&|");
    printf("\n\t\t\t|&|----------------------------------|&|");
    printf("\n\t\t\t|&| .--. |&|");
    printf("\n\t\t\t|&| /.-. '--------------. |&|");
    printf("\n\t\t\t|&| \'-' .--''--'' -''-' |&|");
    printf("\n\t\t\t|&| '--' |&|");
    printf("\n\t\t\t|&|----------------------------------|&|");
    printf("\n请输入学生ID(8位数字):");
    scanf("%d",&id); fflush(stdin);
    printf("\n请输入密码(10位以内):");
    key(key1);fflush(stdin);
    p=head;
    while(p!=NULL)
    {
    if(p->id>=id) break;
    p=p->next;
    }
    if(p!=NULL)
    {
    if(strcmp(p->key,key1)==0)
    {
    stu_ui(p); break;
    }
    else
    {
    z++;
    printf("\n账号或密码有误,请重新输入(你还有%d次机会):",2-z);
    printf("\n请输入密码(10位以内):");
    key(key1);fflush(stdin);
    if(strcmp(p->key,key1)==0)
    {
    stu_ui(p); break;
    }
    }
    }
    else
    {
    printf("该生不存在。"); break;
    }
    }while(z!=2);
    }

    void key_tec()//教师ID与密码验证
    {
    int z=0;
    z<=2;
    char key1[11];
    int id;
    struct tec p;
    system("cls");
    do
    {
    printf("\n\t\t\t|&|
    ************教师登录*************|&|\t");
    printf("\n\t\t\t|&|----------------------------------|&|\t");
    printf("\n\t\t\t|&| .--. |&|\t");
    printf("\n\t\t\t|&| /.-. '--------------. |&|\t");
    printf("\n\t\t\t|&| \'-' .--''--'' -''-' |&|\t");
    printf("\n\t\t\t|&| '--' |&|\t");
    printf("\n\t\t\t|&|----------------------------------|&|\t");
    printf("\n请输入教师ID(8位数字):");
    scanf("%d",&id); fflush(stdin);
    printf("\n请输入密码(10位以内):");
    key(key1);fflush(stdin);
    p=head_tec;
    while(p!=NULL)
    {
    if(p->id>=id) break;
    p=p->next;
    }
    if(p!=NULL)
    {
    if(strcmp(p->key,key1)==0)
    {
    tec_ui(p); break;
    }
    else
    {
    z++;
    printf("\n账号或密码有误,请重新输入(你还有%d次机会):",2-z);
    printf("\n请输入密码(10位以内):");
    key(key1);fflush(stdin);
    if(strcmp(p->key,key1)==0)
    {
    tec_ui(p); break;
    }
    }
    }
    else
    {
    printf("\n对不起,该ID不存在,请查证后再输入。");
    break;
    }
    }while(z!=2);
    }

    void key_adm()//管理员密码验证 只要密码
    {
    int z=0;
    char key1[11];
    system("cls");
    do
    {
    printf("\n\t\t\t|&|*************管理员登录***********|&|\t");
    printf("\n\t\t\t|&|----------------------------------|&|\t");
    printf("\n\t\t\t|&| .--. |&|\t");
    printf("\n\t\t\t|&| /.-. '--------------. |&|\t");
    printf("\n\t\t\t|&| \'-' .--''--'' -''-' |&|\t");
    printf("\n\t\t\t|&| '--' |&|\t");
    printf("\n\t\t\t|&|----------------------------------|&|\t");
    printf("\n请输入密码(10位以内):");
    key(key1);
    if(strcmp(in1.key,key1)==0||strcmp(in2.key,key1)==0)
    {
    adm_ui_1(); break;
    }
    else
    {
    z++;
    printf("\n密码错误请重新输入(你还有%d次机会):",2-z);
    }
    }while(z!=2);
    }

    void st_key_stu(struct stu *p)//学生密码修改
    {
    char key1[11],key2[11];
    int z=1;
    system("cls");
    do
    {
    printf("\n请输入新密码:");
    key(key1); fflush(stdin);
    printf("\n请再次输入新密码:");
    key(key2); fflush(stdin);
    if(strcmp(key1,key2)==0)
    {
    strcpy(p->key,key1); printf("\n密码修改成功!");break;
    }
    else
    {
    printf("\n两次密码不一致,请重新输入,不再修改请输入0,继续修改请输入任何其余值.");
    scanf("%d",&z); fflush(stdin);
    }
    }while(z!=0);

    }

    void st_key_tec(struct tec *p)// 教师密码修改
    {
    char key1[11],key2[11];
    int z=1;
    system("cls");
    do
    {
    printf("\n请输入新密码:");
    key(key1); fflush(stdin);
    printf("\n请再次输入新密码:");
    key(key2); fflush(stdin);
    if(strcmp(key1,key2)==0)
    {
    strcpy(p->key,key1); printf("\n密码修改成功!"); break;
    }
    else
    {
    printf("\n两次密码不一致,请重新输入,不再修改请输入0,继续修改请输入任何其余值.");
    scanf("%d",&z); fflush(stdin);
    }
    }while(z!=0);

    }

    void adm_key()//管理员密码修改
    {
    int z=0;
    char key0[11],key1[11],key2[11];
    system("cls");
    do
    {
    printf("\n请输入原密码(10位以内):");
    key(key0); fflush(stdin);
    if(strcmp(in1.key,key0)==0||strcmp(in2.key,key0)==0)
    {
    break;
    }
    else
    {
    z++;
    printf("\n密码错误请重新输入(你还有%d次机会).",5-z);
    }
    }while(z!=5);
    if(z!=5)
    {
    do
    {
    printf("\n请输入新密码:");
    key(key1); fflush(stdin);
    printf("\n请再次输入新密码:");
    key(key2); fflush(stdin);
    if(strcmp(key1,key2)==0)
    {
    strcpy(in1.key,key1); break;
    }
    else
    {
    printf("\n两次密码不一致,请重新输入,不再修改请输入0,继续修改请输入1.");
    scanf("%d",&z);
    }
    }while(z!=0);

     }else exit(0);
    

    }

    void key(char *key)//以星号形式接受密码并放到地址key上
    {

    int i=0,j=0;

    char c;

    for(;;)

    {
    c=getch();

    if(j==0)
    {
        if((int)c==13)
        {
            printf("\n哦,不,你必须输入密码,这是规则!");
            printf("\n请输入密码:");
        }
        else if((int)c==8) *key='\0';
        else
        {
            j=1;*key=c;key++;i++;
            printf("*");
        }
    }
    else
    {
        if(i>=29 && (int)c!=13 && (int)c != 8 )
        {
            *key='\0';
        }
        else if((int)c==8)
        {
            if(i>0)
            {
            i--;
            key--;
            *key='\0';
            printf("\b");printf(" ");printf("\b");
            }
            else
            {
                j=0;
                *key='\0';
            }
        }
        else if((int)c==13)
        {
            break;
        }
        else
        {
            *key=c;
            key ++;
            i++;
            printf("*");
        }
    }
    

    }
    *key='\0';

    printf("\n");

    }

    void stu_score(struct tec * p) //教师查看学生分数 按id
    {
    struct cla *p1;
    struct res *p2;
    int id;
    int z=1;
    system("cls");

        printf("\n请输入学生ID:");
        scanf("%d",&id);fflush(stdin);
    do
    {
        p1=p->cla;
    while(p1!=NULL)
    {
         if(p1->id==id) break;
         p1=p1->tec;
    }
    if(p1!=NULL)
    {
        printf("\n---------------------------------------------------------------------");
        printf("\n学生ID>>>>学生姓名>>考试成绩>>>>平时成绩>>>>综合成绩>>>>重修成绩>>>>>>");
        printf("\n---------------------------------------------------------------------");
        printf("\n%d  %s   %.2f \t %.2f \t %.2f \t %.2f \t",p1->id,p1->stu_name,p1->e_score,p1->n_score,p1->t_score);
        p2=p1->res;
        while(p2!=NULL)
        {
             printf("(%d)%d  ",p2->times,p2->score);
             p2=p2->next;
        }
        z=0;
        getchar();
    }
    else
    {
         printf("\n找不到该学生!请重新输入ID(或者输入0结束查询):");
         scanf("%d",&id);
    }
    
    }while(id!=0&&z!=0);
    

    }

    void tec_score(struct tec * head) //give score to someone 教师给分
    {
    struct cla *p;
    int id;
    p=head->cla;
    system("cls");
    if(p==NULL)
    {
    printf("\n还没有学生选择你的课程。");
    }
    else
    {
    skim_list_stu(head);
    do
    {
    printf("\n请输入学生的ID:");
    scanf("%d",&id);
    while(id!=0)
    {
    while(p!=NULL)
    {
    if(p->id!=id)
    {p=p->tec; continue;}
    else
    {
    printf("\n请输入学生的分数(考试成绩 平时成绩):");
    scanf("%f",&p->e_score);
    scanf("%f",&p->n_score);
    if(p->e_score {
    p->t_score=p->e_score;
    }
    else
    {
    p->t_score=0.5*p->n_score+0.5*p->e_score;
    }
    printf("\n成功登记分数。");
    break;
    }
    }

             printf("\n请输入学生的ID(不再登记请输入0):");
              scanf("%d",&id);
            }
        }while(id!=0);
    
    }
    

    }

    int score_stu(struct stu* p) // 计算学生学分
    {
    int z=0;
    struct cla *p1;
    struct res *p2;
    p1=p->cla;
    while(p1!=NULL)
    {
    if(p1->e_score>=60)
    z+=p1->score;
    else
    {
    p2=p1->res;
    if(p2!=NULL)
    {
    while(p2!=NULL)
    {
    if(p2->score>=60)
    z=z+p1->score;
    p2=p2->next;
    }
    }
    }
    p1=p1->next;
    }
    return z;

    }

    void select_s(struct stu * p) //学生选课选修
    {
    struct tec p1;
    struct cla cla1;
    struct cla *cp;
    p1=head_tec;
    system("cls");
    printf("\n\t\t\t------------------------------------------");
    printf("\n\t\t\t
    **************课程列表*******************");
    printf("\n\t\t\t------------------------------------------");
    printf("\n\t\t\t教师>>>>学分>>>>>课程名称>>>>>>>课程编号>>");
    printf("\n\t\t\t------------------------------------------");
    while(p1!=NULL)
    {
    printf("\n\t\t\t%s \t%d\t%-10s\t%-10d",p1->name,p1->score,p1->cla_name,p1->cla_id);
    p1=p1->next;
    }
    printf("\n\t\t\t------------------------------------------");
    printf("\n请输入你要选的课程编号+课程名称(输入0返回学生主页):");
    scanf("%d%s",&cla1.id,cla1.name);
    if(cla1.name[0]!='0'&&cla1.id!=0)
    {
    cla1.id=p->id;
    cla1.e_score=0;
    cla1.n_score=0;
    cla1.t_score=0;
    cla1.score=0;
    cp=insert_cla1(cla1);
    insert_cla2(cp);
    printf("\n选课成功!");
    }
    getchar();
    }

    int idc(char id) //id装换 char 到int
    {
    int z=0;
    int i=0;
    int l,n=1;
    l=strlen(id);
    for(i=0;i<l;i++)
    {
    n
    =10;
    }
    i=0;
    n/=10;
    while(id[i]!='\0')
    {
    z=z+((int)id[i]-48)*n;
    i++;
    n/=10;
    }
    return z;
    }

    点赞 评论
  • shen_wei
    shen_wei 2017-06-05 08:17

    使用这样发帖。。。或者做一个网盘提供下载。。。代码不全!!!

    点赞 评论

相关推荐