⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 001.cpp

📁 学生信息管理系统
💻 CPP
字号:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
/*========定义结构体=========*/
typedef struct
{
	char classno[10];		//学生所在班级
	int no;					//学生班级学号
	char name[10];			//学生姓名
	int score[4];			//课程各分数
}stud;						//存放学生信息的结构体
/**/
void pprintf();		//输出当前信息情况函数
void manage();		//管理模块
void find();		//查找模块
void all();			//统计模块
/**/
void instud();			//添加函数
void destud();			//删除函数
void orderstud();		//排序函数
/**/
void nostud();
void scstud();
/**/
void namefind();			//名字查找函数
void numfind();				//学号查找函数
void course();				//课程查找函数
/**/
void high();		//统计出最高分函数
void low();			//统计出最低分函数
void alv();			//统计出平均分函数
void pass();		//统计出各门功课的通过率函数
/**/
stud s1,s2,temp;			//定义几个外部变量
stud s[30];
int i,j,k,exchange;
FILE *fp;
/*===================================主菜单模块main函数=====================================*/
void main()
{
	int xz;
	if((fp=fopen("student.txt","ab+"))==NULL)
		{printf("\n>>不能打开student.txt文件");return;}
	rewind(fp);
	for(i=0;!feof(fp);i++)
		fread(&s[i],sizeof(stud),1,fp);
	i--;		//i已经记录了学生的个数
	fclose(fp);
	//信息已经读取到s[]结构体数组中
	do
	{
		printf(">>主选菜单:1.管理信息	2.统计信息	3.查找学生信息	4.输出	0.退出=>");
		scanf("%d",&xz);
		switch(xz)
		{
			case 1:manage();break;
			case 2:all();break;
			case 3:find();break;
			case 4:pprintf();break;
			case 0:exit(0);
			default:printf("\n>>请选择正确的选项:");
		}
	}while(1);			//使用循环对主菜单进行控制
}
/*================================manage模块========================================*/
void manage()
{
	int mxz;
	do
	{
		printf(">>菜单选择:1.添加学生	2.删除学生	3.排序	4.输出	0.返回=>");
		scanf("%d",&mxz);
		switch(mxz)
		{
			case 1:instud();break;
			case 2:destud();break;
			case 3:orderstud();break;
			case 4:pprintf();break;
			case 0:return;
			default:printf("\n>>请选择正确的选项:");
		}
	}while(1);
	return;
}
void instud()
{
	int ixz;
	if((fp=fopen("student.txt","ab+"))==NULL)
	{printf("\n>>不能创建或打开student.txt文件");return;}
	printf(">>请输信息:班级 学号 姓名 分数(语 数 外)");
	scanf("%s%d%s%d%d%d",s1.classno,&s1.no,s1.name,&s1.score[0],&s1.score[1],&s1.score[2]);
	s1.score[3]=s1.score[0]+s1.score[1]+s1.score[2];
	rewind(fp);
	do
	{
		fread(&s2,sizeof(stud),1,fp);
		if(s1.no==s2.no) break;
	}while(!feof(fp));
	if(!feof(fp)) 
	{
		printf("\n>>该学生信息已经存在,保存失败!\n>>是否按此修改该学生信息:1.是 0.否");
		scanf("%d",&ixz);
		while(1)
		{
			switch(ixz)
			{
				case 1:
					{
						fseek(fp,-(long)sizeof(stud),1);
						fwrite(&s1,sizeof(stud),1,fp);
						printf("\n>>修改成功!");break;
					}
				case 0:return;
				default:printf(">>\n情感选择正确的选项");
			}
		}
	}
	else fwrite(&s1,sizeof(stud),1,fp);
	fclose(fp);
}
void destud()			//删除学生记录
{
	int dxz,exchange=0;
	printf("\n>>请输入需要删除的学生的学号:");
	scanf("%d",&dxz);
	if((fp=fopen("student.txt","ab+"))==NULL)
		{printf("\n>>不能打开student.txt文件");return;}
	rewind(fp);
	for(i=0;!feof(fp);i++)
	{
		fread(&s[i],sizeof(stud),1,fp);	//信息已经读取到s[]结构体数组中
		if(s[i].no==dxz)
		{
			printf("\n>>找到,进行删除……\n");
			i--;
			exchange++;
		}
	}				//i已经记录了学生的个数
	if(!exchange)
	{printf("\n>>没有找到要删除的学生!\n");fclose(fp);return;}
	if((fp=fopen("student.txt","wb+"))==NULL)		//重新写入文件
		{printf("\n>>不能创建student.txt文件");return;}
	for(j=0;j<i;j++)
		fwrite(&s[j],sizeof(stud),1,fp);			//学生信息在s[]结构体数组中存在
	fclose(fp);
}
/*==========================排序模块================================*/
void orderstud()
{
	int oxz;
	do
	{
		printf(">>选择方式:1.学号	2.成绩	3.输出	0.返回=>");
		scanf("%d",&oxz);
		switch(oxz)
		{
			case 1:nostud();break;
			case 2:scstud();break;
			case 3:pprintf();break;
			case 0:return;
			default:printf("\n>>请选择正确的选项!");
		}
	}while(1);
	return;
}
void nostud()//================按学号排名
{ 
	for(j=0;j<i-1;j++)					//i已经记录学生个数使用冒泡排序
	{
		exchange=0;
		for(k=i-2;k>=j;k--)
			if(s[k+1].no<s[k].no)		//s[k+1]是原来排在最后的学生
			{
				temp=s[k+1];
				s[k+1]=s[k];
				s[k]=temp;
				exchange=1;
			}
		if(!exchange) break;
	}
	printf("\n>>班级	学号	姓名	分数(语、数、外)");
	if((fp=fopen("student.txt","wb+"))==NULL)
		{printf("\n>>不能创建student.txt文件");return;}
	for(j=0;j<i;j++)
	{
		printf("\n%s	%d	%s	%d	%d	%d",
			s[j].classno,
			s[j].no,
			s[j].name,
			s[j].score[0],
			s[j].score[1],
			s[j].score[2],
			s[j].score[3]);
		fwrite(&s[j],sizeof(stud),1,fp);	//学生信息在s[]结构体数组中存在重新写入文件
	}
	printf("\n");
	fclose(fp);
}
void scstud()//==================按分数排名
{
	for(j=0;j<i;j++)
		s[j].score[3]=s[j].score[0]+s[j].score[1]+s[j].score[2];		//统计总分
	for(j=0;j<i;j++)
	{
		exchange=0;
		{
			for(k=i-2;k>=j;k--)
				if(s[k+1].score[3]<s[k].score[3])
				{
					temp=s[k+1];
					s[k+1]=s[k];
					s[k]=temp;
					exchange=1;
				}
				if(!exchange) break;
		}
	}
	printf("\n>>按总分排名");
	printf("\n>>班级	学号	姓名	分数(语、数、外)	总分");
	if((fp=fopen("student.txt","wb+"))==NULL)
		{printf("\n>>不能创建student.txt文件");return;}
	for(j=0;j<i;j++)
	{
		printf("\n%s	%d	%s	%d	%d	%d	%d",
			s[j].classno,
			s[j].no,
			s[j].name,
			s[j].score[0],
			s[j].score[1],
			s[j].score[2],
			s[j].score[3]);
		fwrite(&s[j],sizeof(stud),1,fp);			//学生信息在s[]结构体数组中存在
	}
	printf("\n");
	fclose(fp);
}
/*===================================统计模块=================================================*/
void all()
{
	int axz;
	do
	{
		printf("\n>>选择统计:1.最高分	2.最低分	3.平均分	4.通过率	0.返回=>");
		scanf("%d",&axz);
		switch(axz)
		{
			case 1:high();break;
			case 2:low();break;
			case 3:alv();break;
			case 4:pass();break;
			case 5:pprintf();break;
			case 0:return;
			default:printf("\n>>请选择正确的选项!");
		}
	}while(1);
	return;
}
void high()				//最高分函数
{
	stud a,b,c,d;
	a.score[0]=s[0].score[0];
	b.score[1]=s[0].score[1];
	c.score[2]=s[0].score[2];
	d.score[3]=s[0].score[3];
	for(j=0;j<i;j++)
	{
		if(a.score[0]<s[j].score[0])			//找语文最高分
			a=s[j];
		if(b.score[1]<s[j].score[1])			//找数学最高分
			b=s[j];
		if(c.score[2]<s[j].score[2])			//找外语最高分
			c=s[j];
		if(d.score[3]<s[j].score[3])			//找总分最高分
			d=s[j];
	}
	printf("\n>>以下输出各项分数最高的学生信息");
	printf("\n>>个个门最高分班级	学号	姓名	分数(语、数、外)	总分");
	printf("\n>>语文最高分>>");
	printf("%s	%d	%s	%d	%d	%d	%d",
		a.classno,
		a.no,
		a.name,
		a.score[0],
		a.score[1],
		a.score[2],
		a.score[3]);
	printf("\n>>数学最高分>>");
	printf("%s	%d	%s	%d	%d	%d	%d",
		b.classno,
		b.no,
		b.name,
		b.score[0],
		b.score[1],
		b.score[2],
		b.score[3]);
	printf("\n>>外语最高分>>");
	printf("%s	%d	%s	%d	%d	%d	%d",
		c.classno,
		c.no,
		c.name,
		c.score[0],
		c.score[1],
		c.score[2],
		c.score[3]);
	printf("\n>>总分最高分>>");
	printf("%s	%d	%s	%d	%d	%d	%d",
		d.classno,
		d.no,
		d.name,
		d.score[0],
		d.score[1],
		d.score[2],
		d.score[3]);
}
void low()				//最高分函数
{
	stud a,b,c,d;
	a.score[0]=s[0].score[0];
	b.score[1]=s[0].score[1];
	c.score[2]=s[0].score[2];
	d.score[3]=s[0].score[3];
	for(j=0;j<i;j++)
	{
		if(a.score[0]>s[j].score[0])			//找语文最高分
			a=s[j];
		if(b.score[1]>s[j].score[1])			//找数学最高分
			b=s[j];
		if(c.score[2]>s[j].score[2])			//找外语最高分
			c=s[j];
		if(d.score[3]>s[j].score[3])			//找总分最高分
			d=s[j];
	}
	printf("\n>>以下输出各项分数最高的学生信息");
	printf("\n>>个个门最高分班级	学号	姓名	分数(语、数、外)	总分");
	printf("\n>>语文最高分>>");
	printf("%s	%d	%s	%d	%d	%d	%d",
		a.classno,
		a.no,
		a.name,
		a.score[0],
		a.score[1],
		a.score[2],
		a.score[3]);
	printf("\n>>数学最高分>>");
	printf("%s	%d	%s	%d	%d	%d	%d",
		b.classno,
		b.no,
		b.name,
		b.score[0],
		b.score[1],
		b.score[2],
		b.score[3]);
	printf("\n>>外语最高分>>");
	printf("%s	%d	%s	%d	%d	%d	%d",
		c.classno,
		c.no,
		c.name,
		c.score[0],
		c.score[1],
		c.score[2],
		c.score[3]);
	printf("\n>>总分最高分>>");
	printf("%s	%d	%s	%d	%d	%d	%d",
		d.classno,
		d.no,
		d.name,
		d.score[0],
		d.score[1],
		d.score[2],
		d.score[3]);
}
void alv()			//统计平均分函数
{
	float a=0,b=0,c=0,d=0;
	for(j=0;j<i;j++)
	{
		a+=s[j].score[0];
		b+=s[j].score[1];
		c+=s[j].score[2];
		d+=s[j].score[3];
	}
	a=a/i;			//语文平均分
	b=b/i;			//数学平均分
	c=c/i;			//外语平均分
	d=d/i;			//总分平均分
	printf("\n>>以下各项统计的平均分");
	printf("\n>>语文平均分:%.2f",a);
	printf("\n>>数学平均分:%.2f",b);
	printf("\n>>外语平均分:%.2f",c);
	printf("\n>>总分平均分:%.2f",d);
}
void pass()		//计算各门课程的通过率
{
	float a=0,b=0,c=0;
	for(j=0;j<i;j++)
	{
		if(s[j].score[0]>=60)
			a++;
		if(s[j].score[1]>=60)
			b++;
		if(s[j].score[2]>=60)
			c++;
	}
	a=a/i*100;
	b=b/i*100;
	c=c/i*100;
	printf("\n>>以下是各门课程的通过率");
	printf("\n>>语文的通过率是%.2f%%",a);
	printf("\n>>数学的通过率是%.2f%%",b);
	printf("\n>>外语的通过率是%.2f%%",c);
}
/*=============================查找模块=================================*/
void find()
{
	int fxz;
	do
	{
		printf("\n>>选择方式:1.名字查找	2.学号查找	3.课程查找	4.输出	0.返回=>");
		scanf("%d",&fxz);
		switch(fxz)
		{	
			case 1:namefind();break;
			case 2:numfind();break;
			case 3:course();break;
			case 4:pprintf();break;
			case 0:return;
			default:printf("\n>>请选择正确的选项!");
		}
	}while(1);
	return;
}
void namefind()
{
	char fname[10];
	stud a;
	printf("\n>>请输入需要查找的学生的姓名:");
	scanf("%s",&fname);
	if((fp=fopen("student.txt","rb+"))==NULL)
	{printf("\n>>不能打开student.txt文件");return;}
	do
	{
		fread(&a,sizeof(stud),1,fp);
		if(strcmp(fname,a.name)==0)
		{
			printf("\n>>班级	学号	姓名	分数(语、数、外)	总分");
			printf("\n>>%s	%d	%s	%d	%d	%d	%d",
			a.classno,
			a.no,
			a.name,
			a.score[0],
			a.score[1],
			a.score[2],
			a.score[3]);
			break;
		}
	}while(!feof(fp));
	if(feof(fp)) printf("\n>>没有查找到该学生");
	fclose(fp);
}
void numfind()
{
	int number;
	stud a;
	printf("\n>>请输入需要查找的学生的学号 :");
	scanf("%d",&number);
	if((fp=fopen("student.txt","rb+"))==NULL)
	{printf("\n>>不能打开student.txt文件");return;}
	do
	{
		fread(&a,sizeof(stud),1,fp);
		if(number==a.no)
		{
			printf("\n>>班级	学号	姓名	分数(语、数、外)	总分");
			printf("\n>>%s	%d	%s	%d	%d	%d	%d",
			a.classno,
			a.no,
			a.name,
			a.score[0],
			a.score[1],
			a.score[2],
			a.score[3]);
			break;
		}
	}while(!feof(fp));
	if(feof(fp)) printf("\n>>没有查找到该学生");
	fclose(fp);
}
void course()//==================课程查找
{
	stud a;
	int c;
	if((fp=fopen("student.txt","rb+"))==NULL)
	{printf("\n>>不能打开student.txt文件");return;}
	do
	{
		rewind(fp);
		printf("\n>>课程代号:1.语文	2.数学	3.外语	4.总分	0.返回=>");
		scanf("%d",&c);
		printf("\n>>班级	学号	姓名	成绩");
		switch(c)
		{
			case 1:
			case 2:
			case 3:
			case 4:
				{	fread(&a,sizeof(stud),1,fp);
					do
					{
						printf("\n>>%s	%d	%s	%d",a.classno,a.no,a.name,a.score[c-1]);
						fread(&a,sizeof(stud),1,fp);
					}while(!feof(fp));
				}
			case 0:return;
			default:printf("请正确选择!");
		}
		fclose(fp);
	}while(1);
}
/*=======================输出信息函数=======================*/
void pprintf()				//输出当前信息情的况函数
{
	stud pp;
	if((fp=fopen("student.txt","ab+"))==NULL)
	{printf("不能student.txt打开文件");return;}
	fseek(fp,0,2);
	if(ftell(fp)==0) {printf(">>无任何信息\n");fclose(fp);return;}
	else
	{
		rewind(fp);
		printf("班级	学号	姓名	成绩=>");
		fread(&pp,sizeof(stud),1,fp);
		do
		{
			printf("\n%s	%d	%s	%d  %d  %d  %d",
				pp.classno,
				pp.no,
				pp.name,
				pp.score[0],
				pp.score[1],
				pp.score[2],
				pp.score[3]);
			fread(&pp,sizeof(stud),1,fp);
		}while(!feof(fp));
		printf("\n");
		fclose(fp);
		return;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -