精华内容
下载资源
问答
  • 学生成绩管理系统单链表实现

    千次阅读 2020-09-04 10:32:24
    学生成绩管理程序 (使用c,go,python语言开发) 代码及版本管理地址 gitee码云版本地址(点击跳转) 要求 本程序用于教学单位(院/系)的学生成绩管理。要求程序能够实现学生信息录入(可以实现增加、删除、修改学生的...

    程序设计报告

    题目

    学生成绩管理程序 (使用c,go,python语言开发)

    代码及版本管理地址

    gitee码云版本地址(点击跳转)

    要求

    本程序用于教学单位(院/系)的学生成绩管理。要求程序能够实现学生信息录入(可以实现增加、删除、修改学生的基本信息)、单科学习成绩的录入;班级内单科成绩排名;成绩查询:查询某个学生的各科成绩、统计所有不及格科目超过2科的学生名单。

    设计思路

    按照要求设计多种功能函数,并利用主函数实现功能,添加可视化操作提示。

    数据结构

    利用链式线性结构体Stu数据域存储学生信息,学生姓名、班级、年级、学生各科成绩为字符串型,学生编号为整型,指针域存储下一个指针地址。

    流程图

    图床链接过期

    功能及函数介绍

    链表操作函数
    (1)尾插法
    void AddItem(Stu *plist) ;//尾插添加结点:传入需要添加结点的数量和头指针,从头指针遍历到尾结点,并从尾结点开始用malloc函数添加结点,添加完后将尾结点的指针域指向NULL
    
    (2)遍历结点
    Stu *NextItem(Stu *plist) ;//传入当前结点,传出下一结点
    
    (3)链表初始化
    Stu *InitList(int num);//初始化链表:利用malloc函数创建头指针,并将头指针编号为0,将头指针指针域指向NULL,并向后添加num个结点,并返回头指针
    
    (4)寻找结点
    Stu *SearchItem(int num,Stu *phead);//寻找结点:传入头指针,返回编号为num的结点位置
    
    功能函数
    (1)输出所有学生信息
     void ShowItem(Stu *p_list,Stu *p_head);//传入指针,输出其数据域学生信息
    
    (2) 初始化程序
    void InitSys(Stu *p_head);//初始化学生系统后,管理员输入数据层
    
    (3) 保存文件(二进制)
    void SaveFile(Stu *p_head);//保存文件,用wb打开文件,并利用fwrite函数写入fwrite(1,2,3,4); 参数说明:1.要写入的数据的地址,2.一次要写多少字节,3.写多少次,4.写到哪里
    
    (4) 学生总排名
    int Sort(Stu *p_head,int n_ID,int n_subject) ;//院系总排名,传入头指针、学生编号、所要排名的数据类型,用SearchItem()函数检索该编号数据地址,并从头遍历链表到NULL,对每一个结点该数据值进行检索,遇到比被排序结点数值大时sum+1
    
    (5)学生所在班级排名
     int ClassSort(Stu *p_head,int n_ID,int n_subject) ;//班级排名,传入头指针、学生编号、所要排名的数据类型,同(4)类似,只是判断了班级是否相等,利用了strcmp()库函数,包含了<string.h>头文件
    
    (6)查找学生
     void Search(Stu *p_head,char *name);  //搜索学生信息,传入头指针,传入学生姓名,遍历链表,找到该学生(考虑了重名情况)
    
    (7)删除学生信息
     void Del(Stu *p_head,int n_ID); //删除表,传入头指针,传入删除学生编号。用free()释放内存,包含头文件<stdlib>,并将前后结点相连,利用了SearchItem()函数找到3个结点地址
    
    (8)将字符串转为double型
     double Strtodouble(char *str) ;//传入0-100的字符串返回double型函数,若传入其他字符串,则返回-1。主要用于符合成绩逻辑,利用了atof()函数,包含头文件<stdlib>
    
    (9)添加学生
     void AddList(Stu *p_head) ;//尾部添加新同学
    
    (10)修改学生信息
    void Change(Stu *p_head);//修改学生信息,利用SearchItem()函数
    
    (11)统计所有不及格科目超过2科的学生名单
    void NoPass(Stu *p_head);//传入头指针,输出所有不及格科目超过2科的学生名单,从头开始遍历判断
    
    (12)单科学习成绩的录入
    void InputScore(Stu *start , Stu *end , Stu *p_head ,char *subject);//单科学习成绩录入,传入开始录入位置和结束录入位置,传入头指针 ,传入需要录入的学科
    
    (13)保存文件(txt)
    void Fprint(Stu *p_head);//将数据导出到当前路径下的StudentInformation.txt,导出为txt便于使用者阅读
    
    (14)输出单个学生信息
    void ShowItem(Stu *p_list,Stu *p_head) ;//传入结点地址,输出其数据域学生信息
    
    (15)班级内单科成绩排名
    void ClassSortOutput(Stu *p_head,char *str_class,int subject);//传入头指针,传入班级,传入学科 利用了桶排序思想
    
    (16)插入学生
    void Insert(Stu *p_head) ;//在中间插入一个表,找到前后结点,free()并将前中后结点关联,并将后续结点编号加一
    

    功能测试(c语言)

    (1)存在数据文件时对数据读取并进入主菜单

    图床链接过期

    (2)不存在数据时初始化系统

    图床链接过期

    (3)学生菜单

    图床链接过期

    (4)管理员菜单(需输入密匙)

    图床链接过期

    (5)输出所有学生信息

    图床链接过期

    (6)查找学生

    图床链接过期

    (7)输出两门以上不及格学生名单

    图床链接过期

    (8)输出班级单科排名

    图床链接过期

    (9)添加学生

    图床链接过期

    (10)删除学生

    图床链接过期

    (11)修改学生信息

    图床链接过期

    (12)单科成绩录入

    图床链接过期

    (13)插入学生

    图床链接过期

    (14)保存为txt

    图床链接过期

    遇到的问题和异常处理方法

    (1)对输入int型变量的控制:
    if(scanf("%d",&num)!=1)  
    {
    printf("提示:你没有输入正确值,请重新输入:");
    fflush(stdin);//while(getchar()!='\n'); 
    }
    

    能解决输入非int型变量时,程序崩溃问题

    (2)对输入字符串的问题:

    利用gets()函数输入,可以读入空格,防止缓冲区同时读入多个数据。

    (3)
    fflush(stdin);
    

    读入int型等变量时会将换行符读入,利用这个函数可以将缓冲区换行符清除。Stdin指缓冲区

    (4)对成绩判断问题:
    while(Strtodouble(p_new->m_nMath) == -1)
    {    
    printf("提示:您的输入有问题(成绩为0-100的整数),请重新输入:"); 
    gets(p_new->m_nMath);
    }
    

    利用Strtodouble函数对成绩输入判断,如果错误则重新输入

    (5)对指针的判断:

    遇到指针为NULL时,设置返回值,防止异常

    联系方式

    QQ773323518

    展开全文
  • 编译环境vs2017 用单链表实现学生成绩管理系统 文件包含源代码和可执行文件 为以后算法与数据结构的同学提供帮助
  • 学生成绩管理系统(单链表)

    千次阅读 2019-04-11 00:11:12
    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> struct student { char num[10];//学号 char name[10];//姓名 ...//3科成绩 fl...
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<windows.h>
    struct student
    {
    	char num[10];//学号
    	char name[10];//姓名
    	char sex[5];//性别
    	float score[3];//3科成绩
    	float avr;//平均成绩
    	float sum;//总成绩
    };
    
    typedef struct table
    {
    	struct student stu;//学生信息
    	struct table* next;//下一节点指针
    }list,*plist;
    
    
    plist free_list(plist head)
    {
    	plist p=head;
    	plist q=head;
    	while(p)
    	{
    		q=p;
    		p=p->next;
    		free(q);
    	}
    	return NULL;
    }
    
    void show_list(plist head)//显示成绩
    {
    	plist p=head;
    	system("cls");
    	if(head==NULL)
    	{
    		printf("无信息\n");
    		system("pause");
    		return ;
    	}
    	printf("学号    姓名    性别    科一 科二 科三    总分    平均\n");
    	while(p)
    	{
    		printf("%-8s",p->stu.num);
    		printf("%-8s",p->stu.name);
    		printf("%-7s",p->stu.sex);
    		printf("%5.2f",p->stu.score[0]);
    		printf("%5.2f",p->stu.score[1]);
    		printf("%5.2f",p->stu.score[2]);
    		printf("%8.2f",p->stu.sum);
    		printf("%8.2f\n",p->stu.avr);
    		p=p->next;
    	}
    	system("pause");
    }
    
    int menu()
    {
    	int n;
    	system("cls");
    	printf("1:增加学生信息\n");
    	printf("2:修改学生信息\n");
    	printf("3:显示学生信息\n");
    	printf("4:查询学生信息\n");
    	printf("5:删除学生信息\n");
    	printf("6:读取学生信息\n"); 
    	printf("7:保存学生信息\n"); 
    	printf("8:插入学生信息\n"); 
    	printf("9:排序学生信息\n"); 
    	printf("0:运行结束\n"); 
    	scanf("%d",&n);
    	while(n<0||n>9)
    	{
    		printf("输入范围错误!请重新输入\n");
    		scanf("%d,&n");
    	}
    	return n;
    }
    
    
    void Save_File(plist head)
    {
    	FILE *fp;
    	plist p=head;
    	if((fp=fopen("student.txt","wb"))==NULL)
    	{
    		printf("文件打开失败!");
    		system("pause");
    		return ;
    	}
    	while(p)
    	{
    		fwrite(&p->stu,sizeof(struct student),1,fp);
    		p=p->next;
    	}
    	printf("保存成功!\n");
    	fclose(fp);
    	system("pause");
    }
    
    
    plist Open_File(plist head)
    {
    	FILE *fp;
    	head=free_list(head);
    	head=(plist)malloc(sizeof(list));
    	head->next=NULL;
    	plist p=head;
    	plist q=head;
    	if((fp=fopen("student.txt","rb"))==NULL)
    	{
    		printf("文件打开失败\n");
    	}
    	else
    	{
    		while(fread(&p->stu,sizeof(struct student),1,fp))
    		{	
    			p->next=(plist)malloc(sizeof(list));	
    			q=p;
    			p=p->next;
    			p->next=NULL;
    		}
    		q->next=NULL;
    		free(p);
    		fclose(fp);
    		printf("文件数据读取成功!\n");
    	}
    	system("pause");
    	return head;
    }
    
    
    plist add_stu(plist head)//录入成绩
    {	
    	plist p=NULL;
    	if(head==NULL)
    	{
    		head=(plist)malloc(sizeof(list));
    		head->next=NULL;
    		p=head;
    	}
    	else
    	{
    		p=head;
    		while(p->next)
    		{
    			p=p->next;
    		}
    		p->next=(plist)malloc(sizeof(list));
    		p=p->next;
    		p->next=NULL;
    	}
    	system("cls");
    	printf("请输入学生学号\n");
    	scanf("%s",&p->stu.num);
    	printf("请输入学生姓名\n");
    	scanf("%s",&p->stu.name);
    	printf("请输入学生性别\n");
    	scanf("%s",&p->stu.sex);
    	printf("请输入学生第一科成绩\n");
    	scanf("%f",&p->stu.score[0]);
    	printf("请输入学生第二科成绩\n");
    	scanf("%f",&p->stu.score[1]);
    	printf("请输入学生第三科成绩\n");
    	scanf("%f",&p->stu.score[2]);
    	p->stu.sum=p->stu.score[0]+p->stu.score[1]+p->stu.score[2];
    	p->stu.avr=p->stu.sum/3;
    	printf("录入成功!\n");
    	system("pause");
    	return head;
    }
    
    
    void find_num(plist head)
    {
    	char temp[20];
    	int flag=1;
    	plist p=head;
    	system("cls");
    	printf("请输入要查找的学生学号\n");
    	scanf("%s",temp);
    	while(p)
    	{
    		if(!strcmp(temp,p->stu.num))
    		{
    			flag=0;
    			printf("学号    姓名    性别    科一 科二 科三    总分    平均\n");
    			printf("%-8s",p->stu.num);
    			printf("%-8s",p->stu.name);
    			printf("%-7s",p->stu.sex);
    			printf("%5.2f",p->stu.score[0]);
    			printf("%5.2f",p->stu.score[1]);
    			printf("%5.2f",p->stu.score[2]);
    			printf("%8.2f",p->stu.sum);
    			printf("%8.2f\n",p->stu.avr);
    			break;
    		}
    		p=p->next;
    	}
    	if(flag)
    	{
    		printf("无该学号信息!\n");
    	}
    	system("pause");
    }
    
    void find_name(plist head)
    {
    	char temp[20];
    	int flag=1;
    	plist p=head;
    	system("cls");
    	printf("请输入要查找的学生姓名\n");
    	scanf("%s",temp);
    	while(p)
    	{
    		if(!strcmp(temp,p->stu.name))
    		{
    			flag=0;
    			printf("学号    姓名    性别    科一 科二 科三    总分    平均\n");
    			printf("%-8s",p->stu.num);
    			printf("%-8s",p->stu.name);
    			printf("%-7s",p->stu.sex);
    			printf("%5.2f",p->stu.score[0]);
    			printf("%5.2f",p->stu.score[1]);
    			printf("%5.2f",p->stu.score[2]);
    			printf("%8.2f",p->stu.sum);
    			printf("%8.2f\n",p->stu.avr);
    			break;
    		}
    		p=p->next;
    	}
    	if(flag)
    	{
    		printf("无该学生信息!\n");
    	}
    	system("pause");
    }
    
    
    void find_menu(plist head)
    {
    	int n;
    	system("cls");
    	if(head==NULL)
    	{
    		printf("无任何数据\n");
    		system("pause");
    		return ;
    	}
    	do
    	{
    		system("cls");
    		printf("1:按学号查找\n");
    		printf("2:按姓名查找\n");
    		printf("0:返回\n");
    		scanf("%d",&n);
    		while(n<0||n>2)
    		{
    			printf("输入范围错误!请重新输入\n");
    			scanf("%d,&n");
    		}
    		switch(n)
    		{
    		case 1:
    			find_num(head);
    			break;
    		case 2:
    			find_name(head);
    			break;
    		}
    	}while(n!=0);
    
    }
    
    plist del_num(plist head)
    {
    	char temp[20];
    	int flag=1;
    	plist p=head;
    	plist q=head;
    	system("cls");
    	printf("请输入要删除的学生学号\n");
    	scanf("%s",temp);
    	while(p)
    	{
    		if(!strcmp(temp,p->stu.num))
    		{
    			flag=0;
    			printf("学号    姓名    性别    科一 科二 科三    总分    平均\n");
    			printf("%-8s",p->stu.num);
    			printf("%-8s",p->stu.name);
    			printf("%-7s",p->stu.sex);
    			printf("%5.2f",p->stu.score[0]);
    			printf("%5.2f",p->stu.score[1]);
    			printf("%5.2f",p->stu.score[2]);
    			printf("%8.2f",p->stu.sum);
    			printf("%8.2f\n",p->stu.avr);
    			if(q==p)
    			{
    				head=head->next;
    				free(p);
    			}//都指向头结点
    			else
    			{
    				q->next=p->next;
    				free(p);
    			}
    			break;
    		}
    		q=p;
    		p=p->next;
    	}
    	if(flag)
    	{
    		printf("无该学号信息!\n");
    	}
    	else
    	{
    		printf("删除成功!\n");
    	}
    	system("pause");
    	return head;
    }
    
    plist del_name(plist head)
    {
    	char temp[20];
    	int flag=1;
    	plist p=head;
    	plist q=head;
    	system("cls");
    	printf("请输入要删除的学生姓名\n");
    	scanf("%s",temp);
    	while(p)
    	{
    		if(!strcmp(temp,p->stu.name))
    		{
    			flag=0;
    			printf("学号    姓名    性别    科一 科二 科三    总分    平均\n");
    			printf("%-8s",p->stu.num);
    			printf("%-8s",p->stu.name);
    			printf("%-7s",p->stu.sex);
    			printf("%5.2f",p->stu.score[0]);
    			printf("%5.2f",p->stu.score[1]);
    			printf("%5.2f",p->stu.score[2]);
    			printf("%8.2f",p->stu.sum);
    			printf("%8.2f\n",p->stu.avr);
    			if(p==head)
    			{
    				head=head->next;
    				free(p);
    			}//都指向头结点
    			else
    			{
    				q->next=p->next;
    				free(p);
    			}
    			break;
    		}
    		p=p->next;
    	}
    	if(flag)
    	{
    		printf("无该学生信息!\n");
    	}
    	else
    	{
    		printf("删除成功!\n");
    	}
    	system("pause");
    	return head;
    }
    
    
    plist del_menu(plist head)
    {
    	int n;
    	system("cls");
    	if(head==NULL)
    	{
    		printf("无任何数据\n");
    		system("pause");
    		return head;
    	}
    	do
    	{
    		system("cls");
    		printf("1:按学号删除\n");
    		printf("2:按姓名删除\n");
    		printf("0:返回\n");
    		scanf("%d",&n);
    		while(n<0||n>2)
    		{
    			printf("输入范围错误!请重新输入\n");
    			scanf("%d,&n");
    		}
    		switch(n)
    		{
    		case 1:
    			head=del_num(head);
    			break;
    		case 2:
    			head=del_name(head);
    			break;
    		}
    	}while(n!=0);
    	return head;
    }
    
    void modify(plist head)
    {
    	char temp[20];
    	char ch;
    	int flag=1;
    	plist p=head;
    	system("cls");
    	printf("请输入要修改的学生学号\n");
    	scanf("%s",temp);
    	while(p)
    	{
    		if(!strcmp(temp,p->stu.num))
    		{
    			flag=0;
    			printf("学号    姓名    性别    科一 科二 科三    总分    平均\n");
    			printf("%-8s",p->stu.num);
    			printf("%-8s",p->stu.name);
    			printf("%-7s",p->stu.sex);
    			printf("%5.2f",p->stu.score[0]);
    			printf("%5.2f",p->stu.score[1]);
    			printf("%5.2f",p->stu.score[2]);
    			printf("%8.2f",p->stu.sum);
    			printf("%8.2f\n",p->stu.avr);
    			break;
    		}
    		p=p->next;
    	}
    	if(flag)
    	{
    		printf("无该学号信息!\n");
    	}
    	else
    	{
    		printf("是否确认修改?Y/N");
    		fflush(stdin);
    		scanf("%c",&ch);
    		fflush(stdin);
    		if(ch=='y'||ch=='Y')
    		{
    			printf("请输入学生新学号\n");
    			scanf("%s",&p->stu.num);
    			printf("请输入学生新姓名\n");
    			scanf("%s",&p->stu.name);
    			printf("请输入学生性别\n");
    			scanf("%s",&p->stu.sex);
    			printf("请输入学生第一科成绩\n");
    			scanf("%f",&p->stu.score[0]);
    			printf("请输入学生第二科成绩\n");
    			scanf("%f",&p->stu.score[1]);
    			printf("请输入学生第三科成绩\n");
    			scanf("%f",&p->stu.score[2]);
    			p->stu.sum=p->stu.score[0]+p->stu.score[1]+p->stu.score[2];
    			p->stu.avr=p->stu.sum/3;
    			printf("修改成功!\n");
    		}
    	}
    	system("pause");
    }
    
    
    void init()
    {
    	int i=0;
    	printf(" 系统正在初始化,请稍后\n");
    	printf("                 --------------");
    	for(i=0;i<=100;i++)
    	{
    		Sleep(50);
    		printf("\b\b\b\b%-3d%%",i);
    	}
    
    
    	printf("\n      初始化成功!\n");
    	printf("欢迎使用学生信息管理系统\n");	
    	system("pause");
    }
    
    plist sort_num(plist head)
    {
    	struct student temp;
    	plist p,q;
    	p=q=head;
    	while(q)
    	{
    		p=q->next;
    		while(p)
    		{
    			if(strcmp(q->stu.num,p->stu.num)>0)
    			{
    				temp=q->stu;
    				q->stu=p->stu;
    				p->stu=temp;
    			}
    			p=p->next;
    		}
    		q=q->next;
    	}
    	show_list(head);
    	return head;
    }
    
    
    plist sort_name(plist head)
    {
    	struct student temp;
    	plist p,q;
    	p=q=head;
    	while(q)
    	{
    		p=q->next;
    		while(p)
    		{
    			if(strcmp(q->stu.name,p->stu.name)>0)
    			{
    				temp=q->stu;
    				q->stu=p->stu;
    				p->stu=temp;
    			}
    			p=p->next;
    		}
    		q=q->next;
    	}
    	show_list(head);
    	return head;
    }
    
    plist sort_menu(plist head)
    {
    	int n;
    	system("cls");
    	if(head==NULL)
    	{
    		printf("无任何数据\n");
    		system("pause");
    		return NULL;
    	}
    	do
    	{
    		system("cls");
    		printf("1:按学号排序\n");
    		printf("2:按姓名排序\n");
    		printf("0:返回\n");
    		scanf("%d",&n);
    		while(n<0||n>2)
    		{
    			printf("输入范围错误!请重新输入\n");
    			scanf("%d,&n");
    		}
    		switch(n)
    		{
    		case 1:
    			head=sort_num(head);
    			break;
    		case 2:
    			head=sort_name(head);
    			break;
    		}
    	}while(n!=0);
    	return head;
    }
    
    int main()
    {
    	plist head=NULL;
    	int n;
    	init();
    	do
    	{
    		n=menu();
    		switch(n)
    		{
    		case 0:
    			head=free_list(head);
    			break;
    		case 1:
    			head=add_stu(head);
    			break;
    		case 2:
    			modify(head);
    			break;
    		case 3:
    			show_list(head);
    			break;
    		case 4:
    			find_menu(head);
    			break;
    		case 5:
    			head=del_menu(head);
    			break;
    		case 6:
    			head=Open_File(head);
    			break;
    		case 7:
    			Save_File(head);
    			break;
    		case 8:
    			head=add_stu(head);
    			break;
    		case 9:
    			head=sort_menu(head);
    			break;
    		}
    	}while(n!=0);
    	return 0;
    }
    
    展开全文
  • 学生成绩管理系统(单链表+java的GUI)说明:1.我所说的保存到数据库并没有保存到数据库。保存数据的生命周期仅仅是运行到关闭之间时间。2.用的是单链表,所涉及的功能有:增加,删除,修改,查看。3.无论你之前输入...

    学生成绩管理系统(单链表+java的GUI)

    说明:

    1.我所说的保存到数据库并没有保存到数据库。保存数据的生命周期仅仅是运行到关闭之间时间。

    2.用的是单链表,所涉及的功能有:增加,删除,修改,查看。

    3.无论你之前输入或者之后修改的学号怎样,查看的时候数据始终会是按照学号从小到大排列。

    4.修改数据一项,因为我设置了先要确定要修改数据是否存在然后才能进入修改,所以有个修改前的检测。

    4.这是我第一次写博客,写得不好还请包涵。

    一.主要代码块的展示

    增加数据

    // 增加学生信息

    public void AddStudent(StudentInfo studentInfo) {

    StudentInfo temp = head;// 这样辅助指针temp就指向了头结点

    list = new ArrayList<>();

    boolean bool = false;

    while (true) {

    if (temp.next == null) {

    break;

    }

    if (temp.next.studentnumber > studentInfo.studentnumber) {

    break;

    } else if (temp.next.studentnumber == studentInfo.studentnumber) {

    bool = true;

    break;

    }

    list.add("学号:" + Integer.toString(temp.studentnumber) + "\t姓名:" + temp.name + "\t专业:" + temp.major + "\t分数:"

    + temp.score + "\n");

    temp = temp.next;

    }

    if (bool) {

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),

    "学号" + studentInfo.studentnumber + "重复,本次输入无效!请重新输入!");

    } else {

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "恭喜!!!该数据已录入成功", "成功捷报",

    JOptionPane.PLAIN_MESSAGE);

    studentInfo.next = temp.next;

    temp.next = studentInfo;

    }

    }

    2.删除数据

    // 删除学生信息

    public void DeleteStudent(int studentnumber) {

    StudentInfo temp = head;// 辅助指针

    boolean bool = false;

    while (true) {

    if (temp.next == null) {

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "数据库中没有数据", "删除提醒框",

    JOptionPane.PLAIN_MESSAGE);

    break;

    }

    if (temp.next.studentnumber == studentnumber) {

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "恭喜您,成功删除学号为" + studentnumber + "的信息!",

    "删除成功框", JOptionPane.PLAIN_MESSAGE);

    // set=new HashSet<>();//每次容器要刷新一下

    list = new ArrayList<>();

    bool = true;

    break;

    }

    temp = temp.next;

    // set.add("学号:"+Integer.toString(temp.studentnumber)+" 姓名:"+temp.name+"

    // 专业:"+temp.major+" 分数:"+temp.score+"\n");

    list.add("学号:" + Integer.toString(temp.studentnumber) + "\t姓名:" + temp.name + "\t专业:" + temp.major + "\t分数:"

    + temp.score + "\n");

    }

    if (bool) {

    temp.next = temp.next.next;

    }

    }

    3.修改前的检测

    // 修改前检测输入学生学号是否存在该列表中的方法

    public int BeforModStudentMessageNumber;// 存储打开修改的页面显示内容的学号部分

    public String BeforModStudentMessageName;// 存储打开修改的页面显示内容的姓名部分

    public String BeforModStudentMessageMajor;// 存储打开修改的页面显示内容的专业部分

    public double BeforModStudentMessageScore;// 存储打开修改的页面显示内容的分数部分

    public boolean BeforModStudent(int ChackStudentNumber) {

    try {

    if (ChackStudentNumber > 0 && !Integer.toString(ChackStudentNumber).equals("")) {

    StudentInfo temp = head.next;// 指针,用来找该学生学号

    boolean flag = false;

    while (true) {

    if (temp == null) {

    break;

    } else if (temp.studentnumber == ChackStudentNumber) {

    flag = true;

    break;

    } else {

    temp = temp.next;

    }

    }

    if (flag) {

    BeforModStudentMessageNumber = temp.studentnumber;

    BeforModStudentMessageName = temp.name;

    BeforModStudentMessageMajor = temp.major;

    BeforModStudentMessageScore = temp.score;

    return true;// 如果真的存在就返回true

    }

    }

    return false;

    } catch (Exception e) {

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "输入出错,您输入的可能不是数字", "修改失败",

    JOptionPane.PLAIN_MESSAGE);

    }

    return false;// 其他情况返回false

    }

    4.修改数据

    // 修改学生的信息

    public void ModStudent(int WantModStudentNumber, StudentInfo studentInfo) {

    StudentInfo temp = head.next;// 辅助指针

    boolean bool = false;

    while (true) {

    if (temp == null) {

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "数据库中没有数据", "修改提醒框",

    JOptionPane.PLAIN_MESSAGE);

    break;

    }

    if (temp.studentnumber == WantModStudentNumber) {

    list = new ArrayList<>();

    bool = true;

    break;

    }

    temp = temp.next;

    }

    if (bool) {

    list = new ArrayList<>();

    // 先看看会不会学生学号不变的基础上修改

    StudentInfo NowLikeBefore = head.next;

    if (studentInfo.studentnumber == WantModStudentNumber) {

    while (true) {

    if (NowLikeBefore == null) {

    break;

    }

    if (NowLikeBefore.studentnumber == WantModStudentNumber) {

    NowLikeBefore.studentnumber = studentInfo.studentnumber;

    NowLikeBefore.name = studentInfo.name;

    NowLikeBefore.major = studentInfo.major;

    NowLikeBefore.score = studentInfo.score;

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "数据库已更新!!!", "修改提醒框",

    JOptionPane.PLAIN_MESSAGE);

    break;

    }

    NowLikeBefore = NowLikeBefore.next;

    }

    } else {

    StudentInfo NowDeleteBefore = head;

    StudentInfo pDelete = head;

    boolean IsDelete = false;

    list = new ArrayList<>();

    while (true) {

    if (pDelete.next == null) {

    break;

    }

    if (pDelete.next.studentnumber == studentInfo.studentnumber) {

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "更新失败,您输入的学号可以已存在数据库中。", "修改失败警告",

    JOptionPane.PLAIN_MESSAGE);

    break;

    }

    if (pDelete.next.studentnumber > studentInfo.studentnumber) {

    studentInfo.next = pDelete.next;

    pDelete.next = studentInfo;

    IsDelete = true;

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "恭喜!!!该数据已更新", "成功捷报",

    JOptionPane.PLAIN_MESSAGE);

    list = new ArrayList<>();

    break;

    }

    if (pDelete.next.studentnumber < studentInfo.studentnumber && pDelete.next.next == null) {

    studentInfo.next = pDelete.next.next;

    pDelete.next.next = studentInfo;

    IsDelete = true;

    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "恭喜!!!该数据已更新", "成功捷报",

    JOptionPane.PLAIN_MESSAGE);

    list = new ArrayList<>();

    break;

    }

    list.add("学号:" + Integer.toString(pDelete.next.studentnumber) + "\t姓名:" + pDelete.next.name

    + "\t专业:" + pDelete.next.major + "\t分数:" + pDelete.next.score + "\n");

    pDelete = pDelete.next;

    }

    if (IsDelete) {

    list = new ArrayList<>();

    while (true) {

    if (NowDeleteBefore.next == null) {

    break;

    }

    if (NowDeleteBefore.next.studentnumber == WantModStudentNumber) {

    NowDeleteBefore.next = NowDeleteBefore.next.next;

    break;

    }

    NowDeleteBefore = NowDeleteBefore.next;

    }

    list = new ArrayList<>();

    }

    }

    }

    }

    5.查看数据

    // 显示学生信息

    public void ShowStudent() {

    StudentInfo temp = head.next;// 辅助指针

    list = new ArrayList();

    if (head.next == null) {

    int value = JOptionPane.showConfirmDialog(JOptionPane.getRootFrame(), "数据库为空,是否去添加学生信息?", "系统提醒",

    JOptionPane.OK_OPTION);

    if (value == 0) {

    new AddStudentFace();

    }

    return;

    }

    while (true) {

    if (temp == null) {

    break;

    }

    list.add("学号:" + Integer.toString(temp.studentnumber) + "\t姓名:" + temp.name + "\t专业:" + temp.major + "\t分数:"

    + temp.score + "\n");

    temp = temp.next;

    }

    int size = list.size();

    strings = new String[size];

    for (int i = 0; i < size; i++) {

    strings[i] = list.get(i);

    }

    Arrays.sort(strings);

    new ShowStudentFace().jTextArea.append("当前数据库中有" + list.size() + "个学生数据\n" + list.toString());

    }

    二.实现效果图如下

    1.主界面

    9dbc01a365e33e6b7ae401d006f6e85d.png

    2.录入界面

    a8676773f099ac37dc6d6eb9362992ee.png

    3.删除界面

    a048fe81ec0d2c551350557d11cd9438.png

    4.修改前的检测

    9120b4e764520b464d1d70ec39595341.png

    5.这时我们可以去“查看学生信息”看看有哪些数据。(因为当前未输入数据所以有下面显示出现)

    419202384029dbb82277a4e2b08bbba7.png

    6.我们点击是,这时会出现录入信息界面,现在我就在该界面输入几个学生信息(注意:学号为int,分数为float,如果输入其他字符不能录入成功,假如录入不全,会出现错误弹框)。

    7.录入完几个同学的信息以后,我们现在就能点击“查看学生信息”了,这时查看界面就会弹出来,如下图。

    fd24e565edb0d6540207735aa5554356.png

    8.这时如果要求修改张三的信息,将学号改为20170464。你在修改弹窗中输入20171111,然后按下确定,会出现如下修改界面。

    d835cf86262f74bf4c53e80dd2a7ded4.png

    b9ed01cac67b1cb2042d3dd72191370f.png

    8dedb48cf3aecd94ba588cef41bed018.png

    9.假如现在要删除王五的信息,我们可以在删除界面输入王五的学号,如果存在就能删除成功,如果不存在就会出现“数据库中没有数据”提示。

    6a6ec6182b330e804eaf40327ba2bd61.png

    1d105b22ed857fd3be27d35ec00103d9.png

    三.总结

    最近在学习算法,觉得链表挺有意思的,于是就想结合java的GUI设计一个图形化的学生成绩管理系统。单纯就是觉得图形化显示出来“高大上”。一开始我先用画图工具画出了大概一个效果,然后我开始写五个界面的代码。分别是

    主界面(StudentFace),

    录入学生信息界面(AddStudentFace)

    删除学生信息界面(DeleteStudentFace)

    修改学生信息界面(ModStudentFace)

    查看学生信息界面(ShowStudentFace)

    这五个类写好之后,写链表代码,链表的增删改查和修改前检测的代码都放在Student的类里面。

    怎样使得他们之间能关联起来,我先明确了StudentFace这个大总管的地位,但是大总管只是负责显示用户点击的相关界面,而各个界面的信息是提供给Student的增删改查和修改前的检测去用的。

    总之,虽然原理简单,但是让我明白了一个道理,如果你想实现某个效果或者是一时间思路脑子转不过来,你就赶紧去打开画图工具,将自己的想法“画出来”,就像是做几何题,因为画出来远比你想的更了然。

    下载链接:点击下载,链接永久有效!

    展开全文
  • public class TestReport { static{ System.out.println("欢迎使用学生管理系统(垃圾版)!"); System.out.println("请先完成一个成绩表格的初始化,谢谢合作!"); System.out.print("请输入需要统计成绩的两个科目...

    package labReport;

    import java.util.Scanner;

    public class StudentInformation {

    public String name = new String();

    public long stuId = 0L;

    public String lesson_1 = new String();

    public String lesson_2 = new String();

    public float scoreOfLesson_1 = 0f;

    public float scoreOfLesson_2 = 0f;

    public float sum = 0f;

    public StudentInformation next = null;;

    public StudentInformation(String name, long stuId, String lesson_1, String lesson_2, float scoreOfLesson_1, float scoreOfLesson_2){

    this.lesson_1 = lesson_1;

    this.lesson_2 = lesson_2;

    this.name = name;

    this.scoreOfLesson_1 = scoreOfLesson_1;

    this.scoreOfLesson_2 = scoreOfLesson_2;

    this.stuId = stuId;

    this.sum = this.scoreOfLesson_1 + this.scoreOfLesson_2;

    }

    public StudentInformation(Scanner input){

    this(input.next(), input.nextLong(), null, null, input.nextFloat(), input.nextFloat());

    }

    }

    package labReport;

    import java.util.Scanner;

    public class StudentList {

    public StudentInformation head = null;

    private Scanner input = new Scanner(System.in);

    public float sumLesson_1 = 0f, sumLesson_2 = 0f;

    public StudentInformation maxStuSc_1, minStuSc_1;

    public StudentInformation minStuSc_2, maxStuSc_2;

    public StudentList(){

    head = new StudentInformation(null, 0, null, null, 0, 0);

    }

    public StudentList(int lenght){

    this();

    int i = 0;

    for(i = 0; i < lenght; i++)

    insert();

    }

    public void change(long id){

    float newScore_1 = 0f, newScore_2 = 0f;

    StudentInformation p = head;

    while(p != null){

    if(p.stuId == id){

    System.out.println("\n请输入学生的成绩:\t科目一\t科目二");

    while(! input.hasNextFloat()){

    input.next();

    System.out.println("\n非法输入,请重新输入!");

    System.out.println("\n请输入学生的成绩:\t科目一\t科目二");

    }

    newScore_1 = input.nextFloat();

    while(! input.hasNextFloat()){

    input.next();

    System.out.println("\n非法输入,请重新输入!");

    System.out.println("\n请输入学生的成绩:\t科目一\t科目二");

    }

    newScore_2 = input.nextFloat();

    p.scoreOfLesson_1 = newScore_1;

    p.scoreOfLesson_2 = newScore_2;

    }

    p = p.next;

    }

    }

    public void insert() {//插入结点

    StudentInformation p = head;

    StudentInformation s = new StudentInformation(input);

    s.next = p.next;

    p.next = s;

    }

    public void remove(long id) throws Exception{//删除结点

    StudentInformation p = head.next;

    int j = -1;

    while(p.next != null && j < lenght() - 1){

    if(p.stuId == id)

    break;

    p = p.next;

    j++;

    }

    if(j > lenght() || p == null){

    throw new Exception("删除位置不合法");

    }

    p.next = p.next.next;

    }

    public int lenght() {//计算链表长度

    int lenght = 0;

    StudentInformation p = head.next;

    while(p != null){

    lenght++;

    p = p.next;

    }

    return lenght;

    }

    public void rank(){//排序

    StudentInformation p, q, snap1, snap2;

    while(true){

    int judge = 0;

    p = head;

    q = p.next;

    while(p.next != null && q.next != null){

    if(p.next.sum < q.next.sum){

    judge = 1;

    snap1 = p.next;

    snap2 = q.next;

    p.next = snap2;

    snap1.next = snap1.next.next;

    snap2.next = snap1;

    }

    if(q.next == null || p.next == null)

    break;

    p = p.next;

    q = q.next;

    }

    if(judge == 0)

    break;

    }

    }

    public void findStudent(long id) throws Exception{//寻找某位学生

    StudentInformation p = head.next;

    while(p != null && p.stuId != id)

    p = p.next;

    if(p == null){

    throw new Exception("您所寻找的位置不存在!");

    }

    System.out.println("学生姓名:" + p.name + "\t" + head.lesson_1 + "的成绩:" + (int)(p.scoreOfLesson_1 * 10) / 10.0

    + "\t" + head.lesson_2 + "的成绩:" + (int)(p.scoreOfLesson_2 * 10) / 10.0);

    }

    public void check(){//输出方法

    StudentInformation p = head.next;

    System.out.println("学生姓名\t学号\t科目一\t"

    + "成绩\t科目二\t成绩\t总分");

    while(p != null){

    System.out.println(p.name + "\t" + p.stuId + "\t" + head.lesson_1 + "\t"

    + (int)(p.scoreOfLesson_1 * 10) / 10.0 + "\t" + head.lesson_2 +

    "\t" + (int)(p.scoreOfLesson_2 * 10) / 10.0 + "\t" + (int)(p.sum * 10) / 10.0);

    p = p.next;

    }

    }

    public void statistics(){

    StudentInformation p = head.next;

    float minScoreOfLesson_2 = 100f, minScoreOfLesson_1 = 100f;

    float maxScoreOfLesson_2 = 0f, maxScoreOfLesson_1 = 0f;

    while(p != null){

    sumLesson_1 += p.scoreOfLesson_1;

    sumLesson_2 += p.scoreOfLesson_2;

    minStuSc_1 = minScoreOfLesson_1 < p.scoreOfLesson_1 ? minStuSc_1 : p;

    maxStuSc_1 = maxScoreOfLesson_1 > p.scoreOfLesson_1 ? maxStuSc_1 : p;

    maxStuSc_2 = maxScoreOfLesson_2 > p.scoreOfLesson_2 ? maxStuSc_2 : p;

    minStuSc_2 = minScoreOfLesson_2 < p.scoreOfLesson_2 ? minStuSc_2 : p;

    minScoreOfLesson_1 = minStuSc_1.scoreOfLesson_1;

    minScoreOfLesson_2 = minStuSc_2.scoreOfLesson_2;

    maxScoreOfLesson_1 = maxStuSc_1.scoreOfLesson_1;

    maxScoreOfLesson_2 = maxStuSc_2.scoreOfLesson_2;

    p = p.next;

    }

    System.out.println("科目一\n最高分\t姓名\t学号\n最低分\t姓名\t学号\t\n科目平均分");

    System.out.println("" + maxStuSc_1.scoreOfLesson_1 + "\t" + maxStuSc_1.name + "\t" + maxStuSc_1.stuId + "\n" +

    minStuSc_1.scoreOfLesson_1 + "\t" + minStuSc_1.name + "\t" + minStuSc_1.stuId);

    System.out.println((int)((sumLesson_1 / lenght()) * 10) / 10.0);

    System.out.println("科目二\n最高分\t姓名\t学号\n最低分\t姓名\t学号\t\n科目平均分");

    System.out.println(maxStuSc_2.scoreOfLesson_2 + "\t" + maxStuSc_2.name + "\t" + maxStuSc_2.stuId + "\n" +

    minStuSc_2.scoreOfLesson_2 + "\t" + minStuSc_2.name + "\t" + minStuSc_2.stuId);

    System.out.println((int)((sumLesson_2 / lenght()) * 10) / 10.0);

    }

    }

    package labReport;

    import java.util.Scanner;

    public class TestReport {

    static{

    System.out.println("欢迎使用学生管理系统(垃圾版)!");

    System.out.println("请先完成一个成绩表格的初始化,谢谢合作!");

    System.out.print("请输入需要统计成绩的两个科目名称:");

    }

    public static void main(String[] args){

    StudentList list = new StudentList();

    Scanner input = new Scanner(System.in);

    int capita = 0;//初始人数

    int i = 0;

    list.head.lesson_1 = input.next();

    list.head.lesson_2 = input.next();

    System.out.println("请输入成绩统计初始人数!");

    while(! input.hasNextInt()){

    input.next();

    System.out.println("非法输入,请重新输入:");

    System.out.println("请输入成绩统计初始人数!");

    }

    capita = input.nextInt();

    System.out.println("请按顺序输入学生的\t姓名\t学号\t" + list.head.lesson_1

    + "的成绩 \t" + list.head.lesson_2 + "的成绩");

    for(i = 0; i < capita; i++)

    list.insert();

    menu(list);

    input.close();

    }

    @SuppressWarnings("resource")

    public static void menu(StudentList list){

    Scanner input = new Scanner(System.in);

    while(true){

    System.out.println("现在进行操作选择!");

    System.out.println("1、增加学生成员\t2、删除已有学生\t3、查找已有成员\t4、"

    + "修改已有学生成绩\t5、查看学生排名列表\t6、查看学生数据分析\t7、退出");

    while(! input.hasNextInt()){

    input.next();

    System.out.println("非法输入,请重新输入!");

    System.out.println("1、增加学生成员\t2、删除已有学生\t3、查找已有成员\t4、"

    + "修改已有学生成绩\t5、查看学生排名列表\t6、查看学生数据分析\t7、退出");

    }

    switch(input.nextInt()){

    case 1: System.out.println("请按顺序输入学生的\t姓名\t学号\t" + list.head.lesson_1 + "的成绩\t" + list.head.lesson_2 + "的成绩");

    list.insert();

    System.out.println("操作成功!");

    break;

    case 2:

    System.out.println("请输入要删除的学生成员学号!");

    try {

    while(! input.hasNextInt()){

    input.next();

    System.out.println("非法输入,请重新输入!");

    }

    list.remove(input.nextLong());

    } catch (Exception e) {

    e.printStackTrace();

    }

    System.out.println("操作成功!");

    break;

    case 3:

    System.out.println("请输入需查找的学生成员的学号!");

    try {

    while(! input.hasNextInt()){

    input.next();

    System.out.println("非法输入,请重新输入!");

    }

    list.findStudent(input.nextLong());

    } catch (Exception e) {

    e.printStackTrace();

    }

    System.out.println("操作成功!");

    break;

    case 4:

    System.out.println("请输入要修改成绩的学生的学号!");

    while(! input.hasNextInt()){

    input.next();

    System.out.println("非法输入,请重新输入!");

    }

    list.change(input.nextLong());

    System.out.println("操作成功!");

    break;

    case 5:

    list.rank();

    list.check();

    System.out.println("操作成功!");

    break;

    case 6:

    list.statistics();

    System.out.println("操作成功!");

    break;

    case 7: System.out.println("感谢您本次对本产品的使用!");

    System.exit(0);

    break;

    default:

    try {

    System.out.println("非法选项!\n请重新进入菜单选择");

    Thread.sleep(10000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    break;

    }

    }

    }

    }

    展开全文
  • 01-java学生成绩管理系统单链表+java的GUI)

    千次阅读 多人点赞 2019-07-16 18:11:43
    学生成绩管理系统单链表+java的GUI) 说明: 1.我所说的保存到数据库并没有保存到数据库。保存数据的生命周期仅仅是运行到关闭之间时间。 2.用的是单链表,所涉及的功能有:增加,删除,修改,查看。 3.无论你之前...
  • #include "STUHEADERFILES.h"/*函数:Mode_Sort_China功能:语文成绩的比较两个相邻节点进行比较如果左节点比相邻右节点大节点进行交换参数:ListLeftHeadNodes左半部节点ListRightHeadNodes右半部节点返回值:...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 215
精华内容 86
关键字:

学生成绩管理系统单链表