Probleme de boucle infinie [Résolu]

Signaler
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008
-
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
-
Salut à tous,
a, b, c, résultat, ----
0, 0, 0, 0, ----
0, 0, 1, 0, ----
0, 1, 0, 1, ----
0, 1, 1, 1, ----
1, 0, 0, 0, ----
1, 0, 1, 1, ----
1, 1, 0, 1, ----
1, 1, 1, 1

Je veux ecrire une table de verité dans un tableau dont l'equation m'est incconuue (car j'ai la fleme de la calculer ). Ensuite le but du programme est qu'a partir de 3 nombres entré il me donne le resultat de la ligne corespondante.
J'ecris donc le code ;
#include <stdio.h>

int main()
{printf("test");
  int table[4][8],i=0,j=0,k=4;
  int a,b,c;

  //Mise a zero du tableau
  printf("test2");
  for(i=0;i<4;i++)
    {
      for(j=0;j<8;j++)
    {
      table[i][j]=0; }
    }

  //Remplissage de la table
  for (i=0;i<4;i++)
    {
      for(j=0;j<8;j+=k)
    {
      table[i][j]=1;
   
      }  
      //Pour la colonne suivante l'etat change deux fois plus frequement
      k/=2;
    }

  //Ecriture des resultats
  // On pourrai le faire avec des operateurs logiques mais je ne suis pas arrivé a calculer l'equation
  table[3][2]=1;
  table[3][3]=1;
  table[3][5]=1;
  table[3][6]=1;
  table[3][7]=1;
  j=0;

  scanf("%d",&a);
  scanf("%d",&b);
  scanf("%d",&c);

  //Recherche de la ligne correspondante
  while(table[0][j]!=a && table[1][j]!=b && table[2][j]!=c)
    {
      j++;
    }
  printf("%d",table[3][j]);

  return 0;
}

Bon bien sur sa ne march pas, mais ce qui m'étonne le plus, c'est que j'ai mis un printf a la premiere ligne du code et qu'a l'execution aucun texte n'apparait.
En lançant la commande top j'ai remarqué que mon prog partait en espece de boucle infinie  (il prenait 90% du proc)

Donc pourquoi il part en sucette comme ça dejà ?

15 réponses

Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009

Salut,

Bon pour commencer un printf si tu veux qu'il t'affiche la ligne il faut ajouter un \n a la fin de la chaine:

printf("test\n");

il reste bloqué dans ta boulce while:

dans le cas ou a b ou c n"existe pas il ne sort jamais de la boucle ...
Messages postés
63
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
14 juin 2007

Salut a toi!
Bon alors chez moi tes deux printf de test s'affiche bien.
En fait si tu veux faire des affichage test de debug utilise fprintf(stderr,"test"); car cette fonction écrit dans la sortie standard et n'est pas bufferisée. C'est à dire qu'elle écrit a l'écran tout de suite alors que printf attend que le buffer soit plein... printf à été ocnçu ainsi car a chaque écriture il y a un appel system et ton programme perd le processeur (cf ordonnanceur ou scheduleur pour + de détails), ainsi en utilisant un buffer il stock plusieurs choses a écrire avant de faire l'appel system, pour en faire le moins possible. L'avantage de printf est qu'il est plus rapide que fprintf mais son inconvénient et que si le programme plante il est possible qu'il n'écrive pas ce que tu lui a dit d'écrire car le buffer n'est pas plein (ou qu'il n'y a pas eu d'autre appel system)... fprintf lui crache tout ce que tu lui donne... Cela peut donc vraiment ralentir un programme qui à chaque affichage perd le processeur mais qui par contre "doit" être utilisé en phase de debug.
Pour ta boucle infini, elle vient de là:
//Remplissage de la table
  for (i=0;i<4;i++)
    {
      for(j=0;j<8;j+=k)
    {
      table[i][j]=1;
   
      }  
      //Pour la colonne suivante l'etat change deux fois plus frequement
      k/=2;
    }
En fait j'ai un peu de mal à voir comment tu veux remplir ta table... C'est la première table que tu a mis au début de ton poste que tu veux obtenir? Si tel est le cas, autant ne pas la calculer mais la rentrer en dur comme ceci:
int table[4][8]={0,0,0,0,0,0,1,0,0,1,0,1,0,1,1,1,1,0,0,0,1,0,1,1,1,1,0,1,1,1,1,1};

C'est une initialisation à la définition, ça marche comme ça:
type Nom_du_tableau [Taille1][Taille2]...[TailleN] = {elem1, elem2, ... elemX};

Les valeurs sont attribuées aux éléments successifs en incrémentant d'abord les indices de droite,
c'est-à-dire pour un tableau à 2 dimensions : [0][0], [0][1], [0][2] ... puis [1][0] etc.
Tiens moi au courrant de l'avancement de ton programme et n'hésite pas à me demander si tu a des questions...
Bonne continuation.
Thom
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
si je ne me trompe pas, l'équation est :     B   OU   (A ET C)

Loki
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008

Merci Beaucoup pour vos reponsses, apres le bac je m'y repanche
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

Je rajouterais aussi un test sur j dans le while pour éviter un débordement de tableau
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008

Bon mon en est là :

#include <stdio.h>

int main()
{
  int table[4][8]={0,0,0,0,0,0,1,0,0,1,0,1,0,1,1,1,1,0,0,0,1,0,1,1,1,1,0,1,1,1,1,1};
int  i=0,j=0,k=4;
  int a,b,c;

  //Mise a zero du tableau

  for(i=0;i<4;i++)
    {
      for(j=0;j<8;j++)
    {
      table[i][j]=0;
    }
    }

 
  table[3][2]=1;
  table[3][3]=1;
  table[3][5]=1;
  table[3][6]=1;
  table[3][7]=1;
  j=0;
  printf("remplie\n");
  scanf("%d",&a);
  scanf("%d",&b);
  scanf("%d",&c);

  //Recherche de la ligne correspondante
  while(table[0][j]!=a && table[1][j]!=b && table[2][j]!=c)
    {
      j++;printf("x\n");
    }
  printf("%d\n",table[3][j]);

  return 0;
}

A l'execution il scanf mes trois variables. Or il ne reagit pas et ne renvoie rien et se termine.
Je ne comprends pas car je pensse que les conditions sont bonnes ? (la preuve que non mais bon)


http://montagne-liberte.homedns.org
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008

[auteurdetail.aspx?ID=632043 Loki6]
pourrait tu me dire comment tu trouve l'equation ? car je galere la
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009

B   OU   (A ET C) :

if (B |  (A & C) )
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009

lol

euh plutot

B || A && C;

mdr
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
darkwhite >> t'as ton tableau de vérité comme ça :
a, b, c, résultat, ----
0, 0, 0, 0, ----
0, 0, 1, 0, ----
0, 1, 0, 1, ----
0, 1, 1, 1, ----
1, 0, 0, 0, ----
1, 0, 1, 1, ----
1, 1, 0, 1, ----
1, 1, 1, 1

la première chose que je vois c'est qu'à chaque fois que 'b' est TRUE alors le résultat est TRUE.
ensuite le seul autre cas ou le résultat est TRUE c'est quand 'a' et 'c' sont tous les deux TRUE.
on obtient donc l'équation : B   OU   (A ET C).

une autre approche consiste à regarder ligne par ligne
1) quand 'a','b','c' sont FALSE le résultat est FALSE.
2) si 'c' est TRUE on a encore FALSE donc 'c' seul ne sert à rien.
3) on voit que 'b' seul permet de mettre le résultat TRUE.
4) 'b' et 'c' y arrivent aussi, mais 'b' y arrive tout seul et 'c' est un incapable.
5) 'a' tout seul n'y arrive pas non plus.
6) par contre 'a' et 'b' oui ! c'est la première fois que le résultat est TRUE sans 'b'.
7) 'a' et 'b' mettent le résultat à TRUE, mais comme pour 'b' et 'c', 'a' est un incapable et 'b' on sait que 'b' peut faire le boulot tout seul.
8) 'a', 'b', 'c' sont TRUE et le résultat aussi.

on en déduit encore que B peut mettre le résultat à TRUE ou bien (A et C).

La dernière ligne nous prouve que ce n'est pas exclusif !

j'espère que ça te va comme explication. bon courage.

Loki
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
rectification : "6) 'a' et 'c' y arrivent et non pas <strike>'a' et 'b'</strike>"

Loki
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008

Je prefere la premiere approche mdr
En fait moi ma technique (mauvaise) etait de simplifier l'equation donnée par la table
a, b, c, résultat, ----
0, 0, 0, 0, ----
0, 0, 1, 0, ----
0, 1, 0, 1, ----
0, 1, 1, 1, ----
1, 0, 0, 0, ----
1, 0, 1, 1, ----
1, 1, 0, 1, ----
1, 1, 1, 1
Donc poour tous les cas ou resultat = 1
!a * b * !c + !a * b * c + a* !b * !c +a*b*!c+a*b*c+a*!b*c
J'ai trouver des tas de simplifications differentes a chaque essais quand  je changais  le facteur commun pour la simplification.
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
c'est une méthode correcte mais faut pas se tromper à la réduction. je crois que c'est un truc comme ça :

b + bc + ac + ab + abc = R

b(1+c+a+ac) + ac = R

b + ac = R

de toute façon toutes les méthodes sont les mêmes c'est juste le point de vue qui change.

Loki
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
j'ai fais le détail avec les non et les oui et j'espère que je vais sauter suffisamment de ligne pour que tout reste bien aligné comme dans le brouillon

_ _   _      _      _  



ABC + ABC + ABC + ABC + ABC = R
_  _       _       _
AB(C+C) + ABC + AB(C+C) = R
_     _
AB + ABC + AB = R
  _       _
B(A+A) + ABC = R
     _
B + ABC = R

B + AC = R

   _                                     _B+ABC R se partage en deux : B R et ABC = R

B = R veut dire que quel que soit les valeurs de 'A' et 'C' lorsque 'B' est TRUE, 'R' sera TRUE.

et de la même manière 'R' sera TRUE si 'A' TRUE, 'B' FALSE et 'C' TRUE
                          _donc on a R ABC et R AbC donc on peut
            _
simplifier AbC en AC puisque B n'a pas

d'importance





Loki
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
j'espère que c'est clair. et je suppose que ton schéma est :

Loki