首页 > 解决方案 > 有没有办法用 for 循环按降序浏览和排序 C 中的结构元素?

问题描述

我想按降序对 24 个不同元素的结构进行排序。但是我不知道是否有一种方法可以在不使用结构下的指针和表的情况下做到这一点。我只想通过存储不同的元素来做到这一点,然后我将使用 for 循环浏览我的所有元素并按降序对它们进行排序!

这是我的程序,我的变量名是法语的。在我的头文件中,我声明了这一点:

#define SEUIL 5

typedef struct BEO_acc BEO_acc;

// first structure to receive my element and affect them to my variables 
struct BEO_acc {
    int Energie;
    int Kilometrage;
    int date;
};

typedef struct Historique_BEO_acc Historique_BEO_acc;

// second structure where I want to store all my max values of energy given by the user 
struct Historique_BEO_acc {
    int energie1;
    int kilomtrage1;
    int date1;
    int energie2;
    int kilomtrage2;
    int date2;
    int energie3;
    int kilomtrage3;
    int date3;
    int energie4;
    int kilomtrage4;
    int date4;
    int energie5;
    int kilomtrage5;
    int date5;
    int energie6;
    int kilomtrage6;
    int date6;
    int energie7;
    int kilomtrage7;
    int date7;
    int energie8;
    int kilomtrage8;
    int date8;
 };

int FUN_beo_acc(int arg1, int arg2, int arg3);

这是我的 cpp 程序:

#include "prototype_beo.h";
#include <stdio.h>;
#define SEUIL 5
#define RESET_VALUE 0


int FUN_beo_acc(int arg1, int arg2, int arg3)
{
BEO_acc accumulateur;
accumulateur.Energie = arg1;
accumulateur.Kilometrage = arg2;
accumulateur.date = arg3;


return accumulateur.Energie;
}



int main(int argc, char *argv[])
{
BEO_acc accumulateur = {RESET_VALUE, RESET_VALUE, RESET_VALUE};
Historique_BEO_acc Historique = {RESET_VALUE, RESET_VALUE, 
RESET_VALUE, RESET_VALUE, RESET_VALUE, RESET_VALUE, 
RESET_VALUE, RESET_VALUE, RESET_VALUE};
int seuil = SEUIL;
int returned_arg;
int v1, v2, v3;



printf("introduire le premier argument de la fonction \n");
scanf("%d", &v1);
printf("introduire la valeur du deuxième argument ");
scanf("%d", &v2);
printf("introduire la valeur du troisième argument ");
scanf("%d", &v3);
returned_arg = FUN_beo_acc(v1, v2, v3);

while(returned_arg < seuil)
{
printf("introduire le premier argument de la fonction \n");
scanf("%d", &v1);
printf("introduire la valeur du deuxième argument ");
scanf("%d", &v2);
printf("introduire la valeur du troisième argument ");
scanf("%d", &v3);
returned_arg = FUN_beo_acc(v1, v2, v3); 
}

if (returned_arg > seuil)
{
    accumulateur.Energie = returned_arg;
    accumulateur.Kilometrage = v2+10;
    accumulateur.date = v3+10;

    printf("l''energie max est de : %d ", 
    accumulateur.Energie);
    printf("la distance est de : %d ", 
    accumulateur.Kilometrage);
    printf("la date  est de : %d ", accumulateur.date);
    }
    }

目前我只是做了一些输入值并将它们存储在第一个结构中。我希望每次我的能量大于 5 时,我都会将其储存在伟大的结构中。在存储结束时,我将对我的大结构进行排序,并将值按能量的降序排列。

标签: cstruct

解决方案


当您发现自己正在创建名称如thing1thing2thing3的对象时,这强烈暗示您想要使用数组

我建议你重新定义为struct Historique_BEO_acc一个数组struct BEO_acc

struct BEO_acc Historique_BEO_acc[N]; // where N is the number of elements you want to store

您将写入每个元素

Historique_BEO_acc[i].Energie = ...;
Historique_BEO_acc[i].Kilomitrage = ...;
Historique_BEO_acc[i].date = ...;

然后,您可以使用qsort()库函数对数组进行排序。您只需要编写一个比较函数来告诉qsort()如何对元素进行排序。如果你想按Energie降序排序,你的函数看起来像

int cmp_beo( const void *l, const void *r )
{
  const struct BEO_acc *ll = l;
  const struct BEO_acc *lr = r;

  if ( ll->Energie < lr->Energie )
    return 1;
  else if ( ll->Energie > lr->Energie )
    return -1;
  else 
    return 0;
}

然后你会打电话qsort()

qsort( Historique_BEO_acc, N, sizeof Historique_BEO_acc, cmp_beo);

推荐阅读