数据结构课设------学生管理系统

学生成绩管理系统

现有学生成绩信息文件1(1.txt),内容如下
姓名 学号 语文 数学 英语
张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
…. … … … …
学生成绩信息文件2(2.txt),内容如下:
姓名 学号 语文 数学 英语
陈果 31 57 68 82
李华明 32 88 90 68
张明东 33 48 42 56
李明国 34 50 45 87
陈道亮 35 47 58 77
…. … … … …
试编写一管理系统,要求如下:

  1. 实现对两个文件数据进行合并,生成新文件3.txt
  2. 抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
  3. 对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)
  4. 输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)
  5. 要求至少使用结构体实现上述要求,若增加其他实现方式更好.
  6. 采用多种方法且算法正确者,可适当加分.

代码

#include <stdio.h>
#include <string.h>

typedef struct
{
	char id[10];
	char name[20];
	char score[10];
}student;

#define N 1024

void menu(int *n)
{
	printf("\t\t\t*********************************************\n");
	printf("\t\t\t\t\t1.查找学生信息\n");
	printf("\t\t\t\t\t2.按成绩进行排序\n");
	printf("\t\t\t\t\t3.合并信息表\n");
	printf("\t\t\t\t\t4.创建补考信息表\n");
	printf("\t\t\t\t\t0.退出\n");
	printf("\t\t\t*********************************************\n");
	printf("请输入操作数0-4:");
	scanf("%d", n);
}//创建菜单

void Printfstudent(student p[N], int len)
{
	int i;
	printf("学号\t\t姓名\t\t分数\n\n");
	for (i = 0; i < len; i++)
	{
		printf("%s\t\t", p[i].id);
		printf("%c%c%c%c%c%c%c%c%c\t\t", p[i].name[0],p[i].name[1],p[i].name[2],p[i].name[3],p[i].name[4],p[i].name[5],p[i].name[6],p[i].name[7],p[i].name[8]);
		printf("%s\t\\t\n", p[i].score);
	}
}

int visit(student p[N],int len,int i)
{
	int k=0;
	while(p[i].score[k] !='\0')
		 k++;
	return k;
}



void Sort(student p[N], int len)
{
	student st;
	int i,j,a,b;	
	for(i=0;i<len-1;i++)
	{
		for(j=0;j<len-1-i;j++)
		{			
			if(strcmp(p[j].score,p[j+1].score) < 0)
			{
			   st = p[j];
			   p[j] = p[j+1];
			   p[j+1] = st;
			}
            a=visit(p,len,j);
			b=visit(p,len,j+1);
			if(a<b)
			{
			   st = p[j];
			   p[j] = p[j+1];
			   p[j+1] = st;
			 
			}
		
			
		}
	}
	Printfstudent(p, len);
}

void serch(student p[N], int len)
{
	int i, j;
	int flat = 0;
	char num[100];
	char name1[100];
	printf("请输入1或2,1按学号查找,2按姓名查找:");
	scanf("%d", &i);
	if (i == 1)
	{
		printf("请输入要查找的学号:");
		scanf(" %s", num);
		for (j = 0; j <len; j++)
		{
			if (strcmp(p[j].id, num) == 0)
			{
				flat++;
				break;
			}
		}
		if ( flat==0 )
		{
			printf("学号出现错误!\n");
		}
		else
		{
			printf("学号: %s,姓名: %c%c%c%c%c%c%c%c%c,得分: %s\n", p[j].id, p[j].name[0],p[j].name[1],p[j].name[2],p[j].name[3],p[j].name[4],p[j].name[5],p[j].name[6],p[j].name[7],p[j].name[8], p[j].score);
		}
	}
	else if (i == 2)
	{
		flat = 0;
		printf("请输入要查找的姓名:");
		scanf(" %s", name1);
		for (j = 0; j <len; j++)
		{
			if (strcmp(p[j].name, name1) == 0)
			{
				flat++;
				printf("学号: %s,姓名: %c%c%c%c%c%c%c%c%c,得分: %s\n", p[j].id, p[j].name[0],p[j].name[1],p[j].name[2],p[j].name[3],p[j].name[4],p[j].name[5],p[j].name[6],p[j].name[7],p[j].name[8], p[j].score);
				break;
			}
		}
		if (!flat)
		{
			printf("姓名输入有误!\n");
		}
	}
}

//文件1.txt的读入
int dos1(student p[N],int len)
{
	int i,k;
	char a[200];
	FILE *fp = fopen("1.txt", "r+");
	if (fp == NULL)
		return 1;
	fgets(a,200,fp);
	fclose(fp);
	i=0; len=0; k=0;
	while (a[i] != '#')
	{
	    while (a[i] != ',')
		{
	    	p[len].id[k]=a[i];
		     i++;k++;			 
		}
        i++; k=0;
	    while (a[i] != ',')
		{
		    p[len].name[k]=a[i];
		    i++; k++;			
		}
		i++; k=0;
		
	    while (a[i] != '&')
		{
		    p[len].score[k]=a[i];
		    i++; k++;			
		}
		i++; k=0; len++;
	}
	
	return len;
}


//文件2.txt的读入
int dos2(student p[N],int len)
{
	int i,k;
	char b[200];
	FILE *fp = fopen("2.txt", "r+");
	if (fp == NULL)
		return 1;
	fgets(b,200,fp);	
	fclose(fp);
	i=0; k=0;
	while ( b[i]!='#')
	{
	    while (b[i] != ',')
		{
	    	p[len].id[k]=b[i];
		     i++;k++;
			 
		}
        i++; k=0;
	    while (b[i] != ',')
		{
		    p[len].name[k]=b[i];
		    i++; k++;
			
		}
		i++; k=0;
	    while (b[i] != '&')
		{
		    p[len].score[k]=b[i];
		    i++; k++;			
		}
		i++; k=0; len++;
	}
	return len;
}

//合并到文件3.txt
void dos3(student p[N],int len)
{
	FILE *fp;
	int i;
	fp=fopen("3.txt","w+");
	for(i=0;i<len;i++)
	{
		fprintf(fp,"%s,%c%c%c%c%c%c%c%c%c,%s &",p[i].id,p[i].name[0],p[i].name[1],p[i].name[2],p[i].name[3],p[i].name[4],p[i].name[5],p[i].name[6],p[i].name[7],p[i].name[8],p[i].score);
	}
	fclose(fp);
}

//将补考的人的名单输出到文件4.txt
void dos4(student p[N],int len)
{
	FILE *fp;
	int i=0,a;
	char b[2]="60";
	fp=fopen("4.txt","w+");
	while(i<len)
	{
		
		a=visit(p,len,i);
		if(a==3) i++;
		else if(strcmp(p[i].score,b) > 0)
			i++;
		else if(strcmp(p[i].score,b) < 0)
		{
			fprintf(fp," %s,%c%c%c%c%c%c%c%c%c,%s &",p[i].id,p[i].name[0],p[i].name[1],p[i].name[2],p[i].name[3],p[i].name[4],p[i].name[5],p[i].name[6],p[i].name[7],p[i].name[8],p[i].score);
			i++;
		}
	}
	fclose(fp);
}

void main()
{
	int n,len;
	student p[N]={0};
	len=dos1(p,len);	
	len=dos2(p,len);	
	while (1)
	{
	menu(&n);
	switch (n)
	{  case 1:serch(p,len);
		   break;
	   case 2:Sort(p,len);               
		   break;
	   case 3:dos3(p,len);
		   printf("合并完成\n");
		   break;
	   case 4:dos4(p,len);
		   printf("创建完成\n");
		   break;
	   case 0:printf("欢迎再次使用.\n");		   
		   break;
	   default:
		   printf("您的输入有误,请重新输入.\n");
		   break;
	}
	}
}

  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
修正了已发现的所有错误.欢迎大家下载试用.. 一、项目名称:学校学生信息管理系统。 二、项目目标:实现对学校学生的信息管理——信息的建立和维护、信息的检索。 三、主要功能: 1.信息的输入:建立学生档案文件。 2.信息维护: 添加:增加新学生; 修改:学生信息的改变; 删除:学生减少。 3.信息处理 按要求检索学生信息; 按要求统计信息。 四、界面系统 1.系统管理员进入 (请输入密码) 2.一级菜单 (1 信息维护 2 信息检索 3 信息统计 4 退出) 3. 二级菜单 信息维护 (1 建立学生成绩文件 2 添加学生记录 3 删除学生记录 4 修改学生记录 5 返回上级菜单) 信息检索 (1 按班级查找 2 返回上级菜单) 信息统计 (1 成绩统计 2 返回上级菜单) 五、主要功能说明: 1.用口令(密码)形式验证管理员身份(可输入三次),合法者可进入,否则程序结束。 2.有关功能说明 1)建立学生成绩表(模块a) 建立新的学生成绩文件; 建立若干学生记录,包括姓名学号、班级、课程编号、成绩。 2)添加学生记录(模块b) 在已存在的学生成绩文件中添加新记录。 3)删除学生记录(模块c) 在学生成绩文件中删除有三门课程不及格的学生记录; 删除前,逐条显示符合删除条件的学生姓名、成绩,确认后再删除。 4)修改学生信息(模块d) 输入学生学号,在学生成绩文件中找出该学生记录; 在屏幕上逐条显示该学生的各条记录; 每显示一条,询问是否修改,如果“Y”,输入修改后数据, 将文件原记录删除,保存新的记录; 5)按姓名和班级查找(模块e) 输入姓名显示相应信息。 6)信息统计(模块f) 同时按照班级和课程统计每门课程、每个班级的平均成绩,最高分、最低分; 在屏幕上先依次显示各门课程,对应的各个班级的统计数据。 7)退出信息管理系统,返回操作系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值