c课程设计--学生成绩管理系统

学生成绩管理系统文档

源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SUBJECT_NUM 3
#define LEN sizeof(struct student) 


//student结构体  
struct student{
	char studentID[11];			//	学号 
	char name[16];				//	姓名  
	float score[SUBJECT_NUM];	//	分数,为了方便,设置三科分数 
	float GPA;					//	平均绩点
	struct student *next;		//	结构体指针 
};


int openstyle; 							//打开文件的方式 

int saveTag; 							// 0表示已保存,1表示未保存 

struct student *head;					//链表头指针

FILE *fp; 								//指向打开或者新建文件的文件指针 

char filename[10];						// 打开或者新建文件的文件名 

char credit[SUBJECT_NUM];				//各科学分		

int creditSum;							//学分总和 


//函数原型 
void print();

struct student * open();

struct student * newBuild(); 

struct student * loadRecords(FILE *fp); 

int id_verification();

void enter_menu();

int menu_select();

void inputCredit();

struct student * addRecord();

int unique(char id[11]);

struct student * del();

struct student * ID_delRecord();

struct student * name_delRecord();

struct student * modify();

struct student * ID_modifyRecord();

struct student * name_modifyRecord();

void display(); 

void displayAll();

void displayFail();

void query();

void ID_query();

void Name_query();

float calculate_GPA(struct student *p);

void GPA_sort();

void saveRecords(); 

void quit();

void end();

//主函数 
void main()
{
	print();
	if(id_verification()){
		//选择操作文件的方式 
		printf("**************************\n");
		printf("*                        *\n");
		printf("*                        *\n");
		printf("*   1. 打开文件          *\n");
		printf("*                        *\n");
		printf("*   2. 新建文件          *\n");
		printf("*                        *\n");
		printf("*                        *\n");
		printf("**************************\n");
		printf("请输入您的选择:\n");
		for(;;) {
			scanf("%d",&openstyle);
			getchar();
			if(openstyle>0 && openstyle<3){
				break;
			}else{
				printf("\t输入错误,请重新输入您的选择:\n");
			}
		}
	
		if(openstyle==1){
			head=open();	
		}else{
			head=newBuild();
		}
		//进入功能菜单 
		enter_menu(); 
	}
	return;
}



//生成系统初始界面 
void print()
{
	printf("***************************************\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*          学生成绩管理系统           *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                     欢迎使用        *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("***************************************\n\n");
}


//管理员身份验证函数 
//如果输入三次用户名和密码仍然不能通过验证,那么系统将自动退出
//默认用户名:admin  默认密码:000000 
int id_verification()
{
	int i;
	char user[5];
	char userPassword[6];
	char *userName="admin";     //默认用户名:admin
	char *password="000000";    //默认密码:000000
	for(i=1;i<=4;i++){
		if(i==4){
			printf("身份验证失败\n");
			printf("系统已经自动退出\n");
			return 0;
		}
		if(i==1){
			printf("请输入用户名:\n");
			gets(user);
			printf("请输入用户密码:\n");
			gets(userPassword);
			if(strcmp(user,userName)==0 && strcmp(userPassword,password)==0){
				printf("身份验证成功\n\n");
				return 1;
			}	
		}else{
			printf("用户名与密码不匹配\n");
			printf("请重新输入用户名:\n");
			gets(user);
			printf("请重新输入用户密码:\n");
			gets(userPassword);
			if(strcmp(user,userName)==0 && strcmp(userPassword,password)==0){
				printf("身份验证成功\n\n");
				return 1;
			}
		}
	}
}


//打开已经存在的文件 ,并调用加载函数 
struct student * open()
{
	printf("请输入要打开文件名:\n");
	getchar(); 
	gets(filename);
	if((fp=fopen(filename,"rb"))==NULL){
		printf("can't open file!\n");
		exit(0);
	}
	return loadRecords(fp);
}


//原文件不存在,新建一个文件 , 
struct student * newBuild()
{
	printf("请输入新建打开文件名:\n");
	getchar();
	gets(filename);
	if((fp=fopen(filename,"wb"))==NULL){
		printf("can't build file!\n");
		exit(0);
	}
	fclose(fp);
	return NULL;
}


//加载文件数据,返回一个头结点为head的链表。
//如果文件为空,则返回一个空链表 
struct student * loadRecords(FILE *fp)
{
	struct student *head=NULL;
	struct student *p1,*p2;
	while(1){
		//从文件中读取数据,并将数据放进一个链表里 
		if(head==NULL){
			p1=p2=(struct student *)malloc(LEN);
			fread(p1,LEN,1,fp);
			if(feof(fp)){
				break;
			}
			head=p1;
		}else{
			p1=(struct student *)malloc(LEN);
			fread(p1,LEN,1,fp);
			if(feof(fp)){
				break;
			}
			p2->next=p1;
			p2=p1;
		}
	}
	p2->next=NULL;
	fclose(fp);
	return (head);
}


//菜单处理函数 
void enter_menu()
{
	while(1){
		switch(menu_select()){
			case 1: 
				inputCredit();
				break;
			case 2:
				head=addRecord();
				break;
			case 3:
				head=del();
				break;
			case 4:
				head=modify();
				break;
			case 5:
				display();
				break;
			case 6:
				query();
				break;
			case 7:
				GPA_sort();
				break;
			case 8:
				saveRecords();
				break;	
			case 9:
				quit();	
		}
	} 
}


//菜单选择函数 
int menu_select()
{
	int option;
	printf("***************************************\n"); 
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*             系统菜单                *\n");
	printf("*                                     *\n");
	printf("*    1. 输入各科学分                  *\n");
	printf("*                                     *\n");
	printf("*    2. 添加学生信息                  *\n");
	printf("*                                     *\n");
	printf("*    3. 删除信息                      *\n");
	printf("*                                     *\n");
	printf("*    4. 修改信息                      *\n");
	printf("*                                     *\n");
	printf("*    5. 显示学生信息                  *\n");
	printf("*                                     *\n");
	printf("*    6. 查询学生信息                  *\n");
	printf("*                                     *\n");
	printf("*    7. 根据GPA高低输出学生信息       *\n");
	printf("*                                     *\n");
	printf("*    8. 保存                          *\n");
	printf("*                                     *\n");
	printf("*    9. 退出系统                      *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("***************************************\n\n");
	printf("请输入您的选择:\n");
	for(;;)	{
		scanf("%d",&option);
		getchar();
		if(option>0 && option<10){
			return option;
		}else{
			printf("\t输入错误,请重新输入您的选择:\n");
		}
	}
}


//输入各科学分 ,并计算学分总和 
void inputCredit()
{
	int i=1;
	creditSum=0; 
	//先输入各科学分 
	for(i=1;i<=SUBJECT_NUM;i++){
		printf("请输入第%d科的学分:\n",i);
		scanf("%d",&credit[i-1]);
	}
	//求出各科学分之和 
	for(i=1;i<=SUBJECT_NUM;i++){
		creditSum=creditSum+credit[i-1];
	}
} 


//向链表中添加新的数据 
//返回更新数据之后的链表头结点 
//学号必须唯一 
struct student * addRecord()
{
	//用于判断是否和已经添加的学号相同 
	char testID[11]; 
	
	//newRecord 是新添加的数据指针 
	struct student *p,*newRecord;
	
	//将指针p 指向最后一个结点 
	p=head;
	if(head!=NULL){
		while(p->next!=NULL){
			p=p->next;
		}
	}
	//向指针p后面添加新的数据 
	char str[5];
	int j;
	while(1){
		printf("您将要添加一组新的信息,确定吗?\n");
		printf("            (Y/N)               \n");
		gets(str);
		//如果选择no,不再添加新的 
		if(str[0]=='n' || str[0]=='N') {
			break;
		} 
		//输入新结点的信息 
		newRecord=(struct student *)malloc(LEN);
		printf("请输入学号:\n");
		gets(testID);
		while(1){
			if(unique(testID)){
				strcpy(newRecord->studentID,testID);
				break;
			}
			else{
				printf("学号已存在,请重新输入!\n");
				gets(testID);
			}
		}
		printf("请输入姓名:\n");
		gets(newRecord->name);
		for(j=1;j<=SUBJECT_NUM;j++){
			printf("请输入第%d科成绩:\n",j);
			scanf("%f",&(newRecord->score[j-1]));
			getchar();
		}
		//计算newRecord的GPA 
		newRecord->GPA=calculate_GPA(newRecord); 
		if(head==NULL){
			head=newRecord;
		}
		else{
			p->next=newRecord;
		}
		p=newRecord;
	}
	if(head!=NULL){
		p->next=NULL;
	}
	saveTag=1;
	return (head);
}


//判断学号是否唯一,唯一返回1,不唯一返回0 
int unique(char id[11]){
	struct student *p;
	if(head==NULL){
		return 1;
	}
	else{
		p=head;
		do{
			if(strcmp(id,p->studentID)==0){
				return 0;
			}
			p=p->next;
		}while(p!=NULL);
		return 1;
	}
} 


//删除信息 
struct student * del()
{
	int delStyle;
	char str[5];
	while(1){
		printf("**************************\n");
		printf("*                        *\n");
		printf("*                        *\n");
		printf("*   1. 学号删除          *\n");
		printf("*                        *\n");
		printf("*   2. 姓名删除          *\n");
		printf("*                        *\n");
		printf("*                        *\n");
		printf("**************************\n");
		printf("请输入您的选择:\n");
		while(1){
			scanf("%d",&delStyle);
			getchar();
			if(delStyle>0 && delStyle<3){
				break;
			}else{
				printf("输入错误,请重新输入您的选择:\n");
			}
		}
		if(delStyle==1){
			head=ID_delRecord();
		}
		else if(delStyle==2){
			head=name_delRecord();
		}
		//提示是否要删除信息 
		printf("是否还要删除信息?\n");
		printf("      (Y/N)     \n");
		gets(str);
		//选择no,停止删除信息 
		if(str[0]=='n' || str[0]=='N') {
			break;
		} 
	}
	return (head); 
} 


// 删除链表中指定的结点
//根据学号删除链表中的结点 
struct student * ID_delRecord()
{
	struct student *p1,*p2;	
	//存储待删学生的学号 
	char targetID[11];						
	
	//如果为空表,函数结束 
	if(head==NULL){
		printf("无信息,请先添加数据\n");
		return (head); 
	}
	//输入待删的学号 
	printf("请输入要删除的学生的学号:\n");
	gets(targetID);
	p1=head;
	//从头遍历链表,直到找到该学号,或者直到链表结束 
	while(strcmp(targetID,p1->studentID)!=0 && p1->next!=NULL){
		p2=p1;
		p1=p1->next;
	}
	//如果找到该生 
	if(strcmp(targetID,p1->studentID)==0){
		if(p1==head) head=p1->next;					//头结点为要删除的信息 
		else p2->next=p1->next;						//头结点不是要删除的信息 
		printf("删除的学生信息学号是:%s\n\n",targetID);
		free(p1); 
		printf("删除成功!\n\n"); 
	} 
	else{
		printf("该生信息不存在!\n\n");				//未找到该生信息 
	}
	saveTag=1;
	return (head);
}


//根据学生姓名删除信息 
struct student * name_delRecord()
{
	struct student *p1,*p2;	
	//存储待删学生的姓名 
	char targetname[16];						
		//如果为空表,函数结束 
	if(head==NULL){
		printf("无信息,请先添加数据\n");
		return (head); 
	}
	//输入待删的姓名 
	printf("请输入要删除的学生的姓名:\n");
	gets(targetname);
	getchar();
	p1=head;
	//从头遍历链表,直到找到该姓名,或者直到链表结束 
	while(strcmp(targetname,p1->name)!=0 && p1->next!=NULL){
		p2=p1;
		p1=p1->next;
	}
	//如果找到该生 
	if(strcmp(targetname,p1->name)==0){
		if(p1==head) head=p1->next;					//头结点为要删除的信息 
		else p2->next=p1->next;						//头结点不是要删除的信息 
		printf("删除的学生信息姓名是:%s\n\n",targetname);
		free(p1); 
		printf("删除成功!\n\n"); 
	} 
	else{
		printf("该生信息不存在!\n\n");				//未找到该生信息 
	}
	saveTag=1;
	return (head);
}


//修改信息 
struct student * modify()
{
	int modifyStyle;
	char str[5];
	while(1){
		printf("**************************\n");
		printf("*                        *\n");
		printf("*                        *\n");
		printf("*   1. 学号修改          *\n");
		printf("*                        *\n");
		printf("*   2. 姓名修改          *\n");
		printf("*                        *\n");
		printf("*                        *\n");
		printf("**************************\n");
		printf("请输入您的选择:\n");
		while(1){
			scanf("%d",&modifyStyle);
			getchar();
			if(modifyStyle>0 && modifyStyle<3){
				break;
			}else{
				printf("输入错误,请重新输入您的选择:\n");
			}
		}
		if(modifyStyle==1){
			head=ID_modifyRecord();
		}
		else if(modifyStyle==2){
			head=name_modifyRecord();
		}
		//提示是否修改信息 
		printf("是否还要修改其他学生成绩信息?\n");
		printf("            (Y/N)             \n");
		gets(str);
		//选择no,停止修改成绩信息 
		if(str[0]=='n' || str[0]=='N') {
			break;
		} 
	}
	return (head);
}


// 修改学生信息
// 输入学号,找到该生信息,并修改其成绩 
struct student * ID_modifyRecord()
{
	struct student *p1,*p2;	
	//存储待修改学生的学号 
	char targetID[11];	
	char str[5];					
	//如果为空表,函数结束 
	if(head==NULL){
		printf("无信息,请先添加数据\n");
		return (head); 
	}
	//输入待修改的学号 
	printf("请输入要修改成绩学生的学号:\n");
	gets(targetID);
	p1=head;
	//从头遍历链表,直到找到该学号,或者直到链表结束 
	while(strcmp(targetID,p1->studentID)!=0 && p1->next!=NULL){
		p2=p1;
		p1=p1->next;
	}
	//如果找到该生 
	if(strcmp(targetID,p1->studentID)==0){
		int k;
		while(1){
			printf("您想修改第几科成绩:\n");
			scanf("%d",&k);
			if(k>=1 && k<=SUBJECT_NUM){
				printf("请输入修改后的成绩: \n");
				scanf("%f",&(p1->score[k-1]));
				getchar(); 
				printf("修改成功!\n\n"); 
				printf("是否还要修改该生成绩信息?\n");
				printf("          (Y/N)          \n\n");
				gets(str);
				//选择no,停止修改该生成绩信息 
				if(str[0]=='n' || str[0]=='N') {
					break;
				} 
			}else{
				printf("输入错误,请重新输入!\n");
			} 
		} 
		//修改完成绩,GPA相应修改 
		p1->GPA=calculate_GPA(p1);
	} 
	else{
		printf("该生信息不存在!\n\n");				//未找到该生信息 
	}
	saveTag=1;
	return (head); 
}


// 修改学生信息
// 输入姓名,找到该生信息,并修改其成绩 
struct student * name_modifyRecord()
{
	struct student *p1,*p2;	
	//存储待修改学生的姓名 
	char targetname[16];						
	char str[5];
	//如果为空表,函数结束 
	if(head==NULL){
		printf("无信息,请先添加数据\n");
		return (head); 
	}
	//输入待修改的姓名 
	printf("请输入要修改成绩学生的姓名:\n");
	gets(targetname);
	p1=head;
	//从头遍历链表,直到找到该姓名,或者直到链表结束 
	while(strcmp(targetname,p1->name)!=0 && p1->next!=NULL){
		p2=p1;
		p1=p1->next;
	}
	//如果找到该生 
	if(strcmp(targetname,p1->name)==0){
		int k;
		while(1){
			printf("您想修改第几科成绩:\n");
			scanf("%d",&k);
			if(k>=1 && k<=SUBJECT_NUM){
				printf("请输入修改后的成绩: \n");
				scanf("%f",&(p1->score[k-1]));
				getchar();
				printf("修改成功!\n\n"); 
				printf("是否还要修改该生其他成绩?\n");
				printf("         (Y/N)            \n\n");
				gets(str);
				//选择no,停止修改该生成绩信息 
				if(str[0]=='n' || str[0]=='N') {
					break;
				} 
			}else{
				printf("输入错误,请重新输入!\n");
			} 
		} 
		//修改完成绩,GPA相应修改 
		p1->GPA=calculate_GPA(p1);
	} 
	else{
		printf("该生信息不存在!\n\n");				//未找到该生信息 
	}
	saveTag=1;
	return (head); 
}


//显示信息 
void display() 
{
	int displayStyle;
	printf("**************************\n");
	printf("*                        *\n");
	printf("*                        *\n");
	printf("*   1. 显示不及格学生    *\n");
	printf("*                        *\n");
	printf("*   2. 显示所有学生      *\n");
	printf("*                        *\n");
	printf("*                        *\n");
	printf("**************************\n");
	printf("请输入您的选择:\n");
	while(1){
		scanf("%d",&displayStyle);
		getchar();
		if(displayStyle>0 && displayStyle<3){
			break;
		}else{
			printf("输入错误,请重新输入您的选择:\n");
		}
	}
	if(displayStyle==1){
		displayFail();
	}
	else if(displayStyle==2){
		displayAll();
	}
}


//显示链表当前内存里所有的信息 
void displayAll()
{
	struct student *p;
	p=head;
	//如果链表为空,给出提示 
	if(p==NULL){
		printf("无学生信息,请先输入!\n"); 
		return;
	} 
	else{
		//链表不为空,输出所有信息 
		printf("These records are: \n");
		printf("ID\tNAME\tMATH\tENGLISH\t C\tGPA\n\n");
		do{
			printf("%s\t%s\t%.1f\t%.1f\t %.1f\t%.3f\n",p->studentID,p->name,p->score[0],p->score[1],p->score[2],p->GPA);
			p=p->next;
		}while(p!=NULL);
	}
}


//输出当前内存链表中所有不及格的学生信息 
void displayFail()
{
	struct student *p;
	p=head;
	//如果链表为空,给出提示 
	if(p==NULL){
		printf("无学生信息,请先输入!\n"); 
		return;
	} 
	else{
		//链表不为空,输出所有不及格学生信息 
		printf("不及格学生信息:\n");
		printf("ID\tNAME\tMATH\tENGLISH\t C\tGPA\n\n");
		do{
			//判断学生是否有不及格的成绩
			//当三科中有一科成绩满足条件就输出 
			if((p->score[0]<60) || (p->score[1]<60) || (p->score[2]<60)){
				printf("%s\t%s\t%.1f\t%.1f\t %.1f\t%.3f\n",p->studentID,p->name,p->score[0],p->score[1],p->score[2],p->GPA);
			} 
			p=p->next;
		}while(p!=NULL);
	}
}


//查询信息 
void query()
{
	int queryStyle;
	char str[5];
	while(1){
		printf("**************************\n");
		printf("*                        *\n");
		printf("*                        *\n");
		printf("*   1. 学号查询          *\n");
		printf("*                        *\n");
		printf("*   2. 姓名查询          *\n");
		printf("*                        *\n");
		printf("*                        *\n");
		printf("**************************\n");
		printf("请输入您的选择:\n");
		while(1){
			scanf("%d",&queryStyle);
			getchar(); 
			if(queryStyle>0 && queryStyle<3){
				break;
			}else{
				printf("输入错误,请重新输入您的选择:\n");
			}
		}
		if(queryStyle==1){
			ID_query();
		}
		else if(queryStyle==2){
			Name_query(); 
		}
		//提示是否查询信息 
		printf("是否还要查询其他学生成绩信息?\n");
		printf("            (Y/N)             \n");
		gets(str);
		//选择no,停止查询信息 
		if(str[0]=='n' || str[0]=='N') {
			break;
		} 
	}
}


//根据学生学号查询学生信息 
void ID_query()
{
	struct student *p1,*p2;	
	//存储待查学生的学号 
	char id[11];						
	//如果为空表,函数结束 
	if(head==NULL){
		printf("无信息,请先添加数据\n");
		return; 
	}
	//输入待查的学号 
	printf("请输入要查询的学生的学号:\n");
	gets(id);
	p1=head;
	//从头遍历链表,直到找到该学号,或者直到链表结束 
	while(strcmp(id,p1->studentID)!=0 && p1->next!=NULL){
		p2=p1;
		p1=p1->next;
	}
	//如果找到该生 
	if(strcmp(id,p1->studentID)==0){
		printf("该生信息如下: \n");
		printf("ID\tNAME\tMATH\tENGLISH\t C\tGPA\n\n");
		printf("%s\t%s\t%.1f\t%.1f\t %.1f\t%.3f\n",p1->studentID,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->GPA);
	} 
	else{
		printf("该生信息不存在!\n");				//未找到该生信息 
	}
}


//根据学生姓名查询学生信息 
void Name_query()
{
	struct student *p1,*p2;	
	//存储待查学生的姓名 
	char name[16];						
	//如果为空表,函数结束 
	if(head==NULL){
		printf("无信息,请先添加数据\n");
		return; 
	}
	//输入待查的姓名 
	printf("请输入要查询的学生的姓名:\n");
	gets(name);
	p1=head;
	//从头遍历链表,直到找到该姓名,或者直到链表结束 
	while(strcmp(name,p1->name)!=0 && p1->next!=NULL){
		p2=p1;
		p1=p1->next;
	}
	//如果找到该生 
	if(strcmp(name,p1->name)==0){
		printf("该生信息如下: \n");
		printf("ID\tNAME\tMATH\tENGLISH\t C\tGPA\n\n");
		printf("%s\t%s\t%.1f\t%.1f\t %.1f\t%.3f\n",p1->studentID,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->GPA);
	} 
	else{
		printf("该生信息不存在!\n");				//未找到该生信息 
	}
}


//计算学生的平均绩点
// 采用的计算公式:GPA=Σ(该科成绩*该科学分) *4/Σ(各科学分)/100 
float calculate_GPA(struct student *p)
{
	int i=1;
	//保存学生成绩与学分乘积之和 
	float sum;
	sum=0.0;
	//计算学生的sum
	for(i=1;i<=SUBJECT_NUM;i++){
		sum=sum+p->score[i-1]*credit[i-1];
	}
	p->GPA=sum*4/creditSum/100; 
	return (p->GPA);
}


// 根据学生的GPA由高到低排序
//排序完成后,输出结果 
void GPA_sort()
{
	int i=1;
	//q指向p的前一个结点 
	struct student *p,*q,*p1,*p2;
	//链表为空,提示,结束函数 
	if(head==NULL){
		printf("无信息,请先输入!\n");
		return;
	}
	//链表至少有2条数据 
	if(head->next!=NULL)
	{
		//从第二个结点开始排序 
		q=head;
		p=head->next;
		do{
			p1=head;
			//先判断是否插入到头结点之前 
			if((p->GPA)>(p1->GPA)){
				q->next=p->next;
				p->next=head;
				head=p;	
			}
			//如果不是插入到头结点前 
			else{
				p2=head->next;
				//找到要插入的位置 
				while(p2!=p && (p->GPA)<=(p2->GPA)){
					p1=p2;
					p2=p2->next;
				}
				//判断是否需要插入 
				if(p2!=p){
					q->next=p->next;
					p->next=p2;
					p1->next=p; 
				}
			}
			q=p;
			p=p->next;	
		}while(p!=NULL);
	}
	//排序完成,输出排序后的结果 
	printf("排序如下:\n"); 
	printf("ID\tNAME\tGPA\trank\n\n");
	p=head;
	do{
		printf("%s\t%s\t%.3f\t%d\n",p->studentID,p->name,p->GPA,i);
		i++;
		p=p->next;
	}while(p!=NULL);
	saveTag=1;
}


//保存信息到文件中
void saveRecords(){
	//文件保存方式 
	int saveStyle;
	struct student *p;
	printf("**************************\n");
	printf("*                        *\n");
	printf("*                        *\n");
	printf("*   1. 保存文件          *\n");
	printf("*                        *\n");
	printf("*   2. 另存文件          *\n");
	printf("*                        *\n");
	printf("*                        *\n");
	printf("**************************\n");
	printf("请输入您的选择:\n");
	for(;;) {
		scanf("%d",&saveStyle);
		if(saveStyle>0 && saveStyle<3){
			break;
		}else{
			printf("\t输入错误,请重新输入您的选择:\n");
		}
	}
	//保存文件 
	if(saveStyle==1){
		if((fp=fopen(filename,"wb"))==NULL){
			printf("can't open file!\n");
			exit(0);
		}
		if(head==NULL){
			printf("无信息,无需保存\n");
			return;
		}
		p=head;
		do{
			fwrite(p,LEN,1,fp);
			p=p->next;
		}while(p!=NULL);
		printf("数据保存成功\n");
		fclose(fp);
	} 
	//另存文件 
	else if(saveStyle==2){
		char newfile[10];
		printf("请输入新文件名:\n");
		gets(newfile); 
		if((fp=fopen(newfile,"wb"))==NULL){
			printf("can't open file!\n");
			exit(0);
		}
		if(head==NULL){
			printf("无信息,无需保存\n");
			return;
		}
		p=head;
		do{
			fwrite(p,LEN,1,fp);
			p=p->next;
		}while(p!=NULL);
		printf("数据保存成功\n");
		fclose(fp);
	}
	saveTag=0;
} 


//退出系统
void quit(){
	char str[5];
	//saveTag 等于1,表示信息未保存。 
	if(saveTag==1){
		printf("是否保存原来的信息?\n");
		printf("       (Y/N)        \n");
		gets(str);
		if(str[0]!='n' && str[0]!='N'){
			saveRecords();
		}
	}
	end(); 
	free(head);
	exit(0);
} 


//结束界面
void end(){
	printf("***************************************\n"); 
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*       感   谢  使  用 !!!        *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("*                                     *\n");
	printf("***************************************\n"); 
} 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘 要 高校学生成绩管理工作是高等教育中的一个极为重要的环节,是院校学生管理的基础。面对种类繁多的数据和报表,手工处理方式已经很难跟上现代化管理的步伐,传统的文件管理方式进行成绩管理,效率很低,耗时费力,容易出错,安全性也存在问题。特别是在查询上,由于文件过多,带来很多不便。随着计算机及通讯技术的飞速发展,高等教育对教务管理工作提出了更高的要求。尽快改变传统的管理模式,运用现代化手段进行科学管理。 本设计研究的是基于J2EE的高校成绩管理系统设计与实现。本系统是基于J2EE开发的成绩管理系统,弥补了人工管理的不足,提高了一定的效率。主要功能包括教师对学生成绩的记录,生成总评成绩,成绩单的提交。学生查询相关的成绩信息。管理员对学生、教师,课程、班级进行综合管理。该系统为教务处人员提供了强大的成绩管理功能,为教师提供了对平时成绩和期末成绩方便的管理,为学生提供了一个方便快捷的查询功能。本设计的开发工具使用MyEclipse,数据库使用的MySQL,框架是struts整合hibernate。 关键词:J2EE; 成绩管理; MySQL; MyEclipse Abstract College student grade management is a very important aspect of higher education,is the foundation of college students management. Faced with a wide variety of data and statements, the manual processing methods have been difficult to keep up with the pace of modern management, the traditional document management about grade management, is inefficient, time-consuming effort, error-prone, and also existing security issues. Because too many documents, it brings a lot of inconvenience in the query. With the computer and the rapid development of communication technology, higher education must meet a higher demand. We should change the traditional mode of management and use modern means of scientific management as soon as possible. The design based on J2EE technology mainly research about Implementation of grade management system of universities. The system is based on J2EE platform, cover the deficiencies of manual management, and improve the efficiency of management. Main features including: teachers record the grade of students in the term examines, generate the report card to examine. Students can query their information at any time with this system. Administrator can manage the students, teachers, curriculum, classes together. The system for the Registry staff with a powerful performance management capabilities, provide teachers with the usual results and final results for the management, provide students with a convenient and efficient enquiry function. The development tools is MyEclipse, database is MySQL, integrated framework is struts and hibernate. Key words: J2EE; Grade Management; MySql; MyEclipse 目 录 Abstract II 1 绪论 1 1.1高校学生成绩管理系统实施的背景分析 1 1.2选题的目的及意义 1 2 J2EE平台及其支撑技术 3 2.1 J2EE平台 3 2.1.1 J2EE简介 3 2.1.2 JSP技术 5 2.1.3 Servlet技术 7 2.1.4 EJB技术 8 2.1.5 J2EE发展趋势 9 2.2 MVC模式介绍 10 2.3 Struts框架介绍 14 2.4 Hibernate框架介绍 16 3 基于J2EE技术平台的学生成绩管理分析 18 3.1系统可行性分析. 18 3.1.1技术可行性 18 3.1.2经济可行性 18 3.1.3运行可行性 18 3.2系统需求分析 18 3.3系统整体说明 19 3.4系统模块的功能概述 19 4 系统总体设计 20 4.1.系统结构图 20 4.1.1包组织结构图 20 4.3数据流程图设计 21 4.4.1 E-R图 22 4.3主要功能模块的设计 22 4.2.1用户登录模块设计 22 4.2.2管理员管理模块设计 23 4.2.3教师成绩录入和修改模块设计 23 4.2.4学生管理模块设计 23 5 基于J2EE技术平台的系统详细设计 24 5.1数据库详细设计 24 5.1.1 数据库需求分析 24 5.1.2 数据库概念结构设计 25 5.1.3 数据库逻辑结构设计 26 5.1.4 数据库结构的实现 28 5.1.5数据库模型 30 6 系统编码与测试 31 6.1系统编码说明 31 6.1.1系统配置文件 31 6.1.2系统运行效果图示. 35 6.1.3系统主要功能模块详细实现 40 6.1.3.1管理员管理模块详细介绍 40 6.1.3.2管理员管理模块代码说明 40 6.2 系统开发环境的搭建 47 6.2.1软件环境的配置 47 6.2.2硬件环境的配置 47 6.3系统性能测试 47 6.3.1安全性测试 47 6.3.2稳定性测试 47 7 总结与展望 48 7.1总结 48 7.2展望 48 参考文献: 49 致谢 49

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值