小項目:學生成績管理系統

學生成績管理系統

前言:此項目不具有商業價值,旨在總結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);
								return;
							}
							if(cmp_tea_code(i,tea_code))
							{
								system("clear");
								printf("%s老師,歡迎您!\n",teacher[i].name);
								sleep(2);
								teacher_interface_son(i);
								index=0;
							}
							else if(2==index)
							{
								show_msg("你的賬號已經被鎖定",1,0);
								teacher[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;
		case 50:return;break;
	}
}
void administratorsr_interface(void)
{
	system("clear");
	puts("----------管理員登錄----------");
	puts("1.登入管理員管理系統");
	puts("2.返回主界面");
	int adm_num=0;
	char adm_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",&adm_num);
							printf("請輸入密碼:");
							getch();
							password_input(adm_code);
							int i=cmp_adm_num(adm_num);
							if(-1==i)
							{
								show_msg("賬號不存在!",1,0);
								anykey_continue();
								continue;
							}
							if(admin[i].state=='1')
							{
								show_msg("該賬號已經被凍結!",1,0);
								anykey_continue();
								return;
							}
							if(cmp_adm_code(i,adm_code))
							{
								system("clear");
								printf("%s管理員,歡迎您!\n",admin[i].name);
								sleep(2);
								admin_interface_son(i);
								index=0;
							}
							else if(2==index)
							{
								show_msg("你的賬號已經被鎖定",1,0);
								admin[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;
		case 50:return;break;
	}
}
void super_administrators_interface(void)
{
	while(1)
	{
		system("clear");
		puts("1.請輸入指令:");
		puts("2.退出");
		switch(getch())
		{
			case 49:system("clear");
					puts("輸入口令:");
					char sup_adm_mima[30]={};
					password_input(sup_adm_mima);
					int index=strcmp(sup_adm_mima,"asdfghjkl123456789");
					if(index==0)
					{
						show_msg("登入成功!!",1,0);
						super_administrators_interface_son();
					}
					else
					{
						anykey_continue();
						return;
					};break;
			case 50:return;
		}
	}
}

4.student.c

主要是學生界面等信息顯示及其功能函數

#include "common.h"
#define SUM_SEC 365*24*3600
void total_ranking(int n);//總成績排名
void single_ranking(int n);//單科成績排名
void student_interface_son(int i);//學生界面
void change_stu_password(int i);
void single_ranking(int n)
{
	int count_c=1,count_m=1,count_e=1;//排名默認爲1
	for(int i=0;i<500;i++)
	{
		if(student[i].state=='0')
		{
			if(student[i].chinese > student[n].chinese)//有一個成績比我高,我的排名就加1
			count_c++;
			if(student[i].math > student[n].math)
			count_m++;
			if(student[i].English > student[n].English)
			count_e++;
		}
	}
	printf("語文成績排名:%d\n",count_c);
	printf("數學成績排名:%d\n",count_m);
	printf("英語成績排名:%d\n",count_e);
}

void total_ranking(int n)
{
	int count=1;//排名默認爲1
	for(int i=0;i<500;i++)
	{
		if(student[i].state=='0')
		{
			if(student[i].chinese+student[i].math+student[i].English > student[n].chinese+student[n].math+student[n].English )
				count++;			////有一個成績比我高,我的排名就加1
		}
	}
	printf("總成績排名:%d\n",count);	
}
void change_stu_password(int i)
{
	while(1)
		{
			printf("請輸入新密碼:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密碼格式錯誤",1,2);
				continue;
			}
			if(0==strcmp(new_code,"123456"))
			{
				show_msg("不能修改爲初始密碼!",1,2);
				continue;
			}
			strcpy(student[i].code,new_code);
			show_msg("輸入成功!",1,1);
			anykey_continue();
			break;
		}
}
void student_interface_son(int i)
{

	if(0==strcmp(student[i].code,"123456"))
	{
		system("clear");
		while(1)
		{
			puts("第一次登入請修改密碼,密碼不能爲初始值");
			printf("請輸入新密碼:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密碼格式錯誤",1,2);
				continue;
			}
			strcpy(student[i].code,new_code);
			show_msg("輸入成功!",1,1);
			anykey_continue();
			break;
		}
	}
	while(1)
	{
		system("clear");
		printf("--------學生界面--------\n");
		printf("學號:%d\n",student[i].number);
		printf("姓名:%s\n",student[i].name);
		printf("性別:%s\n",student[i].sex=='1'?"男":"女");
		printf("年齡:%ld\n",(time(NULL)/(SUM_SEC))+1970-student[i].year);
		printf("語文成績:%d\n",student[i].chinese);
		printf("數學成績:%d\n",student[i].math);
		printf("英語成績:%d\n",student[i].English);
		printf("平均分:%.2lf\n",(student[i].chinese+student[i].math+student[i].English)/3.0);
		printf("總分:%d\n",student[i].chinese+student[i].math+student[i].English);
		printf("--------------------\n");
		printf("1、查看單科成績排名:\n");
		printf("2、總分成績排名:\n");
		printf("3、修改登入密碼:\n");
		printf("4、返回主菜單:\n");
		printf("--------------------\n");
		switch(getch())
		{
			case 49:printf("*查看單科成績排名*\n");single_ranking(i);anykey_continue();break;//1.學生入口
			case 50:printf("*查看總分成績排名*\n");total_ranking(i);anykey_continue();break;//退出
			case 51:printf("修改登入密碼\n");change_stu_password(i);;break;//退出
			case 52:printf("返回主菜單\n");return ;//退出
		}
	}
}

5、teacher.c

主要是教師界面等信息顯示及其功能函數

#ifndef TEACHER_H
#define TEACHER_H
#include "common.h"
#define SUM_SEC 365*24*3600//宏定義一年的秒數(忽略閏年)用來計算年齡
int _find_num( int key);//尋找學號
char *_find_name(char* name,char* key);//尋找姓名
void _show_stu(int key,int b);//顯示信息
void add_stu_more(void);//導入學生
void add_stu(void);//增加學生(可能需要修改)
void del_stu(void);//刪除學生
void modify_stu(void);//修改學生信息
void reset_code(void);//重置密碼
void unlock_account(void);//解鎖賬號
void find_name_stu(void);//按姓名查找
void show_01_stu(void);//顯示在校學生
void show_2_stu(void);//顯示離校學生
void add_score_more(void);//導入分數
void add_score(void);//添加分數
void modify_score(void);//修改分數
void sort_score(void);//按成績排序
void find_name_num_score(void);//按學號查分數
void teacher_interface_son(int i);//教師界面
void student_achievement_management(void);//學生成績管理
void student_information_management(void);//學生信息管理
void change_tea_password(int i);
int _find_num( int key)//尋找學號
{
	for(int i=0 ;i<stu_count;i++)
	{
		if(student[i].number==key && student[i].state!= '2')
		{
			return i;
		}
	}
	return -1;
}
char *_find_name(char* name,char* key)//尋找姓名
{
	int count=0;
	for(int i=0;i<stu_count;i++)
	{
		if(0==strcmp(student[i].name,name) && (student[i].state=='0'|| student[i].state=='1'))
		{
			key[count]=i+'0';
			count++;
		}
	}
	key[count]='\0';
	return key;
}
void _show_stu(int key,int b)//顯示信息
{
	system("clear");
	printf("學號:%4d ",student[key].number);
	printf("性別:%3s ",'1'==student[key].sex?"男":"女");
	printf("姓名:%4s ",student[key].name);
	if(b==1)
	{
	printf("語文:%4d ",student[key].chinese);
	printf("數學:%4d ",student[key].math);
	printf("英語:%4d ",student[key].English);
	}
	printf("\n");
	sleep(1);
}
void add_stu_more(void)//導入學生
{

	system("clear");
	puts("---------導入學生---------");
	FILE* fp=fopen("add_stu.txt","r");
	if(NULL==fp)
	{
		perror("fopen");
		return ;
	}	
	while(1)
	{
		int num=100000;
		stu_count++;
		fscanf(fp,"%s %d %c",student[stu_count-1].name,&student[stu_count-1].year,&student[stu_count-1].sex);
		if(feof(fp)==1)
		{
			stu_count--;
			break;
		}
		student[stu_count-1].number=num+stu_count;
		strcpy(student[stu_count-1].code,"123456");
		student[stu_count-1].state='0';
	}	
	fclose(fp);
		show_msg("添加成功!按任意鍵返回!",1,1);
		getch();
}
void add_stu(void)//增加學生
{
	system("clear");
	printf("----------增加學生---------\n");
	stu_count++;
	int num=100000;int sex=0;
	student[stu_count-1].number=num+stu_count;
	strcpy(student[stu_count-1].code,"123456");
	printf("請輸入姓名:\n");
	gets(student[stu_count-1].name);

	while(1)
	{	
		printf("請輸入性別1.男 2.女\n");
		sex=getch();
		if(sex==49||sex==50)
		{
			printf("%s\n",sex==49?"男":"女");
			student[stu_count-1].sex=sex;
			break;
		}
		else
		show_msg("性別輸入錯誤!",1,0);
	}
	student[stu_count-1].state='0';
	printf("請輸入出生年份:\n");
	scanf("%d",&student[stu_count-1].year);
	show_msg("添加成功!",1,1);
	sleep(1);	
}
void del_stu(void)//刪除學生
{
	system("clear");
	int key=0;int num=0;int yes=0;
	printf("----------刪除學生---------\n");
	printf("請輸入需刪除學生的學號\n");
	while(1)
	{
		scanf("%d",&key);
		printf("k=%d\n",key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		{
			show_msg("該學生學號不存在!",1,0);
			show_msg("是否重新輸入?y/n",1,2);	
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}	
		else
		{
			_show_stu(num,0);
			show_msg("是否繼續刪除?y/n",1,2);
			yes=getch();
			if(yes==121 || yes==89)
			{	
				student[num].state='2';
				show_msg("刪除成功!",1,1);
				break;
			}
			else
			{
				printf("輸入學號:\n");
			}
		}	
	}
	sleep(1);
}
void modify_stu(void)//修改學生信息
{
	system("clear");
	int key=0;int num=0;char name[20];int year=0;
	printf("----------修改信息---------\n");
	printf("請輸入需修改學生的學號\n");
		scanf("%d",&key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		show_msg("該學生學號不存在!",1,0);
		else
		{
			printf("輸入修改的姓名:\n");
			strcpy(student[num].name,gets(name));
			printf("輸入出生年份:\n");
			scanf("%d",&year);
			student[num].year=year;
			show_msg("修改成功!",1,1);		
		}
	sleep(1);
}
void reset_code(void)//重置密碼
{
	system("clear");
	int key=0;int num=0;
	printf("----------重置密碼----------\n");
	printf("請輸入需要重置密碼學生的學號\n");
	scanf("%d",&key);
	getchar();
	num=_find_num(key);
	if(-1==num)
		show_msg("該學生學號不存在!",1,0);
	else
	{
		strcpy(student[num].code,"123456");
		show_msg("修改成功!",1,1);
	}
	sleep(1);
}
void unlock_account(void)//解鎖賬號
{
	system("clear");
	int key=0;
	printf("----------解鎖賬號----------\n");
	printf("請輸入需要解鎖賬號的學生的學號:\n");
	scanf("%d",&key);
	getchar();
	for(int i=0 ;i<stu_count;i++)
	{
		if(student[i].number==key && student[i].state == '1')
		{
			student[i].state= '0';
			show_msg("解鎖成功!",1,1);
			sleep(1);
			return;
		}
	}	
	show_msg("該賬號不存在或未被鎖定!",1,0);	
	show_msg("任意鍵結束顯示",1,2);
	getch();
	
}
void find_name_stu(void)//按姓名查找
{
	system("clear");
	char key[100] ;char name[20];int num=0;
	printf("----------按姓名查找----------\n");
	while(1)
	{
		printf("請輸入需要查找人姓名:\n");
		gets(name);
		_find_name(name,key);
		num=strlen(key);
		if(0==num)
		{
			show_msg("查無此人!",1,0);
			anykey_continue();
			break;
		}
		for(int i=0;i<num;i++)
		{
			printf("學號:%4d ",student[key[i]-'0'].number);
			printf("性別:%3s ",'1'==student[key[i]-'0'].sex?"男":"女");
			printf("姓名:%4s \n",student[key[i]-'0'].name);
		}
		show_msg("是否結束查找?y/n",1,2);
		num=getch();
		if(num==121 ||num==89)
			break;
	}
}
void show_01_stu(void)//顯示在校學生
{
	system("clear");
	char key[500];
	printf("----------顯示在校學生---------\n");
	int num=0;
	for(int i=0;i<stu_count;i++)
	{
		if(student[i].state!='2')
		{
			key[num]=i+'0';
			num++;
		}
	}
	for(int i=0;i<num;i++)
	{
		printf("學號:%4d ",student[key[i]-'0'].number);
		printf("性別:%3s ",'1'==student[key[i]-'0'].sex?"男":"女");
		printf("姓名:%4s \n",student[key[i]-'0'].name);
	}
	show_msg("任意鍵結束顯示!",1,2);
	getch();
}
void show_2_stu(void)//顯示離校學生
{
	system("clear");
	char key[500];int num=0;
	printf("----------顯示離校學生---------\n");
	for(int i=0;i<stu_count;i++)
	{
		if(student[i].state=='2')
		{
			key[num]=i+'0';
			num++;
		}
	}
	for(int i=0;i<num;i++)	
	{
		printf("學號:%4d ",student[key[i]-'0'].number);
		printf("性別:%3s ",'1'==student[key[i]-'0'].sex?"男":"女");
		printf("姓名:%4s \n",student[key[i]-'0'].name);
	}
	show_msg("任意鍵結束顯示",1,2);
	getch();
}
void student_information_management(void)//學生信息管理
{
	while(1)
	{
		system("clear");
		printf("-------------學生信息管理--------------\n");
		puts("0.批量導入學生");
		puts("1.添加學生");
		puts("2.刪除學生");
		puts("3.修改學生基本信息");
		puts("4.重置學生密碼");
		puts("5.解鎖學生賬號");
		puts("6.根據姓名查詢學生基本信息");
		puts("7.顯示所有在讀學生");
		puts("8.顯示所有退學學生");
		puts("9.返回上層");
		switch(getch())
			{
				case 48: add_stu_more();break;
				case 49: add_stu();break;
				case 50: del_stu();break;
				case 51: modify_stu();break;
				case 52: reset_code();break;
				case 53: unlock_account();break;
				case 54: find_name_stu();break;
				case 55: show_01_stu();break;
				case 56: show_2_stu();break;
				case 57: return;
			}
	}
}
void add_score_more(void)
{
	system("clear");
	puts("---------導入學生成績---------");
	FILE* fp=fopen("add_score.txt","r");
	int n=0;
	if(NULL==fp)
	{
		perror("fopen");
		return ;
	}	
	while(1)
	{
		fscanf(fp,"%d%d%d%d",&score[n].num,&score[n].chinese,&score[n].math,&score[n].English);
		if(feof(fp)==1)
		{
			break;
		}
		n++;
	}	
	fclose(fp);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<stu_count;j++)
		{
			if(score[i].num==student[j].number)
			{
				student[j].chinese=score[i].chinese;
				student[j].math=score[i].math;
				student[j].English=score[i].English;
			}
		}
	}
		show_msg("添加成功!按任意鍵返回!",1,1);
		getch();
}
void add_score(void)
{
	system("clear");
	int key=0;int num=0;int yes=0;
	while(1)
	{
		system("clear");
		puts("----------成績錄入----------");
		printf("請輸入需錄入成績學生的學號\n");
	
		scanf("%d",&key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		{
			show_msg("該學生學號不存在!",1,0);
			show_msg("是否重新輸入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
			
		}
		else
		{
			_show_stu(num,1);
			puts("請輸入語文成績:");
			scanf("%d",&student[num].chinese);
			puts("請輸入數學成績: ");
			scanf("%d",&student[num].math);
			puts("請輸入英語成績:");
			scanf("%d",&student[num].English);
			getchar();
			show_msg("是否繼續輸入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}	
	}
	sleep(1);
}
void modify_score(void)
{
	system("clear");
	int key=0;int num=0;int yes=0;
	while(1)
	{
		system("clear");
		puts("----------成績修改----------");
		puts("請輸入需錄入成績學生的學號");
	
		scanf("%d",&key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		{
			show_msg("該學生學號不存在!",1,0);
			show_msg("是否重新輸入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}		
		else
		{
			_show_stu(num,1);
			puts("請輸入語文成績:");
			scanf("%d",&student[num].chinese);
			puts("請輸入數學成績: ");
			scanf("%d",&student[num].math);
			puts("請輸入英語成績:");
			scanf("%d",&student[num].English);
			getchar();
			show_msg("是否繼續修改?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }
		}
	}
}
void find_name_num_score(void)
{
	int key=0,yes;
	while(1)
	{	
		int num=0;
		system("clear");
		puts("----------成績查詢----------");
		puts("請輸入需要查詢學生的學號:");
		scanf("%d",&key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		{
			show_msg("該學生學號不存在!",1,0);
			show_msg("是否重新輸入?y/n,",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}
		else
		{
			_show_stu(num,1);
			show_msg("任意鍵結束顯示!",1,2);
			getch();
			break;
		}
	}
}
void sort_score(void)
{
	system("clear");
	int count_c[500]={},count_m[500]={},count_e[500]={},count[500]={};
	for(int i=0;i<stu_count;i++)
	{
		if(student[i].state!='2')
		{
			for(int j=0;j<stu_count;j++)
			{
				if(student[j].state!='2')
				{
					if(student[j].chinese > student[i].chinese)
					count_c[i]++;
					if(student[j].math > student[i].math)
					count_m[i]++;
					if(student[j].English > student[i].English)
					count_e[i]++;
					if(student[j].chinese+student[j].math+student[j].English > student[i].chinese+student[i].math+student[i].English )
					count[i]++;
				}
			}
		}
	}
	printf(" 學號    姓名	語文排名(語文分數)  數學排名(數學分數)  英語排名(英語分數)  總排名(總分)\n");
	for(int i=0;i<stu_count;i++)
	{
		
		if(student[i].state!='2')
		{
			printf("%6d\t",student[i].number);
			printf("%s\t",student[i].name);
			printf("%6d(%3d)\t",count_c[i]+1,student[i].chinese);
			printf("%10d(%3d)\t",count_m[i]+1,student[i].math);
			printf("%6d(%3d)\t",count_e[i]+1,student[i].English);
			printf("%7d(%3d)\n",count[i]+1,student[i].chinese+student[i].math+student[i].English);
		}
	}
	show_msg("任意鍵結束顯示!",1,2);
	getch();	

}
void student_achievement_management(void)//學生成績管理
{
	while(1)
	{
		system("clear");
		printf("------------學生成績管理---------------\n");
		puts("1.單個錄入成績");
	    puts("2.值導入成績");
	    puts("3.修改學生成績");
	    puts("4.根據學號或姓名查找成績");
	    puts("5.按各科分數或部分排序");
	    puts("6.返回上層");
	    switch(getch())
	    {
			case 49: add_score();break;//單個錄入成績
			case 50: add_score_more();break;//指導入
			case 51: modify_score();break;//修改學生成績 
	 		case 52: find_name_num_score();break;//根據學號或姓名查詢學生成績 
			case 53: sort_score();break;//按各科分數和部分排序
			case 54: return;//返回上層
		}
	}	
}
void change_tea_password(int i)
{
	while(1)
		{
			printf("請輸入新密碼:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密碼格式錯誤",1,2);
				continue;
			}
			if(0==strcmp(new_code,"123456"))
			{
				show_msg("不能修改爲初始密碼!",1,2);
				continue;
			}
			strcpy(teacher[i].code,new_code);
			puts("輸入成功");
			anykey_continue();
			break;
		}
}
void teacher_interface_son(int i)
{
	if(0==strcmp(teacher[i].code,"123456"))
	{
		system("clear");
		while(1)
		{
			show_msg("第一次登入請修改密碼,密碼不能爲初始值",1,2);
			printf("請輸入新密碼:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密碼格式錯誤",1,2);
				continue;
			}
			strcpy(teacher[i].code,new_code);
			show_msg("輸入成功",1,1);
			anykey_continue();
			break;
		}
	}
	while(1)
	{
	system("clear");
	printf("--------教師界面--------\n");
	printf("工號:%d\n",teacher[i].number);
	printf("性別:%s\n",teacher[i].sex=='1'?"男":"女");
	printf("姓名:%s\n",teacher[i].name);
	printf("年齡:%ld\n",(time(NULL)/(SUM_SEC))+1970-teacher[i].year);
	printf("工齡:%ld\n",(time(NULL)/(SUM_SEC))+1970-teacher[i].work_year);
	printf("1、學生信息管理:\n");
	printf("2、學生成績管理:\n");
	printf("3、修改登入密碼:\n");
	printf("4、返回主菜單:\n");
	switch(getch())
			{
				case 49:student_information_management();break;
				case 50:student_achievement_management();break;
				case 51:printf("修改登入密碼\n");change_tea_password(i);;break;
				case 52:printf("返回主菜單\n");return;break;
			}
	}
}

6、admin.c

主要是管理員界面等信息顯示及其功能函數

#include"common.h"
void admin_interface_son(int i);
int _find_teacher_num( int key);//尋找老師工號
char *_find_teacher_name(char* name,char* key);//尋找教師姓名
void _show_teacher(int key,int b);//顯示教師信息
void add_teacher(void);//增加教師(可能需要修改)
void del_teacher(void);//刪除教師
void modify_teacher(void);//修改教師信息
void reset_teacher_code(void);//重置教師密碼
void unlock_teacher_account(void);//解鎖教師賬號
void find_teacher_name(void);//按姓名查找教師
void show_01_teacher(void);//顯示在職教師
void show_2_teacher(void);//顯示離職教師
void teacher_information_management(void);//教師信息管理
void change_adm_password(int i);
int _find_teacher_num( int key)//尋找老師工號
{
	for(int i=0 ;i<teacher_count;i++)
	{
		if(teacher[i].number==key && teacher[i].state != '2')
		{
			return i;
		}
	}
	return -1;
}
char *_find_teacher_name(char* name,char* key)//尋找教師姓名
{
	int count=0;
	for(int i=0;i < teacher_count;i++)
	{
		if(0==strcmp(teacher[i].name,name) && (teacher[i].state=='0'|| teacher[i].state=='1'))
		{
			key[count]=i+'0';
			count++;
		}
	}
	key[count]='\0';
	return key;
}
void _show_teacher(int key,int b)//顯示教師信息
{
	system("clear");
	printf("工號:%4d ",teacher[key].number);
	printf("性別:%3s ",'1'==teacher[key].sex?"男":"女");
	printf("姓名:%4s \n",teacher[key].name);
	sleep(1);
}
void add_teacher(void)//增加教師(可能需要修改)
{
	system("clear");
	printf("----------增加教師---------\n");
	teacher_count++;
	int num=200000,sex=0;
	teacher[teacher_count-1].state='0';
	strcpy(teacher[teacher_count-1].code,"123456");
	teacher[teacher_count-1].number=num+teacher_count;

	printf("請輸入姓名:\n");
	gets(teacher[teacher_count-1].name);
	while(1)
	{	
		printf("請輸入性別1.男 2.女\n");
		sex=getch();
		if(sex==49||sex==50)
		{
			printf("%s\n",sex==49?"男":"女");
			teacher[teacher_count-1].sex=sex;
			break;
		}
		else
		show_msg("性別輸入錯誤!",1,2);
	}
	printf("請輸入出生年份:\n");
	scanf("%d",&teacher[teacher_count-1].year);
	printf("請輸入參加工作的年份:\n");
	scanf("%d",&teacher[teacher_count-1].work_year);
	show_msg("添加成功!",1,1);
		
}
void del_teacher(void)//刪除教師
{
	system("clear");
	int key=0;int num=0;int yes;
	printf("----------刪除教師---------\n");
	printf("請輸入需刪除教師的工號\n");
	while(1)
	{
		scanf("%d",&key);
		getchar();
		num=_find_teacher_num(key);
		if(-1==num)
		{
			show_msg("該教師工號不存在!",1,0);
			show_msg("是否重新輸入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}
		else
		{
			_show_teacher(num,0);
			show_msg("是否繼續刪除?y/n",1,2);
			yes=getch();
			if(yes==121 || yes==89)
			{	
				teacher[num].state='2';
				show_msg("刪除成功!",1,1);
				break;
			}
			else
			{
				printf("輸入工號:\n");
			}
		}	
	}
	sleep(1);
}
void modify_teacher(void)//修改教師信息
{
	system("clear");
	int key=0;int num=0;char name[20];int year=0;int yes=0;
	printf("----------修改信息---------\n");
	printf("請輸入需修改教師的工號\n");
	while(1)
	{
		scanf("%d",&key);
		getchar();
		num=_find_teacher_num(key);
		if(-1==num)
		{
			show_msg("該教師工號不存在!",1,0);
			show_msg("是否重新輸入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}
		else
		{
			printf("輸入修改的姓名:\n");
			strcpy(teacher[num].name,gets(name));
			
			printf("輸入入職年份:\n");
			scanf("%d",&year);
			teacher[num].year=year;
			show_msg("修改成功!",1,1);
			break;
		}
	}
	sleep(1);
}
void reset_teacher_code(void)//重置教師密碼
{
	system("clear");
	int key=0;int num=0;int yes=0;
	printf("----------重置密碼----------\n");
	printf("請輸入需要重置密碼教師的工號\n");
	while(1)
	{
		scanf("%d",&key);
		getchar();
		num=_find_teacher_num(key);
		if(-1==num)
		{
			show_msg("該教師工號不存在!",1,0);
			show_msg("是否重新輸入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}
		else
		{
			strcpy(teacher[num].code,"123456");
			show_msg("修改成功!",1,1);
			break;
		}
	}	
	sleep(1);
}
void unlock_teacher_account(void)//解鎖教師賬號
{
	system("clear");
	int key=0;
	printf("----------解鎖賬號----------\n");
	while(1)
	{	
		printf("請輸入需要解鎖賬號的教師的工號:\n");
		scanf("%d",&key);
		getchar();
		for(int i=0 ;i<teacher_count;i++)
		{
			if(teacher[i].number==key && teacher[i].state == '1')
			{
				teacher[i].state= '0';
				show_msg("解鎖成功!",1,1);
				anykey_continue();
				return;
			}
		}
		show_msg("查無此人",1,0);
		return;
	}
}
void find_teacher_name(void)//按姓名查找教師
{
	system("clear");
	char key[100]={};char name[20];int num=0;
	printf("----------按姓名查找----------\n");
	while(1)
	{
		printf("請輸入需要查找人姓名:\n");
		gets(name);
		_find_teacher_name(name,key);
		num=strlen(key);
		if(num==0)
		{
			show_msg("查無此人",1,0);
			return;
		}
		for(int i=0;i<num;i++)
		{
			printf("工號:%4d ",teacher[key[i]-'0'].number);
			printf("姓名:%4s ",teacher[key[i]-'0'].name);
			printf("性別:%3s \n",'1'==teacher[key[i]-'0'].sex?"男":"女");
		}
		show_msg("是否結束查找?y/n",1,2);
		num=getch();
		if(num==121 ||num==89)
		{
			break;
		}
	}

}
void show_01_teacher(void)//顯示在職教師
{
	system("clear");
	char key[500];int num=0;
	printf("----------顯示在職教師---------\n");
	for(int i=0;i<teacher_count;i++)
	{
		if(teacher[i].state!='2')
		{
			key[num]=i+'0';
			num++;
		}
	}
	key[num]='\0';
	for(int i=0;i<num;i++)
	{
		printf("工號:%4d ",teacher[key[i]-'0'].number);
		printf("姓名:%4s ",teacher[key[i]-'0'].name);
		printf("性別:%3s\n",'1'==teacher[key[i]-'0'].sex?"男":"女");
	}
	show_msg("按任意鍵繼續!",1,2);
	getch();
	
}
void show_2_teacher(void)//顯示離職教師
{
	system("clear");
	char key[500];int num=0;
	printf("----------顯示離職教師---------\n");
	for(int i=0;i<teacher_count;i++)
	{
		if(teacher[i].state=='2')
		{
			key[num]=i+'0';
			num++;
		}
	}
	key[num]='\0';
	for(int i=0;i<num;i++)
	{
		printf("工號:%4d ",teacher[key[i]-'0'].number);
		printf("姓名:%4s ",teacher[key[i]-'0'].name);
		printf("性別:%3s\n",'1'==teacher[key[i]-'0'].sex?"男":"女");
	}
	show_msg("按任意鍵繼續!",1,2);
	getch();
}
void teacher_information_management(void)//教師信息管理
{
	while(1)
	{
		system("clear");
		printf("-------------教師信息管理--------------\n");
		puts("1.添加教師");
		puts("2.刪除教師");
		puts("3.修改教師基本信息");
		puts("4.重置教師密碼");
		puts("5.解鎖教師賬號");
		puts("6.根據姓名查詢教師基本信息");
		puts("7.顯示所有在職教師");
		puts("8.顯示所有離職教師");
		puts("9.返回上層");
		switch(getch())
			{
				case 49: add_teacher();break;
				case 50: del_teacher();break;
				case 51: modify_teacher();break;
				case 52: reset_teacher_code();break;
				case 53: unlock_teacher_account();break;
				case 54: find_teacher_name();break;
				case 55: show_01_teacher();break;
				case 56: show_2_teacher();break;
				case 57: return;
			}
	}
}
void change_adm_password(int i)
{
	while(1)
		{
			printf("請輸入新密碼:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密碼格式錯誤",1,0);
				continue;
			}
			if(0==strcmp(new_code,"123456"))
			{
				show_msg("不能修改爲初始密碼!",1,0);
				continue;
			}
			strcpy(admin[i].code,new_code);
			show_msg("輸入成功!",1,1);
			anykey_continue();
			break;
		}
}
void admin_interface_son(int num)
{
	if(0==strcmp(admin[num].code,"123456"))
	{
		system("clear");
		while(1)
		{
			puts("第一次登入請修改密碼,密碼不能爲初始值");
			printf("請輸入新密碼:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密碼格式錯誤",1,0);
				continue;
			}
			strcpy(admin[num].code,new_code);
			show_msg("輸入成功!",1,1);
			anykey_continue();
			break;
		}
	}
	while(1)
	{
	system("clear");
	printf("--------管理員界面--------\n");
	printf("工號:%d\n",admin[num].number);
	printf("姓名:%s\n",admin[num].name);
	printf("-------------------------\n");
	printf("1、教師信息管理:\n");
	printf("2、修改登入密碼:\n");
	printf("3、返回主菜單:\n");
	switch(getch())
			{
				case 49:teacher_information_management();break;
				case 50:printf("修改登入密碼\n");change_adm_password(num);;break;
				case 51:printf("返回主菜單\n");return;break;
			}
	}
}

7.sup_admin.c

主要是超級管理員界面及其功能函數

#include"common.h"
void adm_add(void);//添加或刪除管理員函數
int adm_sec_num(int num);//通過工號查找編號
void super_administrators_interface_son(void);//界面函數
int adm_sec_num(int num)
{
	for(int i=0;i<adm_count;i++)
	{
		if(admin[i].state!='2' && num == admin[i].number)
		return i;
	}
	return -1;
}
void replace_adm(void)
{
	puts("輸入要重置密碼的管理員的工號:");
	int num=0;
	scanf("%d",&num);
	getchar();
	int index=adm_sec_num(num);
	if(-1==index)
	{
		show_msg("查無此管理員",1,0);
		anykey_continue();
	}
	else
	{
		strcpy(admin[index].code,"123456");
		show_msg("重置密碼成功",1,1);
		anykey_continue();
	}
	
}
void unlock_adm(void)
{
	puts("輸入要解鎖的管理員的工號:");
	int num=0;
	scanf("%d",&num);
	getchar();
	int index=adm_sec_num(num);
	if(-1==index)
	{
		show_msg("查無此管理員",1,0);
		anykey_continue();
	}
	else
	{
		admin[index].state='0';
		show_msg("解鎖成功",1,1);
		anykey_continue();
	}
}
void list_adm(void)
{
	system("clear");
	for(int i=0;i<adm_count;i++)
	{
		if(admin[i].state=='2')
		continue;
		else
		printf("姓名:%s 工號:%d\n",admin[i].name,admin[i].number);
	}
	anykey_continue();
	
}
void super_administrators_interface_son(void)
{
	while(1)
	{
		system("clear");
		puts("1.添加或刪除管理員");
		puts("2.重置管理員密碼");
		puts("3.解鎖管理員賬號");
		puts("4.顯示所有管理員");
		puts("5.返回上級菜單");
		switch(getch())
		{
			case 49:adm_add();;break;
			case 50:replace_adm();;break;
			case 51:unlock_adm();;break;
			case 52:list_adm();;break;
			case 53:return;		
		}
	}
}
void adm_add(void)
{
	system("clear");
	puts("1.添加管理員");
	puts("2.刪除管理員");
	puts("3.返回上級菜單");
	while(1)
	{
		int num=0;
		switch(getch())
			{
				case 49:
						system("clear");
						printf("----------增加管理員---------\n");
						adm_count++;
						int num=300000,sex=0;
						admin[adm_count-1].state='0';
						strcpy(admin[adm_count-1].code,"123456");
						admin[adm_count-1].number=num+adm_count;

						printf("請輸入姓名:\n");
						gets(admin[adm_count-1].name);
						while(1)
						{	
							printf("請輸入性別1.男 2.女\n");
							sex=getch();
							if(sex==49||sex==50)
							{
								printf("%s\n",sex==49?"男":"女");
								admin[adm_count-1].sex=sex;
								break;
							}
							else
							show_msg("性別輸入錯誤!",1,0);
						}
						printf("請輸入出生年份:\n");
						scanf("%d",&admin[adm_count-1].year);
						show_msg("添加成功!",1,1);
						sleep(1);	
				return;
						;break;
				case 50:
				puts("請輸入要刪除的管理員的工號:");
				scanf("%d",&num);
				getchar();
				int index=adm_sec_num(num);
				if(-1==index)
				{
					show_msg("查無此管理員!",1,0);
					anykey_continue();
					return;
				}
				else
				{
					admin[index].state='2';
					show_msg("刪除成功!",1,1);
					anykey_continue();
					return;
				}
						;break;	
				case 51:return;break;
			}
	}
}

總結

整個系統不是我一個人完成的,是三個人合力完成的。在編寫代碼的時候會發現很多的問題。
比如:

1、函數以及變量名要先統一好,否則一人一個變量名等到整合時會很難受的。
2、會有很多編譯錯誤和編譯警告,其中比較多的是數組數據越界導致的段錯誤。
3、教師和管理員功能類似,不過在移植後發現很多的問題源代碼出現的問題移植過去之後也會產生問題,修改起來就特別麻煩。
所以在之後的學習合作中要:
1、多寫註釋,方便其他人閱讀,和時間久了防止自己忘記。
2、做好及時的溝通交流。
3、結對編程很重要。
4、思維和邏輯靈活,不要把事情搞複雜,往簡單方面想。
5、在寫項目中學習,遇到問題學會分析,一起討論一起解決,學習新的知識,和對原來理解的拓展和更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章