Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème lors de l'execution d'un programme C

Sujet résolu
    23 octobre 2008 à 21:24:21

    Bonjour,

    Lors de l'exécution du programme ci-dessous, j'arrive jusqu'au dernier stade, précisément à la ligne 35 et le vista affiche un message qui dit que le programme a cessé de fonctionner (voir la capture d'écran)

    Programme:
    #include <cstdlib>
    #include <iostream>
    #define crtg 3
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int nbtr, i, j, tractu, crtj, k;
        // nbtr est le nombre de tirages successifs
        // i,j,k sont des compteurs
        // tractu est le numéro du dernier tirage
        // crtu est le nombre de carte jouées
        
        printf("Donner le numero du dernier tirage: ");scanf("%d",&tractu); //lecture du numéro du dernier tirage
        printf("\nDonner le nombre de tirages successifs: ");scanf("%d",&nbtr); // lecture du nombre de tirages successifs
        
        int tab[nbtr][crtg];
        // tab contiendra les 12 cartes sorties à chaque tirage
        // crt contiendra les cartes jouées
        int tab1[nbtr];
        // tab1 contiendra le nombre de cartes sorties parmi les cartes jouées dans chaque tirage
        
        for(i=0;i<nbtr;i++) // boucle de lectures des cartes gagnates par tirage 
        {printf("\nDonner les cartes gagnantes du %dieme tirage:",tractu-i);
        for(j=0;j<3;j++){printf("\nCarte %d :",j+1); scanf("%s",&tab[i][j]);}}
        
        int crt[crtj];
        printf("\nDonner le nombre de cartes jouees: "); scanf("%d",&crtj); // lecture du nombre de cartes jouées
        
        printf("\nDonner les cartes jouees:"); // lecture des cartes jouées
        for(i=0;i<crtj;i++){printf("\nCarte %d: ",i+1);scanf("%s",&crt[i]);}
        
        for(i=0;i<nbtr;i++) tab1[i]=0; // initialisation 
        
        for(i=0;i<nbtr;i++) // i pour le tirage
        {for(j=0;i<crtg;j++) // j pour la jème carte sortie
        {for(k=0;k<crtj;j++) // k pour la kième carte jouée
        if(tab[i][j]==crt[k]) tab1[i]++;} 
        printf("\n%d / %d dans le tirage numero %d",tab1[i],crtj,tractu-i);}
    getchar();getchar();    
    }
    


    Capture d'écran:
    Image utilisateur

    J'ai essayé de l'exécuter sur windows xp, et toujours le même problème, j'ai redouté que ça soit un problème dans l'utilisation de for...{for...{for...}}, mais je ne suis pas sûr, merci de votre aide!
    • Partager sur Facebook
    • Partager sur Twitter
      23 octobre 2008 à 21:29:52

      Le forum C c'est à côté. Car a part les headers je vois pas de C++, de plus indente ton code car là c'est illisible.
      • Partager sur Facebook
      • Partager sur Twitter
        23 octobre 2008 à 21:54:11

        Je suis désolé si ce n'est pas le bon lieu, de toute façon j'ai encore du mal à distinguer c du c++ o_O Modo help! :euh:

        Concernant mon problème, j'aimerais juste savoir si c'est à cause du code ou de la machine, si le problème est dans le code, alors je soupçonne qu'il se situe sur cette dernière portion (de la ligne 35 à la fin)
        for(i=0;i<nbtr;i++) // i pour le tirage
            {for(j=0;i<crtg;j++) // j pour la jème carte sortie
            {for(k=0;k<crtj;j++) // k pour la kième carte jouée
            if(tab[i][j]==crt[k]) tab1[i]++;} 
            printf("\n%d / %d dans le tirage numero %d",tab1[i],crtj,tractu-i);}
        
        • Partager sur Facebook
        • Partager sur Twitter
          23 octobre 2008 à 22:24:38

          Le problème vient du faite que dans la deuxieme boucle tu ne donne pas de limite à atteindre à j, et dans la troisième tu n'incremente pas k. Ce qui en resulte une boucle infini.

          Ce serait plutot ça :

          for(i=0;i<nbtr;i++) // i pour le tirage
              {for(j=0;j<crtg;j++) // j pour la jème carte sortie
              {for(k=0;k<crtj;k++) // k pour la kième carte jouée
              if(tab[i][j]==crt[k]) tab1[i]++;} 
              printf("\n%d / %d dans le tirage numero %d",tab1[i],crtj,tractu-i);}
          


          Après je ne sais pas ce que tu veux faire exactement.
          • Partager sur Facebook
          • Partager sur Twitter
            23 octobre 2008 à 23:24:16

            Merci sebi!

            Mon œil, j'ai fait un tas de fautes d'inattention, je croyais que rien n'échappe au débogueur, or c'est non, ce dernier a laissé passer mes fautes.. ;)

            Et là voilà le programme qui marche:
            #include <cstdlib>
            #include <iostream>
            #define crtg 3
            using namespace std;
            
            int main(int argc, char *argv[])
            {
                int nbtr, i, j, tractu, crtj, k;
                // nbtr est le nombre de tirages successifs
                // i,j,k sont des compteurs
                // tractu est le numéro du dernier tirage
                // crtu est le nombre de carte jouées
                
                printf("Donner le numero du dernier tirage: ");scanf("%d",&tractu); //lecture du numéro du dernier tirage
                printf("\nDonner le nombre de tirages successifs: ");scanf("%d",&nbtr); // lecture du nombre de tirages successifs
                
                int tab[nbtr][crtg];
                // tab contiendra les 12 cartes sorties à chaque tirage
                // crt contiendra les cartes jouées
                int tab1[nbtr];
                // tab1 contiendra le nombre de cartes sorties parmi les cartes jouées dans chaque tirage
                
                for(i=0;i<nbtr;i++) // boucle de lectures des cartes gagnates par tirage 
                {printf("\nDonner les cartes gagnantes du %dieme tirage:",tractu-i);
                for(j=0;j<crtg;j++){printf("\nCarte %d :",j+1); scanf("%d",&tab[i][j]);}}
                
                printf("\nDonner le nombre de cartes jouees: "); scanf("%d",&crtj); // lecture du nombre de cartes jouées
                int crt[crtj];
                
                printf("\nDonner les cartes jouees:"); // lecture des cartes jouées
                for(i=0;i<crtj;i++){printf("\nCarte %d: ",i+1);scanf("%d",&crt[i]);}
                
                for(i=0;i<nbtr;i++) tab1[i]=0; // initialisation 
                
                for(i=0;i<nbtr;i++) // i pour le tirage
                {for(j=0;j<crtg;j++) // j pour la jème carte sortie
                {for(k=0;k<crtj;k++) // k pour la kième carte jouée
                if(tab[i][j]==crt[k]) tab1[i]++;} 
                printf("\n%d / %d dans le tirage numero %d",tab1[i],crtj,tractu-i);}
            getchar();getchar();    
            }
            

            Pour T-S-L, en fait ce programme est une ébauche d'un programme plus complexe, qui fera des calculs rapides de gains, ainsi que des probabilités associées à des mises données dans un jeu de casino, ou on tire 12 cartes gagnantes parmi 36, et dont les gains sont calculer à partir du tableau ci-dessous:
            Image utilisateur
            Exemple: Si tu as misé 2 euro, et joué 9 cartes, si tu as trouvé 8 bonne cartes, tu gagne 1000 euro.
            En bref c'est un programme qui permettra de manier le tableau précédent.
            • Partager sur Facebook
            • Partager sur Twitter
              23 octobre 2008 à 23:30:16

              Euh c'est un peu bizarre ton truc, les headers et le using namespace sont en C++ mais printf () et scanf () du C... Tu mélanges pas un ptit peu par hasard? :p
              • Partager sur Facebook
              • Partager sur Twitter
                23 octobre 2008 à 23:39:57

                Salut Goost,

                Désolé, mais je ne sais vraiment ce que c'est..

                J'ai du peine a distinguer la différence entre le C et le C++ :(
                • Partager sur Facebook
                • Partager sur Twitter
                  24 octobre 2008 à 0:10:07

                  Citation : mrkwala

                  Salut Goost,

                  Désolé, mais je ne sais vraiment ce que c'est..

                  J'ai du peine a distinguer la différence entre le C et le C++ :(



                  C'est un problème, parce que ce sont quand même deux langages très différents. Va falloir faire un choix.

                  Est-ce que tu comprends ce que tu fais quand tu écris ça ?
                  #include <cstdlib>
                  #include <iostream>
                  using namespace std;
                  


                  "using namespace std;" sert à simplifier la référence aux fonctions et classes de la bibliothèque standard du C++... que tu n'utilises absolument pas puisque tout ton code est du code C.

                  Supprime tes include, recompile ton code, et pour chaque fonction que ton compilateur ne reconnaitra pas, inclus les headers dont il a besoin (tapes "man <la fonction>" dans google, c'est écrit dans le synopsis quel header inclure).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 octobre 2008 à 1:52:46

                    Merci mcyrb pour l'explication, je vais chercher plus...
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Problème lors de l'execution d'un programme C

                    × 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