学生成绩管理系统——课程设计报告

这是一个基于链表实现的学生信息管理系统,支持学生信息的增删改查等功能,并能够进行成绩排序和统计,适用于小型教学管理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学期末课程设计的作业,利用链表和文件的操作。日后再完善一些功能介绍。

/*************************************
*******程序名称:学生成绩管理系统 
*******作    者:
*******开发环境:Dev-C++5.11 
*******创建日期:2018.06.28
*******完成日期:2018.07.02 
**************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <ctype.h>

#define YES 1
#define NO 0

typedef struct
{
	int num;
	float prob_score;
	float disc_score;
	float cpp_score;
	double aver_score;
	double sum_score;
	char sex;
}StudentDate;                                            //学生基本信息
typedef struct student
{
	char name[20];                                       //学生姓名
	StudentDate one;                                     //学生其他信息
	int rank;                                            //成绩排名
	struct student *next;
}Student, *List;

Student *startCheck();                                   //登录系统
Student *createListHead();                               //创建链表的头
void menu();                                             //主菜单
void sortList(Student *pHead);                           //排序链表
void readListWithFile(Student *pHead, char *file_name);  //从文件中读取数据,并保存在链表中
int  userChioce(Student *pHead);                         //用户选择
int  sortMenu();                                         //打印选择菜单
void passwordCheck();                                    //密码检测
void correctWord();                                      //修改密码
void addStudentInfo(Student *pHead);                     //向链表的末尾添加数据
int  scanMenu();                                         //浏览菜单
void findStudentInfo(Student *pHead);                    //查找学生信息
void delStudentInfo(Student *pHead);                     //删除某一个学生信息
void alterStudentInfo(Student *pHead);                   //修改学生信息
void saveList(Student *pHead);                           //将链表保存在文件里
void printList(Student *pHead);                          //打印链表
void statisStudentInfo(Student *pHead);                  //查看学生信息
int  statisMenu();                                       //查看菜单
void gotoxy(int x, int y);                               //改变光标位置函数
void inputData(Student *pHead, Student *node);           //输入信息,并检测是否合法

int main()
{
	Student *pHead;

	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//得到窗口句柄
	SMALL_RECT rc = { 0, 0, 94 - 1, 30 - 1 };   //{Y位置,X位置,宽,高}
	SetConsoleWindowInfo(hOut, true, &rc);// 重置窗口位置和大小

	system("color F1");//设置控制台颜色
	pHead = startCheck();//读取信息
	while (1)
	{
		if (9 == userChioce(pHead)) //按9时退出系统
		{
			break;
		}
	}

	return 0;
}
/*================================================
== 函数名:Student *startCheck()
== 功  能:登陆系统 
== 参  数:无 
== 返回值:链表的头指针 
=================================================*/
Student *startCheck()
{
	Student *pHead;
	FILE  *fp1;
	char password[20] = "77137714";
	int i;

	if ((fp1 = fopen("password.dat", "rb")) == NULL)//若密码文件不存在,新建密码文件
	{
		fp1 = fopen("password.dat", "wb");
		fwrite(password, 20, 1, fp1);
		fclose(fp1);
		printf("密码初始化完成!(默认密码为:77137714)");
		passwordCheck();
	}
	else
	{
		passwordCheck();
	}
	//读条
	system("CLS");
	system("title 学生成绩统计系统-载入中");//将标题栏命名为“学生成绩统计系统”
	printf("\n\n\t\t\t欢迎进入本系统!正在载入.....");
	printf("\n\n\n\n\t\t\t┏━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("\t\t\t┃                    ┃\n");
	printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━┛\n");
	gotoxy(26, 7);
	for (i = 0; i < 10; i++)
	{
		printf("█");
		Sleep(100);
	}

	pHead = createListHead();
	readListWithFile(pHead, "stud.dat");

	return pHead;
}
/*================================================
== 函数名:Student *createListHead()
== 功  能:创建一个单链表 
== 参  数:无 
== 返回值:返回链表的头指针 
=================================================*/
Student *createListHead()
{
	Student *pHead;

	pHead = (List)malloc(sizeof(Student));
	pHead->next = NULL;

	return pHead;
}
/*================================================
== 函数名:void passwordCheck()
== 功  能:密码输入及判定 
== 参  数:无 
== 返回值:无 
=================================================*/
void passwordCheck()
{
	char password[20], inputword[20];
	int i = 0, j = 0;
	char c = 0;
	FILE *fp = fopen("password.dat", "rb");

	system("title 学生成绩统计系统-密码输入");//将标题栏命名为“学生成绩统计系统”
	fread(password, 20, 1, fp);
	for (i = 0; i < 3; i++)
	{
		j = 0;
		printf("\n\n\n\t\t你还有%d次机会输入正确密码: ", 3 - i);
		printf("\n\n\n\n\t\t\t┏━━━━━━━━━━━━━━━━┓\n");
		printf("\t\t\t┃                ┃\n");
		printf("\t\t\t┗━━━━━━━━━━━━━━━━┛\n");
		gotoxy(26, 8);
		while ((c = getch()) != 13 && j < 20)
		{
			if (c == '\b' && j >0)
			{
				putchar('\b');
				putchar(' ');
				putchar('\b');
				j--;
			}
			else
			{
				if (isprint(c))//isprint为检测C是否为可打印的函数 
				{
					putchar('*');
					inputword[j] = c;
					j++;
				}
			}
		}
		inputword[j] = '\0';
		if (strcmp(inputword, password) == 0)
		{
			return;
		}
		else
		{
			system("CLS");
			printf("\t\t\t密码输入错误");
		}
	}
	if (3 == i)
	{
		system("CLS");
		printf("\n\n\n\t\t你已浪费所有机会!程序即将退出!");
		Sleep(2000);
		exit(0);
	}
	fclose(fp);
	system("CLS");

	return;
}
/*================================================
== 函数名:void readListWithFile(Student *pHead, char *file_name)
== 功  能:将文件内的信息读取到链表中 
== 参  数:Student *pHead:链表头指针 
           char *file_name:文件指针 
== 返回值:无 
=================================================*/
void readListWithFile(Student *pHead, char *file_name)
{
	FILE *fp;
	Student *p1, *p2;
	int count, rank = 0;
	StudentDate dat;
	char stu_name[20];

	fp = fopen(file_name, "r");
	if (fp == NULL)
	{
		fp = fopen(file_name, "w");
		fclose(fp);
		return;
	}
	fseek(fp, 0L, 2);
	count = ftell(fp);
	p1 = pHead;
	fp = fopen(file_name, "r");
	while (!feof(fp))
	{
		p2 = (List)malloc(sizeof(Student));
		fscanf(fp, "%d %s %c %f %f %f\n", &p2->one.num, p2->name, &p2->one.sex, &p2->one.prob_score,
			&p2->one.disc_score, &p2->one.cpp_score);
		p2->one.sum_score = (double)(p2->one.prob_score + p2->one.disc_score + p2->one.cpp_score);
		p2->one.aver_score = p2->one.sum_score / 3;
		p2->next = NULL;
		p1->next = p2;
		p1 = p2;
		if (ftell(fp) == count)
		{
			break;
		}
	}
	//将链表排序,并初始化排名
	for (p1 = pHead->next; p1 != NULL; p1 = p1->next)
	{
		for (p2 = p1->next; p2 != NULL; p2 = p2->next)
		{
			if (p2->one.aver_score > p1->one.aver_score)
			{
				dat = p2->one;
				strcpy(stu_name, p2->name);
				p2->one = p1->one;
				strcpy(p2->name, p1->name);
				p1->one = dat;
				strcpy(p1->name, stu_name);
			}
		}
		p1->rank = ++rank;
	}
	fclose(fp);
}
/*================================================
== 函数名:int userChioce(Student *pHead)
== 功  能:用户功能选择 
== 参  数:链表头指针 
== 返回值:功能对应整型数 
=================================================*/
int userChioce(Student *pHead)
{
	int bum;

	system("title 学生成绩统计系统-主菜单");//将标题栏命名为“学生成绩统计系统”
	menu();
	printf("请按键选择: ");
	bum = (int)(getch() - '0');
	switch (bum)
	{
	case 1:
		addStudentInfo(pHead);
		break;
	case 2:
		delStudentInfo(pHead);
		break;
	case 3:
		alterStudentInfo(pHead);
		break;
	case 4:
		findStudentInfo(pHead);
		break;
	case 5:
		statisStudentInfo(pHead);
		break;
	case 9:
		break;
	case 6:
		sortList(pHead);
		break;
	case 7:
		correctWord();
		break;
	case 8:
		MessageBox(NULL, TEXT("名称:学生成绩管理系统\n学校:西安邮电大学\n作者:计科1705 杨晓麟"), TEXT("关于"), MB_OK);
		break;
	default:
		break;
	}

	return bum;
}
/*================================================
== 函数名:void addStudentInfo(Student *pHead)
== 功  能:向链表末尾添加数据 
== 参  数:链表头指针 
== 返回值:无 
=================================================*/
void addStudentInfo(Student *pHead)
{
	FILE *fp;
	Student *p1, *p2, *p3 = pHead;
	StudentDate dat;
	int judge = YES, rank = 0;
	char bum, stu_name[20];

	system("title 学生成绩统计系统-添加");//将标题栏命名为“学生成绩统计系统”
	fp = fopen("stud.dat", "a");
	while (pHead->next)
	{
		pHead = pHead->next;
	}
	while (judge)
	{
		p1 = (List)malloc(sizeof(Student));
		inputData(p3, p1);
		p1->next = NULL;
		pHead->next = p1;
		pHead = p1;
		fprintf(fp, "%d %s %c %.1f %.1f %.1f\n", p1->one.num, p1->name, p1->one.sex, p1->one.prob_score,
			p1->one.disc_score, p1->one.cpp_score);
		printf("是否继续添加?(Y/N)");
		bum = getch();
		if (bum == 'n' || bum == 'N')
		{
			break;
		}

	}
	//并交换排名
	for (p1 = p3->next; p1 != NULL; p1 = p1->next)
	{
		for (p2 = p1->next; p2 != NULL; p2 = p2->next)
		{
			if (p2->one.aver_score > p1->one.aver_score)
			{
				dat = p2->one;
				strcpy(stu_name, p2->name);
				p2->one = p1->one;
				strcpy(p2->name, p1->name);
				p1->one = dat;
				strcpy(p1->name, stu_name);
			}
		}
		p1->rank = ++rank;
	}
	fclose(fp);
}
/*================================================
== 函数名:void inputData(Student *pHead, Student *node)
== 功  能:输入信息并检测是否合法 
== 参  数:Student *pHead:链表头指针 
           Student *node:链表工作指针 
== 返回值:无 
=================================================*/
void inputData(Student *pHead, Student *node)
{
	Student *p1 = node, *p2, *p3 = pHead;

	system("CLS");
	printf("\n\n\t请依次输入学生的学号、姓名、性别、概率、离散、c++成绩\n");
	printf("\t注意:姓名不能有空格,性别男用M表示,女用W表示,\n\t各科成绩应该大于0小于100,输入数据时请用空格隔开\n");
	scanf("%d %s %c %f %f %f", &p1->one.num, p1->name, &p1->one.sex, &p1->one.prob_score, &p1->one.disc_score, &p1->one.cpp_score);
	// 判断输入的学号是否已经存在
	p2 = p3->next;
	while (1)
	{
		if (p2 == NULL)
		{
			break;
		}
		if (p2->one.num == p1->one.num && p2 != node)
		{
			printf("该学号已存在,请重新输入学号:");
			scanf("%d", &p1->one.num);
			p2 = p3->next;
		}
		else
		{
			p2 = p2->next;
		}
	}
	//性别是否合法
	while (1)
	{
		if (p1->one.sex != 'W'&& p1->one.sex != 'M')
		{
			p1->one.sex = getchar();
			printf("性别输入不合法,请重新输入: ");
			p1->one.sex = getchar();

		}
		else
		{
			break;
		}
	}
	//成绩是否合法
	while (1)
	{
		if (p1->one.prob_score < 0 || p1->one.prob_score > 100)
		{
			printf("概率成绩输入不合法,请重新输入:");
			scanf("%f", &p1->one.prob_score);
		}
		if (p1->one.disc_score < 0 || p1->one.disc_score > 100)
		{
			printf("离散成绩输入不合法,请重新输入:");
			scanf("%f", &p1->one.disc_score);
		}
		if (p1->one.cpp_score < 0 || p1->one.cpp_score > 100)
		{
			printf("c++成绩输入不合法,请重新输入:");
			scanf("%f", &p1->one.cpp_score);
		}
		if (p1->one.prob_score >= 0 && p1->one.prob_score <= 100 && p1->one.disc_score >= 0
			&& p1->one.disc_score <= 100 && p1->one.cpp_score >= 0 && p1->one.cpp_score <= 100)
		{
			break;
		} 
	}
	p1->one.sum_score = (double)(p1->one.prob_score + p1->one.disc_score + p1->one.cpp_score);
	p1->one.aver_score = p1->one.sum_score / 3;
}
/*================================================
== 函数名:void alterStudentInfo(Student *pHead)
== 功  能:修改学生信息 
== 参  数:链表头指针 
== 返回值:无 
=================================================*/
void alterStudentInfo(Student *pHead)
{
	int bum, count = 0, j = 0;
	int num;
	char student_name[20];
	Student *p1 = pHead->next;

	system("title 学生成绩统计系统-修改");//将标题栏命名为“学生成绩统计系统”
	bum = scanMenu();
	if (bum == 1)
	{
		printf("\n\t\t\t请输入要修改学生的学号:");
		scanf("%d", &num);
		while (p1)
		{
			j++;
			if (p1->one.num == num)
			{
				inputData(pHead, p1);
				break;
			}
			p1 = p1->next;
		}
		if (p1 == NULL)
		{
			getch();
			printf("没有该学生信息!");
		}
	}
	else
	{
		if (bum == 2)
		{
			printf("\n\t\t\t请输入要修改学生的姓名:");
			scanf("%s", student_name);
			while (p1)
			{
				j++;
				if (strcmp(p1->name, student_name) == 0)
				{
					inputData(pHead, p1);
					count = 1;
				}
				p1 = p1->next;
			}
			if (count == 0)
			{
				printf("\n\t\t\t没有该学生信息!");
				getch();
			}
		}
		else
		{
			if (3 == bum)
			{
				return;
			}
			else
			{
				alterStudentInfo(pHead);
			}
		}
	}
	saveList(pHead);
}
/*================================================
== 函数名:int scanMenu()
== 功  能:查询菜单显示和选择 
== 参  数:无 
== 返回值:功能对应整型数 
=================================================*/
int scanMenu()
{
	int bum;

	system("CLS");
	printf("\n\n\n");
	printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("\t\t┃                       以什么方式查询 ?                  ┃\n");
	printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("\t\t┃                    1   按学生的学号                      ┃\n");
	printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("\t\t┃                    2   按学生的姓名                      ┃\n");
	printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("\t\t┃                    3   返回主菜单                        ┃\n");
	printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
	printf("请按键选择:");
	bum = (int)(getch() - '0');
	system("CLS");

	return bum;
}
/*================================================
== 函数名:void saveList(Student *pHead)
== 功  能:将链表保存在文件 
== 参  数:链表头指针 
== 返回值:无 
=================================================*/
void saveList(Student *pHead)
{
	FILE *fp;

	fp = fopen("stud.dat", "w+");
	pHead = pHead->next;
	while (pHead)
	{
		fprintf(fp, "%d %s %c %.1f %.1f %.1f\n", pHead->one.num, pHead->name, pHead->one.sex, pHead->one.prob_score,
			pHead->one.disc_score, pHead->one.cpp_score);
		pHead = pHead->next;
	}
	fclose(fp);
}
/*================================================
== 函数名:void correctWord()
== 功  能:修改密码 
== 参  数:无 
== 返回值:无 
=================================================*/
void correctWord()
{
	char password[20];
	FILE *fp;
	int i = 0;
	char c;

	system("title 学生成绩统计系统-修改密码");//将标题栏命名为“学生成绩统计系统”
	system("CLS");
	printf("\n\n\n\n\t\t\t请输入新的密码:");

	while ((c = getch()) != 13 && i < 20)
	{
		if (c == '\b'&&i > 0)
		{
			putchar('\b');
			putchar(' ');
			putchar('\b');
			i--;
		}
		else
		{
			if (isprint(c))//isprint为检测C是否为可打印的函数 
			{
				putchar('*');
				password[i] = c;
				i++;
			}
		}
	}
	password[i] = '\0';
	printf("\n\t\t\t是否将密码修改为<%s>? Y or N:", password);
	c = getch();
	if (c == 'Y' || c == 'y')
	{
		fp = fopen("password.dat", "wb");
		fwrite(password, 20, 1, fp);
		fclose(fp);
		printf("\n\t\t\t修改成功!\n");
	}
	else
	{
		return;
	}
	getch();
}
/*================================================
== 函数名:void delStudentInfo(Student *pHead)
== 功  能:删除数据 
== 参  数:链表头指针 
== 返回值:无 
=================================================*/
void delStudentInfo(Student *pHead)
{
	Student *p1, *p2 = pHead;
	int bum;
	int num, count = 0;
	char student_name[20], c;

	system("title 学生成绩统计系统-删除");//将标题栏命名为“学生成绩统计系统”
	bum = scanMenu();
	if (bum == 1)
	{
		p1 = pHead->next;
		printf("\n\t\t\t请输入要删除学生的学号:");
		scanf("%d", &num);
		while (p1)
		{
			if (p1->one.num == num)
			{
				count = 1;
				printf("\n\t\t\t删除成功,删除的学生学号为:%d", num);
				if (p1->next == NULL)
				{
					pHead->next = NULL;
					break;
				}
				else
				{
					pHead->next = p1->next;
					free(p1);
					p1 = pHead->next;
				}
			}
			else
			{
				pHead = pHead->next;
				p1 = pHead->next;
			}
		}
	}
	else
	{
		if (bum == 2)
		{
			p1 = pHead->next;
			printf("\n\t\t\t请输入要删除的学生姓名:");
			scanf("%s", student_name);
			//统计一共有多少个学生
			while (p1)
			{
				if (strcmp(p1->name, student_name) == 0)
				{
					count++;
				}
				p1 = p1->next;
			}
			if (count > 0)
			{
				printf("'\n\n\n\t\t\t一共有%d个人的信息 全部删除(Y) or 逐一删除(N)?", count);//选择全部删除,还是逐一删除
				c = getch();
				//全部删除
				if (c == 'y' || c == 'Y')
				{
					p1 = pHead->next;
					while (p1)
					{
						if (strcmp(p1->name, student_name) == 0)
						{
							printf("\n\t\t\t删除成功,姓名为: %s", student_name);
							if (p1->next == NULL)
							{
								pHead->next = NULL;
								break;
							}
							else
							{
								pHead->next = p1->next;
								free(p1);
								p1 = pHead->next;
							}
						}
						else
						{
							pHead = pHead->next;
							p1 = pHead->next;
						}
					}

				}
				else
				{
					//逐一删除
					p1 = pHead->next;
					while (p1)
					{
						if (strcmp(p1->name, student_name) == 0)
						{
							printf("\n姓名:%s,学号:%d,性别:%c  是否删除(y or n)?", p1->name, p1->one.num, p1->one.sex);
							c = getch();
							if (c == 'y' || c == 'Y')
							{
								if (p1->next == NULL)
								{
									pHead->next = NULL;
									break;
								}
								else
								{
									pHead->next = p1->next;
									free(p1);
									p1 = pHead->next;
								}
								printf("成功!");
							}
							else
							{
								pHead = pHead->next;
								p1 = pHead->next;
							}
						}
						else
						{
							pHead = pHead->next;
							p1 = pHead->next;
						}
					}
				}

			}
		}
		else
		{
			if (bum == 3)
			{
				return;
			}
			else
			{
				delStudentInfo(pHead);
			}
		}
	}
	if (count == 0)
	{
		printf("\n\t\t\t没有该学生信息!");
	}
	else
	{
		saveList(p2);
	}
	getch();
}
/*================================================
== 函数名:void findStudentInfo(Student *pHead)
== 功  能:数据查找 
== 参  数:链表头指针 
== 返回值:无 
=================================================*/
void findStudentInfo(Student *pHead)
{
	int bum, count = 0;
	int num;
	char student_name[20];

	pHead = pHead->next;
	system("title 学生成绩统计系统-查找");//4-将标题栏命名为“学生成绩统计系统”
	bum = scanMenu();
	if (bum == 1)
	{
		printf("请输入学生的学号:");
		scanf("%d", &num);
		while (pHead)
		{
			if (pHead->one.num == num)
			{
				if (count == 0)
				{
					printf("\n\t\t\t已经查到!\n");
					printf("\n\  ┏━━━━━━┳━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━┓");
					printf("\n  ┃ 学号 ┃ 姓 名  ┃性别┃概  率┃离  散┃c  ++ ┃平均分┃总  分┃名次┃\n");
					count = 1;
				}
				printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
				printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", pHead->one.num,
					pHead->name, pHead->one.sex, pHead->one.prob_score, pHead->one.disc_score,
					pHead->one.cpp_score, pHead->one.aver_score, pHead->one.sum_score, pHead->rank);
				break;
			}
			pHead = pHead->next;
		}
		if (pHead == NULL)
		{
			printf("\n\t\t\t没有该学生记录!\n");
		}
		else
		{
			printf("  ┗━━━━━━┻━━━━━━━━┻━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━┛\n");
		}
	}
	else
	{
		if (bum == 2)
		{
			printf("请输入学生姓名:");
			scanf("%s", student_name);
			while (pHead)
			{
				if (strcmp(student_name, pHead->name) == 0)
				{
					if (count == 0)
					{
						printf("\n\t\t\t已经查到!\n");
						printf("\n\  ┏━━━━━━┳━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━┓");
						printf("\n  ┃ 学号 ┃ 姓 名  ┃性别┃概  率┃离  散┃c  ++ ┃平均分┃总  分┃名次┃\n");
						count = 1;
					}
					printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
					printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", pHead->one.num,
						pHead->name, pHead->one.sex, pHead->one.prob_score, pHead->one.disc_score,
						pHead->one.cpp_score, pHead->one.aver_score, pHead->one.sum_score, pHead->rank);
				}
				pHead = pHead->next;
			}
			if (count == 0)
			{
				printf("\n\t\t\t没有该学生记录!");
			}
			else
			{
				printf("  ┗━━━━━━┻━━━━━━━━┻━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━┛\n");
			}
		}
		else
		{
			if (bum == 3)
			{
				return;
			}
			else
			{
				findStudentInfo(pHead);
			}
		}

	}
	getch();
}
/*================================================
== 函数名:void menu()
== 功  能:菜单显示 
== 参  数:无 
== 返回值:无 
=================================================*/
void menu()
{
	system("CLS");//清屏
	printf("\n\n\n\t\t\t\t┌──────────────────────────────────┐\n");
	printf("\t\t\t\t│         学生成绩统计系统         │\n");
	printf("\t\t\t\t├──────────────────────────────────┤\n");
	printf("\t\t\t\t│         1   增加学生记录         │\n");
	printf("\t\t\t\t├──────────────────────────────────┤\n");
	printf("\t\t\t\t│         2   删除学生记录         │\n");
	printf("\t\t\t\t├──────────────────────────────────┤\n");
	printf("\t\t\t\t│         3   修改学生记录         │\n");
	printf("\t\t\t\t├──────────────────────────────────┤\n");
	printf("\t\t\t\t│         4   查找学生信息         │\n");
	printf("\t\t\t\t├──────────────────────────────────┤\n");
	printf("\t\t\t\t│         5   统计学生成绩         │\n");
	printf("\t\t\t\t├──────────────────────────────────┤\n");
	printf("\t\t\t\t│         6   查看学生成绩         │\n");
	printf("\t\t\t\t├──────────────────────────────────┤\n");
	printf("\t\t\t\t│         7   修改登陆密码         │\n");
	printf("\t\t\t\t├──────────────────────────────────┤\n");
	printf("\t\t\t\t│         8      关于              │\n");
	printf("\t\t\t\t├──────────────────────────────────┤\n");
	printf("\t\t\t\t│         9    退出系统            │\n");
	printf("\t\t\t\t└──────────────────────────────────┘\n");
}
/*================================================
== 函数名:void sortList(Student *pHead)
== 功  能:数据排序 
== 参  数:链表头指针 
== 返回值:无 
=================================================*/
void sortList(Student *pHead)
{
	Student *p1, *p2;
	StudentDate dat;
	char stu_name[20];
	int bum, count = 0, rank;

	system("title 学生成绩统计系统-查看");//6-将标题栏命名为“学生成绩统计系统”
	bum = sortMenu();
	if (bum == 1)//按平均分高低排序
	{
		for (p1 = pHead->next; p1 != NULL; p1 = p1->next)
		{
			for (p2 = p1->next; p2 != NULL; p2 = p2->next)
			{
				if (p2->one.aver_score > p1->one.aver_score)
				{
					dat = p2->one;
					rank = p2->rank;
					strcpy(stu_name, p2->name);
					p2->one = p1->one;
					p2->rank = p1->rank;
					strcpy(p2->name, p1->name);
					p1->one = dat;
					p1->rank = rank;
					strcpy(p1->name, stu_name);
				}
			}
		}
	}
	else
	{
		if (bum == 2)//按学号高低排序
		{
			for (p1 = pHead->next; p1 != NULL; p1 = p1->next)
			{
				for (p2 = p1->next; p2 != NULL; p2 = p2->next)
				{
					if (p2->one.num < p1->one.num)
					{
						dat = p2->one;
						rank = p2->rank;
						strcpy(stu_name, p2->name);
						p2->one = p1->one;
						p2->rank = p1->rank;
						strcpy(p2->name, p1->name);
						p1->one = dat;
						p1->rank = rank;
						strcpy(p1->name, stu_name);
					}
				}
			}
		}
		else
		{
			if (bum == 3)
			{
				return;
			}
			else
			{
				sortList(pHead);
			}
		}
	}
	printList(pHead);
}
/*================================================
== 函数名:int sortMenu()
== 功  能:排序方式菜单显示和选择 
== 参  数:无 
== 返回值:排序方式对应整型数 
=================================================*/
int sortMenu()
{
	int bum;

	system("CLS");
	printf("\n\n\n");
	printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("\t\t┃                       以什么方式查询 ?                  ┃\n");
	printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("\t\t┃                    1   按成绩的高低                      ┃\n");
	printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("\t\t┃                    2   按学号的升次                      ┃\n");
	printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("\t\t┃                    3   返回主菜单                        ┃\n");
	printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
	printf("请按键选择:");
	bum = (int)(getch() - '0');
	system("CLS");

	return bum;
}
/*================================================
== 函数名:void printList(Student *pHead)
== 功  能:链表数据打印 
== 参  数:链表头指针 
== 返回值:无 
=================================================*/
void printList(Student *pHead)
{
	int count = 0;
	pHead = pHead->next;
	system("CLS");
	printf("\n\  ┏━━━━━━┳━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━┓");
	printf("\n  ┃ 学号 ┃ 姓 名  ┃性别┃概  率┃离  散┃c  ++ ┃平均分┃总  分┃名次┃\n");
	while (pHead)
	{
		printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
		printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", pHead->one.num,
			pHead->name, pHead->one.sex, pHead->one.prob_score, pHead->one.disc_score,
			pHead->one.cpp_score, pHead->one.aver_score, pHead->one.sum_score, pHead->rank);
		pHead = pHead->next;
		count++;
	}
	printf("  ┗━━━━━━┻━━━━━━━━┻━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━┛\n");
	printf("\t\t\t该班一共%d个人!", count);
	getch();
}
/*================================================
== 函数名:void statisStudentInfo(Student *pHead)
== 功  能:查看学生信息 
== 参  数:链表头指针 
== 返回值:无 
=================================================*/
void statisStudentInfo(Student *pHead)
{
	double aver_score[5] = { 0,0,0,0,0 };
	Student *p1 = pHead->next;
	int count = 0;
	int bad = 0, bum;

	system("title 学生成绩统计系统-统计");//将标题栏命名为“学生成绩统计系统”
	bum = statisMenu();
	if (bum == 1)
	{
		while (p1)
		{
			aver_score[0] = aver_score[0] + p1->one.prob_score;
			aver_score[1] = aver_score[1] + p1->one.disc_score;
			aver_score[4] = aver_score[4] + p1->one.cpp_score;
			p1 = p1->next;
			count++;
		}
		aver_score[0] = aver_score[0] / count;
		aver_score[1] = aver_score[1] / count;
		aver_score[4] = aver_score[4] / count;
		p1 = pHead->next;
		printf("\n\n  ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
		printf("  ┃\t概率的平均分为:%.1f,没有达到达到平均分的学生有        ┃\n", aver_score[0]);
		printf("  ┣━━━━━━┳━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━┫\n");
		printf("  ┃ 学号 ┃ 姓 名  ┃性别┃概  率┃离  散┃  c++ ┃平均分┃总  分┃名次┃\n");
		printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
		while (p1)
		{
			if (p1->one.prob_score < aver_score[0])
			{
				if (bad == 0)
				{
					printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
						p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
						p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
				}
				else
				{
					printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
					printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
						p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
						p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
				}
				bad = 1;
			}
			p1 = p1->next;
		}
		bad = 0;
		p1 = pHead->next;
		printf("  ┣━━━━━━┻━━━━━━━━┻━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━┫\n");
		printf("  ┃\t离散的平均分为:%.1f,没有达到达到平均分的学生有        ┃\n", aver_score[1]);
		printf("  ┣━━━━━━┳━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━┫\n");
		printf("  ┃ 学号 ┃ 姓 名  ┃性别┃概  率┃离  散┃  c++ ┃平均分┃总  分┃名次┃\n");
		printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
		while (p1)
		{
			if (p1->one.disc_score < aver_score[1])
			{
				if (bad == 0)
				{
					printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
						p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
						p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
				}
				else
				{
					printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
					printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
						p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
						p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
				}
				bad = 1;
			}
			p1 = p1->next;
		}

		bad = 0;
		p1 = pHead->next;
		printf("  ┣━━━━━━┻━━━━━━━━┻━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━┫\n");
		printf("  ┃\tc++的平均分为:%.1f,没有达到达到平均分的学生有         ┃\n", aver_score[4]);
		printf("  ┣━━━━━━┳━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━┫\n");
		printf("  ┃ 学号 ┃ 姓 名  ┃性别┃概  率┃离  散┃  c++ ┃平均分┃总  分┃名次┃\n");
		printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
		while (p1)
		{
			if (p1->one.cpp_score < aver_score[4])
			{
				if (bad == 0)
				{
					printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
						p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
						p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
				}
				else
				{
					printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
					printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
						p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
						p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
				}
				bad = 1;
			}
			p1 = p1->next;
		}
		printf("  ┗━━━━━━┻━━━━━━━━┻━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━┛\n");
		printf("\t\t\t\t\t\t该班一共%d个人!", count);
	}
	else
	{
		if (bum == 2)
		{
			bad = 0;
			printf("\n\n  ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
			printf("  ┃\t概率成绩大于90分或小于60的学生有                       ┃\n");
			printf("  ┣━━━━━━┳━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━┫\n");
			printf("  ┃ 学号 ┃ 姓 名  ┃性别┃概  率┃离  散┃  c++ ┃平均分┃总  分┃名次┃\n");
			printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
			p1 = pHead->next;
			while (p1)
			{
				if (p1->one.prob_score < 60 || p1->one.prob_score >= 90)
				{
					if (bad == 0)
					{
						printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
							p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
							p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
					}
					else
					{
						printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
						printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
							p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
							p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
					}
					bad = 1;
				}
				p1 = p1->next;
			}
			bad = 0;
			printf("  ┣━━━━━━┻━━━━━━━━┻━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━┫\n");
			printf("  ┃\t离散成绩大于90分或小于60的学生有                       ┃\n");
			printf("  ┣━━━━━━┳━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━┫\n");
			printf("  ┃ 学号 ┃ 姓 名  ┃性别┃概  率┃离  散┃  c++ ┃平均分┃总  分┃名次┃\n");
			printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
			p1 = pHead->next;
			while (p1)
			{
				if (p1->one.disc_score < 60 || p1->one.disc_score >= 90)
				{
					if (bad == 0)
					{
						printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
							p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
							p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
					}
					else
					{
						printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
						printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
							p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
							p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
					}
					bad = 1;
				}
				p1 = p1->next;
			}
			bad = 0;
			printf("  ┣━━━━━━┻━━━━━━━━┻━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━┫\n");
			printf("  ┃\tc++成绩大于90分或小于60的学生有                        ┃\n");
			printf("  ┣━━━━━━┳━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━┫\n");
			printf("  ┃ 学号 ┃ 姓 名  ┃性别┃概  率┃离  散┃  c++ ┃平均分┃总  分┃名次┃\n");
			printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
			p1 = pHead->next;
			while (p1)
			{
				if (p1->one.cpp_score < 60 || p1->one.cpp_score >= 90)
				{
					if (bad == 0)
					{
						printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
							p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
							p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
					}
					else
					{
						printf("  ┣━━━━━━╋━━━━━━━━╋━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━┫\n");
						printf("  ┃ %-5d┃ %-6s ┃  %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", p1->one.num,
							p1->name, p1->one.sex, p1->one.prob_score, p1->one.disc_score,
							p1->one.cpp_score, p1->one.aver_score, p1->one.sum_score, p1->rank);
					}
					bad = 1;
				}
				p1 = p1->next;
			}
			printf("  ┗━━━━━━┻━━━━━━━━┻━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━┛\n");
		}
		else
		{
			if (bum == 3)
			{
				return;
			}
			else
			{
				statisStudentInfo(pHead);
			}
		}
	}
	getch();
}
/*================================================
== 函数名:int statisMenu()
== 功  能:查看方式菜单和选择 
== 参  数:无 
== 返回值:方式对应整型数 
=================================================*/
int statisMenu()
{
	int bum;

	system("CLS");
	printf("\n\n\n");
	printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("\t\t┃                   以什么方式统计学生信息?               ┃\n");
	printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("\t\t┃                      1   按平均分                        ┃\n");
	printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("\t\t┃                      2   按是否合格                      ┃\n");
	printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("\t\t┃                      3   返回主菜单                      ┃\n");
	printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
	printf("请按键选择:");
	bum = (int)(getch() - '0');
	system("CLS");

	return bum;
}
/*================================================
== 函数名:void gotoxy(int x, int y)
== 功  能:光标移动到指定位置 
== 参  数:int x:列坐标 
           int y:行坐标 
== 返回值:无 
=================================================*/
void gotoxy(int x, int y)//x为列坐标,y为行坐标
{
	COORD pos = { x, y };
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
}

 

摘 要 高校学生成绩管理工作是高等教育中的一个极为重要的环节,是院校学生管理的基础。面对种类繁多的数据和报表,手工处理方式已经很难跟上现代化管理的步伐,传统的文件管理方式进行成绩管理,效率很低,耗时费力,容易出错,安全性也存在问题。特别是在查询上,由于文件过多,带来很多不便。随着计算机及通讯技术的飞速发展,高等教育对教务管理工作提出了更高的要求。尽快改变传统的管理模式,运用现代化手段进行科学管理。 本设计研究的是基于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
一、课程设计题目 ① 基本要求题目:矩阵乘法。 ② 综合训练:学生成绩管理系统 二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2列),乘积放在C数组中。在主函数中输入相乘的两数组,并输出结果。 学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等的综合应用) 程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以下功能: (1)主菜单 (2)各菜单项功能 ① 成绩录入:输入学生的学号、姓名及三门课的成绩; ② 成绩查询:(至少一种查询方式)。  按学号查询学生记录。  查询不及格学生的记录。 ③成绩统计:  计算学生的平均分;  根据学生的平均分高低,对学生的数据进行排序后输出;  对学生单科成绩排序,输出学生姓名与该科成绩; ④退出系统:退出整个系统(即主菜单)。 (3)结构体数组: #define N 30struct student {int num; /* 定义学号*/ char name[20]; /* 定义姓名*/ float score[3]; /* 定义存贮三门课成绩的数组*/ float average; /* 定义平均成绩*/ };struct student stu[N];  /* 定义结构体数组,存贮多个学生的记录*/ 三、数据结构设计描述 系统功能描述 1能够输入学生的学号、姓名、三科成绩并且计算出平均成绩。 2能够以表格的形式输出学生记录 3能够按照学生三科的平均成绩进行排序 4能够按照学生的单科成绩进行排序 5能够按照学号查询学生记录 6往表中插入学生记录 7从表中删除学生记录 8存储记录到文件中 9从文件中读取记录 10退出 数据字典 1数据流条目 数据流名称:全部记录 别名:无 简述:最新更新后所有关于学生成绩的记录 来源:数据库 去向:加工“记录筛选” 数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩 数据存储条 数据存储名称:学生成绩记录 别名:无 简述:存放学生所有可供查询的信息 组成:学号+姓名+SC1+SC2+SC3+平均成绩 组织方式:索引文件,以学学号为关键字 查询要求:要求能立即查询 2数据项条目 数据项名称:学号 别名:无 简述:所有学校学生的学号 类型:字符串 3加工条目 加工名:更改的记录 激发条件:学生成绩记录被改动 优先级:普通 输入:新记录 输出:更新数据、数据未改动 加工逻辑:根据现有学生成绩记录 if 新记录旧记录 then 更新数据 else 数据未改动 endif 设计测试流程 1、进入界面 2、输入选项0,回车; 按提示输入数据 3、回到主菜单; 输入选项8,回车; 输入文件名:data,回车; 出现成功提示,则读入文件操作成功。 4、回到主菜单,输入1,回车 每10个暂停显示数据 5、回到主菜单,输入2,回车 出现排序成功信息。 6、回到主菜单,输入3,回车 出现排序成功信息。 7、回到主菜单,输入5,回车 按提示插入一组数据 8、回到主菜单,输入6,回车 按提示输入姓名,删除数据 出现删除成功的信息 9、回到主菜单,输入4,回车 输入学号进行查询 10、回到主菜单,输入1,回车 出现统计信息 11、回到主菜单,输入7,回车 输入result,回车 出现成功写入文件的信息 12、回到主菜单,输入9,回车退出系统
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值