cs_darkwhite
Messages postés133Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention29 avril 2008
-
11 juin 2007 à 07:11
Loki6
Messages postés286Date d'inscriptiondimanche 27 novembre 2005StatutMembreDernière intervention27 décembre 2009
-
3 sept. 2007 à 21:47
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)
thomwebster
Messages postés63Date d'inscriptionmercredi 7 février 2007StatutMembreDernière intervention14 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
//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)
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.
cs_darkwhite
Messages postés133Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention29 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.
Loki6
Messages postés286Date d'inscriptiondimanche 27 novembre 2005StatutMembreDernière intervention27 décembre 20092 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