小项目:学生成绩管理系统

本文介绍了一个小型的学生成绩管理系统项目,旨在巩固C语言知识和提升编程能力。系统包括管理员、教师、学生等多个角色的登录与功能模块,通过文件存储数据。在开发过程中遇到的挑战包括统一命名、编译错误、功能移植等问题,通过良好的团队协作、注释编写、沟通交流和结对编程得以解决,项目提升了团队成员的编程思维和问题解决能力。
摘要由CSDN通过智能技术生成

学生成绩管理系统

前言:此项目不具有商业价值,旨在总结C语言所学知识点及各知识点在项目中的运用,主要锻炼编码能力,程序设计能力,对业务逻辑的理解能力。

系统要求

在这里插入图片描述
在这里插入图片描述

设计逻辑

  1. 先设计系统主界面,并且搭建基础框架。主界面分为管理员、教师、学生各自的入口和退出功能,其中超级管理员也要设置,但不显示。搭建管理员、教师、学生等子界面基本框架。
  2. 确定全局变量:学生、老师、管理员结构体,学生、老师、管理员数量,超级管理员有且只有一个直接写入程序。
  3. 编写各个子界面功能函数 ,统一编写登录功能函数。
  4. 信息读取与储存:每次启动系统,系统从文件中读取所有信息,包括(学生、老师、管理员结构体,学生、老师、管理员数量),然后存储在相应变量中以待系统编辑。编辑完成后,正常退出,退出时将相应变量存储到文件中。

编程实现

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)
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值