学生信息管理系统(c语言,数组版)

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
//创建结构体
struct student{
		char num[15];//学号 
		char name[15];//姓名 
		char major[10];//专业computer,softwear,network
		int classNo;//班级 
		int score[3];//3门课的成绩  
		int sum;//3门课的总成绩 
	};
student in[15];student save[15];
//定义全局变量N,记录保存的学生信息数量 
int N;


//函数声明 
void OutputStudent(student *p);//输出函数 
void write(student *a);//从文件中读入n个学生信息
void rand_read(student *a);//从文件中随机读取第n个(0<=n<=9)学生的信息
void request_fine(student *a);//输入班级与成绩要求进行查找
void highest(student *a);//所有学生某门课程的最高分和分数最高的学生的姓名
void all_ave_sort(student *a);//所有学生按平均成绩由低到高进行简单选择排序
void cla_eva_sort(student *a);//对某个班级的学生按平均成绩由高到低进行起泡排序
void maj_sig_sort(student *a);//对某个专业的学生按某门课程由低到高进行直接插入排序
void store();//存储更新后的学生信息


//主函数 
int main()
{
	//录入学生信息
	printf("下面,请录入学生的信息\n"); 
	FILE *fp;char filename[10];
	printf("请输入文件名:"); 
	scanf("%s",&filename);
	printf("请输入10个学生的信息,并用空格隔开:\n");
	for(int i=0;i<10;i++)
	{
		in[i].sum=0;
		scanf("%s",in[i].num);
		scanf("%s",in[i].name);
		scanf("%s",in[i].major);
		scanf("%d",&in[i].classNo);
		for(int j=0;j<=2;j++)
		{
			scanf("%d",&in[i].score[j]);
			in[i].sum+=in[i].score[j];
		}
	}
	
	//写入文件
	if((fp=fopen(filename,"w"))==NULL) 
	{
		printf("Cannot open this file."); 
		exit(0);
	}
	fwrite(in,sizeof(student),10,fp);
	fclose(fp);
	
	//进行功能选项
	printf("请输入功能编号,运行相应功能\n");
	printf("1.从文件中读入n(0<n<10)个学生信息\n");
	printf("2.从文件中随机读取第n个(0<=n<=9)学生的信息\n");
	printf("3.输入班级与成绩要求进行查找\n");
	printf("4.所有学生某门课程的最高分和分数最高的学生的姓名\n");
	printf("5.所有学生按平均成绩由低到高进行简单选择排序\n");
	printf("6.对某个班级的学生按平均成绩由高到低进行起泡排序\n");
	printf("7.对某个专业的学生按某门课程由低到高进行直接插入排序\n");
	printf("8.存储更新后的学生信息\n");
	printf("其他.退出\n");
	
	//调用函数 
	int num;
	while(scanf("%d",&num)!=EOF)
	{
		if(num<1||num>8)
			break;
		switch(num)
		{
			case 1:
				write(in);									
				break;
			case 2:
				rand_read(in);
				break;
			case 3:
				request_fine(in);
				break;
			case 4:
				highest(in);
				break;
			case 5:
				all_ave_sort(in);
				break;
			case 6:
				cla_eva_sort(in);
				break;
			case 7:
				maj_sig_sort(in);
				break;
			case 8:
				store();
				break;
		}
	}
	return 0;
}


//写功能函数
void OutputStudent(student *p) //输出函数 
{
	printf("\n%s\t%-6s\t%-10s\t%d\t%d\t%d\t%d\t", p->num, p->name, p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
}


void write(student *a)//从文件中读入n个学生信息
{	
	FILE *x;
	char b[10];
	int k;
	printf("请输入你想查找的文件名:");
	scanf("%s",b);
	if((x=fopen(b,"r"))==NULL)
	{
		printf("Wrong.");
		exit(0);
	}
	printf("请输入你要读取信息的人数:"); 
	scanf("%d",&k);N=k;
	fread(in,sizeof(student),k,x);
	fclose(x);
	printf("\n学号\t姓名\t专业  \t\t班级   成绩1   成绩2   成绩3   \t"); 
	for(int i=0;i<k;i++)
	{
		save[i]=in[i];       //保存读取的信息 
		OutputStudent(&in[i]);
	}
}


void rand_read(student *a)//从文件中随机读取第n个(0<=n<=9)学生的信息
{
	FILE *x;
	char b[10];
	int k;
	printf("请输入你想查找的文件名:");
	scanf("%s",b); 
	if((x=fopen(b,"r"))==NULL)
	{
		printf("Wrong.");
		exit(0);
	}
	printf("请输入你要读取信息的人的编号(0-9):"); 
	scanf("%d",&k);N=1;
	fread(in,sizeof(student),10,x);
	fclose(x);
	printf("\n学号\t姓名\t专业  \t\t班级   成绩1   成绩2   成绩3   \t");
	save[0]=in[k];       //保存读取的信息 
	OutputStudent(&in[k]); 
}


void request_fine(student *a)//输入班级与成绩要求进行查找
{
	FILE *x;
	char b[10];int q=0;
	printf("请输入你想查找的文件名:");
	scanf("%s",b); 
	if((x=fopen(b,"r"))==NULL)
	{
		printf("Wrong.");
		exit(0);
	}
	fread(in,sizeof(student),10,x);
	fclose(x);
	
	int i,j;
	char k; 
	printf("请输入要查询的班级:");
	scanf("%d",&i);getchar();
	printf("请输入条件(>或<)和成绩,用空格隔开:");
	scanf("%c",&k);
	scanf("%d",&j);
	if(k=='<')
	{
		printf("\n学号\t姓名\t专业  \t\t班级   成绩1   成绩2   成绩3   \t");
		for(int m=0;m<10;m++)
			if(in[m].sum<j&&in[m].classNo==i)
			{
				OutputStudent(&in[m]);
				save[q]=in[m];
				q++;
			}
			N=q+1;
	}
	if(k=='>')
	{
		printf("\n学号\t姓名\t专业  \t\t班级   成绩1   成绩2   成绩3   \t");
		for(int m=0;m<10;m++)
			if(in[m].sum>j&&in[m].classNo==i)
			{
				OutputStudent(&in[m]);
				save[q]=in[m];              //保存读取的信息
				q++;
			}
			N=q+1;
	}
}


void highest(student *a)//所有学生某门课程的最高分和分数最高的学生的姓名
{
	FILE *x;
	char b[10];
	int k,flag,maxn=0;
	printf("请输入你想查找的文件名:");
	scanf("%s",b); 
	if((x=fopen(b,"r"))==NULL)
	{
		printf("Wrong.");
		exit(0);
	}
	printf("请输入你想查找的最高分课程编号(0-2):");
	scanf("%d",&k);
	fread(in,sizeof(student),10,x);
	for(int i=0;i<10;i++)
	{
		if(maxn<in[i].score[k])
		{
			maxn=in[i].score[k];         
			flag=i;         //flag记录最高分人的编号 
		}
	}	 
	printf("\n学号\t姓名\t专业  \t\t班级   成绩1   成绩2   成绩3   \t");
	OutputStudent(&in[flag]);
	N=1;
	save[0]=in[flag];         //保存读取的信息
}


void all_ave_sort(student *a)//所有学生按平均成绩由低到高进行简单选择排序
{
	FILE *x;
	char b[10];
	int minx,c[10],d[10],book[10],temp;
	printf("请输入你想查找的文件名:");
	scanf("%s",b); 
	if((x=fopen(b,"r"))==NULL)
	{
		printf("Wrong.");
		exit(0);
	}
	fread(in,sizeof(student),10,x);
	printf("下面是所有学生按平均成绩由低到高进行简单选择排序:");
	N=10;
	for(int i=0;i<10;i++)//初始化BOOK数组,输入C数组数据 
	{
		c[i]=in[i].sum;
	}
	
	for(int i=0;i<10;i++)//第一次循环:记录  拥有第n低成绩的人的编号 
	{
		minx=0;
		for(int j=0;j<10;j++)//第2次循环:逐个比较 
		{
			if(c[j]<c[minx])
			{
				minx=j;     //记录编号 
			}
		}
		d[i]=minx;         //储存进数组 
		c[minx]=1000;
	}
	printf("\n学号\t姓名\t专业  \t\t班级   成绩1   成绩2   成绩3   \t");
	for(int i=0;i<10;i++)
	{
		OutputStudent(&in[d[i]]);
		save[i]=in[d[i]];         //保存读取的信息
	}
}


void cla_eva_sort(student *a)//对某个班级的学生按平均成绩由高到低进行起泡排序
{
	FILE *x;
	char b[10];
	int n,maxn,p=0,temp,c[10],d[10];
	memset(c,0,sizeof(c));
	memset(d,0,sizeof(d));
	printf("请输入你想查找的文件名:");
	scanf("%s",b); 
	if((x=fopen(b,"r"))==NULL)
	{
		printf("Wrong.");
		exit(0);
	}
	fread(in,sizeof(student),10,x);
	printf("请输入班级:");
	scanf("%d",&n);
	
	printf("下面是对%d班的学生按平均成绩由高到低进行起泡排序:",n); 
	
	//存储符合要求的学生的成绩和序号
	for(int i=0;i<10;i++)
	{
		if(in[i].classNo==n)
			{
				c[p]=in[i].sum;
				d[p]=i;
				p++;
			}
	}
	N=p+1;
	
	//起泡排序 
	for(int i=0;i<p-1;i++)    //第一层 0到 N-1 
	{
		for(int j=0;j<p-1-i;j++)//第二层 0到 N-1-i 
		{
			if(c[j]<c[j+1])
				{
					temp=c[j];   //交换成绩  
					c[j]=c[j+1];
					c[j+1]=temp;
					
					temp=d[j];   //交换序号 
					d[j]=d[j+1];
					d[j+1]=temp;
				}
		}
	}
	printf("\n学号\t姓名\t专业  \t\t班级   成绩1   成绩2   成绩3   \t");
	for(int i=0;i<p;i++)
	{
		OutputStudent(&in[d[i]]);
		save[i]=in[d[i]];         //保存读取的信息
	}
}


void maj_sig_sort(student *a)//对某个专业的学生按某门课程由低到高进行直接插入排序
{
	FILE *x;
	char b[10],c[10];
	int p=0,d,e[10],f[10],k[10],l[10];//f和l 是序号数组      e和k 是成绩数组 
	memset(k,1000,sizeof(k));
	printf("请输入你想查找的文件名:");
	scanf("%s",b); 
	if((x=fopen(b,"r"))==NULL)
	{
		printf("Wrong.");
		exit(0);
	}
	fread(in,sizeof(student),10,x);
	printf("请输入要查询学生的专业:");
	scanf("%s",c);
	printf("请输入要查询的学科序号(0-2): ");
	scanf("%d",&d);
	
	printf("下面是对%s专业的学生按第%d门课程由低到高进行直接插入排序:\n",c,d); 
	
	//存储符合要求的学生的成绩和序号 
	for(int i=0;i<10;i++)
	{
		if(!strcmp(c,in[i].major))
		{
			e[p]=in[i].score[d];
			f[p]=i;
			p++;
		}
	}
	
	//插入排序 
	N=p+1;
	k[0]=e[0];
	l[0]=f[0];            //初始化数组 
	for(int i=1;i<p;i++)
	{
		for(int j=i-1;j>=0;j--)  //第二层循环,倒序比较 
		{
			if(k[j]>e[i])
			{
				k[j+1]=k[j];    //记录成绩 
				k[j]=e[i];
				
				l[j+1]=l[j];    //记录编号 
				l[j]=f[i];
			}
			else
			{
				k[i]=e[i];
				l[i]=f[i];
			}
		}
	}
	printf("\n学号\t姓名\t专业  \t\t班级   成绩1   成绩2   成绩3   \t");
	for(int i=0;i<p;i++)
	{
		OutputStudent(&in[l[i]]);
		save[i]=in[l[i]];            //保存读取的信息
	}
}


void store()//存储更新后的学生信息
{
	FILE *fp;
	char xx[15];
	printf("请输入要储存的文件名\n");
	getchar();
	gets(xx);
	if((fp=fopen(xx,"w"))==NULL)
	{
		printf("Wrong.\n");
		exit(0);
	}
	fwrite(save,sizeof(save),N,fp);
	fclose(fp);	
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我的代码no摆烂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值