学生成绩管理系统
前言:此项目不具有商业价值,旨在总结C语言所学知识点及各知识点在项目中的运用,主要锻炼编码能力,程序设计能力,对业务逻辑的理解能力。
文章目录
系统要求
设计逻辑
- 先设计系统主界面,并且搭建基础框架。主界面分为管理员、教师、学生各自的入口和退出功能,其中超级管理员也要设置,但不显示。搭建管理员、教师、学生等子界面基本框架。
- 确定全局变量:学生、老师、管理员结构体,学生、老师、管理员数量,超级管理员有且只有一个直接写入程序。
- 编写各个子界面功能函数 ,统一编写登录功能函数。
- 信息读取与储存:每次启动系统,系统从文件中读取所有信息,包括(学生、老师、管理员结构体,学生、老师、管理员数量),然后存储在相应变量中以待系统编辑。编辑完成后,正常退出,退出时将相应变量存储到文件中。
编程实现
1、主函数
#include"interface.h"
#include"common.h"
void xsglxt(void)//主界面
{
while(1)
{
interface();//显示初始界面
switch(getch())
{
case 49:student_interface();break;//1.学生入口
case 50:teacher_interface();break;//2.教师入口
case 51:administratorsr_interface();break;//3.管理员入口
case 52:super_administrators_interface();break;//4.超级管理员入口
case 53:return ;;break;//5.退出
}
}
}
int main()//读写信息使用二进制文件,提高文件安全性(二进制打开看不懂)
{
FILE* fpp1=fopen("admin.dat","r");//读取管理员信息
fseek(fpp1,0,SEEK_END);
long j=ftell(fpp1);
rewind(fpp1);
adm_count=j/56;
for(int i=0;i<=adm_count;i++)
{
fread(&admin[i],56,1,fpp1);
}
FILE* fap1=fopen("student.dat","r");//读取学生信息
fseek(fap1,0,SEEK_END);
long j1=ftell(fap1);
rewind(fap1);
stu_count=j1/64;
for(int i=0;i<=stu_count;i++)
{
fread(&student[i],64,1,fap1);
}
FILE* fwp1=fopen("teacher.dat","r");//读取老师信息
fseek(fwp1,0,SEEK_END);
long j2=ftell(fwp1);
rewind(fwp1);
teacher_count=j2/60;
for(int i=0;i<=teacher_count;i++)
{
fread(&teacher[i],60,1,fwp1);
}
xsglxt();//显示主界面,进入相应的子界面完成操作
FILE* fap=fopen("student.dat","w");//写入(保存)学生信息
for(int i=0;i<stu_count;i++)
{
fwrite(&student[i],sizeof(student[0]),1,fap);
}
FILE* fwp=fopen("teacher.dat","w");//写入(保存)教师信息
for(int i=0;i<teacher_count;i++)
{
fwrite(&teacher[i],sizeof(teacher[0]),1,fwp);
}
FILE* fpp=fopen("admin.dat","w");//写入(保存)管理员信息
for(int i=0;i<adm_count;i++)
{
fwrite(&admin[i],sizeof(admin[0]),1,fpp);
}
}
2、common.c
存放普遍功能函数,以及结构体、数量等全局变量
#include<stdio.h>
#include<getch.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<time.h>
void clear_stdin(void);//清屏函数
char* get_str(char* str,size_t size);//输入函数
void anykey_continue(void);//任意键跳出函数
void password_input(char* str);//密码输入
void show_msg(char* msg,int sec,int color);//延迟显示
int password_rule(char *str);//密码规则
int password_rule(char *str)
{
int x=strlen(str);
if(x<6 || x>10)
return 0;
for(int i=0;str[i];i++)
{
if(str[i]<'0' || str[i]>'9')
return 0;
}
return 1;
}
struct Admin
{
int number;//工号
char name[20];//姓名
char code[20];//密码
int year;//出生年
int work_year;//参加工作的那年
char sex;//性别
char state;//0正常 1 冻结 2 离职
};
struct Teacher
{
int number;//工号
char name[20];//姓名
char sex;//性别
int year;//出生年
int work_year;//入职年
char code[20];//密码
char state;//0正常 1 冻结 2 退学
};
struct Student
{
char code[20];//密码
char name[20];//姓名
int number;//学号
int year;//出生年
int math;//数学成绩
int English;//英语成绩
int chinese;//语文成绩
char sex;//性别
char state;//0正常 1 冻结 2 离职
};
struct Score
{
int num ;//学号
int math ;//数学成绩
int English;//英语成绩
int chinese;// 语文成绩
};
struct Score score[500];
struct Student student[500];
struct Teacher teacher[50];
struct Admin admin[10];
int stu_count=0;
int teacher_count=0;
int adm_count=0;
void anykey_continue(void)
{
puts("按任意键返回......");
getch();
}
void password_input(char* str);
void clear_stdin(void)
{
stdin->_IO_read_ptr=stdin->_IO_read_end;
}
char* get_str(char* str,size_t size)
{
if(NULL == str) return str;
clear_stdin();
fgets(str,size,stdin);
if(size-1 == strlen(str))
{
if('\n'==str[size-2])
str[size-2]= '\0';
else
clear_stdin();
}
else
str[strlen(str)-1]='\0';
}
void password_input(char* str)
{
for(int i=0;i<20;i++)
{
str[i]=getch();
if(i>0&&127 == str[i])
{
i-=2;
printf("\b \b");
continue;
}
if(127 == str[i])
{
i--;
continue;
}
if('\n'==str[i])
{
str[i]='\0';
break;
}
putchar('*');
}
}
void show_msg(char* msg,int sec,int color)//提示信息颜色
{
if(0==color)
printf("\n\033[01;31m%s\n\033[00m\n",msg);
if(1==color)
printf("\n\033[01;32m%s\n\033[00m\n",msg);
if(2==color)
printf("\n\033[01;33m%s\n\033[00m\n",msg);
sleep(sec);
}
3.interface.c
主要为主界面进入子界面的入口和登录函数
#include "common.h"
#include "sup_admin.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
void interface(void);//主菜单函数声明
void student_interface(void);//学生入口
void teacher_interface(void);//教师入口
void administratorsr_interface(void);//管理员入口
void super_administrators_interface(void);//超级管理员入口
int cmp_stu_num(int num);//通过学号查找编号
int cmp_stu_code(int num,char *str);//通过编号对学生密码进行验证
int cmp_tea_num(int num);//通过工号查找编号
int cmp_tea_code(int num,char *str);//通过编号对教师密码进行验证
int cmp_adm_num(int num);//通过工号来查找编号
int cmp_adm_code(int num,char *str);//通过编号对管理员密码进行验证
void student_interface_son(int i);
int cmp_stu_code(int num,char *str)
{
if(num<0) return 0;
int i=strcmp(str,student[num].code);
if(i==0) return 1;
else return 0;
}
int cmp_stu_num(int num)
{
for(int i=0;student[i].number;i++)
{
if(student[i].number==num)
return i;
}
return -1;
}
int cmp_tea_code(int num,char *str)
{
if(num<0) return 0;
int i=strcmp(str,teacher[num].code);
if(i==0) return 1;
else return 0;
}
int cmp_tea_num(int num)
{
for(int i=0;teacher[i].number;i++)
{
if(teacher[i].number==num)
return i;
}
return -1;
}
int cmp_adm_code(int num,char *str)
{
if(num<0) return 0;
int i=strcmp(str,admin[num].code);
if(i==0) return 1;
else return 0;
}
int cmp_adm_num(int num)
{
for(int i=0;admin[i].number;i++)
{
if(admin[i].number==num)
return i;
}
return -1;
}
void interface(void)
{
system("clear");
puts("-----指针学生信息管理系统-----");
puts("1.学生入口");
puts("2.教师入口");
puts("3.管理员入口");
puts("5.退出");
}
void student_interface(void)
{
system("clear");
puts("----------学生登录----------");
puts("1.登入学生成绩查询系统");
puts("2.返回主界面");
int stu_num=0;
char stu_code[20];
int index=0;
switch(getch())
{
case 49:
while(1)
{
system("clear");
puts("-----登入学生成绩查询系统-----");
puts("1.输入账号密码:");
puts("2.退出");
switch(getch())
{
case 49:printf("请输入账号:");
scanf("%d",&stu_num);
printf("请输入密码:");
getch();
password_input(stu_code);
int i=cmp_stu_num(stu_num);
if(-1==i)
{
show_msg("账号不存在!",1,0);
continue;
}
if(student[i].state=='1')
{
show_msg("该账号已经被冻结!",1,0);
return;
}
if(student[i].state=='2')
{
show_msg("您已离校!无法登入!",1,0);
return;
}
if(cmp_stu_code(i,stu_code))
{
system("clear");
printf("%s同学,欢迎你!\n",student[i].name);
sleep(2);
student_interface_son(i);
index=0;
}
else if(2==index)
{
show_msg("你的账号已经被锁定",1,0);
student[i].state='1';
anykey_continue();
return;
}
else
{
printf("\n\033[01;33m你还剩%d次机会!\n\033[00m\n",2-index);
index++;
anykey_continue();
};
;break;
case 50:return;
}
}
;break;//1.学生入口
case 50:return;break;//退出
}
}
void teacher_interface(void)
{
system("clear");
puts("----------教师登录----------");
puts("1.登入教师管理系统");
puts("2.返回主界面");
int tea_num=0;
char tea_code[20];
int index=0;
switch(getch())
{
case 49:
while(1)
{
system("clear");
puts("-----登入教师管理系统-----");
puts("1.输入账号密码:");
puts("2.退出");
switch(getch())
{
case 49:printf("请输入教师工号:");
scanf("%d",&tea_num);
printf("请输入密码:");
getch();
password_input(tea_code);
int i=cmp_tea_num(tea_num);
if(-1==i)
{
show_msg("账号不存在!",1,0);
continue;
}
if(teacher[i].state=='1')
{
show_msg("该账号已经被冻结!",1,0)