学生成绩管理系统(合并文件,查找,总分排序,保存补考学生信息)

目录

题目及要求:

录入学生成绩信息到链表中

合并文件

直接插入排序(总分降序)

冒泡排序(总分降序)

顺序查找(名字查找)

二分查找(名字查找)

 这里是先按字母首字母排序再查找

保存不及格学生到文件中


题目及要求:

现有学生成绩信息文件 1(1.txt),内容如下(同学自己补充,共 30 名学生,数据文件格式与解析程序自己设定):

姓名

 学号

语文

数学

英语

张明明

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)抽取出三科成绩中有补考的学生(小于 60 分)并保存在一个新文件 4.txt

(3)对合并后的文件 3.txt 中的数据按总分降序排序(至少采用两种排序方法实现)

(4)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)

(5)要求使用结构体,链或数组等实现上述要求合并文件

录入学生成绩信息到链表中

List inputfile() {
	char stu[50];
	FILE *fp;
	List s,head,p;
	p=initlist();
	head=initlist();
	if((fp=fopen("E:\\3.txt","r"))==NULL) {
		printf("Could not open the file!");
		return 0;
	}
	fgets(stu,50,fp);
	head=p;
	while(!feof(fp)) {              //尾插法
		s=initlist();                //文件刚开始不能读入第一行元素,原因是文件空行的问题
		fscanf(fp,"%s%d%d%d%d\n",s->std.name,&s->std.stdID,&s->std.Chinese,&s->std.Math,&s->std.Engish);
		s->std.total=s->std.Chinese+s->std.Engish+s->std.Math;
		p->next=s;
		p=s;
	}
	p->next=NULL;
	fclose(fp);
	return head;
}

合并文件

int combination() {
	FILE *fp1=fopen("E:\\1.txt","rb+");       //读入文件1.txt
	FILE *fp2=fopen("E:\\2.txt","rb+");       //读入文件2.txt
	FILE *fp3=fopen("E:\\3.txt","wb+");       //写入文件3.txt
	char c;
	if(fp1==NULL||fp2==NULL||fp3==NULL) {
		puts("Could not open the files\n");
		return 0;
	}
	while((c=fgetc(fp1))!=EOF)         //读到文件末尾返回EOF(-1)
		fputc(c,fp3);                   //逐个字符写入文件3.txt
	while((c=fgetc(fp2))!=EOF)
		fputc(c,fp3);
	printf("Merged 1.txt and 2.txt into 3.txt\n");
	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
	return 1;
}

直接插入排序(总分降序)

List sortscore1() {
	List p,q,head,r;
	head=inputfile();
	p=head->next;                 //带头结点和第一个元素的链表
	q=p->next;                    //第一个元素后面的链表
	p->next=NULL;                   //链表一后面为空
	while(q!=NULL) {               //连表二不为空执行
		p=head;                      //头结点,p表示头结点,在下面一定不要搞混
		r=q->next;                           //链表二第一个元素的下一个
		while(p->next!=NULL) {                                  //头结点下一个不为空时执行
			if(p->next->std.total>q->std.total) {                 //p->next表示头结点的下一个元素对应的总分,大于不需要调整,继续比下一个
				p=p->next;
			} else {
				break;
			}
		}
		q->next=p->next;                      //当链表一p的第一个小于链表二q的第一个元素,将q的第一个元素头插到p中
		p->next=q;                             //插入q的第一个元素在p头结点后
		q=r;                                    //移动q到r
	}
	return head;
}

冒泡排序(总分降序)

List sortscore2() {
	List  p,q,head,tail;
	tail=NULL;
	head=inputfile();
	while((head->next->next!=tail)) {
		p=head;
		q=head->next;
		while(q->next!=tail) {
			if((q->std.total)<(q->next->std.total)) {             //小于调换
				p->next=q->next;
				q->next=q->next->next;
				p->next->next=q;
				q=p->next;
			}
			q=q->next;
			p=p->next;
		}
		tail=q;
	}
	return head;
}

顺序查找(名字查找)

void search_Name1() {
	List p=sortscore1();           //循环使用函数,要在前面声明函数,否则出现conflicting types for"XXX"
	char a[10];
	printf("请输入查找的名字:");
	scanf("%s",a);
	while(p) {
		if(0==strcmp(a,p->std.name)) {                              //字符串匹配strcmp()
			printf("姓名\t学号\t语文\t数学\t英语\t总分\n");
			printf("%s\t%.2d\t%d\t%d\t%d\t%d\n",p->std.name,p->std.stdID,p->std.Chinese,p->std.Math,p->std.Engish,p->std.total);
			break;
		}
		p=p->next;
		if(p==NULL)
			printf("Could not find!\n");     //找不到返回
	}

}

二分查找(名字查找)

 这里是先按字母首字母排序再查找

void search_Name2() {
	FILE *fp;
	Studentdata temp;
	Studentdata stu[60];   //要加static,否则后面会出现报错,改变了局部变量
	memset(stu,0,sizeof(stu));            //初始化数组
	int i=0,n,m;
	char std[50];
	if((fp=fopen("E:\\3.txt","rb+"))==NULL) {
		printf("Could not open the file!");
		exit(0);
	}
	fgets(std,50,fp);
	while(!feof(fp)) {
		fscanf(fp,"%s%d%d%d%d",stu[i].name,&stu[i].stdID,&stu[i].Chinese,&stu[i].Math,&stu[i].Engish); //数组存数据
		stu[i].total=stu[i].Chinese+stu[i].Math+stu[i].Engish;
		i++;
	}
	fclose(fp);
	for(n=0; n<i-1; n++) {
		for(m=0; m<i-n; m++) {
			if(strcmp(stu[m].name,stu[m+1].name)>0) {                          //按姓名字母排序
				temp=stu[m];
				stu[m]=stu[m+1];
				stu[m+1]=temp;
			}
		}
	}
	printf("%d",i);
	for(n=0; n<i; n++) {
		printf("%s   %.2d   %d   %d   %d   %d\n",stu[n].name,stu[n].stdID,stu[n].Chinese,stu[n].Math,stu[n].Engish,stu[n].total);
	}
	char a[10];
	printf("请输入查找的名字:");
	scanf("%s",a);
	int low=1,high=i,mid;
	while(low<high) {
		mid=(low+high)/2;
		if(strcmp(a,stu[mid].name)==0) {
			printf("姓名\t学号\t语文\t数学\t英语\t总分\n");
			printf("%s\t%.2d\t%d\t%d\t%d\t%d\n",stu[mid].name,stu[mid].stdID,stu[mid].Chinese,stu[mid].Math,stu[mid].Engish,stu[mid].total);
			break;
		} else if(strcmp(stu[mid].name,a)<0)
			low=mid+1;
		else high=mid-1;
		if(low==high)
			printf("Could not find!\n");     //找不到返回
	}
}

保存不及格学生到文件中

int bujige() {
	int key=60;
	List p=inputfile()->next;
	FILE *fp1=fopen("E:\\3.txt","rb+");
	FILE *fp2=fopen("E:\\4.txt","wb+");
	if((fp1==NULL)||(fp2==NULL)) {
		printf("Could not open the file!");
		return 0;
	}
	while(p) {
		if((p->std.Chinese<key)||(p->std.Engish<key)||(p->std.Math<key)) {
			fprintf(fp2,"%s  %.2d  %d  %d  %d\n",p->std.name,p->std.stdID,p->std.Chinese,p->std.Math,p->std.Engish);
		}
		p=p->next;
	}
	printf("4.txt successfully saved!\n");
	fclose(fp1);
	fclose(fp2);
}

完整代码

#include<stdio.h>
#include<locale.h>
#include<stddef.h>
#include<stdlib.h>
#include<string.h>

typedef struct {
	int stdID;
	int Chinese;
	int Math;
	int Engish;
	int total;
	char name[10];
} Studentdata,*ST;

typedef struct student {
	Studentdata std;
	struct student *next;
} student,*List;


List initlist() {         //初始化头结点
	List head;
	head=(List)malloc(sizeof(student));
	head->next=NULL;
	return head;
}

//函数声明,不声明,下面调用函数会出现错误
int combination();              //合并函数 ,合并1.txt和2.txt到3.txt中
List inputfile();                 //录入成绩
int bujige();                      //补考学生保存4.txt
List sortscore1();                //排序
List sortscore2();               //排序
void search_Name1();               //查找
void search_Name2();               //名字排序并查找


//读入学生的信息
List inputfile() {
	char stu[50];
	FILE *fp;
	List s,head,p;
	p=initlist();
	head=initlist();
	if((fp=fopen("E:\\3.txt","r"))==NULL) {
		printf("Could not open the file!");
		return 0;
	}
	fgets(stu,50,fp);
	head=p;
	while(!feof(fp)) {              //尾插法
		s=initlist();                                            //文件刚开始不能读入第一行元素,原因是文件空行的问题
		fscanf(fp,"%s%d%d%d%d\n",s->std.name,&s->std.stdID,&s->std.Chinese,&s->std.Math,&s->std.Engish);
		s->std.total=s->std.Chinese+s->std.Engish+s->std.Math;
		p->next=s;
		p=s;
	}
	p->next=NULL;
	fclose(fp);
	return head;
}

//查找不及格的保存文件4.txt中
int bujige() {
	int key=60;
	List p=inputfile()->next;
	FILE *fp1=fopen("E:\\3.txt","rb+");
	FILE *fp2=fopen("E:\\4.txt","wb+");
	if((fp1==NULL)||(fp2==NULL)) {
		printf("Could not open the file!");
		return 0;
	}
	while(p) {
		if((p->std.Chinese<key)||(p->std.Engish<key)||(p->std.Math<key)) {
			fprintf(fp2,"%s  %.2d  %d  %d  %d\n",p->std.name,p->std.stdID,p->std.Chinese,p->std.Math,p->std.Engish);
		}
		p=p->next;
	}
	printf("4.txt successfully saved!\n");
	fclose(fp1);
	fclose(fp2);
}



//合并后的学生成绩按总分降序排序,两种排序方法实现
//直接插入排序,拆分链表
List sortscore1() {
	List p,q,head,r;
	head=inputfile();
	p=head->next;                 //带头结点和第一个元素的链表
	q=p->next;                    //第一个元素后面的链表
	p->next=NULL;                   //链表一后面为空
	while(q!=NULL) {               //连表二不为空执行
		p=head;                      //头结点,p表示头结点,在下面一定不要搞混
		r=q->next;                           //链表二第一个元素的下一个
		while(p->next!=NULL) {                                  //头结点下一个不为空时执行
			if(p->next->std.total>q->std.total) {                 //p->next表示头结点的下一个元素对应的总分,大于不需要调整,继续比下一个
				p=p->next;
			} else {
				break;
			}
		}
		q->next=p->next;                      //当链表一p的第一个小于链表二q的第一个元素,将q的第一个元素头插到p中
		p->next=q;                             //插入q的第一个元素在p头结点后
		q=r;                                    //移动q到r
	}
	return head;
}
//冒泡排序
List sortscore2() {
	List  p,q,head,tail;
	tail=NULL;
	head=inputfile();
	while((head->next->next!=tail)) {
		p=head;
		q=head->next;
		while(q->next!=tail) {
			if((q->std.total)<(q->next->std.total)) {             //小于调换
				p->next=q->next;
				q->next=q->next->next;
				p->next->next=q;
				q=p->next;
			}
			q=q->next;
			p=p->next;
		}
		tail=q;
	}
	return head;
}

//查找学生的信息并输出结果
//顺序查找
void search_Name1() {
	List p=sortscore1();           //循环使用函数,要在前面声明函数,否则出现conflicting types for"XXX"
	char a[10];
	printf("请输入查找的名字:");
	scanf("%s",a);
	while(p) {
		if(0==strcmp(a,p->std.name)) {                              //字符串匹配strcmp()
			printf("姓名\t学号\t语文\t数学\t英语\t总分\n");
			printf("%s\t%.2d\t%d\t%d\t%d\t%d\n",p->std.name,p->std.stdID,p->std.Chinese,p->std.Math,p->std.Engish,p->std.total);
			break;
		}
		p=p->next;
		if(p==NULL)
			printf("Could not find!\n");     //找不到返回
	}

}

//按姓氏字母排序并查找,二分查找
void search_Name2() {
	FILE *fp;
	Studentdata temp;
	Studentdata stu[60];   //要加static,否则后面会出现报错,改变了局部变量
	memset(stu,0,sizeof(stu));            //初始化数组
	int i=0,n,m;
	char std[50];
	if((fp=fopen("E:\\3.txt","rb+"))==NULL) {
		printf("Could not open the file!");
		exit(0);
	}
	fgets(std,50,fp);
	while(!feof(fp)) {
		fscanf(fp,"%s%d%d%d%d",stu[i].name,&stu[i].stdID,&stu[i].Chinese,&stu[i].Math,&stu[i].Engish); //数组存数据
		stu[i].total=stu[i].Chinese+stu[i].Math+stu[i].Engish;
		i++;
	}
	fclose(fp);
	for(n=0; n<i-1; n++) {
		for(m=0; m<i-n; m++) {
			if(strcmp(stu[m].name,stu[m+1].name)>0) {                          //按姓名字母排序
				temp=stu[m];
				stu[m]=stu[m+1];
				stu[m+1]=temp;
			}
		}
	}
	printf("%d",i);
	for(n=0; n<i; n++) {
		printf("%s   %.2d   %d   %d   %d   %d\n",stu[n].name,stu[n].stdID,stu[n].Chinese,stu[n].Math,stu[n].Engish,stu[n].total);
	}
	char a[10];
	printf("请输入查找的名字:");
	scanf("%s",a);
	int low=1,high=i,mid;
	while(low<high) {
		mid=(low+high)/2;
		if(strcmp(a,stu[mid].name)==0) {
			printf("姓名\t学号\t语文\t数学\t英语\t总分\n");
			printf("%s\t%.2d\t%d\t%d\t%d\t%d\n",stu[mid].name,stu[mid].stdID,stu[mid].Chinese,stu[mid].Math,stu[mid].Engish,stu[mid].total);
			break;
		} else if(strcmp(stu[mid].name,a)<0)
			low=mid+1;
		else high=mid-1;
		if(low==high)
			printf("Could not find!\n");     //找不到返回
	}
}

//打印函数
int PrintList_L(List p) {
	while(p) {
		printf("%s\t%.2d\t%d\t%d\t%d\t%d\n",p->std.name,p->std.stdID,p->std.Chinese,p->std.Math,p->std.Engish,p->std.total);
		p = p->next;
	}
	printf("\n");
	return 0;
}

//合并文件函数
int combination() {
	FILE *fp1=fopen("E:\\1.txt","rb+");       //读入文件1.txt
	FILE *fp2=fopen("E:\\2.txt","rb+");       //读入文件2.txt
	FILE *fp3=fopen("E:\\3.txt","wb+");       //写入文件3.txt
	char c;
	if(fp1==NULL||fp2==NULL||fp3==NULL) {
		puts("Could not open the files\n");
		return 0;
	}
	while((c=fgetc(fp1))!=EOF)         //读到文件末尾返回EOF(-1)
		fputc(c,fp3);                   //逐个字符写入文件3.txt
	while((c=fgetc(fp2))!=EOF)
		fputc(c,fp3);
	printf("Merged 1.txt and 2.txt into 3.txt\n");
	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
	return 1;
}

void menu() {
	system("cls");                   //清屏信号
	printf("\n\n\n\n");
	printf("\t\t|------------------------STUDENT GRADE SYSTEM-------------------------------|\n");
	printf("\t\t|\t 0.退出                                                             |\n");
	printf("\t\t|\t 1.合并1.txt和2.txt文件,生成3.txt文件                              |\n");
	printf("\t\t|\t 2.录入学生信息到链表                                               |\n");
	printf("\t\t|\t 3.抽取三科成绩中补考的学生(<60)保存到4.txt文件                     |\n");
	printf("\t\t|\t 4.按总分降序排序(直接插入排序)                                     |\n");
	printf("\t\t|\t 5.按总分降序排序(冒泡排序)                                         |\n");
	printf("\t\t|\t 6.输入姓名,查找学生信息(直接查找)                                 |\n");
	printf("\t\t|\t 7.输入姓名,查找学生信息(按姓名首字母排序并查找,二分查找)         |\n");
	printf("\t\t|\t 8.输入姓名,查找学生信息(fibonacci查找)                            |\n");
	printf("\t\t|---------------------------------------------------------------------------|\n");
	printf("\t\t|======================请输入对应数字(0-7)==================================|\n");
}


int main() {
	List p;
	int n;
	menu();
	printf("请输入(0-7)>>  ");
	scanf("%d",&n);
	while(1) {
		switch(n) {
			case 1: {
				combination();
				break;
			}
			case 2: {
				printf("姓名\t学号\t语文\t数学\t英语\t总分\n");
				p=inputfile();
				PrintList_L(p->next);
				break;
			}
			case 3: {
				bujige();
				break;
			}
			case 4: {
				printf("姓名\t学号\t语文\t数学\t英语\t总分\n");
				p=sortscore1();
				PrintList_L(p->next);
				break;
			}
			case 5: {
				printf("姓名\t学号\t语文\t数学\t英语\t总分\n");
				p=sortscore2();
				PrintList_L(p->next);
				break;
			}
			case 6:
				search_Name1();
				break;
			case 7:
				search_Name2();
				break;
			default:
				break;
		}
		if(n==0) break;
		getch();                //过滤回车键
		menu();
		printf("请输入(0-7)>>  ");
		scanf("%d",&n);
	}
}

这是我的数据结构课设题目,想分享给大家参考,因为我觉得在这里分享会提高我对代码的兴趣,我也知道学习路上会有很多阻碍,非常感谢这个网站带来的帮助,我也希望帮助更多人,如有不足的地方,欢迎各位大神不吝赐教。

管理员操作说明 1-1、管理员从“管理页面”进行后台登陆,新系统默认系统管理员帐号和密码为admin和admin。 1-2、为了增加系统安全,登陆后请你马上到“管理页面-修改密码”修改你的系统管理员密码。 1-3、“管理页面-帐号管理”你可以添加、编辑、删除管理员帐号(如果你有系统管理员权限)。 1-4、“管理页面-教师管理-添加教师”你可以添加教师帐号。 1-5、“管理页面-教师管理”你可以编辑、删除教师帐号,任课情况和班主任只是该教师当前所授课程和任哪班的班主任,若要修改请到相应的“课程管理”和“班级管理”。 1-6、“管理页面-年级管理”你可以添加、编辑、删除年级。年级的概念是“高三(2)班”中的“高三”。 1-7、“管理页面-学期管理”你可以添加、编辑、删除学期,并且必须把某一个学期设置为当前学期。学期名最好以“2006-2007第二学期”这样的格式发布。 2-1、“功能页面-系统设置”,你可以设置网站名称、网页左上方图标地址、网站主体表格属性。 2-2、“功能页面-年级变迁”,新学期可以对同一年级下班级进行批量升级,但请注意,必须从高年级开始升。比如,想将高二升为高三,再将高一升为高二。 2-3、“功能页面-下载管理”,你可以添加、编辑、删除软件下载的分类名。 2-4、“功能页面-软件管理”,你可以添加、编辑、删除所有软件,包括教师添加的软件。 2-5、“功能页面-留言管理”,你可以按时间批量学生对教师留言、家长对教师留言、学生与家长留言,点击“执行删除”将在不做任何提示的情况下删除所有留言,不可恢复。 3-1、“班级管理-班级管理”,你可以编辑、删除某个班级,同时可以查询,如“高三(2)班”只需输入“(2)班”即可。 3-2、“班级管理-批量班级添加一”,选择年级、班主任,输入班级名称,可一次性添加9个班级。 3-3、“班级管理-批量班级添加二”,选择需要添加的班级数,选择年级,输入班级的公共字部分,如“班”,也可以不输,然后点击“设定参数”。在下面的新表格中输入班级名,选择班主任,添加新班级。此两种方法视情况自由选择。 4-1、“课程管理-课程管理”,你可以编辑、删除某个课程。 4-2、“课程管理-批量课程添加”,选择批量添加的课程数,输入公共字,也可以不输,点击“设定参数”,在下面出来的新表格中填写课程名称,然后添加。 4-3、“课程管理-任课管理”,你可以编辑、删除某个教师相对应的任课关系。任课关系是教师、课程、班级、学期四者间的关系。 4-4、“课程管理-课程添加”,可先选择条数、教师、学期、班级,再点“设定”,然后在下面新生成的表格里根据实际重新选择添加。只有存在任课关系的教师才可以登陆管理自己相应班级和课程的成绩,否则无法管理。 5-1、“学生管理-学生管理”,你可以编辑、删除某个同学。 5-2、“学生管理-批量学生添加”,先根据学生数、班级、状态、入学年月设定,学号可填可不填,即公共字。在下面生成的新表格中完成填写,添加新学生。 5-3、“学生管理-按班批量学生添加”,选择班级、状态、入学年月,“起始学号”和“终止学号”为位数相同的数字,比如1200-1240,终止大于起始。 5-4、“学生管理-评语管理”,管理员无评语管理功能,评语管理是教师针对学生的评价。 5-5、“学生管理-数据导入”,管理员可以上传EXCEL文件学生名单及成绩文件至服务器,再将数据导入。 6-1、“成绩管理-成绩管理”,你可以编辑、删除某个学生的成绩,并且可以根据条件来显示需要的学生成绩。 6-2、“成绩管理-批量成绩添加”,可以根据成绩数、班级、课程、学期、类型来设定,根据新生成的表格来输入成绩,需要一个个输入学号和对应的成绩。 6-3、“成绩管理-按班批量成绩添加”,可以选择班级、课程、学期、类型进行设定,然后下面会生成新表格,列出该班的所有学生,你只需要输入对应的成绩,操作比较方便。 7-1、“管理统计-学生统计”,选定某一个班级,可以显示该班级的学生数及状态和所属班级。 7-2、“管理统计-排名统计”,选定所有条件后,列出符合条件的记录,并按分数从高到低或从低到高进行排序
好的,这是一个比较完整的学生成绩管理系统,需要涉及到文件读写、排序查找等多个方面。下面是我给出的一个解决方案,仅供参考。 1. 实现对两个文件数据进行合并,生成新文件3.txt 首先,我们需要读取文件1和文件2中的数据,然后将它们合并到一个新文件3中。这可以通过以下代码实现: ```python # 读取文件1中的数据 with open('1.txt', 'r') as f: data1 = f.readlines() # 读取文件2中的数据 with open('2.txt', 'r') as f: data2 = f.readlines() # 合并数据 data = data1 + data2 # 将数据写入新文件3中 with open('3.txt', 'w') as f: f.writelines(data) ``` 2. 抽取出三科成绩中有补考学生保存在一个新文件4.txt 接下来,我们需要从文件3中抽取出有补考学生信息,并保存到一个新文件4中。假设补考的分数线是60分,可以通过以下代码实现: ```python # 读取文件3中的数据 with open('3.txt', 'r') as f: data = f.readlines() # 抽取有补考学生信息 data_with_makeup_exam = [] for line in data: line = line.strip().split() name, _, chinese, math, english = line chinese, math, english = int(chinese), int(math), int(english) if chinese < 60 or math < 60 or english < 60: data_with_makeup_exam.append(line) # 将有补考学生信息写入新文件4中 with open('4.txt', 'w') as f: for line in data_with_makeup_exam: f.write(' '.join(line) + '\n') ``` 3. 合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现) 现在,我们需要将文件3中的数据按照总分降序排列,可以采用快速排序和归并排序两种方法实现。以下是示例代码: ```python # 定义快速排序函数 def quick_sort(data): if len(data) <= 1: return data pivot = data[0] left = [x for x in data[1:] if int(x.split()[2]) + int(x.split()[3]) + int(x.split()[4]) >= int(pivot.split()[2]) + int(pivot.split()[3]) + int(pivot.split()[4])] right = [x for x in data[1:] if int(x.split()[2]) + int(x.split()[3]) + int(x.split()[4]) < int(pivot.split()[2]) + int(pivot.split()[3]) + int(pivot.split()[4])] return quick_sort(left) + [pivot] + quick_sort(right) # 定义归并排序函数 def merge_sort(data): if len(data) <= 1: return data mid = len(data) // 2 left = merge_sort(data[:mid]) right = merge_sort(data[mid:]) i, j = 0, 0 res = [] while i < len(left) and j < len(right): if int(left[i].split()[2]) + int(left[i].split()[3]) + int(left[i].split()[4]) >= int(right[j].split()[2]) + int(right[j].split()[3]) + int(right[j].split()[4]): res.append(left[i]) i += 1 else: res.append(right[j]) j += 1 res += left[i:] res += right[j:] return res # 读取文件3中的数据 with open('3.txt', 'r') as f: data = f.readlines() # 使用快速排序对数据进行排序 sorted_data_quick = quick_sort(data) # 使用归并排序对数据进行排序 sorted_data_merge = merge_sort(data) # 将排序后的数据写入新文件3_sorted_quick.txt和3_sorted_merge.txt中 with open('3_sorted_quick.txt', 'w') as f: f.writelines(sorted_data_quick) with open('3_sorted_merge.txt', 'w') as f: f.writelines(sorted_data_merge) ``` 4. 输入一个学生姓名后,能查找到此学生信息并输出结果(至少采用两种查找方法实现) 最后,我们需要实现对文件3中的数据进行查找,根据学生姓名查找学生信息。可以采用线性查找和二分查找两种方法,以下是示例代码: ```python # 定义线性查找函数 def linear_search(data, name): for line in data: line = line.strip().split() if line[0] == name: return line return None # 定义二分查找函数 def binary_search(data, name): left, right = 0, len(data) - 1 while left <= right: mid = (left + right) // 2 line = data[mid].strip().split() if line[0] == name: return line elif line[0] < name: left = mid + 1 else: right = mid - 1 return None # 读取文件3中的数据 with open('3.txt', 'r') as f: data = f.readlines() # 使用线性查找查找学生信息 name = input('请输入要查找学生姓名:') result_linear = linear_search(data, name) if result_linear: print(' '.join(result_linear)) else: print('查无此人') # 使用二分查找查找学生信息 data_sorted = merge_sort(data) name = input('请输入要查找学生姓名:') result_binary = binary_search(data_sorted, name) if result_binary: print(' '.join(result_binary)) else: print('查无此人') ``` 以上是一个比较完整的解决方案,其中涉及到文件读写、排序查找等多个方面。需要注意的是,这只是一个示例代码,可能还需要根据实际情况进行修改和完善。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值