【c语言小项目】学生成绩管理系统

这是一个使用C语言编写的学生成绩管理系统,包括学生、教师和校长三个角色的功能。学生可以修改密码、查询成绩等;教师能添加、删除学生,录入成绩;校长则有权限管理教师并重置所有人的密码。系统包含多个源文件和头文件,适用于Linux Ubuntu环境。
摘要由CSDN通过智能技术生成

设计要求:
此项目没有商业价值,练习学习过的知识点。
仅限于C语言知识。
学生:
姓名 性别 学号 密码 语文 数学 英语
1、第一次登录强制修改密码。
2、查询成绩
排名 不显示姓名和学号。
平均分
最高分 所有学生单科和总分
最低分
3、修改密码
4、查看个人信息
5、三次密码错误锁定帐号,由教师解锁

教师:
姓名 性别 工号 密码
1、第一次登录强制修改密码。
2、添加学生(学生的学号自动生成)
单个添加
从文件批量导入
3、删除学生
输入两次学号确定
删除的学生要记录保存在已退学的文件中
4、查找学生
按姓名查找
按学号查找
5、修改学生信息
修改学生基础信息
修改学生成绩
6、录入学生成绩
单个录入
批量导入
7、重置学生密码
8、解锁学生
9、显示所有在校学生信息
10、显示所有退出学生信息
11、三次密码错误锁定帐号,由校长解锁

校长:
admin
1、第一次登录强制修改密码。
2、能重置自己的密码
3、能重置教师密码
4、添加教师
5、删除教师
6、解锁老师
7、显示所有在职教师
8、显示所有离职教师

以下代码实现在Linux ubuntu
main.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#include "file.h"
#include "land.h"

int main(int argc,const char* argv[])
{
   	
	//分配内存 读取文件
	s=calloc(1000,sizeof(Students));
	stu_e=calloc(100,sizeof(Students));
	tea=calloc(100,sizeof(Teachers));
	dtea=calloc(100,sizeof(Teachers));
	file_scanf();
	while(1)
	{
   
		system("clear");
		printf("\033[01;34m");
		puts("欢迎使用学生成绩管理系统!");
		puts("1.进入学生菜单.");
		puts("2.进入教师菜单.");
		puts("3.进入校长菜单.");
		puts("4.退出并保存.");
		printf("\033[00m");
		switch(get_cmd('1','4'))
		{
   
			case '1': land_student();break;
			case '2': land_teacher();break;
			case '3': land_choose();break;
			case '4': file_save();return 0 ;
			
		}
	}
	return 0;
}

tools.h

//一个优秀的工具函数
#ifndef TOOL_H   	//头文件卫士,防止头文件重复包含
#define TOOL_H

#include <getch.h>  //该函数需手动添加到系统头文件路径
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct Teacher
{
   
	char name[10];
	char sex[4];
	char key[10];
	char lock;
	int id;
}Teachers;
Teachers* tea;//声明在职教师
Teachers* dtea;//声明离职教师

typedef struct Student{
   
	char name[10];
	char sex[4];
	int id;
	float Chinese;
	float Math;
	float English;
	char key[10];
	char lock;
}Students;
Students *s;//声明在校学生
Students *stu_e;//声明退校学生

int count_stu,count_stu_e,iD;//学生用全局变量

int count_tea,count_dtea;//老师用全局

int cur;//通用全局

int get_cmd(char start,char end);
char* get_str(char* str,size_t size);
void anykey_continue(void);
char* get_password(char* password, size_t len,bool isshow);

#endif //TOOL_H

tools.c

#include <stdio.h>
#include "tool.h"

int count_stu=0,count_stu_e=0,iD;//学生用全局变量

int count_tea=0,count_dtea=0;//老师用全局

int cur=0;//通用全局

int get_cmd(char start,char end)//从键盘中读取按键,起始终止位置为ASCII表字符
{
   
	puts("------------------");
	printf("请输入指令:");
	for(;;)
	{
   
		char cmd = getch();
		if(start <= cmd && cmd <= end)//接收判断
		{
   
			printf("%c\n",cmd);
			return cmd;
		}
	}
}
char* get_str(char* str,size_t size)//优化fgets函数,防止换行符的读取和多余数据残留输入缓冲区
{
   
	// 限制输入的字符度
	fgets(str,size,stdin);
	// 计算实际输入的字符数量
	size_t len = strlen(str);
	// 判断最一个字符是否是'\n'
	if('\n' == str[len-1])
	{
   
		// 删除'\n'
		str[len-1] = '\0';
	}
	else
	{
   
		// 清理输入缓冲区
		stdin->_IO_read_ptr = stdin->_IO_read_end;//在GNU编译环境下
	}
	return str;
}
void anykey_continue(void)//读取一个字符后可继续操作
{
   
	stdin->_IO_read_ptr = stdin->_IO_read_end;
	puts("按任意键继续...");
	getch();
	stdin->_IO_read_ptr = stdin->_IO_read_end;
}

char* get_password(char* password, size_t len,bool isshow)
{
   
	int i = 0;
	while (i < len - 1)
	{
   
		char ch = getch();
		if (127 == ch)
		{
   
			if (i > 0)
			{
   
				i--;
				printf("\b \b");
			}
			continue;
		}
		if ('\n' == ch)
		{
   
			break;
		}
		if(true==isshow)
		{
   
		printf("*");
		}
		else
		{
   	
		printf("%c",ch);
		}
		password[i++] = ch;
	}
	password[i] = '\0';
	return password;
}

land.h

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#ifndef PASSWORD_H
#define PASSWORD_H

void land_student(void);
void land_teacher(void);
void land_admin(void);

#endif//PASSWORD

land.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#include "land.h"

void land_student(void)		//学生登录接口
{
   		
		
	printf("请输入学号:\n");
	int ID = 0;
	int flaa=0;
	char password[10]={
   0};
	int cnt1=3;
	while(1)
	{
   
		//get_str(ID, sizeof(ID));
		scanf("%d",&ID);
		stdin->_IO_read_ptr = stdin->_IO_read_end;
		for(int a=0;a<count_stu;a++)
		{
   
			if(ID==s[a].id)
			{
   
				cur=a;
				flaa=1;
				break;
			}				
		}
		if(!flaa)
			printf("未查询到该学号,请重新输入!\n");
		else
			break;
	}
	if(1==s[cur].lock)
	{
   
		printf("帐号已锁定!\n");
		anykey_continue();
		return;
	}
	if(0==strcmp(s[cur].key,"000000"))
	{
   			
		printf("首次登录请重置密码,且不能为初始化密码:000000\n");
		get_password(password,sizeof(password),false);
		printf("\n");
		while(0==strcmp(password,"000000"))
		{
   
		printf("请重新初始化密码!\n");
		get_password(password,sizeof(password),false);
		printf("\n");
		}
		strcpy(s[cur].key,password);
		printf("密码修改成功!\n");
		sleep(1);
		menu_student();
		return;
	}
	else
	{
   
		//int count1=3;
		while(cnt1)
		{
   	
			printf("请输入密码:\n");
			get_password(password,sizeof(password),true);
			printf("\n");
			if (0 == strcmp(password,s[cur].key))
			{
   
				printf("验证通过!\n");
				sleep(1);
				menu_student();
				return;
			}
			else	
			{
   
				cnt1--;
				printf("\033[01;31m");
				printf("验证失败三次将冻结帐号,还有%d次机会!\n",cnt1);
				printf("\033[00m");		
			}			
		}
		if(!cnt1)
		{
   
			printf("帐号已锁定,请寻求老师解锁并初始化密码!\n");
			s[cur].lock='1';
			anykey_continue();
			return;
		}	
	}
}
	
void land_teacher(void)			//老师登录接口
{
   		
		
	printf("请输入工号:\n");
	int ID = 0;
	int flgg=0;
	char password[10]={
   0};
	int cnt1=3;
		while(1)
		{
   
			//get_str(ID, sizeof(ID));
			scanf("%d",&ID);
			stdin->_IO_read_ptr = stdin->_IO_read_end;
			for(int a=0;a<count_tea;a++)
			{
   
				if(ID==tea[a].id)
				{
   
					cur=a;
					flgg=1;
					break;
				}
			}
			if(!flgg)
				printf("未查询到该工号,请重新输入!\n");
			else
				break;
		}

	 
		if(1==tea[cur].lock)
		{
   
			printf("帐号已锁定!\n");
			anykey_continue();
			return;
		}
		if(0==strcmp(tea[cur].key,"000000"))
		{
   			
			printf("首次登录请重置密码,且不能为初始化密码:000000\n");
			get_password(password,sizeof(password),false);
			printf("\n");
			while(0==strcmp(password,"000000"))
			{
   
			printf("请重新初始化密码!\n");
			get_password(password,sizeof(password),false);
			printf("\n");
			}
			strcpy(tea[cur].key,password);
			printf("密码修改成功!\n");
			sleep(1);
			teacher();
			return;
		}

		else
		{
   
		//int count1=3;
			while(cnt1
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <stdio.h> #include <stdlib.h> #include <string.h> #include<ctype.h> #define M 3 struct student {long num; char name[20]; char sex; int score[5]; int ave; }stu[M]; void init() { printf("\t\t********************************\n\n"); printf("\t\tStudent score management systerm \n"); printf("\n"); printf("\t\t Make by Maggiehe \n"); printf("\n"); printf("\t\t Student number is 3206***** \n\n"); printf("\t\t********************************\n\n"); } void input() { int i,j; printf("\nInput the student number name sex math English PE maolun majing:\n"); for(i=0;i<M;i++) {scanf("%ld,%s,%c",&stu[i].num,stu[i].name,&stu[i].sex); for(j=0;j<5;j++) scanf("%d",&stu[i].score[j]); scanf("%d",&stu[i].ave); save(); } } void list() { int i,j; clrscr(); printf("\t**********************student****************************\n"); printf("num name sex math English PE maolun majing:\n"); for(i=0;i<M;i++) { printf("%ld %s %c",stu[i].num,stu[i].name,stu[i].sex); for(j=0;j<5;j++) printf("%d",stu[i].score[j]); printf("%d",stu[i].ave); } if((i+1)%10==0) { printf("\npress any key continue.......\n"); getch(); } printf("\t*************************end*********************************\n"); } void average() { int i,j; float sum[M]; for(i=0;i<M;i++) for(j=0;j<5;j++) sum[i]+=stu[i].score[j]; stu[i].ave=sum[i]/5.0; } void search_num() { long num; int i,j; printf("\nplease enter number which you want to search:"); scanf("%ld",&num); printf("\n"); for(i=0;i<M;i++) if(stu[i].num!=num) printf("The number is not exist\n"); else { printf("number name sex math English PE maolun majing average\n"); printf("%ld %s %c",stu[i].num,stu[i].name,stu[i].sex); for(j=0;j<5;j++) printf("%d",stu[i].score[j]); printf("%d",stu[i].ave); } } void search_nam() { int i,j; char name[20]; printf("\nplease enter name which you want to search:"); scanf("%s",&name); printf("\n"); for(i=0;i<M;i++) if(strcmp(stu[i].name,name)==0) { printf("number name sex math English PE maolun majing average:\n"); printf("%ld%s%c",stu[i].num,stu[i].name,stu[i].sex); for(j=0;j<5;j++) printf("%d",stu[i].score[j]); printf("%d",stu[i].ave); } else printf("\nThe name is not exist!!!\n"); } void search_ave() { int i,j,a=0; float k; printf("please enter average score which you want to search:"); scanf("%f",&k); printf("\n"); for(i=0;i<M;i++) if(stu[i].ave!=k) printf("The average score is not exist!!!\n"); else for(i=0;i<M;i++) { if(stu[i].ave<=k) printf("number name sex math English PE maolun majing average\n"); printf("%ld %s %c",stu[i].num,stu[i].name,stu[i].sex); for(j=0;j<5;j++) printf("%d",stu[i].score[j]); printf("%d",stu[i].ave); a++; } } void sort() { int i,j; struct student temp; for(i=0;i<M;i++) for(j=i+i;j<M;j++) if(stu[i].ave<stu[j].ave) {temp=stu[i]; stu[i]=stu[j]; stu[j]=temp; } } void save() { int i; FILE *fp; if((fp=fopen("student.dat","wb"))==NULL) {printf("cannot open file\n"); return; } for(i=0;i<M;i++) if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("file write error\n"); fclose(fp); } void delect() { int i,t; long num; printf("please enter number which you want to delect:"); scanf("%ld",&num); printf("\n"); for(i=0;i<M;i++) { if(stu[i].num!=num) printf("The number is not exist!!!\n"); if(stu[i].num==num) t=i; } for(i=t;i<M;i++) stu[i]=stu[i+1]; save(); } void insert() {FILE *fp; int i,n,t; struct student s; printf("please input record\n"); printf("number name sex math English PE maolun majing average\n"); scanf("%ld,%s,%c,%d%d%d%d%d%d",&s.num,s.name,&s.sex,&s.score[0],&s.score[1],&s.score[2],&s.score[3],&s.score[4],&s.ave); s.ave=(s.score[0]+s.score[1]+s.score[2]+s.score[3]+s.score[4])/3.0; if((fp=fopen("student.dat","wb"))==NULL) {printf("cannot open file\n"); return; } i=M; for(t=0;stu[i].ave>s.ave&&t<M;t++) if(fwrite(&s,sizeof(struct student),1,fp)!=1) printf("file write error\n"); fclose(fp); } void MainMenu() {clrscr(); printf("\t********************************************************************\n \n); Printf(“\n”); printf("\t choose one of following:\n"); printf("\t 1. search record\n"); printf("\t 2. sort record\n"); printf("\t 3. insert record\n"); printf("\t 4. delect record\n"); printf("\t please enter your choice:"); printf(“\n”); printf("\t********************************************************************\n"); } void menu_select() {clrscr(); printf("\t******************************************************************\n\n"); printf(“\n”); printf("\t choose one of following:\n"); printf("\t 1.1 search by number\n"); printf("\t 1.2 search by name\n"); printf("\t 1.3 search by average score\n"); printf("\t please enter your choice:"); printf(“\n”); printf("\t******************************************************************\n"); } void search() { char ch; clrscr(); menu_select(); ch=getch(); switch(ch) { case '1':search_num();break; case '2':search_nam();break; case '3':search_ave();break; } } main() { char ch; clrscr(); init(); input(); list(); average(); save(); MainMenu(); ch=getch(); switch(ch) { case '1':search();break; case '2':sort();break; case '3':insert();break; case '4':delect();break; } search_num(); search_nam(); search_ave(); sort(); delect(); insert; }
本实验课题主要是要解决数据在文件中的读取,并且要求读取到的学生总人数少于30人,每位学生的课程不多于6门。此程序需要实现输入、计算、排序、删除、查询、显示功能。此实验需要在CodeBlocks等C语言编译平台上完成同时本实验要求所写的程序可以流畅的在编译平台上运行。首先为用户提供一个菜单,展示各个选项的功能,用户可输入一个选项(数字),执行相应的功能,通过运用switch语句对用户输入的数字进行处理判断出用户想要执行的操作。一共有14个选项,第一个和八九选项没有使用函数,二三分别对应着一个函数,第四个到第七个都使用同一个函数来输出成绩。十到十三个分别对应一个函数,最后一个0来结束程序。 学生信息的写入(定义FILE *fp指针),先将将学生人数和课程门数写入文件,以结构体数组的形式来保存键盘上输入的每个学生相应的信息。然后再用fprintf函数的格式写入方式将数组中的数据写入文档中。 学生信息的读取,先定义结构体数组,从文件中读取学生的学号姓名及成绩等信息写入到结构体数组stu中,在用fscanf函数的格式读取方式将文档中相应的数据保存在相应的结构体数组里定义的变量中。 计算排序的功能,是按不同的要求分别将学生的总成绩和平均成绩计算出来,然后将每个学科的总成绩平均成绩计算出来,然后按升序或者降序将成绩排序出来。 删除查询显示等功能,可以通过读取得到的结构体数组,进行重写文档,打印等方式实现功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值