Organiser variables aléatoires en ordre décroissant

Fermé
lmc-3 Messages postés 597 Date d'inscription samedi 13 juin 2015 Statut Membre Dernière intervention 30 septembre 2024 - 18 oct. 2015 à 01:53
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 27 oct. 2015 à 15:52
Bonjour,
Je code actuellement un programme en C visant à afficher des variables aléatoires dans l'ordre décroissant mais je ne sais pas comment m'y prendre.
Si quelqu'un peut m'aider (sachant que je débute dans le domaine de la programmation et suis limité aux fonctionnalités les plus simples...).

Merci

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 oct. 2015 à 15:11
Bonjour,
afficher des variables aléatoires dans l'ordre décroissant
Des variables aléatoires ? Ou des variables contenant des valeurs aléatoires ?
Peux-tu donner un exemple de ce que tu souhaites ?

Cdlt,
0
Des variables contenant un nombre aléatoire
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 22/10/2015 à 22:58
Bonjour,

Voici un code à trou :
#include <...>
#include <...>

#define NBCOL ...

int main(void) {
     int i;
     const int max=...;
     int tab[NBCOL];
     srand(time(NULL));

     for(...) {
          tab[...]=(int) (rand() / (double) RAND_MAX * max);
     }

     /*tri décroissant*/

     return 0;
}

Pour le tri, il y a plusieurs méthodes comme le bubble sort : https://openclassrooms.com/courses/le-tri-a-bulles

Cdlt,

Google is your friend
0
lmc-3 Messages postés 597 Date d'inscription samedi 13 juin 2015 Statut Membre Dernière intervention 30 septembre 2024 68
23 oct. 2015 à 13:48
je vais essayer ça merci
0
lmc-3 Messages postés 597 Date d'inscription samedi 13 juin 2015 Statut Membre Dernière intervention 30 septembre 2024 68
Modifié par lmc-3 le 23/10/2015 à 14:10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(int argc, char *argv[])
{
int Boucle = 0;
char Personage = 0;
int BBA = 0;
int CA = 0;
int NbDe = 0;
int TypeDe = 0;
int Bonus = 0;
int CritiqueDe = 0;
int Critiquex = 0;
int De = 0;
const int MAX = 20, MIN = 1;
srand(time(NULL));
De = (rand() % (MAX - MIN + 1)) + MIN;
char Case1[100], Case2[100], Case3[100];
int Passage2 = 0, Passage3 = 0, Passage4 = 0;



printf ("\t\t\t===Pathfinder===\n\n\n");

printf ("\t\t\t===Personages===\n\n\n");

char Personage1[100];
int INI1 = 0, PV1 = 0, CA1 = 0, BMO1 = 0, DMD1 = 0;
char Arme1o1[100], Arme1o2[100];
int BBA1o1 = 0, NbDe1o1 = 0, TypeDe1o1 = 0, Bonus1o1 = 0, CritiqueDe1o1 = 0, Critiquex1o1 = 0;
int BBA1o2 = 0, NbDe1o2 = 0, TypeDe1o2 = 0, Bonus1o2 = 0, CritiqueDe1o2 = 0, Critiquex1o2 = 0;

char Personage2[100];
int PV2 = 0, INI2 = 0, CA2 = 0, BMO2 = 0, DMD2 = 0;
char Arme2o1[100], Arme2o2[100];
int BBA2o1 = 0, NbDe2o1 = 0, TypeDe2o1 = 0, Bonus2o1 = 0, CritiqueDe2o1 = 0, Critiquex2o1 = 0;
int BBA2o2 = 0, NbDe2o2 = 0, TypeDe2o2 = 0, Bonus2o2 = 0, CritiqueDe2o2 = 0, Critiquex2o2 = 0;

int Continue = 0;

char Personage3[100];
int PV3 = 0, INI3 = 0, CA3 = 0, BMO3 = 0, DMD3 = 0;
char Arme3o1[100], Arme3o2[100];
int BBA3o1 = 0, NbDe3o1 = 0, TypeDe3o1 = 0, Bonus3o1 = 0, CritiqueDe3o1 = 0, Critiquex3o1 = 0;
int BBA3o2 = 0, NbDe3o2 = 0, TypeDe3o2 = 0, Bonus3o2 = 0, CritiqueDe3o2 = 0, Critiquex3o2 = 0;

char Personage4[100];
int PV4 = 0, INI4 = 0, CA4 = 0, BMO4 = 0, DMD4 = 0;
char Arme4o1[100], Arme4o2[100];
int BBA4o1 = 0, NbDe4o1 = 0, TypeDe4o1 = 0, Bonus4o1 = 0, CritiqueDe4o1 = 0, Critiquex4o1 = 0;
int BBA4o2 = 0, NbDe4o2 = 0, TypeDe4o2 = 0, Bonus4o2 = 0, CritiqueDe4o2 = 0, Critiquex4o2 = 0;




//1)
printf("\n\n\nPersonage 1\n\n");
scanf("%s", Personage1);
printf("\nInitiative\n");
scanf("%d", &INI1);
int Initiative1 = 0;
srand(time(NULL));
Initiative1 = 1+rand() % (20 + 1);
int Passage1 = Initiative1 + INI1;
char Case4 = Personage1;
printf("\nPV\n");
scanf("%d", &PV1);
printf("\nBBA (Bonus de Base a l'Attaque)\n");
scanf("%d", &CA1);
printf("\nBMO (Bonus de Manoeuvre Offensive)\n");
scanf("%d", &BMO1);
printf("\nDMD (Bonus de Manoeuvre Defensive)\n");
scanf("%d",& DMD1);
printf("\nArme 1\n");
scanf("%s", Arme1o1);
scanf("\n\n%d", &NbDe1o1);
printf ("d");
scanf("%d", &TypeDe1o1);
printf ("+");
scanf("%d", &Bonus1o1);
printf("\nArme 2\n");
scanf("%s", Arme1o2);
scanf("\n\n%d", &NbDe1o2);
printf ("d");
scanf("%d", &TypeDe1o2);
printf ("+");
scanf("%d", &Bonus1o2);

//2)
printf("\n\n\nPersonage 2\n\n");
scanf("%s", Personage2);
printf("\nInitiative\n");
scanf("%d", &INI2);
int Initiative2 = 0;
srand(time(NULL));
Initiative2 = 1+rand() % (20 + 1);
int Passage2o1 = Initiative2 + INI2 - Passage1;
int Passage2o2 = Passage1 - Initiative2 + INI2;
if (Passage2o1 > Passage2o2)
{
char Case3 = Personage2;
int Passage2 = Passage2o1;
}
else
{
char Case4 = Personage2, Case3 = Personage1;
int Passage2 = Passage2o2;
}
printf("\nPV\n");
scanf("%d", &PV2);
printf("\nBBA (Bonus de Base a l'Attaque)\n");
scanf("%d", &CA2);
printf("\nBMO (Bonus de Manoeuvre Offensive)\n");
scanf("%d", &BMO2);
printf("\nDMD (Bonus de Manoeuvre Defensive)\n");
scanf("%d",& DMD2);
printf("\nArme 1\n");
scanf("%s", Arme2o1);
scanf("\n\n%d", &NbDe2o1);
printf ("d");
scanf("%d", &TypeDe2o1);
printf ("+");
scanf("%d", &Bonus2o1);
printf("\nArme 2\n");
scanf("%s", Arme2o2);
scanf("\n\n%d", &NbDe2o2);
printf ("d");
scanf("%d", &TypeDe2o2);
printf ("+");
scanf("%d", &Bonus2o2);

printf("\nContinue?\n1. Oui\n2. Non\n\n");
scanf("%d", &Continue);

//3)
if (Continue == 1)
{
printf("\n\n\nPersonage 3\n\n");
scanf("%s", Personage3);
printf("\nInitiative\n");
scanf("%d", &INI3);
int Initiative3 = 0;
srand(time(NULL));
Initiative3 = 1+rand() % (20 + 1);
int Passage3o1 = Initiative3 + INI3 - Passage2;
int Passage3o2 = Passage2 - Initiative3 + INI3;
if (Passage3o1 > Passage3o2)
{
char Case2 = Personage3;
int Passage3 = Passage3o1;
}
else
{
char Case3 = Personage3, Case2 = Personage2;
int Passage3 = Passage3o2;
}
printf("\nPV\n");
scanf("%d", &PV3);
printf("\nBBA (Bonus de Base a l'Attaque)\n");
scanf("%d", &CA3);
printf("\nBMO (Bonus de Manoeuvre Offensive)\n");
scanf("%d", &BMO3);
printf("\nDMD (Bonus de Manoeuvre Defensive)\n");
scanf("%d",& DMD3);
printf("\nArme 1\n");
scanf("%s", Arme3o1);
scanf("\n\n%d", &NbDe3o1);
printf ("d");
scanf("%d", &TypeDe3o1);
printf ("+");
scanf("%d", &Bonus3o1);
printf("\nArme 2\n");
scanf("%s", Arme3o2);
scanf("\n\n%d", &NbDe3o2);
printf ("d");
scanf("%d", &TypeDe3o2);
printf ("+");
scanf("%d", &Bonus3o2);

printf("\nContinue?\n1. Oui\n2. Non\n\n");
scanf("%d", &Continue);
}
else
{
char Case2 = '.', Case1 = '.';
}


//4)
if (Continue == 1)
{
printf("\n\n\nPersonage 4\n\n");
scanf("%s", Personage3);
printf("\nInitiative\n");
scanf("%d", &INI3);
int Initiative4 = 0;
srand(time(NULL));
Initiative4 = 1+rand() % (20 + 1);
int Passage4o1 = Initiative4 + INI4 - Passage3;
int Passage4o2 = Passage3 - Initiative4 + INI4;
if (Passage4o1 > Passage4o2)
{
char Case1 = Personage4;
int Passage4 = Passage4o1;
}
else
{
char Case2 = Personage4, Case1 = Personage3;
int Passage4 = Passage4o2;
}
printf("\nPV\n");
scanf("%d", &PV3);
printf("\nBBA (Bonus de Base a l'Attaque)\n");
scanf("%d", &CA3);
printf("\nBMO (Bonus de Manoeuvre Offensive)\n");
scanf("%d", &BMO3);
printf("\nDMD (Bonus de Manoeuvre Defensive)\n");
scanf("%d",& DMD3);
printf("\nArme 1\n");
scanf("%s", Arme4o1);
scanf("\n\n%d", &NbDe4o1);
printf ("d");
scanf("%d", &TypeDe4o1);
printf ("+");
scanf("%d", &Bonus4o1);
printf("\nArme 2\n");
scanf("%s", Arme4o2);
scanf("\n\n%d", &NbDe4o2);
printf ("d");
scanf("%d", &TypeDe4o2);
printf ("+");
scanf("%d", &Bonus4o2);

printf("\nContinue?\n1. Oui\n2. Non\n\n");
scanf("%d", &Continue);
}
else
{
char Case1 = '.';
}


printf ("\t\t\t===Pathfinder===\n\n\n");
printf ("\t\t\t===Combat===\n\n\n");
printf("\n1.%s", Case1);
printf("\n2.%s", Case2);
printf("\n3.%s", Case3);
printf("\n4.%s", Case4);

__________________________________________________

J'aimerais afficher les noms des personnages selon la valeur de "passage" qui leur est attribué, la somme d'INI et d'Initiative
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 23/10/2015 à 16:48
Salut lmc-3,

Tu devrais créer une struct avec les différentes informations relatives à chaque personnage et créer un tableau de struct.

Cela te permettra de créer du code générique permettant de trier les données selon le contenu des membres de la structure sur lesquels tu souhaites te baser.

Sinon, en regardant en diagonale ton code, on y voit des choses bizarres, par exemple :

char Case4 = Personage1;
alors que Personnage1 est déclaré comme étant un
char Personage1[100];
, les types ne sont donc pas compatibles. En C,
Personage1
serait un pointeur vers le premier élément du tableau de char (si tu affectes cela à une variable sensée contenir un char, tu n'obtiens certainement pas l'effet recherché). Dans la mesure où tu revois ton code pour le rendre plus générique, tu vas gérer des numéros d'index sur ton tableau de struct, et cela sera plus simple.

srand(time(NULL));
ne devrait figurer qu'une seule fois dans ton code, au début du programme. Comme tu le fais figurer de multiples fois avant chaque tirage avec rand, ton code va produire le même tirage à chaque appel à rand s'il s'exécute dans une même seconde.

... dans ce que tu as posté, il manque aussi l'accolade fermante à ton main et un
return 0;
en fin de code, mais j'ai l'impression que tu n'as pas tout copié dans ton post, alors peut-être as tu mis cela dans ton code.

Tu devrais aussi te pencher sur l'usage de fonctions, pour alléger ta fonction main et rendre ton code plus générique et plus lisible.

Dal
0
lmc-3 Messages postés 597 Date d'inscription samedi 13 juin 2015 Statut Membre Dernière intervention 30 septembre 2024 68
Modifié par lmc-3 le 24/10/2015 à 16:31
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(int argc, char *argv[])
{
    int Boucle = 0;
    do
    {
    int*tab;
    int De = 0;
             const int MAX = 20, MIN = 1;
             srand(time(NULL));
             De = (rand() % (MAX - MIN + 1)) + MIN;
    char Ordre[100];
    char Personage[100];
    int INI, PV, BBA, CA, BMO, DMD;
    char Arme1, Arme2;
    int NbDe1, TypeDe1, Bonus1, CritiqueDe1, Critiquex1;
    int NbDe2, TypeDe2, Bonus2, CritiqueDe2, Critiquex2;
    int i;


    printf ("\t\t\t===Pathfinder===\n\n\n");

    printf ("\t\t\t===Personages===\n\n\n");


    printf("\n\n\nCombien de personages etes vous?\n");
    int NbPersonages;
    scanf("%d", &NbPersonages);
    tab=(int*)malloc(NbPersonages*sizeof(int));


    int Numero = 0, Passage = 0;



    for(i=0;i<NbPersonages;i++)
    {
    Numero++;
    printf("\n\n\nPersonage %d\n\n", Numero);
    scanf("%s", &Personage);
    printf("\nInitiative\n");
    scanf("%d", &INI);
    int Initiative = 0;
        srand(time(NULL));
        Initiative = 1+rand() % (20 + 1);
    int Passage = Initiative + INI;
    printf("\nPV\n");
    scanf("%d", &PV);
    tab=(int*)malloc(PV*sizeof(int));
    printf("\nBBA (Bonus de Base a l'Attaque)\n");
    scanf("%d", &BBA);
    tab=(int*)malloc(BBA*sizeof(int));
    printf("\nCA (Competence d'Armure)\n");
    scanf("%d", &CA);
    tab=(int*)malloc(CA*sizeof(int));
    printf("\nBMO (Bonus de Manoeuvre Offensive)\n");
    scanf("%d", &BMO);
    tab=(int*)malloc(BMO*sizeof(int));
    printf("\nDMD (Bonus de Manoeuvre Defensive)\n");
    scanf("%d",& DMD);
    tab=(int*)malloc(DMD*sizeof(int));
    printf("\nArme 1\n");
    scanf("%s", &Arme1);
    tab=(char*)malloc(Arme1*sizeof(char));
    scanf("\n\n%d", &NbDe1);
    tab=(int*)malloc(NbDe1*sizeof(int));
    printf ("d");
    scanf("%d", &TypeDe1);
    tab=(int*)malloc(TypeDe1*sizeof(int));
    printf ("+");
    scanf("%d", &Bonus1);
    tab=(int*)malloc(Bonus1*sizeof(int));
    scanf("%d", &CritiqueDe1);
    tab=(int*)malloc(CritiqueDe1*sizeof(int));
    printf("x\n");
    scanf("%d", &Critiquex1);
    tab=(int*)malloc(Critiquex1*sizeof(int));
    printf("\nArme 2\n");
    scanf("%s", &Arme2);
    tab=(char*)malloc(Arme2*sizeof(char));
    scanf("\n\n%d", &NbDe2);
    tab=(int*)malloc(NbDe2*sizeof(int));
    printf ("d");
    scanf("%d", &TypeDe2);
    tab=(int*)malloc(TypeDe2*sizeof(int));
    printf ("+");
    scanf("%d", &Bonus2);
    tab=(int*)malloc(Bonus2*sizeof(int));
    scanf("%d", &CritiqueDe2);
    tab=(int*)malloc(CritiqueDe2*sizeof(int));
    printf("x\n");
    scanf("%d", &Critiquex2);
    tab=(int*)malloc(Critiquex2*sizeof(int));
    }



    printf ("\t\t\t===Pathfinder===\n\n\n");
    printf ("\t\t\t===Combat===\n\n\n");


#define TRUE 1
#define FALSE 0

void tri_a_bulle(int*t,int n)
{
int j =0;
int tmp =0;
int en_desordre =1;
while(en_desordre)
    {
        en_desordre = FALSE;

        for(j =0; j < n-1; j++)
        {
            if(t[j] > t[j+1])
            {
                tmp = t[j+1];
                t[j+1] = t[j];
                t[j] = tmp;
                en_desordre = TRUE;
            }
        }
    }
}


tri_a_bulle(tab,Passage);

for(Passage=0;Passage<NbPersonages;Passage++)
    {
    int N;
    N++;
    printf("\n%d: %3s\n", N, tab[Personage]);
    }

} while (Boucle =! 0);
}


_________________________________________________________
J'ai allégé mon programme mais je ne sais toujours pas comment afficher les noms des personnages selon l'ordre de "Passage" attribué à ces derniers

Par exemple:
Perso A: Passage = 12
Perso B: Passage = 33
Perso C: Passage = 24
Perso D: Passage = 11

Sur l'écran:
1: B
2: C
3: A
4: D

?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lmc-3 Messages postés 597 Date d'inscription samedi 13 juin 2015 Statut Membre Dernière intervention 30 septembre 2024 68
24 oct. 2015 à 17:57
Je sens que je me rapproche mais je ne trouve pas l'erreur

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(int argc, char *argv[])
{
    int Boucle = 0;
    do
    {
    int*tab;
    int De = 0;
             const int MAX = 20, MIN = 1;
             srand(time(NULL));
             De = (rand() % (MAX - MIN + 1)) + MIN;
    char Personage[100];
    int INI, PV, BBA, CA, BMO, DMD;
    char Arme1[100], Arme2[100];
    int NbDe1, TypeDe1, Bonus1, CritiqueDe1, Critiquex1;
    int NbDe2, TypeDe2, Bonus2, CritiqueDe2, Critiquex2;
    int Numero = 0;
    char Passage[100];



    printf ("\t\t\t===Pathfinder===\n\n\n");
    printf ("\t\t\t===Personages===\n\n\n");


    printf("\n\n\nCombien de personages etes vous?\n");
    int NbPersonages;
    scanf("%d", &NbPersonages);
    tab=(int*)malloc(NbPersonages*sizeof(int));



    Personage[Numero];
    Passage[Numero];


    for(Numero=0;Numero<NbPersonages;)
    {
    Numero++;
    printf("\n\n\nPersonage %d\n\n", Numero);
    scanf("%s", &Personage[Numero]);
    tab=(char*)malloc(Personage[Numero]*sizeof(char));
    printf("\nInitiative\n");
    scanf("%d", &INI);
    int Initiative = 0;
        srand(time(NULL));
        Initiative = 1+rand() % (20 + 1);
    Passage[Numero] = Initiative + INI;
    tab=(int*)malloc(Passage[Numero]*sizeof(int));
    printf("\nPV\n");
    scanf("%d", &PV);
    tab=(int*)malloc(PV*sizeof(int));
    printf("\nBBA (Bonus de Base a l'Attaque)\n");
    scanf("%d", &BBA);
    tab=(int*)malloc(BBA*sizeof(int));
    printf("\nCA (Competence d'Armure)\n");
    scanf("%d", &CA);
    tab=(int*)malloc(CA*sizeof(int));
    printf("\nBMO (Bonus de Manoeuvre Offensive)\n");
    scanf("%d", &BMO);
    tab=(int*)malloc(BMO*sizeof(int));
    printf("\nDMD (Bonus de Manoeuvre Defensive)\n");
    scanf("%d",& DMD);
    tab=(int*)malloc(DMD*sizeof(int));
    printf("\nArme 1\n");
    scanf("%s", &Arme1);
    tab=(char*)malloc(Arme1[100]*sizeof(char));
    scanf("\n\n%d", &NbDe1);
    tab=(int*)malloc(NbDe1*sizeof(int));
    printf ("d");
    scanf("%d", &TypeDe1);
    tab=(int*)malloc(TypeDe1*sizeof(int));
    printf ("+");
    scanf("%d", &Bonus1);
    tab=(int*)malloc(Bonus1*sizeof(int));
    scanf("%d", &CritiqueDe1);
    tab=(int*)malloc(CritiqueDe1*sizeof(int));
    printf("x\n");
    scanf("%d", &Critiquex1);
    tab=(int*)malloc(Critiquex1*sizeof(int));
    printf("\nArme 2\n");
    scanf("%s", &Arme2);
    tab=(char*)malloc(Arme2[100]*sizeof(char));
    scanf("\n\n%d", &NbDe2);
    tab=(int*)malloc(NbDe2*sizeof(int));
    printf ("d");
    scanf("%d", &TypeDe2);
    tab=(int*)malloc(TypeDe2*sizeof(int));
    printf ("+");
    scanf("%d", &Bonus2);
    tab=(int*)malloc(Bonus2*sizeof(int));
    scanf("%d", &CritiqueDe2);
    tab=(int*)malloc(CritiqueDe2*sizeof(int));
    printf("x\n");
    scanf("%d", &Critiquex2);
    tab=(int*)malloc(Critiquex2*sizeof(int));
    }



    printf ("\t\t\t===Pathfinder===\n\n\n");
    printf ("\t\t\t===Combat===\n\n\n");


#define TRUE 1
#define FALSE 0



void tri_a_bulle(int*t,int n)
{
int j =0;
int tmp =0;
int en_desordre =1;
while(en_desordre)
    {
        en_desordre = FALSE;

        for(j =0; j < n-1; j++)
        {
            if(t[j] > t[j+1])
            {
                tmp = t[j+1];
                t[j+1] = t[j];
                t[j] = tmp;
                en_desordre = TRUE;
            }
        }
    }
}


tri_a_bulle(tab,Passage[Numero]);


for(Numero=0;Numero<=NbPersonages;)
{
Passage[Numero] = Personage[Numero];

    int N;
    N++;
    printf("\n%d: %s\n", N, Personage[Numero]);
}

} while (Boucle =! 0);
}
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
26 oct. 2015 à 13:59
Je n'ai pas tenté de compiler ton code, mais à première vue, voilà quelques remarques :

- en C, tu ne peux pas créer des fonctions à l'intérieur d'autres fonctions
- tu exécutes toujours plusieurs fois srand
- tab est un pointeur sur int dans ton code, tu alloues de la mémoire dessus avec malloc en écrasant à chaque allocation le pointeur précédent... bref, la mémoire allouée est inaccessible et ne te sert à rien (sauf la dernière allocation)
- tu n'utilises pas un tableau de struct
- il n'y a toujours pas de
return 0;
à la fin de ton main
- ...

Vois un cours de C sur les points suivants :

- la structure d'un programme en C
- apprends à déclarer un tableau
- apprends à déclarer une struct
- apprends à déclarer un tableau de struct
- apprends à déclarer une fonction
- commence avec de l'allocation statique, tu auras tout le temps de te compliquer la vie avec les mallocs dans tous les sens une fois que ton code fonctionnera correctement avec une allocation statique

Essaye de faire plus simple pour commencer, avec une structure limitée à une chaîne et un nombre, puis :

- commence déjà par afficher les données avec une boucle for
- quand tu as réussi à faire cela, passe au tri


Dal
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 26/10/2015 à 18:47
Salut lmc-3,

Voilà un exemple simplifié dont tu peux t'inspirer :

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

#define MAX_PERS 4

struct personnage {
    char nom[256];
    char metier[256];
    int PV;
};

void tri_bulle_nom(struct personnage * tab, int n) {
    int bulle;
    struct personnage echange;
    int i;

    do {
        bulle = 0;
        for (i=0; i<n-1; i++) {
            if(strcmp(tab[i].nom,tab[i+1].nom)>0) {
                echange = tab[i];
                tab[i] = tab[i+1];
                tab[i+1]  = echange;
                bulle = 1;
            }
        }
    } while (bulle);
}

void personnage_init(struct personnage * p, const char * st_nom,
        const char * st_metier, int PV) {
    strcpy(p->nom, st_nom);
    strcpy(p->metier, st_metier);
    p->PV = PV;
}

int main(void) {
    int i;
    struct personnage tableau[MAX_PERS];

    personnage_init(&tableau[0], "Riri", "Neveu", 10);
    personnage_init(&tableau[1], "Fifi", "Neveu", 10);
    personnage_init(&tableau[2], "Loulou", "Neveu", 10);
    personnage_init(&tableau[3], "Donald", "Oncle", 25);
    tri_bulle_nom(tableau, MAX_PERS);
    for (i = 0; i <= MAX_PERS - 1; i++) {
        printf("tab[%d]=%s (%s) - %d\n", i, tableau[i].nom,
                tableau[i].metier, tableau[i].PV);
    }

    return 0;
}

Ce n'est pas complet, ni parfait, mais le but est, je l'espère, de t'éclairer sur la mise en oeuvre de certains des conseils qui t'ont été donnés précédemment.


Dal
0
lmc-3 Messages postés 597 Date d'inscription samedi 13 juin 2015 Statut Membre Dernière intervention 30 septembre 2024 68
27 oct. 2015 à 14:05
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "Personages.h"
#include "tri_a_bulle.h"

int main(int argc, char *argv[])
{
    int Boucle = 0;
    do
    {
    Personages J;
    printf ("\t\t\t===Pathfinder===\n\n\n");
    printf ("\t\t\t===Personages===\n\n\n");


    printf("\n\n\nCombien de personages etes vous?\n");
    scanf("%d", &J.NbPersonages);

    for(J.Numero=0;J.Numero<J.NbPersonages;J.Numero++)
    {
    printf("\n\n\nPersonage %d\n\n", J.Numero+1);
    scanf("%s", &J.Personage[J.Numero]);
    printf("\nInitiative\n");
    scanf("%d", &J.INI);
        srand(time(NULL));
        J.Initiative = 1+rand() % (20 + 1);
    J.Passage = J.Initiative + J.INI;
    printf("\nPV\n");
    scanf("%d", &J.PV[J.Numero]);
    printf("\nBBA (Bonus de Base a l'Attaque)\n");
    scanf("%d", &J.BBA[J.Numero]);
    printf("\nCA (Competence d'Armure)\n");
    scanf("%d", &J.CA[J.Numero]);
    printf("\nBMO (Bonus de Manoeuvre Offensive)\n");
    scanf("%d", &J.BMO[J.Numero]);
    printf("\nDMD (Bonus de Manoeuvre Defensive)\n");
    scanf("%d",& J.DMD[J.Numero]);
    printf("\nArme 1\n");
    scanf("%s", &J.Arme1[J.Numero]);
    scanf("\n\n%d", &J.NbDe1);
    printf ("d");
    scanf("%d", &J.TypeDe1[J.Numero]);
    printf ("+");
    scanf("%d", &J.Bonus1[J.Numero]);
    scanf("%d", &J.CritiqueDe1[J.Numero]);
    printf("x\n");
    scanf("%d", &J.Critiquex1[J.Numero]);
    printf("\nArme 2\n");
    scanf("%s", &J.Arme2[J.Numero]);
    scanf("\n\n%d", &J.NbDe2[J.Numero]);
    printf ("d");
    scanf("%d", &J.TypeDe2[J.Numero]);
    printf ("+");
    scanf("%d", &J.Bonus2[J.Numero]);
    scanf("%d", &J.CritiqueDe2[J.Numero]);
    printf("x\n");
    scanf("%d", &J.Critiquex2[J.Numero]);
    }



    printf ("\t\t\t===Pathfinder===\n\n\n");


    tri_a_bulle(J.PointeurPassage,J.Passage);



    printf ("\t\t\t===Combat===\n\n\n");




int i;
for(i=0;i<J.NbPersonages;i++)
{
    printf("\n%d: %s\n", i+1, J.PointeurPassage[i]);
}
system("PAUSE");
} while (Boucle =! 0);
}



#include <stdio.h>
#include <stdlib.h>
#include <time.h>




typedef struct Personages Personages;
struct Personages
{
    int NbPersonages;
    char Personage[100];
    char*PointeurPersonage;
    int Initiative;
    int INI[100], PV[100], BBA[100], CA[100], BMO[100], DMD[100];
    char Arme1[100], Arme2[100];
    int NbDe1[100], TypeDe1[100], Bonus1[100], CritiqueDe1[100], Critiquex1[100];
    int NbDe2[100], TypeDe2[100], Bonus2[100], CritiqueDe2[100], Critiquex2[100];
    int Numero;
    int*PointeurNumero;
    int Passage;
    int*PointeurPassage;
};


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "Personages.h"


void tri_bulle_nom(struct Personages * tab, int n)
{
    int bulle;
    struct Personages echange;
    int i;

    do {
        bulle = 0;
        for (i=0; i<n-1; i++)
        {
            if(strcmp(tab[i].Passage,tab[i+1].Passage)>0)
            {
                echange = tab[i];
                tab[i] = tab[i+1];
                tab[i+1]  = echange;
                bulle = 1;
            }
        }
    } while (bulle);
}
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 27/10/2015 à 16:06
Salut lmc-3,

1.

Tu as pris le temps t'écrire plus de 100 lignes de code, mais tu as oublié de prendre le temps de poser ta question.

Compiles avec les warnings et corrige tous les warnings et erreurs.

Tu ne devrais pas écrire une telle masse de code sans vérifier et tester régulièrement que ce que tu écris compile proprement et s'exécute comme tu le souhaites, surtout quand tu débutes.

Tu as un compilateur, utilise le. Commence sur quelques lignes de code saines, et construit à partir de là.

On ne peut pas faire cet effort à ta place.

Si tu ne comprends pas certains messages du compilateur, documentes toi et cherche par toi même, si tu ne sais pas, pose la question ici.

2.

Sinon, voilà quelques indications à la lecture de ton code.

En principe, on ne met que des déclarations dans les fichiers .h, qui ont chacun un fichier .c qui est leur pendant avec les implémentations, définitions et initialisations, et chaque .h est protégé par des

#ifndef MON_FICHIER_H
#define MON_FICHIER_H

(... contenu ici ...)

#endif

Cela permet d'utiliser les .h de façon modulaire dans chaque source qui a besoin d'y faire appel, sans risquer de produire des doublons qui feront échec à la construction de l'exécutable.

Le style est important en C, car le langage est tellement flexible qu'on peut rapidement faire n'importe quoi. Lis cela : http://www.umich.edu/~eecs381/handouts/CHeaderFileGuidelines.pdf je trouve ce document très bon sur cette question.

3.

Je ne t'ai pas dit de créer une struct pour y mettre tous tes personnages, mais de créer une struct pour rassembler tes données relatives à un personnage, et de créer un tableau de struct pour énumérer, trier, bref.. gérer tous tes personnages.

Ta struct devrait s'appeler "personnage" (comme dans mon exemple).

Cette façon de procéder permet de trier les personnages en permutant les struct contenues dans le tableau, comme dans mon exemple.

Je ne t'ai pas dit de créer un typedef, mais fait ce que tu veux. Sinon, il y a deux n à "personnage".

4.

Pour la 3ème fois, je te rappelle que tu continues d'utiliser srand de façon répétée (dans la boucle for). Cette instruction doit être exécutée une seule fois dans le programme, car elle sert à initialiser le générateur de nombres aléatoires. Met la au début de ton code et sort la de la boucle. Je ne le répéterai plus, j'ai atteint mon quota :-)

5.

strcmp()
nécessite
string.h
, qui est manquant dans ton code.

6.

Tu définis la fonction
tri_bulle_nom()
, mais tu appelles
tri_a_bulle()
. Si tu rectifies le nom, tu verras que de toutes façons ton appel n'est pas bon, car tu n'appelles pas la fonction avec des arguments ayant des types correspondants.

7.

L'opérateur "différent" est
!=
et pas
=!
qui réalise une affectation.

8.

Les messages d'erreur et warnings du compilateur te dirigeront vers d'autres erreurs de types incompatibles utilisés dans les scanf, printf, dans les opérations arithmétiques.


Dal
0