内容:
给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作:
设计一个显示对学生信息操作的菜单函数如下所示:
*************************
1、录入学生基本信息
2、直接插入排序
3、冒泡排序
4、快速排序
5、简单选择排序
6、堆排序
7、2-路归并排序
8、输出学生信息
0、退出
*************************
算法设计要求:按分数从高到低的顺序进行排序,分数相同的为同一名次。输入的学生信息存入文件中,每选择一种排序方法,必须从文件中取出数据。
#include<stdio.h>
#include<stdlib.h>
#define Max 100
typedef struct Student{
char name[100];
int score,number,n;
}Node;
typedef struct{
Node stu[Max+1];
int num;
}SqList;
Student stu[Max];
int Creat(SqList &L)
{//创建学生信息并写入文件中
int i;
FILE *pWrite;
pWrite=fopen("stu_scores.txt","w");
printf("请输入学生人数:\n");
scanf("%d",&L.num);
for(i=1;i<=L.num;i++)
{
printf("请输入第%d个学生的学号姓名和成绩:\n",i);
scanf("%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
fprintf(pWrite,"%d %s %d\n",L.stu[i].number,L.stu[i].name,L.stu[i].score);
}
fclose(pWrite);
return 0;
}
void place(SqList &L)
{//排名次
int i,j;
j=1;
L.stu[1].n=1;
for(i=2;i<=L.num;i++,j++)
{
if(L.stu[i].score==L.stu[i-1].score)
{
L.stu[i].n=j;
}
else
L.stu[i].n=j+1;
}
}
void Display1(SqList &L)
{//输出学生信息
int i;
printf(" 学号 姓名 成绩 \n");
for(i=1;i<=L.num;i++)
{
printf(" %d %8s %6d\n",L.stu[i].number,L.stu[i].name,L.stu[i].score);
}
}
void Display2(SqList L)
{//排序后的结果
int i;
printf(" 学号 姓名 成绩 名次\n");
for(i=1;i<=L.num;i++)
{
printf(" %d %8s %6d %3d\n",L.stu[i].number,L.stu[i].name,L.stu[i].score,L.stu[i].n);
}
}
void InsertSort(SqList &L)
{//直接插入排序
int i,j;
FILE *pRead;
pRead=fopen("stu_scores.txt","r");
for(i=1;i<=L.num;i++)
{
fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score); //从文件中读取数据
}
for(i=2;i<=L.num;++i)
if(L.stu[i].score>L.stu[i-1].score)
{
L.stu[0]=L.stu[i];
L.stu[i]=L.stu[i-1];
for(j=i-2;L.stu[0].score>L.stu[j].score;--j)
L.stu[j+1]=L.stu[j];
L.stu[j+1]=L.stu[0];
}
place(L);
Display2(L);
}
void BubbleSort(SqList &L)
{//冒泡排序
Student temp;
int i,j;
int flag=1;
FILE *pRead;
pRead=fopen("stu_scores.txt","r");
for(i=1;i<=L.num;i++)
{
fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
}
for(j=1;j<=L.num && flag;j++)
{
flag=0;
for(i=1;i<=L.num-j;i++)
if(L.stu[i].score<L.stu[i+1].score)
{
temp=L.stu[i];
L.stu[i]=L.stu[i+1];
L.stu[i+1]=temp;
flag=1;
}
}
place(L);
Display2(L);
}
int Partition(SqList &L,int low,int high)
{//枢轴函数
int pivotkey;
L.stu[0]=L.stu[low];
pivotkey=L.stu[low].score;
while(low<high)
{
while(low<high && L.stu[high].score<=pivotkey)
--high;
L.stu[low]=L.stu[high];
while(low<high && L.stu[low].score>=pivotkey)
++low;
L.stu[high]=L.stu[low];
}
L.stu[low]=L.stu[0];
return low;
}
void QSort(SqList &L,int low,int high)
{//对顺序表L中的子序列快速排序
int pivotloc;
if(low<high)
{
pivotloc=Partition(L,low,high);
QSort(L,low,pivotloc-1);
QSort(L,pivotloc+1,high);
}
}
void QuickSort(SqList &L)
{//对顺序表L快速排序
int i;
FILE *pRead;
pRead=fopen("stu_scores.txt","r");
for(i=1;i<=L.num;i++)
{
fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
}
QSort(L,1,L.num);
place(L);
Display2(L);
}
void SelectSort(SqList &L)
{//简单选择排序
int i,j,k;
Student temp;
FILE *pRead;
pRead=fopen("stu_scores.txt","r");
for(i=1;i<=L.num;i++)
{
fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
}
for(i=1;i<=L.num;i++ )
{
k=i;
for(j=i+1;j<=L.num;j++)
if(L.stu[k].score<L.stu[j].score)
k=j;
if(k!=i)
{
temp=L.stu[i];
L.stu[i]=L.stu[k];
L.stu[k]=temp;
}
}
place(L);
Display2(L);
}
void HeapAdjust(SqList &L,int s,int m)
{//调整为大堆
int i;
Student r;
r=L.stu[s];
for(i=2*s;i<=m;i*=2)
{
if(i<m && L.stu[i].score>L.stu[i+1].score)
++i;
if(!(r.score>L.stu[i].score))
break;
L.stu[s]=L.stu[i];
s=i;
}
L.stu[s]=r;
}
void HeapSort(SqList &L)
{//堆排序
int i;
Student temp;
FILE *pRead;
pRead=fopen("stu_scores.txt","r");
for(i=1;i<=L.num;i++)
{
fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
}
for(i=L.num/2;i>0;--i)
HeapAdjust(L,i,L.num);
for(i=L.num;i>1;--i)
{
temp=L.stu[1];
L.stu[1]=L.stu[i];
L.stu[i]=temp;
HeapAdjust(L,1,i-1);
}
place(L);
Display2(L);
}
int main()
{
SqList L;
int i;
while(1)
{
printf("*****************************\n");
printf(" 1、录入学生基本信息\n");
printf(" 2、直接插入排序\n");
printf(" 3、冒泡排序\n");
printf(" 4、快速排序\n");
printf(" 5、简单选择排序\n");
printf(" 6、堆排序\n");
printf(" 7、输出学生信息\n");
printf(" 0、退出\n");
printf("****************************\n");
printf("----请选择操作:-----\n");
scanf("%d",&i);
switch(i)
{
case 1: Creat(L);
break;
case 2: InsertSort(L);
break;
case 3: BubbleSort(L);
break;
case 4: QuickSort(L);
break;
case 5: SelectSort(L);
break;
case 6: HeapSort(L);
break;
case 7: Display1(L);
break;
case 0: return 0;
break;
}
}
}