数据结构期末实践周【学生成绩管理系统】,基于C语言,(建议收藏)

如果你喜欢这篇文章的话,请给作者点赞+关注哟,你的支持是我不断前进的动力!

经过多天的实践,终于把数据结构的实践任务做完了,每一天都在修改代码的路上奔波,为bug发愁,如果你期末也选了这个课题,相信这篇文章会对你有一些帮助。

如果你想要实践报告的话,去作者上传的资料里面找哦!

一、题目要求:

学生成绩管理系统实现的主要功能:

①根据指定学生个数,逐个输入学生信息;

②逐个显示学生表中所有学生的相关信息;

③给定一个学生信息,插入到表中指定的位置;

④删除指定位置的学生记录;

⑤统计表中学生个数;

⑥利用快速排序按照学号进行排序;

⑦分别利用直接插入排序和折半插入排序按照成绩进行排序;

⑧根据成绩进行折半查找,成功返回此学生的学号和姓名;

⑨可将数据存入文件中;

⑩实现数据的清空功能;

二、代码实现

#include
#include
#include
#define OK 1
#define ERROR 0
#define MAXSIZE 20  //学生最多人数
typedef struct{
	char num[20];  //学号
	char name[20]; //姓名
	int score;     //分数
}stu;
typedef struct{
	 stu R[MAXSIZE+1]; //0单元作为监视哨
	 int length;
}Sqlist;

/*主菜单*/
void menu(){//菜单
	printf("**************************\n");
	printf(" 欢迎使用学生成绩管理系统 \n");
	printf("     系统功能如下所示 \n");
	printf("**************************\n");
	printf("\t1. 录入学生基本信息\n");
	printf("\t2. 删除\n");
	printf("\t3. 插入\n");
	printf("\t4. 排序\n");
    printf("\t5. 查找\n");
	printf("\t6. 修改\n");
	printf("\t7. 输出\n");
	printf("\t0. 退出\n");
	printf("**************************\n");
	printf("请选择:\n");
}
/*新建列表*/
void InputInformation(Sqlist &L){//存入初始信息
		int i;
	FILE *fp,*fq;
	if((fp=fopen("D:\\stdinf.txt","w"))==NULL){
		printf("无法打开该文件!\n");
		return ;
	}
	if((fq=fopen("D:\\length.txt","w"))==NULL){
		printf("无法打开该文件!\n");
		return ;
	}
	printf("请输入学生人数:");
    scanf("%d",&L.length);
	fprintf(fq,"%d",L.length);
	printf("请输入学生的学号,姓名,分数\n");
	for(i=1;i<=L.length;i++){
		scanf("%s%s%d",L.R[i].num,L.R[i].name,&L.R[i].score);
		fprintf(fp,"%8s%8s%8d\n",L.R[i].num,L.R[i].name,L.R[i].score);
	}//while

	fclose(fp);
	fclose(fq);
}
/*从文件导入*/
void Readfile(Sqlist &L){//读取文件
	FILE *fp,*fq;
	int i;
	fq= fopen("D:\\length.txt","r");
	fscanf(fq,"%d",&L.length);
	fp = fopen("D:\\stdinf.txt","r");
	for(i=1;i<=L.length;i++)
    fscanf(fp,"%8s%8s%8d\n",L.R[i].num,L.R[i].name,&L.R[i].score);
	fclose(fp);
	fclose(fq);
}
/*输出到文件*/
void Writefile(Sqlist &L) {//将数组写入文件
	FILE *fp;
	FILE *fq;
	int i;
	fp = fopen("D:\\stdinf.txt","w");
	fq= fopen("D:\\length.txt","w") ;
	fprintf(fq,"%d",L.length);
	for(i=1;i<=L.length;i++)
    fprintf(fp,"%8s%8s%8d\n",L.R[i].num,L.R[i].name,L.R[i].score);
	fclose(fp);
	fclose(fq);
}
/*删除*/
int ListDelete_Sq(Sqlist &L){//删除
	printf("请输入删除信息的位置\n");
	int j,i;
	scanf("%d",&i);
	if((i<1)||(i>L.length)) return ERROR;	 //i值不合法
	for (j=i;j<=L.length-1;j++)
		L.R[j]=L.R[j+1];
	--L.length;               	      //表长减1
	return OK;
}
/*插入*/
int ListInsert_Sq(Sqlist &L){//插入
	int i,j; stu e;
	printf("请输入插入信息的位置\n");
	scanf("%d",&i);
	printf("请输入信息的学号,姓名,分数\n");
	scanf("%8s%8s%8d",e.num,e.name,&e.score);
	if(i<1 || i>L.length+1) return ERROR;	         //i值不合法
	if(L.length==MAXSIZE) return ERROR;    //当前存储空间已满
	for(j=L.length;j>=i;j--)
		L.R[j+1]=L.R[j];    //插入位置及之后的元素后移
	L.R[i]=e;                     //将新元素e放入第i个位置
	++L.length;		     	//表长增1
	return OK;
}
/*修改*/
int modify(Sqlist &L){//修改
	int i,j; stu e;
	printf("请输入修改信息的位置\n");
	scanf("%d",&i);
	if((i<1)||(i>L.length)) return ERROR;	 //i值不合法
	printf("请输入修改信息的学号,姓名,分数\n");
	scanf("%8s%8s%8d",e.num,e.name,&e.score);
	L.R[i]=e;
	return OK;
}
/*按照姓名排序*/
void sort1(Sqlist &L) {
	int i, j;
	stu temp;
	for (i = 1; i<=L.length - 1; i++)
		for (j = 1; j<=L.length-1-i; j++)
			if (strcmp(L.R[j].name, L.R[j+1].name)>0) {
				temp = L.R[j];
				L.R[j] = L.R[j+1];
				L.R[j+1] = temp;
			}
}
/*直接插入排序*/
void InsertSort(Sqlist &L){ //插入排序
	int i,j;
	for(i=2;i<=L.length;i++)
		if(L.R[i].score > L.R[i-1].score){
			L.R[0] = L.R[i];  //R[i]为哨兵
			L.R[i] = L.R[i-1];
			for(j=i-2;L.R[0].score >L.R[j].score;j--)
				L.R[j+1] = L.R[j];
			L.R[j+1] = L.R[0];
		}//if
}
/*折半插入排序*/
void BInsertSort(Sqlist &L){//折半插入排序
	int i,j;
	int low,high,mid;

	for(i=2;i<=L.length;i++){
		L.R[0]=L.R[i];
		low=1;
		high=i-1;
		while(low<=high){
			mid=(low+high)/2;
			if(L.R[0].score>L.R[mid].score)
				high=mid-1;
			else
				low=mid+1;
		}
		for(j=i-1;j>=high+1;--j)L.R[j+1]=L.R[j];
		L.R[high+1]=L.R[0];
	}
}
/*冒泡排序*/
void BubbleSort(Sqlist &L){//起泡排序
	int flag=1,i,j;
	for(i=1;i<=L.length && flag;i++){
		flag = 0;
		for(j=1;j<=L.length-i;j++)
			if(L.R[j].score < L.R[j+1].score){
				L.R[0] = L.R[j];	L.R[j] = L.R[j+1];
				L.R[j+1] = L.R[0];	flag = 1;
			}//if
	}//for
}
/*快速排序(按照学号排序)*/
int Partition(Sqlist &L,int low,int high){//快速排序 递归
	 char pivotnum[20];
	 strcpy(pivotnum,L.R[low].num);
	 L.R[0]=L.R[low];
	 while(low:");
	scanf("%d",&L.R[0].score);
	low=1;
	high=L.length;
	while(low<=high){
		mid=(low+high)/2;
		if(L.R[0].score==L.R[mid].score)
			break;
		else
			if(L.R[0].score>L.R[mid].score)
				high=mid-1;
		else
			if(L.R[0].scorehigh)
		printf("未找到成绩为<%d>的学生\n",L.R[0].score);
	else
		printf("成绩为<%d>的学生,姓名为<%s>,学号为<%s>\n",L.R[0].score,L.R[mid].name,L.R[mid].num);
}
/*折半查找(根据姓名)*/
void search1(Sqlist &L) {
	if (L.length == 0) {
		printf("已无学生记录!\n");
		menu();
	} else {
		int low = 1, high = L.length, mid, flag = 0;
		printf("\n");
		printf("按姓名查找-->请输入要查找的姓名:");
		char a[15], ch;
		scanf("%s", a);
		while (low <= high) {
			mid = (low + high) / 2;
			if (strcmp(a, L.R[mid].name) == 0) {
				flag = 1;
				break;
			} else if (strcmp(a, L.R[mid].name)>0)
				low = mid + 1;
			else
				high = mid - 1;
		}
		if (flag == 1) {
			printf("姓名为<%s>的学生,学号为<%s>,成绩为<%d>\n",L.R[mid].name,L.R[mid].num,L.R[mid].score);

			}
		}
	}
/*输出到屏幕*/
void show(Sqlist L){//输出信息
	Sqlist L1;
	int i;int j;
	int rank[21],index=0;
	L1=L;
	InsertSort(L1);
	rank[1]=1;

	for(i=1;i

如果你喜欢这篇文章的话,请给作者点赞哟,你的支持是我不断前进的动力。

因为作者能力水平有限,欢迎各位大佬指导。

如果你想要实践报告的话,去作者上传的资料里面找哦!

你可能感兴趣的:(数据结构学习,数据结构实验)