学生信息管理

学生信息管理系统设计与实现
本文介绍了一个基于C语言的学生信息管理系统的设计与实现,系统具备增加、修改、查询、删除和保存学生信息的功能,采用结构体组织数据,通过密码保护界面,支持学号和姓名查询,实现了信息的刷新和输出。

第三次上机–学生信息管理系统

  1. 题目分析
    本次实验是基于管理学生信息来实现的,主要功能应有对学生信息的增加,修改,查询,删除,保存。
    学生信息含有学号、姓名、年龄和成绩,学号应该保持不一致,这样才符合现实世界的逻辑。这样要删除或修改哪个学生的信息就可以直接用学号锁定学生,不会出现重复的学生。鉴于信息不能肆意修改,我为界面设置了密码。在这些基础上还实现了学生信息的刷新,输出现已保存的学生信息。
    为了让每个学生的信息不分散,我使用了结构体。
  2. 关键算法构造
    2.1主函数

在这里插入图片描述
2.2保存信息函数
在这里插入图片描述
2.密码实现
在这里插入图片描述
3. 程序实现

#include<stdio.h>	/*I/O函数*/
#include<stdlib.h>	/*其它说明*/
#include<string.h>	/*字符串函数*/
#include<iostream.h>
#include<fstream.h>
#include<cassert>
#define LEN 15		/* 学号和姓名最大字符数,实际请更改*/
#define N 50
struct student
{		/* 最大学生人数,实际请更改*/
char code[LEN+1];	/* 学号*/
char name[LEN+1];	/* 姓名*/
int age;			/* 年龄*/
char sex;		/* 性别*/
float score[3];  /* 3门课程成绩*/
}student[N];
    
int k=1,n=0, m=0;/* n代表当前记录的学生人数*/	 
void seek();//查找学生信息
void modify();//修改学生信息
void insert();//增加学生信息
void save();//保存学生信息
void del();//删除学生信息
void display();//输出学生信息
void menu(); //主菜单
void refresh();//刷新学生信息
int main()
{   int t=1;
	char password[3];
	while(t)
	{printf("请输入密码\n");
    for(int i=0;i<3;i++)
	{scanf("%c",&password[i]);}
	if(password[0]=='A'&&password[1]=='B'&&password[2]=='C')
	{
		t=0;
	while(k)
	{
		menu();
	}
	system("pause");
	return 0;
	}
	}
} 
void help()//帮助
{ 
	printf("\n0.欢迎使用系统帮助!\n");
	printf("\n1.初次进入系统后,请先选择增加学生信息;\n");
	printf("\n2.按照菜单提示键入数字代号;\n");
	printf("\n3.增加学生信息后,切记保存;\n");
	printf("\n4.谢谢您的使用!\n");
} 
void seek() /*查找*/
{
	int i,item,flag;
	char s1[21]; /* 以姓名和学号最长长度+1为准*/
	printf("------------------\n");
	printf("-----1.按学号查询-----\n");
	printf("-----2.按姓名查询-----\n");
	printf("-----3.退出本菜单-----\n");
	printf("------------------\n");
	while(1)
	{
		printf("请选择子菜单编号:");
		scanf("%d",&item);
		flag=0;
		switch(item)
		{
		case 1:
			printf("请输入要查询的学生的学号:\n");
			scanf("%s",s1);
			for(i=0;i<n;i++)
				if(strcmp(student[i].code,s1)==0)
				{
					flag=1;
					printf("学生学号    学生姓名  年龄   性别  C语言成绩  高等数学  大学英语成绩\n");				
					printf("--------------------------------------------------------------------\n");
					printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",student[i].code,student[i].name,student[i].age,student[i].sex,student[i].score[0],student[i].score[1],student[i].score[2]);break;
}
				if(0==flag)
					printf("该学号不存在!\n"); break;
		case 2:
			printf("请输入要查询的学生的姓名:\n");
			scanf("%s",s1);
			for(i=0;i<n;i++)
				if(strcmp(student[i].name,s1)==0)
				{
					flag=1;
					printf("学生学号    学生姓名  年龄   性别  C语言成绩  高等数学  大学英语成绩\n");				
					printf("--------------------------------------------------------------------\n");
					printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",student[i].code,student[i].name,student[i].age,
						student[i].sex,student[i].score[0],student[i].score[1],student[i].score[2]);
				}
					if(0==flag)
						printf("该姓名不存在!\n"); break;
		case 3:return;
		default:printf("请在1-3之间选择\n");
		}
	}
} 
void modify() /*修改信息*/
{
	int i,item,num=-1;
	char sex1,s1[LEN+1],s2[LEN+1]; /* 以姓名和学号最长长度+1为准*/
	float score1;
	printf("请输入要要修改的学生的学号:\n");
	scanf("%s",s1);
	for(i=0;i<n;i++)
		if(strcmp(student[i].code,s1)==0) /*比较字符串是否相等*/
			num=i;
		printf("------------------\n");
		printf("1.修改姓名\n");
		printf("2.修改年龄\n");
		printf("3.修改性别\n");
		printf("4.修改C语言成绩\n");
		printf("5.修改高等数学成绩\n");
		printf("6.修改大学英语成绩\n");
		printf("7.退出本菜单\n");
		printf("------------------\n");
		while(1)
		{
			printf("请选择子菜单编号:");
			scanf("%d",&item);
			switch(item)
			{
			case 1:
				printf("请输入新的姓名:\n");
				scanf("%s",s2);
				strcpy(student[num].name,s2);break;
			case 2:
				printf("请输入新的年龄:\n");
				scanf("%d",student[num].age);break;
			case 3:
				printf("请输入新的性别:\n");
				scanf("%c",&sex1);
				student[num].sex=sex1;break;
			case 4:
				printf("请输入新的C语言成绩:\n");
				scanf("%f",&score1);
				student[num].score[0]=score1;break;
			case 5:
				printf("请输入新的高等数学成绩:\n");
				scanf("%f",&score1);
				student[num].score[1]=score1;break;
			case 6:
				printf("请输入新的大学英语成绩:\n");
				scanf("%f",&score1);
				student[num].score[2]=score1;break;
			case 7:	return;
			default:printf("请在1-7之间选择\n");
			}
		}
} 
void sort()/*按学号排序*/
{
	int i,j,k,*p,*q,s;
	char temp[LEN+1],ctemp;
	float ftemp;
	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
			if(strcmp(student[j-1].code,student[j].code)>0)
			{
				strcpy(temp,student[j].code);
				strcpy(student[j-1].code,student[j].code);
				strcpy(student[j].code,temp);
				strcpy(temp,student[j-1].name);
				strcpy(student[j-1].name,student[j].name);
				strcpy(student[j].name,temp);
				ctemp=student[j-1].sex;
				student[j-1].sex=student[j].sex;
				student[j].sex=ctemp;
				p=&student[j-1].age;
				q=&student[j].age;
				s=*q;
				*q=*p;
				*p=s;
				for(k=0;k<3;k++)
				{
					ftemp=student[j-1].score[k];
					student[j-1].score[k]=student[j].score[k];
					student[j].score[k]=ftemp;
				}
			}
	}
} 
void insert() /*插入函数*/
{
	int i=n,j,flag;

	printf("请输入待增加的学生数:\n");
	scanf("%d",&m);
	if(m>0)
	{
	  do
	  {
			flag=1;
			while(flag)
			{ flag=0;

			printf("请输入第%d 个学生的学号:\n",i+1);
			scanf("%s",student[i].code);
			for(j=0;j<i;j++)
				if(strcmp(student[i].code,student[j].code)==0)
				{printf("已有该学生信息,请重新录入\n");
				flag=1;
				break;
				}
			}
			printf("请输入第%d 个学生的姓名:\n",i+1);
			scanf("%s",student[i].name);
			printf("请输入第%d 个学生的年龄:\n",i+1);
			scanf("%d",&student[i].age);
			printf("请输入第%d 个学生的性别:\n",i+1);
			scanf(" %c",&student[i].sex);
			printf("请输入第%d 个学生的C语言成绩\n",i+1);
			scanf("%f",&student[i].score[0]);
			printf("请输入第%d 个学生的高等数学成绩:\n",i+1);
			scanf("%f",&student[i].score[1]);
			printf("请输入第%d 个学生的大学英语成绩:\n",i+1);
			scanf("%f",&student[i].score[2]);
			if(0==flag)
			{
				i++;
			}

	}
	while(i<n+m);
}


	n+=m;
	printf("信息增加完毕!\n\n");
	sort();
} 

void del()//删除学生信息
{
	int i,j,flag=0;
	char s1[LEN+1];
	printf("请输入要删除学生的学号:\n");
	scanf("%s",s1);
	for(i=0;i<n;i++)
		if(strcmp(student[i].code,s1)==0)
		{
			flag=1;
			for(j=i;j<n-1;j++)
				student[j]=student[j+1];
				
		}
		if(flag==0)
			printf("该学号不存在!\n");
		if(flag==1)
		{
			printf("删除成功,显示结果请选择菜单\n");
			n--;
		}
} 


void display()//显示学生信息
{
	int i;
	printf("共有%d位学生的信息:\n",n);

	if(0!=n)
	{
		printf("学生学号  学生姓名 年龄  性别  C语言成绩  高等数学  大学英语成绩\n");				
		printf("--------------------------------------------------------------------\n");
		for(i=0;i<n;i++)
		{ 
			printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",student[i].code,student[i].name,student[i].age,
						student[i].sex,student[i].score[0],student[i].score[1],student[i].score[2]);
		}
	}
} 
void menu()/* 界面*/
{
	int num;
	printf(" \n\n                    \n\n");
	printf("  ******************************************************\n\n");
	printf("  *                学生信息管理系统                    *\n \n");
	printf("  ******************************************************\n\n"); 
	printf("*********************系统功能菜单*************************       \n");
	printf("     ----------------------   ----------------------   \n");
	printf("     *********************************************     \n");
	printf("     * 0.系统帮助及说明  * *  1.刷新学生信息   *     \n");
	printf("     *********************************************     \n"); 
	printf("     * 2.查询学生信息    * *  3.修改学生信息   *     \n");
	printf("     *********************************************     \n");
	printf("     * 4.增加学生信息    * *  5.按学号删除信息 *     \n");
	printf("     *********************************************     \n");
	printf("     * 6.显示当前信息    * *  7.保存当前学生信息*     \n");
	printf("     ********************** **********************     \n");
	printf("     * 8.退出系统        *                            \n");
	printf("     **********************                            \n");
	printf("     ----------------------   ----------------------                           \n");
	printf("请选择菜单编号:");
	scanf("%d",&num);
	switch(num)
	{ 
	case 0:help();break;
	case 1:refresh();break;
	case 2:seek();break;
	case 3:modify();break;
	case 4:insert();break;
 	case 5:del();break;
 	case 6:display();break;
	case 7:save();break;
	case 8:k=0;break;
	default:printf("请在0-8之间选择\n");
	}
}
void save() //学生信息保存函数实现
	{
		 if(n<=0)
		 {
		 cout<<"没有职工信息存入,系统将返回主菜单"<<endl;
		 menu();
		 }
		 else
		 {
			 ofstream outfile("student.txt",ios::out);
		 cout<<"文件正在保存......请稍候!!"<<endl;
		 cout<<"数据保存成功!!!"<<endl;
		 outfile<<"已保存学生信息如下:"<<endl;
			if(0!=n)
			{
				for(int i=0;i<n;i++)
				{ 
					outfile<<"学号:"<<student[i].code<<endl;
					outfile<<"姓名:"<<student[i].name<<endl;
					outfile<<"年龄:"<<student[i].age<<endl;
					outfile<<"性别:"<<student[i].sex<<endl;
					outfile<<"C语言成绩:"<<student[i].score[0]<<endl;
					outfile<<"高等数学成绩:"<<student[i].score[1]<<endl;
					outfile<<"大学英语成绩:"<<student[i].score[2]<<endl;
				}
			}
		}
	 
	}

	void refresh()//学生信息刷新
{

	char buf[1024];
	FILE*fp;
	int len;
	if((fp=fopen("student.txt","r"))==NULL)
	{
		perror("失败");
		exit(1);

	}
	while(fgets(buf,1024,fp)!=NULL)
	{
		len=strlen(buf);
		buf[len-1]='\n';
		printf("%s",buf);
	}

}
  1. 调试、测试及运行结果
    4.1 调试
    在这里插入图片描述
    4.2测试
    (1)测试验证身份的密码
    输入密码正确时,主菜单页面出现
    在这里插入图片描述
    输入密码错误时,一直停留在输入密码页面上,直到输入密码正确
    在这里插入图片描述
    (2)测试增加学生信息函数

在这里插入图片描述在这里插入图片描述
(3)测试修改学生信息函数

在这里插入图片描述在这里插入图片描述
(4)测试查询学生信息函数

在这里插入图片描述
(5)测试显示当前信息函数
在这里插入图片描述
(6)测试保存学生信息函数
在这里插入图片描述
在这里插入图片描述
将信息保存在student.txt中
在这里插入图片描述
(7)测试刷新函数
在这里插入图片描述在这里插入图片描述

4.3运行结果
完整运行过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5. 经验归纳
将数据组织改为结构体形式后,在运行保存信息的函数后,student.txt中没有出现已保存的学生信息,之后才发现是因为改为结构体形式后,我使用结构体引用结构体成员的格式不正确。
在进行编写信息从文件中读取的函数时,我了解到了几种读取方式,一次读取一个字符串和一次读取一行,我在这个作业中使用了一次读取一行的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值