经过多天的实践,终于把数据结构的实践任务做完了,每一天都在修改代码的路上奔波,为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
如果你喜欢这篇文章的话,请给作者点赞哟,你的支持是我不断前进的动力。
因为作者能力水平有限,欢迎各位大佬指导。