gpt4 book ai didi

c - 快速排序 float 最终仅显示 0,00

转载 作者:行者123 更新时间:2023-11-30 14:33:29 26 4
gpt4 key购买 nike

免责声明:我的程序中的某些单词是法语。

我需要读取一个文件,其中包含 118 名学生的学号、姓名、名字和年级。然后使用 quicksort() 将这些学生从最高年级到最低年级重新排列。当我运行程序时,突然每个成绩都变成 0,00 。我知道我的快速排序本身没有任何问题,问题在于变量 note (等级)。有人可以帮忙吗?

#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define MAX_PERS 200
#define MAX_LONG_NP 15


typedef struct
{
int numero;
char nom[MAX_LONG_NP];
char prenom[MAX_LONG_NP];
float note;
} donnees;

donnees tab[MAX_PERS];
int nbPers=0;



void lire(donnees tab[], int *n)
{
FILE *aLire = fopen("notes.txt", "r");

int nb=0;

while(!feof(aLire))
{
fscanf(aLire, "%d%s%s%f\n", &tab[nb].numero, &tab[nb].nom, &tab[nb].prenom, &tab[nb].note);
nb++;
}
fclose(aLire);
*n = nb;
}



void afficher(donnees tab[], int nb, char *quand)
{
int i;

printf("Contenu du tableau %s le tri\n\n", quand);

for(i=0; i<nb; i++)
printf( "%4d %15s %15s %3.2f\n", tab[i].numero, tab[i].nom, tab[i].prenom, tab[i].note);
printf("\n\n");
}



void echanger (donnees *P1, donnees *P2)
{
donnees tempo;

tempo = *P1 ;
*P1 = *P2;
*P2 = tempo;
}



void partitionner ( donnees tab[], int debut, int fin, int *P )
{
int G = debut , D = fin ;

float Val_Pivot = tab[debut].note;

while ( G <= D && tab[G].note >= Val_Pivot) G++;

while ( tab[D].note < Val_Pivot) D--;

if ( G < D ) echanger(&tab[G], &tab[D]);

while ( G <= D ) ;

echanger (&tab[debut], &tab[D]);

*P = D ;
}



void quickSort ( donnees tab[], int gauche, int droite )
{
int indPivot ;

if (gauche < droite)
{
partitionner ( tab, gauche, droite, &indPivot);
quickSort ( tab, gauche, indPivot - 1 );
quickSort ( tab, indPivot + 1, droite);
}
}




int main()
{
donnees tab[MAX_PERS];

lire(tab, &nbPers);

afficher(tab, nbPers, "avant");

quickSort(tab, 0, nbPers-1);

afficher(tab, nbPers, "apres");



return 0;
}

编辑

这些是文件中的前五个条目:

1000 Docteur             Albert              65.5
1001 Solo Hanz 23.4
1002 Caillou Frederic 78.7
1003 Viky Bryan 98.6
1004 Encas Christian 67.7

这些是输出中的前五个条目:

1000 Docteur             Albert              0.00
1001 Solo Hanz 0.00
1002 Caillou Frederic 0.00
1003 Viky Bryan 0.00
1004 Encas Christian 0.00

最佳答案

对于某些数据集,您的快速排序没有任何问题,我得到以下输出就证明了这一点:

Contenu du tableau avant le tri

1 pax diablo 72.00
2 george washington 61.00
3 bilbo baggins 68.00


Contenu du tableau apres le tri

1 pax diablo 72.00
3 bilbo baggins 68.00
2 george washington 61.00

来自输入:

1 pax diablo 72
2 george washington 61
3 bilbo baggins 68

因此,您可能会遇到一些与您的代码无关的其他问题。我建议至少:

  • 发布输入文件的小版本及其生成的输出,假设缩小输入文件后问题不会消失;
  • 确保输入文件的格式完全正确(每个条目四个项目,且类型正确),不包括“pax guido fortescue diablo”等长名称。
<小时/>

但是,我确实注意到的一件事是您的分区函数中的这一点:

while ( G <= D ) ;
echanger (&tab[debut], &tab[D]);

在某些情况下,第一行末尾的分号将导致无限循环。我认为这不是您的具体问题,因为这会导致排序数据没有输出,但一旦第一个问题得到解决,您就需要检查它。

即使您确实删除了该分号,您也会发现它没有帮助,因为您从未更改DG在那个循环中。因此,您需要检查交换项目时这些变量会发生什么。

关于c - 快速排序 float 最终仅显示 0,00,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59296616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com