linux终端版学生信息管理系统【C语言实现】

Linux终端版的学生信息管理系统

/*-----------------------------------------------------------------------------------------
程序名:stu_management.c
程序功能:
         1.鉴别root权限,设置管理员和学生权限,管理员和学生可以异步登录
         (如果加入网络模块就可以实现多用户同步登录)
         2.管理员可以设置/查询/修改学生所有账户信息,也可以增加新的管理员
         3.学生只有查询账户/课程/奖学金的权限
         4.自动生成配置文件,退出时并保存配置文件,防止信息丢失
         5.移植程序只需将可执行程序和配置文件移植即可,信息不会丢失
程序实现:采用链表加文件操作库函数结合过程控制实现
编译:gcc stu_management.c -o stu_management
编译环境:gcc 版本 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) 
作者:张峰   [mailto:frankzhang02010@gmail.com]
修改日期:2013-12-8
-----------------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define N 3                //课程和奖学金种类的总数量和
 
 
typedef struct SCORE{
    char course_name[32];
    float score;
}Score;
 
typedef struct node{
    int auth;
    char usr_name[32];
    char password[18];
    int id;
    char stu_name[32];
    char major[32];
    Score s[N];
    struct node* next;
}Node;
 
Node *head,*last;
int usr_type;
char usr_name[32],password[18];
const char* f_name="usr_info.conf";
 
void load_data(),save_data(),export_data(),check_admin(),add_admin(),login();
void add_student(),search_student(),del(),modify(),modify_password(),logout();
void show_score(),search_course();
 
void title_win(),msg_win();
 
int main()
{
    int ch;
    load_data();
    title_win();
    check_admin();
     
loop:
    printf("请选择用户类型:");
    scanf("%d",&usr_type);
    if(usr_type!=1 && usr_type!=2)
    {
        msg_win("没有该用户类型,请重新输入,1表示admin,2表示student\n");
        goto loop;
    }
     
    if(usr_type==1)
    {
         title_win();
        login();
        while(1)
        {
            msg_win("User Type:Admin");
            msg_win("Add/Srch/Del/Mdfy/M_Psd/Quit/Exp/Save");
            printf(">");
            scanf("%d",&ch);
             
            switch(ch)
            {
                case 1:add_student();break;
                case 2:search_student();break;
                case 3:del();break;
                case 4:modify();break;
                case 5:modify_password();break;
                case 6:logout();break;
                case 7:export_data();break;
                case 8:save_data();break;
                case 9:add_admin();break;
                default:break;
            }
            getchar();
            msg_win("按任意键返回");
            getchar();
            system("clear");
        }
     
    }
    else
    {
         title_win();
        login();       
        while(1)
        {
            msg_win("User Type:Student");
            msg_win("ShowScore/SrchCourse/M_Pwd/Quit");
            printf(">");
            scanf("%d",&ch);
             
            switch(ch)
            {
                case 1:show_score();break;
                case 2:search_course();break;
                case 3:modify_password();break;
                case 4:logout();break;
                default:break;
            }
            getchar();
            msg_win("按任意键返回");
            getchar();
            system("clear");
        }
     
    }
    return 0;
}
 
void load_data()
{  
    FILE* fp=NULL;
        
    if(!(fp=fopen(f_name,"a")))
    {
        msg_win("Open file fail");
        return;
    }
     
    fclose(fp);
    fp=NULL;
     
    if(!(fp=fopen(f_name,"r+")))
    {
        msg_win("Open file fail");
        return;
    }
     
    Node* p;
    while(1)
    {    
        p=(Node*)malloc(sizeof(Node));
        if(!p) continue;
        if(!fread(p,sizeof(Node),1,fp))
            break;       
        if(head==NULL)
        {
            head=last=p;
            head->next=NULL;
        }
        else
        {
            last->next=p;
            last=p;
            last->next=NULL;
        } 
     } 
     fclose(fp);
     fp=NULL;     
}
 
void save_data()
{
    FILE* fp=NULL;
    if(!(fp=fopen(f_name,"w+")))
    {
        msg_win("Open file fail");
        return;
    }
     
    Node* p;
    p=head;
    while(p)
    {
        fwrite(p,sizeof(Node),1,fp);
         p=p->next;
    }
    fclose(fp);
    fp=NULL;
}
 
void export_data()
{
    FILE* fp;
    if(!(fp=fopen("export.log","w+")))
    {
        msg_win("Open file fail");
        return;
    }
     
    Node* p;
    int i;
    p=head;
    while(p)
    {
        fprintf(fp,"%-2d|%-15s|%-18s|%-15s|%-10d|%-18s|\n",p->auth,p->usr_name,p->password,p->stu_name,p->id,p->major);
        for(i=0;i<N;i++)
                fprintf(fp,"%s:%-5.1f|",p->s[i].course_name,p->s[i].score);
        fprintf(fp,"\n");
         p=p->next;
    }
    fclose(fp);
}
 
void check_admin()
{
    Node* p;
    p=head;
    while(p)
    {
        if(p->auth==1)
            return;
        p=p->next;
    }
    p=(Node*)malloc(sizeof(Node));
    p->auth=1;
    msg_win("请设置管理员账户");
    printf("用户名:");
    scanf("%s",p->usr_name);
    printf("密码:");
    scanf("%s",p->password);
     
    if(head==NULL)
    {
        head=last=p;
        head->next=NULL;
    }
    else
    {
        last->next=p;
        last=p;
        last->next=NULL;
    }       
    msg_win("管理员账户设置成功");
    sleep(1);
    system("clear");
}
 
void add_admin()
{
    Node* p;
    p=(Node*)malloc(sizeof(Node));
    p->auth=1;
    msg_win("添加管理员账户");
    printf("用户名:");
    scanf("%s",p->usr_name);
    printf("密码:");
    scanf("%s",p->password);
     
    if(head==NULL)
    {
        head=last=p;
        head->next=NULL;
    }
    else
    {
        last->next=p;
        last=p;
        last->next=NULL;
    }       
    msg_win("新管理员账户设置成功");
 
}
 
void login()
{
login: system("clear");
    msg_win("登录");
    printf("用户名:");
    scanf("%s",usr_name);
    printf("密码:");
    scanf("%s",password);
     
    Node* p;
    p=head;
    while(p)
 
    {
        if(!strcmp(p->usr_name,usr_name) && !strcmp(p->password,password) && p->auth==usr_type)
        {
            msg_win("登录成功");
            sleep(1);
            system("clear");
            return;
        }
        p=p->next;
    }
    msg_win("用户名或密码不正确,按任意键重新登录");
    getchar();getchar();
        goto login;
}
 
void add_student()
{
    Node* p=(Node*)malloc(sizeof(Node));
    if(!p)  return ;
     
    p->auth=2;
    msg_win("添加学生账户");
    printf("用户名:");
    scanf("%s",p->usr_name);
    printf("密码:");
    scanf("%s",p->password);
    printf("姓名:");
    scanf("%s",p->stu_name);
    printf("学号:");
    scanf("%d",&(p->id));
    printf("专业:");
    scanf("%s",p->major);
     
    if(head==NULL)
    {
        head=last=p;
        head->next=NULL;
    }
    else
    {
        last->next=p;
        last=p;
        last->next=NULL;
    }       
    msg_win("学生账户设置成功");
}
 
void search_student()
{
    msg_win("搜索账户信息");
    int stu_id,i;
    printf("请输入学号:");
    scanf("%d",&stu_id);
     
    Node* p;
    p=head;
    while(p)
    {
        if(p->id==stu_id)
        {
            printf("%d %s %s %s %d %s\n",p->auth,p->usr_name,p->password,p->stu_name,p->id,p->major);
            for(i=0;i<N;i++)
                printf("%s:%-5.1f",p->s[i].course_name,p->s[i].score);
            printf("\n");
            return;
        }
        p=p->next;
    }
    msg_win("系统中没有该学号");
}
 
void del()
{
    Node *p,*q;
    int stu_id;
     
    msg_win("删除账户信息");
    printf("请输入学号:");
    scanf("%d",&stu_id);
     
    p=head;
    while(p)
    {
        if(p->id==stu_id)
        {
            if(head==p)
                head=head->next;
            else
                q->next=p->next;            
             
            free(p);
            msg_win("删除成功!");
            return;
        }
        q=p;
        p=p->next;
    }
    msg_win("删除失败!系统中没有该学号");    
}
 
void modify()
{
    int stu_id,i;
     
    msg_win("修改课程成绩和奖学金");
    printf("请输入学号:");
    scanf("%d",&stu_id);
     
    Node* p;
    p=head;
    while(p)
    {
        if(p->id==stu_id)
        {
            for(i=0;i<N;i++)
                scanf("%s %f",p->s[i].course_name,&(p->s[i].score));
            return;
        }
        p=p->next;
    }
    msg_win("系统中没有该学号");    
}
 
void modify_password()
{
    char temp[18],new_password[18];
     
    msg_win("修改密码");
     
    printf("请输入旧密码:");
    scanf("%s",temp);
     
    printf("请输入新密码:");
    scanf("%s",new_password);
    printf("请确认新密码:");
    scanf("%s",password);
     
    Node* p;
    p=head;
    while(p)
    {
        if(!strcmp(usr_name,p->usr_name))
        {
            if(!strcmp(p->password,temp)&& !strcmp(new_password,password))
            {
                strcpy(password,new_password);
                strcpy(p->password,password);
                msg_win("密码修改成功");
                return;
            }
            else
            {
                msg_win("输入有误,自动退出");
                return;
            }
        }
        p=p->next;
    }
}
 
void logout()
{
    save_data();
    msg_win("成功退出");
    exit(1);
}
 
void show_score()
{
    int i;
    Node* p;
    p=head;
    msg_win("所有课程成绩和奖学金");
    while(p)
    {
        if(!strcmp(usr_name,p->usr_name))
        {
            printf("%d %s %s %s %d %s\n",p->auth,p->usr_name,p->password,p->stu_name,p->id,p->major);
            for(i=0;i<N;i++)
                printf("%s:%-5.1f",p->s[i].course_name,p->s[i].score);
            printf("\n");
            return;
        }
        p=p->next;
    }
}
 
void search_course()
{
    char course_name[32];
    int i;
    msg_win("输入要查询的课程");
    printf(">");
    scanf("%s",course_name);
     
     Node* p;
    p=head;
    while(p)
    {
     if(!strcmp(usr_name,p->usr_name))
     {  
        for(i=0;i<N;i++)
         {      
            if(!strcmp(course_name,p->s[i].course_name))
             {
               printf("%s:%-5.1f\n",p->s[i].course_name,p->s[i].score);
               return;
              }
        }
      }
        p=p->next;
    }
}
 
char str1[]="Student Information Management System";
 
void title_win()
{
     int i,M;
     
     M=strlen(str1);
    for(i=0;i<M;i++)   printf("-");
    printf("\n");
    printf("%s\n",str1);
    for(i=0;i<M;i++)   printf("-");
    printf("\n");
}
 
void msg_win(const char* str)
{
    int i,M;
     
    M=strlen(str1);
    printf("\n");
    printf("%s\n",str);
    for(i=0;i<M;i++)   printf("-");
    printf("\n");   
}


  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值