练习项目:学校管理系统

一、项目要求:

本项目管理三种身份人员的信息:

  1. 管理员(仅一个):姓名:admin 密码:

  2. 教师(多个):姓名、密码、工号、性别、出生日期、

  3. 学生(多个):姓名、密码、学号、性别、出生日期、数学、语文、英语三门功课成绩

管理员登录后可以进行如下操作:

  1. 修改自身登录密码

  2. 添加新教师

  3. 查看所有教师

  4. 删除教师

  5. 修改教师信息

教师登录后可以进行如下操作:

    1. 修改自身登录密码
    2. 查阅自身信息
    3. 添加新学生
    4. 删除学生
    5. 查阅指定学生信息
    6. 修改学生信息(姓名、性别、出生日期、三门功课成绩)
    7. 按学号从低到高查看所有学生信息
    8. 按数学成绩从高到低查看所有学生信息
    9. 按语文成绩从高到低查看所有学生信息
    10. 按英语成绩从高到低查看所有学生信息
    11. 按总分从高到低查看所有学生信息

学生登录后可以进行如下操作:

   1. 修改自身登录密码
   2. 查阅自身信息

二、项目思路

整体思路MCV模式

1. model模块包含管理员,教师以及学生

1)管理员模块里包含:

因为只需要一个,我用了个结构体数组来保存管理员数据

管理员角色数据类型:账号、密码

保存管理员数据到文件的函数:这里用了文件的读写操作来保存和加载数据

从文件中读取管理员数据的函数:同样这里用了文件的读写操作来保存和加载数据

2)教师模块里包含:

这里我采用了带头结点单向链表来管理多个教师角色

教师的数据类型

教师链表相关操作函数:

创建结点

增删改查等操作

释放整个链表等等

保存和加载教师数据函数

3)学生模块里包含:

这里我也采用了带头结点单向链表来管理多个学生角色

和教师模块类似

2.viewer模块

负责界面相关函数

3.Controller模块

调用Viewer模块和三个Model模块提供的函数串接成完整的最终程序

三、代码

1. .h文件

1)管理员模块

//定义管理员结构体信息
struct admin_info{
    char admin_name[32];
    char admin_pswd[18];
}a[1];

void admin_logon(struct admin_info a[]);
void admin_read(struct admin_info a[]);
void admin_read1(struct admin_info a[]);
void mod_admin_pswd(struct admin_info a[]);
void save_admin(struct admin_info a[]);

2) viewer界面

void first_menu();
void login_mode_menu();
void admin_menu();
void mod_tch_menu();
void tch_menu();
void mod_stu_menu();
void stu_menu();
void sec_menu();

3)密码模块

int admin_login(struct admin_info a[]);
int tch_login(struct tch_info *head1,int number);
int stu_login(struct stu_info *head2,int number);

4)学生模块

//定义学生结构体信息
struct stu_info{
    char stu_name[32];
    int stu_num;
    char stu_pswd[18];
    char stu_gender[5];
    char stu_birth[20];
    double math;
    double chinese;
    double english; 
    double total;
    struct stu_info *next;
};

struct stu_info *create_stu_node();
void add_stu(struct stu_info *head2);
void save_stu(struct stu_info *head2);
void read_stu(struct stu_info *head2);
void show_stu(struct stu_info *head2,int key);
struct stu_info *search_stu(struct stu_info *head2,int number);
void del_stu(struct stu_info *head2);
void mod_stu(struct stu_info *head2);
void mod_stu_pswd(struct stu_info *head2,int number);
void show_self_info_stu(struct stu_info *head2,int number);

5)老师模块

//定义教师结构体信息
struct tch_info{
    char tch_name[32];
    int tch_num;
    char tch_pswd[18];
    char tch_gender[5];
    char tch_birth[20];
    struct tch_info *next;
};

struct tch_info *create_tch_node();
void add_tch(struct tch_info *head1);
void save_tch(struct tch_info *head1);
void read_tch(struct tch_info *head1);
void show_tch(struct tch_info *head1);
struct tch_info *search_tch(struct tch_info *head1,int num);
void del_tch(struct tch_info *head1);
void mod_tch(struct tch_info *head1);
void mod_tch_pswd(struct tch_info *head1,int number);
void show_self_info(struct tch_info *head1,int number);

2.  .c文件

1)主函数部分

main函数,包含了项目的整体的框架。

管理员的登录操作——>选择登录方式——>管理员模式 or 老师模式 or 学生模式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../inc/menu.h"
#include "../inc/admin.h"
#include "../inc/teacher.h"
#include "../inc/student.h"
#include "../inc/pswd.h"

int main(){
    struct tch_info *head1=NULL;
    struct stu_info *head2=NULL;
    head1=create_tch_node();
    head2=create_stu_node();
    int ret,ret1,ret2,choose,choose1,input,input1,input2,input3;
    int flag=1;


//注册管理员账号or其他账号登录
    first_menu();
    scanf("%d",&choose);
    while(getchar()!='\n');
    switch(choose){
        case 1:
            //已有管理员账号,加载账号信息
            admin_read(a);
            break;
        case 2:
            //注册管理员账号
            admin_read1(a);
            //若账号已存在,用户选择 1--重置账号 2--进入下级菜单
            if(strlen(a[0].admin_name)>0){
                printf("账号已存在\n");
                sec_menu();
                scanf("%d",&choose1);
                while(getchar()!='\n');
                switch(choose1){
                    case 1:
                        admin_logon(a);
                        break;
                    default:
                        break;
                }
            }
            else  admin_logon(a);
            break;
        case 3:
            //进入下级菜单  不加载管理员账号信息
            break;
        case 0:
            exit(-1);
            break;
        default:
            printf("无效参数\n");
            exit(-1);
            break;
    }


    //加载教师数据  不能放在while里循环加载
    read_tch(head1);
    //加载学生数据
    read_stu(head2);
    //选择登录模式
    while(flag){
        int flag1=1;
        int flag2=1;
        int flag3=1;
        int number,number1,number2;
        struct stu_info *psearch=NULL;
        login_mode_menu();
        scanf("%d",&input);
        while(getchar()!='\n');
        switch(input){
//管理员模式————————————————————————————————————————————————————————————————————
            case 1:
                //用户名密码判断
                ret=admin_login(a);
                if(ret==0){        //正确登录
                    while(flag1){
                        admin_menu();
                        scanf("%d",&input1);
                        while(getchar()!='\n');
                        switch(input1){
                            //修改密码
                            case 1:
                                mod_admin_pswd(a);
                                break;
                            //添加教师
                            case 2:
                                add_tch(head1);
                                break;
                            //查看教师
                            case 3:
                                show_tch(head1);
                                break;
                            //删除教师
                            case 4:
                                del_tch(head1);
                                break;
                            //修改教师信息
                            case 5:
                                mod_tch(head1);
                                break;
                            //返回上一层
                            case 0:
                                flag1=0;
                                //保存管理员密码
                                save_admin(a);
                                //保存教师数据
                                save_tch(head1);
                                break;
                            default:
                                printf("无效参数,请重新输入\n");
                                break;
                        }
                    }
                }
                break;
//老师模式———————————————————————————————————————————————————————————————————————
            case 2:
                printf("工号:");
                scanf("%d",&number);
                while(getchar()!='\n');
                //判断教师密码
                ret1=tch_login(head1,number);
                if(ret1==0){  //成功登录
                    while(flag2){
                        tch_menu();
                        scanf("%d",&input2);
                        while(getchar()!='\n');
                        switch(input2){
                            //修改自身登录密码
                            case 1:
                                mod_tch_pswd(head1,number);
                                break;
                            //查阅自身信息
                            case 2:
                                show_self_info(head1,number);
                                break;
                            //添加学生
                            case 3:
                                add_stu(head2);
                                break;
                            //删除学生
                            case 4:
                                del_stu(head2);
                                break;
                            //查阅指定学生信息
                            case 5:
                                printf("请输入需要查找的学生学号:");
                                scanf("%d",&number1);
                                while(getchar()!='\n');
                                psearch=search_stu(head2,number1);
                                if(psearch==NULL)
                                    printf("查找失败,无此学号\n");
                                else
                                    printf("姓名:%s 学号:%d 性别:%s 出生日期:%s 数学成绩:%.1lf 语文成绩:%.1lf 英语成绩:%.1lf 总成绩:%.1lf\n",\
                                        psearch->stu_name,psearch->stu_num,psearch->stu_gender,psearch->stu_birth,psearch->math,psearch->chinese,\
                                        psearch->english,psearch->total);
                                break;
                            //修改学生信息
                            case 6:
                                mod_stu(head2);
                                break;
                            //按学号从低到高排序
                            case 7:
                                show_stu(head2,4);
                                break;
                            //按数学成绩从高到低排序
                            case 8:
                                show_stu(head2,1);
                                break;
                            //按语文成绩从高到低排序
                            case 9:
                                show_stu(head2,2);
                                break;
                            //按英语成绩从高到低排序
                            case 10:
                                show_stu(head2,3);
                                break;
                            //按总分成绩从高到低排序
                            case 11:
                                show_stu(head2,0);
                                break;
                            case 0:
                                flag2=0;
                                //保存教师密码数据
                                save_tch(head1);
                                //保存学生数据
                                save_stu(head2);
                                break;
                            default:
                                printf("无效参数,请重新输入\n");
                                break;
                        }
                    }
                }
                break;
//学生模式——————————————————————————————————————————————————————————————————————
            case 3:
                printf("学号:");
                scanf("%d",&number2);
                while(getchar()!='\n');
                //判断学生密码
                ret2=stu_login(head2,number2);
                if(ret2==0){  //成功登录
                    while(flag3){
                        stu_menu();
                        scanf("%d",&input3);
                        while(getchar()!='\n');
                        switch(input3){
                            //修改密码
                            case 1:
                                mod_stu_pswd(head2,number2);
                                break;
                            //查看自身信息
                            case 2:
                                show_self_info_stu(head2,number2);
                                break;
                            //退出
                            case 0:
                                flag3=0;
                                //保存学生密码
                                save_stu(head2);
                                break;
                            default:
                                printf("无效参数,请重新输入\n");
                                break;
                        }
                    }
                }
                break;

            //退出
            case 0:
                flag=0;
                break;
            default:
                printf("无效参数,请重新输入\n");
                break;
        }
    }
    return 0;
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

2)viewer界面

#include <stdio.h>
//判断用户是否已有管理员账号
void first_menu(){
    printf("——————————————————————————————————————————\n");
    printf("|********欢迎登录学校信息管理系统********|\n");
    printf("——————————————————————————————————————————\n");
    printf("|            1.已有管理员账号            |\n");
    printf("——————————————————————————————————————————\n");
    printf("|            2.注册管理员账号            |\n");
    printf("——————————————————————————————————————————\n");
    printf("|            3.其他用户登录              |\n");
    printf("——————————————————————————————————————————\n");
    printf("|            0.退出系统                  |\n");
    printf("——————————————————————————————————————————\n");
    printf("请输入:");
}
// 判断管理员账号是存在后的选择菜单
void sec_menu(){
    printf("——————————————————————————————————————————\n");
    printf("|********欢迎登录学校信息管理系统********|\n");
    printf("——————————————————————————————————————————\n");
    printf("|             1.重置账号                 |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             2.进入下级菜单             |\n");
    printf("——————————————————————————————————————————\n");
    printf("请输入:");
}
//选择登录身份
void login_mode_menu(){
    printf("——————————————————————————————————————————\n");
    printf("|********欢迎登录学校信息管理系统********|\n");
    printf("——————————————————————————————————————————\n");
    printf("|                1.管理员                |\n");
    printf("——————————————————————————————————————————\n");
    printf("|                2.教师                  |\n");
    printf("——————————————————————————————————————————\n");
    printf("|                3.学生                  |\n");
    printf("——————————————————————————————————————————\n");
    printf("|                0.退出系统              |\n");
    printf("——————————————————————————————————————————\n");
    printf("请输入:");
}
//管理员界面
void admin_menu(){
    printf("——————————————————————————————————————————\n");
    printf("|********欢迎登录学校信息管理系统********|\n");
    printf("——————————————————————————————————————————\n");
    printf("|             1.修改账号密码             |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             2.添加新教师               |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             3.查看所有教师信息         |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             4.删除教师                 |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             5.修改教师信息             |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             0.放回上一层               |\n");
    printf("——————————————————————————————————————————\n");
    printf("请输入:");
}
//修改教师信息的菜单
void mod_tch_menu(){
    printf("——————————————————————————————————————————\n");
    printf("|********欢迎登录学校信息管理系统********|\n");
    printf("——————————————————————————————————————————\n");
    printf("|              1.修改教师姓名            |\n");
    printf("——————————————————————————————————————————\n");
    printf("|              2.修改教师工号            |\n");
    printf("——————————————————————————————————————————\n");
    printf("|              3.修改教师性别            |\n");
    printf("——————————————————————————————————————————\n");
    printf("|              4.修改教师出生日期        |\n");
    printf("——————————————————————————————————————————\n");
    printf("|              0.放回上一层              |\n");
    printf("——————————————————————————————————————————\n");
    printf("请输入:");
}

//教师界面
void tch_menu(){
    printf("——————————————————————————————————————————\n");
    printf("|********欢迎登录学校信息管理系统********|\n");
    printf("——————————————————————————————————————————\n");
    printf("|        1.修改账号密码                  |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        2.查看账号信息                  |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        3.添加新学生                    |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        4.删除学生                      |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        5.按条件查找学生                |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        6.修改学生信息                  |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        7.按学号从小到大排序查看        |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        8.按数学成绩从高到低排序查看    |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        9.按语文成绩从高到低排序查看    |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        10.按英语成绩从高到低排序查看   |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        11.按总分从高到低排序查看       |\n");
    printf("——————————————————————————————————————————\n");
    printf("|        0.返回上一层                    |\n");
    printf("——————————————————————————————————————————\n");
    printf("请输入:");
}

//修改学生信息的菜单
void mod_stu_menu(){
    printf("——————————————————————————————————————————\n");
    printf("|********欢迎登录学校信息管理系统********|\n");
    printf("——————————————————————————————————————————\n");
    printf("|             1.修改学生姓名             |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             2.修改学生学号             |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             3.修改学生性别             |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             4.修改学生出生日期         |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             5.修改学生数学成绩         |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             6.修改学生语文成绩         |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             7.修改学生英语成绩         |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             0.放回上一层               |\n");
    printf("——————————————————————————————————————————\n");
    printf("请输入:");
}

//学生界面
void stu_menu(){
    printf("——————————————————————————————————————————\n");
    printf("|********欢迎登录学校信息管理系统********|\n");
    printf("——————————————————————————————————————————\n");
    printf("|             1.修改账号密码             |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             2.查看账号信息             |\n");
    printf("——————————————————————————————————————————\n");
    printf("|             0.返回上一层               |\n");
    printf("——————————————————————————————————————————\n");
    printf("请输入:");
}                       

3)管理员模块

管理员自身的密码管理

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <string.h>
#include "../inc/admin.h"


//注册账号
void admin_logon(struct admin_info a[]){
    int choose;
    FILE *fp=NULL;
    fp=fopen("../file/user.txt","w");
    if(fp==NULL){
        perror("fopen");
        return;
    }
    //注册管理员账号
    printf("请输入管理员名:");
    scanf("%s",a[0].admin_name);
    while(getchar()!='\n');
    printf("请输入密码:");
    scanf("%s",a[0].admin_pswd);
    while(getchar()!='\n');
    fprintf(fp,"%s\t%s\n",a[0].admin_name,a[0].admin_pswd);

    printf("账号注册成功\n");
    fclose(fp);
    return;
}

//加载账号
void admin_read(struct admin_info a[]){
    FILE *fp=NULL;
    fp=fopen("../file/user.txt","r");
    if(fp==NULL){
        perror("fopen");
        exit(-1);
    }

    fscanf(fp,"%s\t%s\n",a[0].admin_name,a[0].admin_pswd);
    if(strlen(a[0].admin_name)<=0){
        printf("您无账号,请先注册\n");
        fclose(fp);
        exit(-1);
    }

    fclose(fp);
    char buff[25];
    memset(buff,'\0',25);
    puts("加载中...");
    for(int i=0;i<25;i++){
        printf("%-24s[%d%%]\r",buff,(i+1)*4);
        fflush(stdout);
        buff[i]='.';
        usleep(100000);
    }
    printf("\n");
    return;
}

void admin_read1(struct admin_info a[]){
    FILE *fp=NULL;
    fp=fopen("../file/user.txt","r");
    if(fp==NULL){
        perror("fopen");
        exit(-1);
    }

    fscanf(fp,"%s\t%s\n",a[0].admin_name,a[0].admin_pswd);
    fclose(fp);
    return;
}


//修改管理员密码
void mod_admin_pswd(struct admin_info a[]){
    printf("请输入修改后的密码:");
    scanf("%s",a[0].admin_pswd);
    while(getchar()!='\n');

    printf("密码修改成功\n");
    return;
}

//保存数据
void save_admin(struct admin_info a[]){
    FILE *fp=NULL;
    fp=fopen("../file/user.txt","w");
    if(fp==NULL){
        perror("fopen");
        exit(-1);
    }

    fprintf(fp,"%s\t%s\n",a[0].admin_name,a[0].admin_pswd);
    fclose(fp);
    return;
}

管理教师

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "../inc/teacher.h"
#include "../inc/menu.h"
//创建结点
struct tch_info *create_tch_node(){
    struct tch_info *pnew=NULL;
    pnew=(struct tch_info *)malloc(sizeof(struct tch_info));
    assert(pnew!=NULL);
    pnew->next=NULL;
    return pnew;
}
//保存数据
void save_tch(struct tch_info *head1){
    FILE *fp=NULL;
    fp=fopen("../file/tch.txt","w");
    if(fp==NULL){
        perror("fopen");
        return;
    }   

    int ret;
    struct tch_info *p=head1->next;
    while(p!=NULL){
        ret=fprintf(fp,"%s\t%d\t%s\t%s\t%s\n",p->tch_name,p->tch_num,p->tch_pswd,p->tch_gender,p->tch_birth);
        if(ret<0){
            perror("fprintf");
            fclose(fp);
            return;
        }
        p=p->next;
    }   

    fclose(fp);
    return;
}

//加载数据
void read_tch(struct tch_info *head1){
    FILE *fp=NULL;
    fp=fopen("../file/tch.txt","r");
    if(fp==NULL){
        perror("fopen");
        return;
    }   

    int ret;
    struct tch_info *pnew=head1->next;
    while(1){
        pnew=create_tch_node();
        ret=fscanf(fp,"%s\t%d\t%s\t%s\t%s\n",pnew->tch_name,&pnew->tch_num,pnew->tch_pswd,pnew->tch_gender,pnew->tch_birth);
        if(ret==EOF){
            break;
        }
        //头插法
        pnew->next=head1->next;
        head1->next=pnew;
    }   

    fclose(fp);
    return;
}
//添加教师
void add_tch(struct tch_info *head1){
    struct tch_info *pnew=head1->next;
    struct tch_info *p=head1->next;
    pnew=create_tch_node();

    printf("请输入老师姓名:");
    scanf("%s",pnew->tch_name);
    while(getchar()!='\n');
    printf("请输入老师工号:");
    scanf("%d",&pnew->tch_num);
    while(getchar()!='\n');
    //判断工号是否重复
    while(p!=NULL){
        if(pnew->tch_num==p->tch_num){
            printf("工号重复\n");
            return;
        }
        p=p->next;
    }   

    printf("请输入老师密码:");
    scanf("%s",pnew->tch_pswd);
    while(getchar()!='\n');
    printf("请输入老师性别(男or女):");
    scanf("%s",pnew->tch_gender);
    while(getchar()!='\n');
    printf("请输入老师出生日期(2000-9-10):");
    scanf("%s",pnew->tch_birth);
    while(getchar()!='\n');
    //头插法
    pnew->next=head1->next;
    head1->next=pnew;
    printf("添加成功\n");
    return;
}
//根据工号升序排序
static void sort_tch_rise(struct tch_info *head1){
    struct tch_info *headn=head1->next;
    head1->next=NULL;
    struct tch_info *p=NULL;
    struct tch_info *pmax=NULL;
    struct tch_info *new_head=NULL;
    while(headn!=NULL){
        //找到最大值
        pmax=headn;
        p=headn;
        while(p!=NULL){
            if(pmax->tch_num<p->tch_num){
                pmax=p;
            }
            p=p->next;
        }

        //移走最大值
        if(pmax==headn){
            headn=headn->next;
        }
        else{
            p=headn;
            //找pmax前一位结点
            while(p->next!=pmax){
                p=p->next;
            }
            p->next=pmax->next;
        }
        pmax->next=NULL;

        //将最大值添加到新链表
        pmax->next=new_head;
        new_head=pmax;
    }   
    //将头与new_head连起来
    head1->next=new_head;
}
//显示教师信息
void show_tch(struct tch_info *head1){
    //显示前先排序
    sort_tch_rise(head1);
    if(head1->next==NULL){
        printf("无教师信息\n");
        return;
    }   
    struct tch_info *p=head1->next;
    printf("姓名\t工号\t性别\t出生日期\n");
    while(p!=NULL){
        printf("%s\t%d\t%s\t%s\n",p->tch_name,p->tch_num,p->tch_gender,p->tch_birth);
        p=p->next;
    }   
    return;
}
//根据工号查找教师
//成功返回查找的结点
//失败返回NULL
struct tch_info *search_tch(struct tch_info *head1,int num){
    if(head1->next==NULL){
        printf("无教师信息\n");
        return NULL;
    }   

    struct tch_info *p=head1->next;
    while(p!=NULL){
        if(p->tch_num==num){
            return p;
        }
        p=p->next;
    }   
    printf("无此工号\n");
    return NULL;
}
//删除教师
void del_tch(struct tch_info *head1){
    int num;
    struct tch_info *pdel=NULL;
    struct tch_info *p=head1;
    printf("请输入待删除的教师的工号:");
    scanf("%d",&num);
    while(getchar()!='\n');
    //根据工号查找到需要删除的结点
    pdel=search_tch(head1,num);
    //判断pdel的值,若为空则无此工号
    if(pdel==NULL){
        return;
    }   
    //找到pdel前一个结点
    while(p->next!=pdel){
        p=p->next;
    }   
    p->next=pdel->next;
    free(pdel);
    printf("删除成功\n");
    return;
}

//修改教师信息
void mod_tch(struct tch_info *head1){
    struct tch_info *pmod=NULL;
    struct tch_info *p=head1->next;
    int flag=1;
    int choose,num,number;
    printf("请输入待修改的教师的工号:");
    scanf("%d",&num);
    while(getchar()!='\n');
    //根据工号查找到需要修改的结点
    pmod=search_tch(head1,num);
    if(pmod==NULL){
        return;
    }   
    while(flag){
        mod_tch_menu();
        scanf("%d",&choose);
        while(getchar()!='\n');
        switch(choose){
            case 1:
                //修改姓名
                printf("请输入修改后的姓名:");
                scanf("%s",pmod->tch_name);
                while(getchar()!='\n');
                printf("修改姓名成功\n");
                break;
            case 2:
                //修改工号
                printf("请输入修改后的工号:");
                scanf("%d",&number);
                while(getchar()!='\n');
                //判断修改后的工号是否重复
                while(p!=NULL){
                    if(p->tch_num==number){
                        printf("修改失败,已存在此工号\n");
                        return;
                    }
                    else p=p->next;
                }
                //若不重复则赋值给pmod->num
                pmod->tch_num=number;
                printf("修改工号成功\n");
                break;
            case 3:
                //修改性别
                printf("请输入修改后的性别(男or女):");
                scanf("%s",pmod->tch_gender);
                while(getchar()!='\n');
                printf("修改性别成功\n");
                break;
            case 4:
                //修改出生日期
                printf("请输入修改后的出生日期(2000-1-1):");
                scanf("%s",pmod->tch_birth);
                while(getchar()!='\n');
                printf("修改出生日期成功\n");
                break;
            case 0:
                flag=0;
                break;
            default:
                printf("无效参数,请重新输入\n");
                break;
        }
    }
}

//修改教师密码
void mod_tch_pswd(struct tch_info *head1,int number){
    struct tch_info *psearch=NULL;
    //根据工号找到对应结点
    psearch=search_tch(head1,number);
    if(psearch==NULL){
        return;
    }

    printf("请输入修改后的密码:");
    scanf("%s",psearch->tch_pswd);
    while(getchar()!='\n');

    printf("密码修改成功\n");
    return;
}


//查阅自身信息
void show_self_info(struct tch_info *head1,int number){
    struct tch_info *psearch=NULL;
    //根据工号找到对应结点
    psearch=search_tch(head1,number);
    if(psearch==NULL){
        return;
    }

    printf("姓名:%s 工号:%d 性别:%s 出生日期:%s\n",\
            psearch->tch_name,psearch->tch_num,psearch->tch_gender,psearch->tch_birth);
    return;
}

4)教师及学生模块


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "../inc/student.h"
#include "../inc/menu.h"


//创建结点
struct stu_info *create_stu_node(){
    struct stu_info *pnew=NULL;
    pnew=(struct stu_info *)malloc(sizeof(struct stu_info));
    assert(pnew!=NULL);
    pnew->next=NULL;
    return pnew;
}
//添加学生
void add_stu(struct stu_info *head2){
    struct stu_info *pnew=NULL;
    pnew=create_stu_node();
    struct stu_info *p=head2->next;

    printf("请输入学生姓名:");
    scanf("%s",pnew->stu_name);
    while(getchar()!='\n');
    printf("请输入学生学号:");
    scanf("%d",&pnew->stu_num);
    while(getchar()!='\n');
    //判断学号是否重复
    while(p!=NULL){
        if(p->stu_num==pnew->stu_num){
            printf("学号重复\n");
            return;
        }
        p=p->next;
    }
    printf("请输入学生密码:");
    scanf("%s",pnew->stu_pswd);
    while(getchar()!='\n');
    printf("请输入学生性别(男or女):");
    scanf("%s",pnew->stu_gender);
    while(getchar()!='\n');
    printf("请输入学生出生日期(2000-1-1):");
    scanf("%s",pnew->stu_birth);
    while(getchar()!='\n');
    printf("请输入学生数学成绩:");
    scanf("%lf",&pnew->math);
    while(getchar()!='\n');
    printf("请输入学生语文成绩:");
    scanf("%lf",&pnew->chinese);
    while(getchar()!='\n');
    printf("请输入学生英语成绩:");
    scanf("%lf",&pnew->english);
    while(getchar()!='\n');
    pnew->total=pnew->math+pnew->chinese+pnew->english;

    pnew->next=head2->next;
    head2->next=pnew;
    printf("添加成功\n");
    return;
}

//保存学生数据
void save_stu(struct stu_info *head2){
    FILE *fp=NULL;
    fp=fopen("../file/stu.txt","wb");
    if(fp==NULL){
        perror("fopen");
        return;
    }

    struct stu_info *p=head2->next;
    int ret;
    while(p!=NULL){
        ret=fwrite(p,sizeof(struct stu_info),1,fp);
        if(ret<0){
            perror("fwrite");
            fclose(fp);
            return;
        }
        p=p->next;
    }

    fclose(fp);
    printf("保存成功\n");
    return;
}

//加载学生数据
void read_stu(struct stu_info *head2){
    FILE *fp=NULL;
    fp=fopen("../file/stu.txt","rb");
    if(fp==NULL){
        perror("fopen");
        return;
    }

    int ret;
    struct stu_info *pnew=NULL;
    while(1){
        pnew=create_stu_node();
        ret=fread(pnew,sizeof(struct stu_info),1,fp);
        if(ret==0){
            break;
        }
        pnew->next=head2->next;
        head2->next=pnew;
    }


    fclose(fp);
    printf("加载成功\n");
    return;
}
//按学号从小到大排序
static void sort_stu_by_num_rise(struct stu_info *head2){
    struct stu_info *headn=head2->next;
    head2->next=NULL;
    struct stu_info *pmax=NULL;
    struct stu_info *p=NULL;
    struct stu_info *new_head=NULL;

    while(headn!=NULL){
        //找学号是最大的结点
        pmax=headn;
        p=headn;
        while(p!=NULL){
            if(pmax->stu_num<p->stu_num){
                pmax=p;
            }
            p=p->next;
        }

        //移走最大值结点
        if(headn==pmax){
            headn=headn->next;
        }
        else{
            p=headn;
            while(p->next!=pmax){
                p=p->next;
            }
            p->next=pmax->next;
        }
        pmax->next=NULL;

        //添加最大值结点到新链表
        pmax->next=new_head;
        new_head=pmax;
    }
    //将头与new_head连接
    head2->next=new_head;
    return;
}
//按成绩来排序
static void sort_stu_by_score_fall(struct stu_info *head2,int key){
    struct stu_info *headn=head2->next;
    head2->next=NULL;
    struct stu_info *pmin=NULL;
    struct stu_info *p=NULL;
    struct stu_info *new_head=NULL;

    while(headn!=NULL){
        //找数学成绩最小的结点
        pmin=headn;
        p=headn;
        //key=1代表按数学成绩排序
        if(key==1){
            while(p!=NULL){
                if(pmin->math>p->math){
                    pmin=p;
                }
                p=p->next;
            }
        }
        //key=2代表按语文成绩排序
        else if(key==2){
            while(p!=NULL){
                if(pmin->chinese>p->chinese){
                    pmin=p;
                }
                p=p->next;
            }
        }
        //key=3代表按英语成绩排序
        else if(key==3){
            while(p!=NULL){
                if(pmin->english>p->english){
                    pmin=p;
                }
                p=p->next;
            }
        }
        //key=0代表按总成绩排序
        else if(key==0){
            while(p!=NULL){
                if(pmin->total>p->total){
                    pmin=p;
                }
                p=p->next;
            }
        }
        //移走最小值结点
        if(headn==pmin){
            headn=headn->next;
        }
        else{
            p=headn;
            while(p->next!=pmin){
                p=p->next;
            }
            p->next=pmin->next;
        }
        pmin->next=NULL;

        //添加最小值结点到新链表
        pmin->next=new_head;
        new_head=pmin;
    }
    //将头与new_head连接
    head2->next=new_head;
    return;
}

//显示学生信息
void show_stu(struct stu_info *head2,int key){
    if(head2->next==NULL){
        printf("无学生信息\n");
        return;
    }
    //key=4代表按学号排序
    if(key==4){
        sort_stu_by_num_rise(head2);
    }
    //key=1代表按数学成绩排序
    else if(key==1){
        sort_stu_by_score_fall(head2,1);
    }
    //key=2代表按语文成绩排序
    else if(key==2){
        sort_stu_by_score_fall(head2,2);
    }
    //key=3代表按英语成绩排序
    else if(key==3){
        sort_stu_by_score_fall(head2,3);
    }
    //key=0代表按总成绩成绩排序
    else if(key==0){
        sort_stu_by_score_fall(head2,0);
    }
    struct stu_info *p=head2->next;
    printf("姓名\t学号\t性别\t出生日期\t数学\t语文\t英语\t总成绩\n");
    while(p!=NULL){
        printf("%s\t%d\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n",\
                p->stu_name,p->stu_num,p->stu_gender,p->stu_birth,p->math,p->chinese,p->english,p->total);
        p=p->next;
    }
    return;
}

//查阅学生
//成功返回对应结点
//失败返回NULL
struct stu_info *search_stu(struct stu_info *head2,int number){
    if(head2->next==NULL){
        printf("无学生信息\n");
            return NULL;
    }
    struct stu_info *psearch=head2->next;
    while(psearch!=NULL){
        if(psearch->stu_num==number){
            return psearch;
        }
        psearch=psearch->next;
    }
    printf("无此学号\n");
    return NULL;
}
//删除学生
void del_stu(struct stu_info *head2){
    int number;
    struct stu_info *pdel=NULL;
    struct stu_info *p=head2;
    printf("请输入待删除的学生的学号:");
    scanf("%d",&number);
    while(getchar()!='\n');
    //根据学号查找到需要删除的结点
    pdel=search_stu(head2,number);
    if(pdel==NULL){
        return;
    }
    //找到pdel前一位结点
    while(p->next!=pdel){
        p=p->next;
    }
    p->next=pdel->next;
    free(pdel);
    printf("删除成功\n");
    return;
}

//修改学生信息
void mod_stu(struct stu_info *head2){
    struct stu_info *pmod=NULL;
    struct stu_info *p=head2->next;
    int number,choose,num;
    int flag=1;
    printf("请输入待修改的学生的学号:");
    scanf("%d",&number);
    while(getchar()!='\n');
    //找到待修改的结点
    pmod=search_stu(head2,number);

    while(flag){
        mod_stu_menu();
        scanf("%d",&choose);
        while(getchar()!='\n');
        switch(choose){
            //修改姓名
            case 1:
                printf("请输入修改后的姓名:");
                scanf("%s",pmod->stu_name);
                while(getchar()!='\n');
                printf("修改姓名成功\n");
                break;
            //修改学号
            case 2:
                printf("请输入修改后的学号:");
                scanf("%d",&num);
                while(getchar()!='\n');
                //判断修改后的学号是否重复
                while(p!=NULL){
                    if(p->stu_num==num){
                        printf("修改失败,学号已存在\n");
                        return;
                    }
                    else p=p->next;
                }
                //若不重复则赋值
                pmod->stu_num=num;
                printf("修改学号成功\n");
                break;
            //修改性别
            case 3:
                printf("请输入修改后的性别(男or女):");
                scanf("%s",pmod->stu_gender);
                while(getchar()!='\n');
                printf("修改性别成功\n");
                break;
            //修改出生日期
            case 4:
                printf("请输入修改后的出生日期(2000-1-1):");
                scanf("%s",pmod->stu_birth);
                while(getchar()!='\n');
                printf("修改出生日期成功\n");
                break;
            //修改数学成绩
            case 5:
                printf("请输入修改后的数学成绩:");
                scanf("%lf",&pmod->math);
                while(getchar()!='\n');
                printf("修改数学成绩成功\n");
                break;
            //修改语文成绩
            case 6:
                printf("请输入修改后的语文成绩:");
                scanf("%lf",&pmod->chinese);
                while(getchar()!='\n');
                printf("修改语文成绩成功\n");
                break;
            //修改英语成绩
            case 7:
                printf("请输入修改后的英语成绩:");
                scanf("%lf",&pmod->english);
                while(getchar()!='\n');
                printf("修改英语成绩成功\n");
                break;
            case 0:
                //返回时更新下总成绩
                pmod->total=pmod->math+pmod->chinese+pmod->english;
                flag=0;
                break;
            default:
                printf("无效参数,请重新输入\n");
                break;
        }
    }
}



//学生模块
//学生修改密码
void mod_stu_pswd(struct stu_info *head2,int number){
    struct stu_info *psearch=NULL;
    //根据学号找到学生结点
    psearch=search_stu(head2,number);
    if(psearch==NULL){
        return;
    }
    printf("请输入修改后的密码:");
    scanf("%s",psearch->stu_pswd);
    while(getchar()!='\n');
    printf("密码修改成功\n");
    return;
}

//查阅自身信息
void show_self_info_stu(struct stu_info *head2,int number){
    struct stu_info *psearch=NULL;
    //根据工号找到对应结点
    psearch=search_stu(head2,number);
    if(psearch==NULL){
        return;
    }

    printf("姓名:%s 学号:%d 性别:%s 出生日期:%s 数学成绩:%.1lf 语文成绩:%.1lf 英语成绩:%.1lf 总成绩:%.1lf\n",\
            psearch->stu_name,psearch->stu_num,psearch->stu_gender,psearch->stu_birth,psearch->math,psearch->chinese,\
            psearch->english,psearch->total);
    return;
}

6)密码模块

#include <stdio.h>
#include <string.h>
//#include <conio.h>
#include "../inc/admin.h"
#include "../inc/teacher.h"

//判断管理员登录操作
//登录成功返回0
//登录失败返回-1
int admin_login(struct admin_info a[]){
    int i;
    char name[32];
    char pswd[18];
    printf("管理员名:");
    scanf("%s",name);
    while(getchar()!='\n');
    printf("密码:");
    scanf("%s",pswd);
    while(getchar()!='\n');


    //判断用户名和密码是否正确
    if(strcmp(a[0].admin_name,name)==0&&strcmp(a[0].admin_pswd,pswd)==0){
        printf("登录成功\n");
        return 0;
    }
    else{
        printf("登录失败\n");
        return -1;
    }
}

//判断教师登录操作
//登录成功返回0
//登录失败返回-1
int tch_login(struct tch_info *head1,int number){
    char pswd[18];
    struct tch_info *psearch=NULL;
    printf("密码:");
    scanf("%s",pswd);
    while(getchar()!='\n');
    //根据工号找出对应结点
    psearch=search_tch(head1,number);
    //psearch为空,无此工号
    if(psearch==NULL){
        return -1;
    }
    //判断密码
    if(strcmp(psearch->tch_pswd,pswd)==0){
        printf("教师 %s 登录成功\n",psearch->tch_name);
        return 0;
    }
    else{
        printf("登录失败\n");
        return -1;
    }
}

//判断学生登录操作
//登录成功返回0
//登录失败返回-1
int stu_login(struct stu_info *head2,int number){
    char pswd[18];
    struct stu_info *psearch=NULL;
    printf("密码:");
    scanf("%s",pswd);
    while(getchar()!='\n');
    //根据学号查找对应结点
    psearch=search_stu(head2,number);
    if(psearch==NULL){
        return -1;
    }
    //判断密码
    if(strcmp(psearch->stu_pswd,pswd)==0){
        printf("学生 %s 登陆成功\n",psearch->stu_name);
        return 0;
    }
    else{
        printf("登录失败\n");
        return -1;
    }
}

3.Makefile文件

src = $(wildcard ./*.c)   #获取当前路径下所有的 .c文件

obj = $(patsubst %.c, %.o, $(src))  #将 .c  文件转换成  .o

target = SIMS


$(target): $(obj)
    gcc $^ -o  $@

%.o : %.c 
    gcc  $^ -o  $@  -c


clean:
    rm  -rf  *.o   $(target)

4.数据保存文件

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值