Probleme de boucle infinie

Résolu
cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008 - 11 juin 2007 à 07:11
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 - 3 sept. 2007 à 21:47
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

cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
11 juin 2007 à 08:05
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 ...
3
thomwebster Messages postés 63 Date d'inscription mercredi 7 février 2007 Statut Membre Dernière intervention 14 juin 2007
11 juin 2007 à 08:12
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
3
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
11 juin 2007 à 12:23
si je ne me trompe pas, l'équation est :     B   OU   (A ET C)

Loki
3
cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008
11 juin 2007 à 12:26
Merci Beaucoup pour vos reponsses, apres le bac je m'y repanche
0

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

Posez votre question
mogwai93 Messages postés 361 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 19 mars 2015
11 juin 2007 à 20:43
Je rajouterais aussi un test sur j dans le while pour éviter un débordement de tableau
0
cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008
18 août 2007 à 20:54
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
0
cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008
3 sept. 2007 à 17:57
[auteurdetail.aspx?ID=632043 Loki6]
pourrait tu me dire comment tu trouve l'equation ? car je galere la
0
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
3 sept. 2007 à 18:22
B   OU   (A ET C) :

if (B |  (A & C) )
0
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
3 sept. 2007 à 18:23
lol

euh plutot

B || A && C;

mdr
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
3 sept. 2007 à 18:45
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
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
3 sept. 2007 à 18:47
rectification : "6) 'a' et 'c' y arrivent et non pas <strike>'a' et 'b'</strike>"

Loki
0
cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008
3 sept. 2007 à 20:05
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.
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
3 sept. 2007 à 21:09
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
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
3 sept. 2007 à 21:46
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
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
3 sept. 2007 à 21:47
j'espère que c'est clair. et je suppose que ton schéma est :

Loki
0
Rejoignez-nous