Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau et informations aléatoires

Initialiser un tableau et récupérer aléatoirement des chaines

Sujet résolu
    23 janvier 2021 à 12:38:33

    Bonjour,

    Je débute dans la programmation C et j'essaie de me faire des programmes pour me familiariser avec le langage.

    Je voudrais essayer de faire un code qui me permet de créer un tableau de caractère avec une longueur explicite et de pouvoir récupérer aléatoirement ma chaîne de caractère et l'afficher.

    Donc déjà je pensais faire un tableau mais est-ce qu'on peut rentrer plusieurs chaines de caractères dans un tableau comme cela :

    Mon code :

    Bien sûr, ce code ne se compile pas.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
       char* tableau[3];
       int i;
       char film;
       extern int rand();
    
       tableau[0]="Film1";
       tableau[1]="Film2";
       tableau[2]='/0';
    
       for(i=0;;i<=3;i++)
       {
          film=rand(tableau[i]);
       }
    
       printf("Vous allez regarder :\n");
       printf("%d",film);
    
       return 0;
    }



    J'ai trouvé pleins de site qui parle de récupérer des nombres aléatoire mais pas des chaines de caractères, peut-être que cela est impossible ? 

    Est-ce que l'idée de faire un tableau est la meilleur solution ?

    Donc le but est de :

    - Créer un tableau de longueur explicite

    - Lire ce tableau

    - Récupérer aléatoirement une des chaines de caractère

    - L'afficher

    J'espère avoir été assez claire, demandez moi plus de précision si ce n'est pas le cas.

    Merci.

    Edit : J'ai pensé à faire autrement, est-ce que ce ne serait pas mieux de créer un fichier.txt avec mes titres de films (par exemple), d'aller lire dans ce fichier et de pouvoir ressortir aléatoirement un des titres qui est inscrit dans le fichier ?

    -
    Edité par ArnaudD_ 24 janvier 2021 à 18:13:52

    • Partager sur Facebook
    • Partager sur Twitter
      23 janvier 2021 à 13:03:38

      Bonjour, j'ai modifié le titre de votre sujet, en effet "[Problème]" n'a rien à y faire. Si vous postez on se doute que vous avez un problème, inutile de l'indiquer dans le titre du sujet, cela n'apporte aucune information quant au contenu du sujet.

      Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        23 janvier 2021 à 14:04:27

        Oui tu peux référencer plusieurs chaîne dans un tableau, soit faire comme tu as fait un tableau de pointeur sur char ou chaque pointeur pointe sur une chaîne de caractère, ou alors un tableau de tableau de char ou chaque tableau de char contiendra une chaîne de caractère.

        Pour l'aléatoire tu as les fonction rand et srand.

        Si tu veux choisir une chaîne aléatoirement dans le tableau, c'est sur l'indice du tableau qu'il faut agir ! 

        • Partager sur Facebook
        • Partager sur Twitter
          23 janvier 2021 à 16:02:36 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


            23 janvier 2021 à 16:09:13

            Attention à poster ton code correctement sur le forum avec le bouton </> comme te l'a déjà rappelé AbcAbc6 un peu plus haut ...
            • Partager sur Facebook
            • Partager sur Twitter
              23 janvier 2021 à 16:10:11

              AbcAbc6 a écrit:

              Merci de colorer votre code à l'aide du bouton Code </>

              La fonction rand renvoi bien un entier, et tu dois te servir de cet entier pour sélectionner la case du tableau via son indice !

              Un petit tuto à son sujet : https://nicolasj.developpez.com/articles/libc/hasard/
              • Partager sur Facebook
              • Partager sur Twitter
                23 janvier 2021 à 16:27:14

                Attention: en C, un tableau de N cases a son indice qui va de 0 à N-1 ....
                • Partager sur Facebook
                • Partager sur Twitter

                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  23 janvier 2021 à 16:45:06

                  Je n'ai pas compris le but.

                  Tu veux placer des chaînes de caractères dans un tableau, et ensuite tu vas en tirer plusieurs au hasard. C'est bien ça ? Combien, et selon quels critères ?

                  Je pose cette question parce que, dans ta boucle, tu effectues autant de tirages qu'il y a de chaînes, du coup je me demande si le but n'est pas plus précis : tirer au hasard la liste de toutes les chaînes de caractères les unes après les autres sans remise

                  -
                  Edité par robun 23 janvier 2021 à 16:45:42

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 janvier 2021 à 18:29:47

                    Bonjour

                    ArnaudD_ a écrit:

                    Donc déjà je pensais faire un tableau mais est-ce qu'on peut rentrer plusieurs chaines de caractères dans un tableau

                    Il y a plusieurs possibilités, par exemple:

                    #include <stdio.h>
                    
                    void ex1(void)
                    {
                    	const char *stringsArray[] = {
                    		"Marc", "Luc", "Jean"
                    	};
                    	puts(stringsArray[0]);
                    	puts(stringsArray[1]);
                    	puts(stringsArray[2]);
                    }
                    
                    void ex2(void)
                    {
                    	const char *stringsArray[3];
                    	stringsArray[0] = "Marc";
                    	stringsArray[1] = "Luc";
                    	stringsArray[2] = "Jean";
                    	puts(stringsArray[0]);
                    	puts(stringsArray[1]);
                    	puts(stringsArray[2]);
                    }
                    
                    int main(void)
                    {
                    	ex1();
                    	ex2();
                    	return 0;
                    }



                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 janvier 2021 à 18:13:15

                      magma a écrit:

                      Attention à poster ton code correctement sur le forum avec le bouton </> comme te l'a déjà rappelé AbcAbc6 un peu plus haut ...


                      D'accord, excusez moi, je pensais qu'en faisant des captures d'écran je n'avais pas besoin de faire cela.

                      robun a écrit:

                      Je n'ai pas compris le but.

                      Tu veux placer des chaînes de caractères dans un tableau, et ensuite tu vas en tirer plusieurs au hasard. C'est bien ça ? Combien, et selon quels critères ?

                      Je pose cette question parce que, dans ta boucle, tu effectues autant de tirages qu'il y a de chaînes, du coup je me demande si le but n'est pas plus précis : tirer au hasard la liste de toutes les chaînes de caractères les unes après les autres sans remise

                      -
                      Edité par robun hier à 16:45


                      Bonjour,

                      Le but est de tirer une seule chaine du tableau au hasard et sans remise.

                      Du coup ma fonction rand() devrait être à l'extérieur de la boucle ?

                      edgarjacobs a écrit:

                      Attention: en C, un tableau de N cases a son indice qui va de 0 à N-1 ....

                      Oui, c'est bien ce que j'ai fais en faisant cela ?

                      int main(int argc, char **argv)
                      {
                         char* tableau[3];
                      
                        tableau[0]="Film1";
                        tableau[1]="Film2";
                        tableau[2]='/0';
                      
                      }

                      Je ne vois pas pourquoi vous dites cela, ce serait dans ma boucle for que je me suis trompé ? sur (i<=3) ?

                      Marc Mongenet a écrit:

                      Bonjour

                      Il y a plusieurs possibilités, par exemple:

                      #include <stdio.h>
                      
                      void ex1(void)
                      {
                      	const char *stringsArray[] = {
                      		"Marc", "Luc", "Jean"
                      	};
                      	puts(stringsArray[0]);
                      	puts(stringsArray[1]);
                      	puts(stringsArray[2]);
                      }
                      
                      void ex2(void)
                      {
                      	const char *stringsArray[3];
                      	stringsArray[0] = "Marc";
                      	stringsArray[1] = "Luc";
                      	stringsArray[2] = "Jean";
                      	puts(stringsArray[0]);
                      	puts(stringsArray[1]);
                      	puts(stringsArray[2]);
                      }
                      
                      int main(void)
                      {
                      	ex1();
                      	ex2();
                      	return 0;
                      }

                       D'accord, merci pour cette information !





                      -
                      Edité par ArnaudD_ 24 janvier 2021 à 18:30:43

                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 janvier 2021 à 18:36:43

                        ArnaudD_ a écrit:

                        Je ne vois pas pourquoi vous dites cela, ce serait dans ma boucle for que je me suis trompé ? sur (i<=3) ?s

                        Il y a une erreur de syntaxe de le for que tu as posté, et le plus petit ou égal est aussi erroné.

                        Voici un exemple d'affichage avec une boucle:

                        #include <stdio.h>
                        
                        int main(void)
                        {
                        	const char *ts[3] = { "Marc", "Luc", "Jean" };
                        	for (int i = 0; i < 3; i++)
                        		printf("%d. %s\n", i+1, ts[i]);
                        	return 0;
                        }
                        




                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 janvier 2021 à 18:59:50

                          Marc Mongenet a écrit:

                          Il y a une erreur de syntaxe de le for que tu as posté, et le plus petit ou égal est aussi erroné.

                          Voici un exemple d'affichage avec une boucle:

                          #include <stdio.h>
                          
                          int main(void)
                          {
                          	const char *ts[3] = { "Marc", "Luc", "Jean" };
                          	for (int i = 0; i < 3; i++)
                          		printf("%d. %s\n", i+1, ts[i]);
                          	return 0;
                          }
                          


                          Ah oui d'accord. Merci !



                          -
                          Edité par ArnaudD_ 24 janvier 2021 à 19:04:37

                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 janvier 2021 à 19:05:28

                            Tu n'as pas besoin de boucle, la fonction rand te renvoi un entier et tu te sert de cet entier comme indice pour obtenir la case du tableau !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 janvier 2021 à 19:48:53

                              ArnaudD_ a écrit:

                              Le but est de tirer une seule chaine du tableau au hasard et sans remise.

                              Du coup ma fonction rand() devrait être à l'extérieur de la boucle ?

                              Du coup, et comme l'a dit rouloude, il n'y a pas besoin de boucle.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 janvier 2021 à 20:06:12

                                Bonjour,

                                Merci à tous pour votre aide !

                                [EDIT] Le code fonctionne correctement.

                                include <stdio.h>
                                include <stdlib.h>
                                include <time.h>
                                 
                                int main(void)
                                {
                                   int i;
                                   const int MIN=0, MAX=3;
                                   srand(time(NULL));
                                   const char *stringArray[4]
                                 
                                   stringArray[0]="Film1";
                                   stringArray[1]="Film2";
                                   stringArray[2]="Film3";
                                   stringArray[3]="Film4";
                                 
                                   i=(rand()%(MAX-MIN+1))+MIN;
                                 
                                   printf("Vous allez regarder :\n");
                                   puts(stringsArray[i]);
                                 
                                   return 0;
                                }



                                -
                                Edité par ArnaudD_ 24 janvier 2021 à 20:38:37

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 janvier 2021 à 20:15:04

                                  ArnaudD_ a écrit:

                                  Le code fonctionne correctement.

                                  include <stdio.h>
                                  include <stdlib.h>
                                  include <time.h>
                                  
                                  int main(void)
                                  {
                                     int i;
                                     const int MIN=0, Max=9;
                                     srand(time(NULL));
                                     const char *stringArray[10]
                                  
                                     stringArray[0]="Film1";
                                     stringArray[1]="Film2";
                                     stringArray[2]="Film3";
                                     stringArray[3]="Film4";
                                  
                                     i=(rand()%(MAX-MIN+1))+MIN;
                                  
                                     printf("Vous allez regarder :\n");
                                     puts(stringsArray[i]);
                                  
                                     return 0;
                                  }



                                  Ben non, ça va planter. Lors de la prochaine exécution, ou demain, ou dans ... .Tu n'as pas initialisé stringArray[4] à [9]. Donc le puts(), qui attend un \0 pour la fin de la chaine, pourrait ne jamais le rencontrer avec ces indices-là.

                                  Edit: ligne 20, stringsArray n'est pas connu, et il manque un ; ligne 10. Et tant que j'y suis, ligne 17, MAX n'est pas non plus connu.

                                  -
                                  Edité par edgarjacobs 24 janvier 2021 à 20:22:10

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                    24 janvier 2021 à 20:26:00

                                    edgarjacobs a écrit:

                                    Ben non, ça va planter. Tu n'as pas iniitalisé stringAarray[4] à [9]. Donc le puts(), qui attend un \0 pour la fin de la chaine, pourrait ne jamais le rencontrer avec ces indices-là.

                                    Je me suis trompé en retranscrivant mon code, mais dans mon programme j'ai bien :

                                    MAX=3 

                                    et const char *stringArray[4]



                                    -
                                    Edité par ArnaudD_ 24 janvier 2021 à 20:26:50

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 janvier 2021 à 20:30:23

                                      ArnaudD_ a écrit:

                                      Je me suis trompé en retranscrivant mon code, mais dans mon programme j'ai bien :

                                      MAX=3 

                                      et const char *stringArray[4]



                                      Vachement drôle :colere:

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                        24 janvier 2021 à 20:36:21

                                        edgarjacobs a écrit:

                                                       Vachement drôle :colere:

                                        Excusez moi, ce n'était pas une plaisanterie et pour l'instant je ne peux pas faire de copier coller de mon code via la machine virtuelle sur ma machine hôte.



                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          24 janvier 2021 à 20:37:15

                                          De toute façon Max=9 n'aurait pas compilé car Max != de MAX !

                                          Tu retapes le code au clavier sur le forum ?!  Fait plutôt un copier coller ça évite ce genre d'étourderies !

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            24 janvier 2021 à 20:39:39

                                            rouloude a écrit:

                                            De toute façon Max=9 n'aurait pas compilé car Max != de MAX !

                                            Tu retapes le code au clavier sur le forum ?!  Fait plutôt un copier coller ça évite ce genre d'étourderies !


                                             Je ne peux pas faire de copier coller de mon code via la machine virtuelle sur ma machine hôte, pour l'instant.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Tableau et informations aléatoires

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown