数据结构实现学生信息管理系统功能

学生信息管理系统

1、 学生信息录入:主要是录入学生班级信息和学生基本情况;
2、 学生信息查询:按指定系检索该系的学生信息,其中包括所有的学生信息;
3、 学生信息维护:维护学生、系别、课程、学生选课及成绩等方面的基本信息,包括增加、删除和修改;
4、 学生选课:为学生提供选课界面,包括所有课程信息。进入该界面前学生要输入正确的学号和姓名。

具体代码如下:(vc++6.0刚刚试过可以运行)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include <windows.h>
struct course	//定义储存课程信息的结构体
{
	int num;//课程号
	char subject[10];//课程名
	int mark;//学分
	int count;//已选人数
}cour[5] = { {1,"数据结构",3,0},{2,"java语言",3,0},
{3,"大学英语",5,0},{4,"软件工程",4,0},{5,"线性代数",3,0} };//课程信息
void Output_course(struct course *p)//调用存储课程信息结构体数组,输出所有课程信息
{
	system("cls");
	printf("课程信息如下:   \n");
	for (p = cour; p < cour + 5; p++)
		printf("课程号--%d   科目--%7s   学分--%d   已选人数--%d\n\n",
			p->num, p->subject, p->mark, p->count);
}
struct student	//定义存储学生信息的结构体
{
	long num;
	char name[10];
	char order1[10];//所选课程1
	char order2[10];//所选课程2
}stu[8] = {	   {20170401,"小明","NULL","NULL"},
			   {20170402,"小红","NULL","NULL"},
			   {20170403,"小张","NULL","NULL"},
			   {20170404,"小王","NULL","NULL"},
			   {20170405,"小花","NULL","NULL"},
			   {20170406,"小丽","NULL","NULL"},
			   {20170407,"小雨","NULL","NULL"},
			   {20170408,"小二","NULL","NULL"},
};
void Output_student(struct student *p)调用存储课程信息结构体数组,输出所有学生信息
{
	system("cls");
	printf("学生的选课情况如下:\n");
	for(p=stu;p<stu+8;p++)
	printf("学号--%d  姓名--%3s  课程1--%7s  课程2--%7s\n\n",
		p->num, p->name, p->order1, p->order2);
}
void modify(struct student *p, struct course cour[5])
//调用储存course和student的结构体数组,输出任意一个学生信息,并且可以修改
{
	int s;
	int g;
	char b;
	char k[10];
	char h;
	long n;
	long m;
	int i;
	int j;
	char name1[20];
	system("cls");
	printf("请输入学号(20170401-20170408):");
	scanf("%d", &n);
	printf("请输入学号对应的姓名:");
	scanf("%d", &h);
	for (p = stu; p < stu + 8; p++)
	{
		if (n == p->num)	//找到对应的学生
		{
			system("cls");
			printf("\n\n\n 该学生信息如下\n\n\n");
			printf("学号--%d  姓名--%s  课程1--%s  课程2--%s\n\n", 
				p->num, p->name, p->order1, p->order2);
			printf("\nA.修改  退出请按A,a外任意字母键\n");
			scanf("%s", &b);
			{ if (b == 'a' || b == 'A')
			{
				printf("\n1.修改学号   2.修改姓名   3.修改所选课程\n");
				scanf("%d", &s);
				{ if (s == 1)
				{
					printf("\n 学号修改为:\n"); //修改学号
					scanf("%d", &m);
					p->num = m;
					system("cls");
					printf("\n\n\n\n\n\n\n修改后如下:\n");
					printf("学号--%d  姓名--%s  课程1--%s  课程2--%s\n\n",
						p->num, p->name, p->order1, p->order2);
				}
				if (s == 2)
				{
					printf("\n 姓名修改为:\n");
					scanf("%20s", name1);
					strcpy(p->name, name1);
					system("cls");
					printf("\n\n\n\n\n 修改后如下\n\n");
					printf("学号--%d  姓名--%s  课程1--%s  课程2--%s\n\n", 
						p->num, p->name, p->order1, p->order2);
				}
				if (s == 3)
				{
					system("cls");
					printf("\n 输入你想修改的课程:区分大小写\n");
					scanf("%s", &k);
					{if (strcmp(p->order1, k) == 0)
					{
						system("cls");
						printf("\n1.数据结构  2.java语言   3.大学英语   4.软件工程   5.线性代数\n");
						printf("\n你想修改为(1-5):\n");
						scanf("%d", &g);
						for (i = 0; i < 5; i++)
						{
							if (g == i + 1)
							{
								if (cour[g - 1].count >= 3)
								{
									system("cls");
									printf("\n\n  该课程已被选满\n");//课程选满,返回主菜单
								}
								else {
									if (strcmp(p->order2, cour[g - 1].subject) == 0)
										printf("\n\n 你已选过这门课   \n\n");//重选,返回主菜单
									else {
										strcpy(p->order1, cour[g - 1].subject);
										cour[g - 1].count++;
										for (j = 0; j < 5; j++)
										{
											if (strcmp(cour[j].subject, k) == 0)

												cour[j].count--;
										}
										system("cls");
										printf("\n\n学生信息 \n\n");
										printf("学号--%d  姓名--%s  课程1--%s  课程2--%s\n\n",
											p->num, p->name, p->order1, p->order2);
									}
								}
							}
						}
					}
					else
						if (strcmp(p->order2, k) == 0)
						{
							system("cls");
							printf("\n1.数据结构  2.java语言   3.大学英语   4.软件工程   5.线性代数\n");
							printf("\n你想修改为(1-5):\n");
							scanf("%d", &g);
							for (i = 0; i < 5; i++)
							{
								if (g == i + 1)
								{
									if (cour[g - 1].count >= 3)
									{
										printf("\n\n   该课程已被选满\n");//已选满
									}
									else {
										if (strcmp(p->order1, cour[g - 1].subject) == 0)
											printf("\n\n 你已选过这门课   \n\n");//重选
										else {
											strcpy(p->order2, cour[g - 1].subject);
											cour[g - 1].count++;
											for (j = 0; j < 5; j++)
											{
												if (strcmp(cour[j].subject, k) == 0)
													cour[j].count--;
											}
											system("cls");
											printf("\n\n学生信息 \n\n");
											printf("学号--%d  姓名--%s  课程1--%s  课程2--%s\n\n",
												p->num, p->name, p->order1, p->order2);
										}
									}
								}
							}
						}
						else  printf("\n\n 您还没选这门课或拼写错误\n\n");
					}
				}

				}
			}
			}
		}
	}
}

void xuanke(struct student *p,struct course cour[5])//为任意学生去选课
{ long n;int a;int b;int t = 0;int u = 0;int i;
	system("cls");
	printf("请输入学号(20170401-20170408):");
	scanf("%d", &n);

	for (p = stu;p < stu + 8;p++)
	{
		if (n == p->num)//找到相应的学生
		{
			system("cls");
			if (strcmp(p->order1,"NULL")!=0)	//第一门课不为空
				t = 1;
			else
			{
				system("cls");
				printf("\n\n\n\n\n\n请选您的第一门课   提示:您最多只能选二门课\n\n");
				printf("\n1.数据结构  2.java语言   3.大学英语   4.软件工程   5.线性代数\n\n");
				printf("\n请选第一门课:不选请按1-5外任意数字键返回\n\n");
				scanf("%d", &a);//输入所选课程编号
				for (i = 0; i < 5; i++)
				{
					if (a == i + 1)
					{
						if (cour[a - 1].count >= 3)
						{
							printf("\n\n该课程已被选满\n");//课程选满。返回主菜单
						}
						else {
							if (strcmp(p->order2,cour[a - 1].subject)==0)
								printf("\n\n\n 你已选过这门课\n");//重选,返回主菜单
							else {
								strcpy(p->order1, cour[a - 1].subject);//选课成功
								cour[a - 1].count++;
								system("cls");
								printf("\n\n\n\n\n\n   学生信息:\n");
								printf("学号--%d  姓名--%s  课程1--%s  课程2--%s\n\n",
									p->num, p->name, p->order1, p->order2);
							}
						}
					}
				}
			}
			if (strcmp(p->order2, "NULL")!=0)//第二门课不为空
				u = 1;
			else {
				printf("\n\n\n\n\n\n请选您的第二门课   提示:您最多只能选二门课\n\n");
				printf("\n1.数据结构  2.java语言   3.大学英语   4.软件工程   5.线性代数\n\n");
				printf("\n 请选第二门课:不选请按 1-5 外任意数字键返回\n\n");
				scanf("%d", &b);
				for (i = 0; i < 5; i++)
				{
					if (b == i + 1)
					{
						if (cour[b - 1].count >= 3)
						{
							printf("\n\n 该课程已被选满 \n");//已选满,返回主菜单
						}
						else {
							if (strcmp(p->order1, cour[b - 1].subject)==0)
								printf("\n\n\n   你已选过这门课   \n");//重选,返回主菜单
							else {
								strcpy(p->order2, cour[b - 1].subject);
								cour[b - 1].count++;
								system("cls");
								printf("\n\n\n\n\n\n   学生信息:\n");//成功选课
								printf("学号--%d  姓名--%s  课程1--%s  课程2--%s\n\n",
									p->num, p->name, p->order1, p->order2);
							}
						}
					}
				}
			}
			if (u==1&&t==1)
				printf("\n 您已选满,若想修改请进入菜单 3\n");
		}
	}
}

void a()
{
	for (;;){
	int n;
	printf("\t\t************欢迎来到选课系统************\n\n");
	printf("\t\t**-------- 1 浏览课程信息 ------------**\n\n");
	printf("\t\t**-------- 2 浏览学生选课情况 --------**\n\n");
	printf("\t\t**-------- 3 学生信息查询和修改 ------**\n\n");
	printf("\t\t**-------- 4 学生选课 ----------------**\n\n");
	printf("\t\t**-------- 5 退出 --------------------**\n\n");
	printf("请选择(1-5):[ ]\b\b");
	scanf("%d", &n);
	switch (n)
	{
	case 1:Output_course(cour); break;
	case 2:Output_student(stu); break;
	case 3:modify(stu,cour); break;
	case 4:xuanke(stu,cour); break;
	case 5:exit(0);
	default:printf("请输入正确数字!\n");
	}
	}
}


#define N 100
typedef struct stulink_node
{
	char sdepartment[10];
	char sclass[10];
	char scourse[10];
	char sno[14];
	char sname[10];
	char ssex[2];
	float psscore;
	float syscore;
	float qmscore;
	float zpscore;
	struct stulink_node *next;
}student;
typedef student *linklist;

student *head;

char sno[N][20]={{'a','b'}};
int count;
void display();                  //函数声明
int judge(char sno1[])               //判断学号函数
{
	int i;
	for(i=0;i<N;i++)
	{
		if(!strcmp(sno1,sno[i]))
			return 1;
	}
	return 0;
}

student *init()            //建立一个空的单链表
{
	return NULL;
}
float average(student *stu)          //求总评成绩函数
{
	return (float)(0.4*stu->psscore+0.3*stu->syscore+0.3*stu->qmscore);
}
void luru()                //录入学生信息函数
{	
	linklist p,q;
	static int count=0;
	char flag='0';
	q=(linklist)malloc(sizeof(student));
	p=head=NULL;
	while(flag=='0')
		{
			printf("\n");
			printf("请输入学生的学号: ");
			scanf("%s",&q->sno);
			while(judge(q->sno))
			{
			printf("学号重复,请重新输入:");
			scanf("%s",&q->sno);
			}
			strcpy(sno[count],q->sno);count++;
			printf("请输入学生的系别: ");
			scanf("%s",&q->sdepartment);
			printf("请输入学生的班级: ");
			scanf("%s",&q->sclass);
			printf("请输入学生的课程: ");
			scanf("%s",&q->scourse);
			printf("请输入学生的姓名: ");
			scanf("%s",&q->sname);
			printf("请输入学生的性别: ");
		    scanf("%s",&q->ssex);
			printf("请输入学生的平时成绩: ");
		    scanf("%f",&q->psscore);
			printf("请输入学生的实验成绩: ");
		    scanf("%f",&q->syscore);
			printf("请输入学生的期末成绩: ");
			scanf("%f",&q->qmscore);
			q->zpscore=average(q);
			setbuf(stdin,NULL);
			if(head==NULL) 
			{
				head=q;
				p=head;
			}
			else 
			{
				p->next=q;
				p=q;
			}
			q=(linklist)malloc(sizeof(student));
			printf("按0继续输入,否则退出\n");
			flag=getch();
			setbuf(stdin,NULL);
		}
	free(q);
	printf("输入完毕!\n ");
	p->next=NULL;
}
void charu()                      //插入 学生信息函数        
{
	int j=0,i;
	linklist p,q;
	p=head;
	printf("请输入要插入的位置: ");
	scanf("%d",&i);
	if(i<0) printf("输入位置不规范!\n");
	else 
	{
		while (p&&i!=j)
		{
			p=p->next;j++;
		}
		if(!p&&i!=0)  printf("未找到该结点不能插入!");
		else
		{
			q=(linklist)malloc(sizeof(student));
			printf("请输入学生的学号: ");
			scanf("%s",&q->sno);
			while(judge(q->sno))
			{
			printf("学号重复,请重新输入:");
			scanf("%s",&q->sno);
			}
			strcpy(sno[count],q->sno);count++;
			printf("请输入学生的系别: ");
			scanf("%s",&q->sdepartment);
			printf("请输入学生的班级: ");
			scanf("%s",&q->sclass);
			printf("请输入学生的课程: ");
			scanf("%s",&q->scourse);
			printf("请输入学生的姓名: ");
			scanf("%s",&q->sname);
			printf("请输入学生的性别: ");
			scanf("%s",&q->ssex);
			printf("请输入学生的平时成绩: ");
			scanf("%f",&q->psscore);
			printf("请输入学生的实验成绩: ");
			scanf("%f",&q->syscore);
			printf("请输入学生的期末成绩: ");
			scanf("%f",&q->qmscore);
			q->zpscore=average(q);
			if(i==0)
			{
				q->next=head;
				head=q;
			}
			else 
			{
				q->next=p->next;
				p->next=q;
			}
		}
	}

}
void xiugai()                         //修改学生信息函数
{
	linklist q;
	int m=0;
	char sno[15];
	q=head;
	printf("请输入要修改的学生学号:");
	scanf("%s",&sno);
	if(!q)  printf("修改失败,没有学生信息!\n");
	else 
	{
		while(q!=NULL)
		{
			if(strcmp(q->sno,sno)==0)
			{
				printf("请输入学生的系别: ");
			    scanf("%s",&q->sdepartment);
			    printf("请输入学生的班级: ");
			    scanf("%s",&q->sclass);
			    printf("请输入学生的课程: ");
			    scanf("%s",&q->scourse);
				printf("请输入学生的学号: ");
				scanf("%s",&q->sno);
				printf("请输入学生的姓名: ");
				scanf("%s",&q->sname);
				printf("请输入学生的性别: ");
				scanf("%s",&q->ssex);
				printf("请输入学生的平时成绩: ");
				scanf("%f",&q->psscore);
				printf("请输入学生的实验成绩: ");
				scanf("%f",&q->syscore);
				printf("请输入学生的期末成绩: ");
				scanf("%f",&q->qmscore);
				q->zpscore=average(q);
				setbuf(stdin,NULL);
				m=1;
				printf("修改成功!\n\n");
				break;
			}
			else
				q=q->next;	
		}
		if(m==0) printf("修改失败,没有该学生信息!\n\n");
	}
}

void shanchu()                       //删除学生信息函数
{
	linklist pre,q;
	char sno[12];
	pre=head;
	q=head;
	printf("请输入要删除的学生学号:");
	scanf("%s",&sno);
	if(!q) printf("没有学生信息,无法删除!\n\n");
	else
	{
		while(q)
		{
			if(strcmp(q->sno,sno)==0) 
			{
				if(q==head)
				{
				head=q->next;
				free(q);
				}
				else 
				{
				pre->next=q->next;
				free(q);
				}
				printf("删除成功!\n");
				break;
			}
			else
			{
				pre=q;
				q=q->next;
			}
		}
	}	
}

void chaxun()                           //查询学生信息函数
{
	linklist p;
	int m=0;
	char sno[15];
	p=head;
	printf("请输入需查询的学生学号:");
	scanf("%s",&sno);
	if(!p) printf("没有学生信息,无法查询!\n\n");
	else
	{
		while(p)
		{
			if(strcmp(p->sno,sno)==0) 
			{
				printf("系别:%s\n",p->sdepartment);
				printf("班级:%s\n",p->sclass);
				printf("课程:%s\n",p->scourse);
				printf("学号:%s\n",p->sno);
				printf("姓名:%s\n",p->sname);
				printf("性别:%s\n",p->ssex);
				printf("平时成绩:%-.2f\n",p->psscore);
				printf("实验成绩:%-.2f\n",p->syscore);
				printf("期末成绩:%-.2f\n",p->qmscore);
				printf("总评成绩:%-.2f\n",p->zpscore);
				m=1;
				break;
			}
			else
				p=p->next;
		}
		if(m==0) printf("查询失败,没有该生信息!\n");
	}
	
}
void paixu()                       //对学生总评成绩排序(冒泡法)
{
	linklist p,q,r;
	student temp;
	r=head;
	if(r==NULL) printf("没有学生成绩,请先添加学生成绩!\n");
	else
	{
	while(r)
	{
		p=r;
		q=r->next;
		while(q)
		{
			if(p->zpscore < q->zpscore)
			{
				strcpy(temp.sdepartment,p->sdepartment);
				strcpy(temp.sclass,p->sclass);
				strcpy(temp.scourse,p->scourse);
				strcpy(temp.sno,p->sno);
				strcpy(temp.sname,p->sname);
				strcpy(temp.ssex,p->ssex);
				temp.psscore=p->psscore;
				temp.syscore=p->syscore;
				temp.qmscore=p->qmscore;
				temp.zpscore=p->zpscore;

  				strcpy(p->sdepartment,q->sdepartment);
				strcpy(p->sclass,q->sclass);
				strcpy(p->scourse,q->scourse);
				strcpy(p->sno,q->sno);
				strcpy(p->sname,q->sname);
				strcpy(p->ssex,q->ssex);
				p->psscore=q->psscore;
				p->syscore=q->syscore;
				p->qmscore=q->qmscore;
				p->zpscore=q->zpscore;

				strcpy(q->sdepartment,temp.sdepartment);
				strcpy(q->sclass,temp.sclass);
				strcpy(q->scourse,temp.scourse);
				strcpy(q->sno,temp.sno);
				strcpy(q->sname,temp.sname);
				strcpy(q->ssex,temp.ssex);
				q->psscore=temp.psscore;
				q->syscore=temp.syscore;
				q->qmscore=temp.qmscore;
				q->zpscore=temp.zpscore;
			}
			q=q->next;
		}
		r=r->next;
	}
	printf("****排序完毕,按由大到小的总评成绩!");
	display();
	}
	
}

void display()                   //输出学生信息函数
{
	student *p;
	p=head;
	if(!p) printf("暂无学生成绩!\n");
	else
	{
		printf("各个学生成绩为:\n");
		while(p)
		{
			/*printf("系别:%s,班级:%s,课程:%s,学号:%s,姓名:%s,性别:%s,
				平时成绩:%-.2f,实验成绩:%-.2f,期末成绩:%-.2f,总评成绩:%-.2f\n",
				p->sdepartment,p->sclass,p->scourse,p->sno,p->sname,p->ssex,
				p->psscore,p->syscore,p->qmscore,p->zpscore);*/
			    printf("系别:%s	",p->sdepartment);
				printf("班级:%s	",p->sclass);
				printf("课程:%s	",p->scourse);
				printf("学号:%s	",p->sno);
				printf("姓名:%s	",p->sname);
				printf("性别:%s	",p->ssex);
				printf("平时成绩:%-.2f	",p->psscore);
				printf("实验成绩:%-.2f	",p->syscore);
				printf("期末成绩:%-.2f	",p->qmscore);
				printf("总评成绩:%-.2f\n",p->zpscore);
			p=p->next;
		}
	}
}
void menu()
{
	int choose;
	printf("**************学生信息管理系统*****************\n");
	printf("*                                             *\n");
	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("***********************************************\n");
	printf("\n");
	printf("请输入你的选择:");
	scanf("%d",&choose);
	switch(choose)
	{
	case 1:luru();break;
	case 2:charu();break;
	case 3:xiugai();break;
	case 4:shanchu();break;
	case 5:chaxun();break;
	case 6:paixu();break;
	case 7:display();break;
	case 8:a();break;
	case 9:exit(0);break;
	default:printf("请输入正确数字!\n");
	}
	menu();
}

int main()
{
	head=init();
	menu();
	return 0;
}


运行结果很多,我简单的给个主菜单
在这里插入图片描述
欢迎您关注我的微信公众号:学习微站(studysth)
在这里插入图片描述

最后,这是我的主页链接:https://blog.csdn.net/weixin_43206161

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习微站公众平台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值