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

这篇具有很好参考价值的文章主要介绍了学生成绩管理系统(合并文件,查找,总分排序,保存补考学生信息)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

题目及要求:

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

合并文件

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

冒泡排序(总分降序)

顺序查找(名字查找)

二分查找(名字查找)

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

保存不及格学生到文件中


题目及要求:

现有学生成绩信息文件 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);
	}
}

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

到了这里,关于学生成绩管理系统(合并文件,查找,总分排序,保存补考学生信息)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学生成绩管理系统——C

    任务描述 相关知识 系统介绍 设计思想 功能描述 功能设计 成绩录入 计算分数 计算每门课程的总分和平均分 成绩排序 选择函数功能排出名次表 成绩查找 按姓名查询学生排名及其考试成绩代码 统计百分比 对每门课程分别统计每个类别的人数以及所占的百分比代码 成绩显示

    2024年02月09日
    浏览(42)
  • Java——学生成绩管理系统

    一、项目简介 学生管理系统是一种基于计算机技术实现的学生信息管理工具,能够方便地对学生信息进行录入、查询、修改和删除。该项目采用 Java 语言编写,使用 Spring MVC 框架和 MySQL 数据库,实现了以上所述的主要功能,该学生管理系统可以应用于学校、培训机构、教育

    2024年02月08日
    浏览(44)
  • Python学生成绩管理系统

    根据项目要求,学生系统成绩管理系统应该具备以下几个功能: (1)系统的登录与注册: (2)学生成绩添加: (3)学生成绩修改: (4)学生成绩删除: (5)学生成绩查询: (6)学生成绩排序及显示: (7)系统退出: 系统主要功能分为三大模块,分别为:系统的登录

    2024年02月03日
    浏览(62)
  • java学生成绩管理信息系统

    学生成绩管理信息系统是一个基于Java Swing的桌面应用程序,旨在方便学校、老师和学生对学生成绩进行管理和查询。本文档将提供系统的详细说明,包括系统特性、使用方法和技术实现。 添加学生信息:录入学生基本信息,包括学号、姓名、班级等。 编辑学生信息:修改学

    2024年01月18日
    浏览(52)
  • 【期末课程设计】学生成绩管理系统

    因其独特,因其始终如一 文章目录 一、学生成绩管理系统介绍 二、学生成绩管理系统设计思路 三、源代码 1. test.c  2. Student Management System.c 3.Stu_System.c 4.Teacher.c 5.Student Management System.h   前言: 学生成绩管理系统含教师登录入口和学生登录入口,可实现学生信息的添加,删

    2024年02月16日
    浏览(41)
  • 学生成绩管理系统(C++实现)

    实现学生成绩管理系统: 学生信息包括:学号、姓名、性别、年龄、班级等信息。除了包括学生所有信息外,还包括专业、英语、程序设计和高等数学等课程。 设计一程序能够对学生成绩进行管理,应用到继承、抽象类、虚函数、虚基类、多态和文件的输入/输出等内容。用

    2024年02月05日
    浏览(46)
  • Java课设-学生成绩管理系统

    题目要求 : 代码: Student.java : StudentApplication.java : StudentManage.java : 运行主界面 :

    2024年02月11日
    浏览(54)
  • Java设计学生成绩管理系统

    1.1 题目与要求 设计一个学生成绩排名系统 实现以下功能: (1) 具备对成绩的管理功能(添加、删除、排序); (2) 具备对成绩的统计功能(最高分,最低分,平均分,及格率等); (3) 具备按学号、姓名查询成绩的功能; (4) 具备处理解决学号重复问题 ; 备注:成绩记录以下

    2024年02月09日
    浏览(55)
  • 【学生成绩管理系统----C语言】

    还在为期末程序设计而烦恼吗,不要担心,大师帮你安利一波完整的的管理系统代码,对你有帮助记得加关注噢! 文章目录 一、学生成绩管理系统是什么? 二、信息管理的七个模块 1.Step one 2.Step Two  3.Step Three 4.Step four 5.Step five 6.Step Six 7.Next 总结        学生信息管理系统

    2024年02月03日
    浏览(56)
  • 学生成绩管理系统V1.0

    某班有最多不超过 30 人(具体人数由键盘输入)参加某门课程的考试,用 一维数组作函数参数 编程实现如下学生成绩管理: ( 1 )录入每个学生的学号和考试成绩; ( 2 )计算课程的总分和平均分; ( 3 )按成绩由高到低排出名次表; ( 4 )按学号由小到大排出成绩表;

    2024年02月13日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包