shining shadow 2022-12-07 17:18 采纳率: 100%
浏览 130
已结题

利用堆排序实现学生成绩管理

问题遇到的现象和发生背景

用vs2019写利用堆排序实现学生成绩管理

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n;
typedef struct student {
char num[20];
char name[25];
int score;
}*Stu, StuNode;

void Build(Stu stu)
{
FILE* fp;
char name[20];
int score, i;
char num[20];
fp = fopen("E:\Student.txt", "w");
printf("请输入学生人数:");
scanf("%d", &n);

printf("请输入学生信息(学号,姓名,成绩):\n");
for (i = 1; i <= n; i++)
{
    scanf("%s %s %d", num, name, &score);
    fprintf(fp, "%s %s %d\n", num, name, score);
}
printf("登录成功.\n");
fclose(fp);

}
void ReadFile(Stu& stu)
{//读文件,存到Stu结构体中
FILE* fp;
int i;
stu = (Stu)malloc(sizeof(StuNode) * (n + 1));
fp = fopen("E:\Student.txt", "r");
for (i = 1; i <= n; i++)
fscanf(fp, "%s %s %d", stu[i].num, stu[i].name, &stu[i].score);

fclose(fp);

}

void Display(Stu stu)
{//显示数据
int i;
int temp = 1, index = 0;
for (i = 1; i <= n; i++)
{
printf("%2d %15s %15s %5d\n", temp, stu[i].num, stu[i].name, stu[i].score);
if (i < n && stu[i].score == stu[i + 1].score)
index++;
else
{
temp += index + 1;
index = 0;
}
}

free(stu);

}

void Swap(StuNode& a, StuNode& b)
{
StuNode temp;
temp = a;
a = b;
b = temp;
}

void HeapAdjust(Stu stu, int s, int m)
{//调整堆
int j;
StuNode rc;
rc = stu[s];

for (j = 2 * s; j <= m; j *= 2)
{
    if (j<m && stu[j].score>stu[j + 1].score)
        j++;
    if (!(rc.score > stu[j].score))
        break;
    stu[s] = stu[j];
    s = j;
}
stu[s] = rc;

}
void HeapSort(Stu stu)
{//堆排序
int i;
ReadFile(stu);
for (i = n / 2; i > 0; i--)
HeapAdjust(stu, i, n);
for (i = n; i > 1; i--)
{
Swap(stu[1], stu[i]);
HeapAdjust(stu, 1, i - 1);
}
Display(stu);
}

int main()
{
Stu stu;
int key;
while (1)
{
printf(" ----------------------\n");
printf(" 1.录入学生基本信息。\n");
printf(" 2.堆排序。\n");
printf(" 3.输出学生信息。\n");
printf(" 4.退出。\n");
printf(" ----------------------\n");
scanf("%d", &key);
stu = NULL;
switch (key)
{
case 1:
Build(stu);
break;
case 2:
HeapSort(stu);
break;
case 3:
ReadFile(stu);
Display(stu);
break;
default:
return 0;
}
}
}

运行结果及报错内容

img

我想要达到的结果

正常运行

  • 写回答

4条回答 默认 最新

  • honestman_ 2022-12-07 17:26
    关注
    
    //排序:
    /*  
        1、录入学生基本信息
        2、直接插入排序
        3、冒泡排序
        4、快速排序
        5、简单选择排序
        6、堆排序
        7、2-路归并排序
        8、输出学生信息
    */
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct{
        char name[20];
        int num;
        int score;
        int degree;
    }Student,*student;
    int save(student w,int n)
    {
        FILE *fp;
        if((fp=fopen("stu.txt","wb"))==NULL)
        {
            printf("cannot creat the file!\n");
            return 1;
        }
        for(int i=1;i<=n;i++)
        {
            fwrite(w+1,sizeof(Student),1,fp);
            w++; 
        }
        fclose(fp);
        return 0;
    }
    void Studentinfo(student stu,int n)
    {
        int i;    
        printf("录入学生的信息:\n");
        printf("姓名   学号   分数:\n");
        for(i=1;i<=n;i++)
        {
            scanf("%s",stu[i].name);
            scanf("%d",&stu[i].num);
            scanf("%d",&stu[i].score);    
            getchar();
        }
        save(stu,n);
    }
     
    int openfile(student p,int n)
    {
        FILE *fp;
        if((fp=fopen("stu.txt","rb"))==NULL)
        {
            printf("cannot open the file!\n");
            return 1;
        }
        for(int i=1;i<=n;i++)
        {
            fread(p+1,sizeof(Student),1,fp);
            p++;
        }
        fclose(fp);    
        return 0;
    }
    void showinfo(student stu,int n)
    {
        int i;
        printf("进行排序后学生的信息:\n");
        printf("姓名   学号   分数   名次:\n");
        for(i=1;i<=n;i++)
        {
            stu[i].degree=n-i+1;
            printf("%s ",stu[i].name);
            printf("%5d%5d%5d\n",stu[i].num,stu[i].score,stu[i].degree);
        }
    }
    void InsertSort(student stu,int n)
    {
        int i,j;
        for(i=2;i<=n;i++)
        {
            if(stu[i].score<stu[i-1].score)
            {
                stu[0]=stu[i];
                stu[i]=stu[i-1];
                for(j=i-2;stu[0].score<stu[j].score;j--)
                    stu[j]=stu[j-1];
                stu[j+1]=stu[0];
            }
        }
        showinfo(stu,n);        
    }
    void BubbleSort(student stu,int n)
    {
        int i,j;
        int flag=1;
        Student t;
        for(i=1;i<=n&&flag;i++)
        {
            flag=0;
            for(j=1;j<=n-i;j++)
            {
                if(stu[j].score>stu[j+1].score)
                {
                    flag=1;
                    t=stu[j];
                    stu[j]=stu[j+1];
                    stu[j+1]=t;
                }
            }
        }
        showinfo(stu,n);
    }
    int Partition(student &stu,int low,int high)
    {
        stu[0]=stu[low];
        int   keyword=stu[low].score;
        while(low<high){
     
            while(low<high&&stu[high].score>=keyword)
                high--;
            stu[low]=stu[high];
            while(low<high&&stu[low].score<=keyword)
                low++;
            stu[high]=stu[low];
        }
        stu[low]=stu[0];
        return low;
    }
    void QSort(student &stu,int low,int high)
    {
        int temp;
        if(low<high)
        {
            temp=Partition(stu,low,high);
            QSort(stu,low,temp-1);
            QSort(stu,temp+1,high);
        }
    }
    void SlectsSort(student stu,int n)
    {
        int i,j,k;
        Student temp;
        for(i=1;i<n;i++)
        {
            k=i;
            for(j=i+1;j<=n;j++)
                if(stu[k].score>stu[j].score)
                    k=j;
            if(k!=i)
            {
                temp=stu[i];
                stu[i]=stu[k];
                stu[k]=temp;
            }
        }
        showinfo(stu,n);
    }
    void HeapAdjust(student stu,int s,int n)
    {
        
        Student rc;
        rc=stu[s];
        for(int j=2*s;j<=n;j*=2)
        {
            if(j<n&&stu[j].score<stu[j+1].score)
                j++;
            if(rc.score>stu[j].score) break;
            stu[s]=rc;
        }
    }
    void HSort(student stu,int n)
    {//堆排序
        int i;
        Student t;
        for(i=n/2;i>0;i--)
            HeapAdjust(stu,i,n);
        for(i=n;i>1;i--)
        {
            t=stu[1];
            stu[1]=stu[i];
            stu[i]=t;
            HeapAdjust(stu,1,i-1);
        }
            
    }
    student S;
    void merge(Student stu[],int i,int m,int n)
    {
        int j,k;
        j=m+1;
        k=i;
        while(j<=n&&i<=m)
        {
            if(stu[i].score<=stu[j].score)
                S[k++]=stu[i++];
            else 
                S[k++]=stu[j++];
        }
        while(j<=n)
            S[k++]=stu[j++];
        while(i<=m)
            S[k++]=stu[i++];
        for(int t=i;t<=n;t++)
            stu[t]=S[t];
    }
    void MergeSort(student stu,int low,int high)
    {
        if(low==high)
            return;
        int m;
        m=(low+high)/2;
        MergeSort(stu,low,m);
        MergeSort(stu,m+1,high);
        merge(stu,low,m,high);
    }
    int main()
    {
        student stu;
        int n,low,high;
        printf("请输入学生个数:\n");
        scanf("%d",&n);
        low=1;high=n;
        stu=(student)malloc((n+1)*sizeof(Student));
        Studentinfo(stu,n);
        openfile(stu,n);
        InsertSort(stu,n);
        openfile(stu,n);
        BubbleSort(stu,n);
        openfile(stu,n);
        QSort(stu,low,high);
        showinfo(stu,n);
        openfile(stu,n);
        SlectsSort(stu,n);
        HSort(stu,n);
        showinfo(stu,n);
        /*MergeSort(stu,low,high);
        showinfo(stu,n);*/
        return 0;    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月7日
  • 已采纳回答 12月7日
  • 创建了问题 12月7日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程