condition

Le
John Ramm
Bonjour,

j'ai un comportement bizarre d'un programme..

char const a[] = "arf yop/bijoure";
do {


if ((a[i] != ' ') || (a[i] != '/'))

printf("%c", a[i]);

++i;

} while ((a[i] != 'e'));



normalement il devrait afficher:

arfyopbijoure



cependant ce n'est pas le cas. pq?



merci
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Kevin Barbier
Le #583603
Bonjour,

John Ramm wrote:
if ((a[i] != ' ') || (a[i] != '/'))


if ((a[i] != ' ') && (a[i] != '/'))

Ca marchera mieux comme ca ;)

Luc Martineau
Le #583602
Bonjour,
Bonjour


j'ai un comportement bizarre d'un programme..

char const a[] = "arf yop/bijoure";
do {


if ((a[i] != ' ') || (a[i] != '/'))
Est-ce que "i" est initialisé ?



printf("%c", a[i]);

++i;

} while ((a[i] != 'e'));



normalement il devrait afficher:

arfyopbijoure



cependant ce n'est pas le cas. pq?



merci


en espérant d'avoir aidé, avec plaisir.

Luc

Horst Kraemer
Le #583601
On Thu, 4 Mar 2004 21:45:45 +0100, "John Ramm" wrote:

Bonjour,

j'ai un comportement bizarre d'un programme..

char const a[] = "arf yop/bijoure";
do {


if ((a[i] != ' ') || (a[i] != '/'))

printf("%c", a[i]);

++i;

} while ((a[i] != 'e'));



normalement il devrait afficher:

arfyopbijoure



cependant ce n'est pas le cas. pq?


parce que la condition


a[i] != ' ' || a[i] != '/'

est toujours vraie pour n'importe quel a[i].

--
Horst

Anthony Fleury
Le #583600
John Ramm wrote:

Bonsoir

char const a[] = "arf yop/bijoure";
do {
if ((a[i] != ' ') || (a[i] != '/'))
printf("%c", a[i]);
++i;
} while ((a[i] != 'e'));
normalement il devrait afficher:

arfyopbijoure



Non ce n'est pas la sortie normale de ce bout de code.
Tu lui demande d'afficher a[i] si ce caractère est différent d'un espace ou
si il est différent d'un /.

pour le a le r et le f il est différent des deux, pour l'espace, il est
différent de / donc il affiche l'espace, pour yop il est different des
deux, et pour le / il est différent d'espace donc il affiche aussi le /.

En clair, tu voulais surement :

if(a[i] != ' ' && a[i] != '/') printf("%c", a[i]);
La il faut qu'il soit différent de ' ' ET de '/' pour afficher le caractère.

Anthony
--
"I should have seen it would be this way
I should have known from the start what she's up to
When you have loved and you've lost someone
You know what it feels like to lose" -- The Rasmus

Emmanuel Delahaye
Le #583599
In 'fr.comp.lang.c', "John Ramm"
j'ai un comportement bizarre d'un programme..

char const a[] = "arf yop/bijoure";
do {


if ((a[i] != ' ') || (a[i] != '/'))

printf("%c", a[i]);

++i;

} while ((a[i] != 'e'));

normalement il devrait afficher:

arfyopbijoure

cependant ce n'est pas le cas. pq?


Parce que l'équation booleenne est fausse.

if (a[i] != ' ' && a[i] != '/')

ou

if (!(a[i] != ' ' || a[i] != '/'))

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Régis Troadec
Le #583596
Salut,

"John Ramm" 404794ac$
Bonjour,

j'ai un comportement bizarre d'un programme..

char const a[] = "arf yop/bijoure";
do {


if ((a[i] != ' ') || (a[i] != '/'))

printf("%c", a[i]);

++i;

} while ((a[i] != 'e'));



Precision :

Si tu veux afficher le e a la fin, ce n'est pas bon,
qd l'expression du while est evaluee lorsque l'on arrive sur
la lettre e, celle-ci devient fausse, par consequent, tu manques un
tour de boucle.
Si c'est toute la chaine que tu veux traiter, utilise le caractere de fin de
chaine ''
(zero, pas o) ajouté implicitement a l'initialisation du tableau a :


char const a[] = "arf yop/bijoure";

do {
if ( (a[i] != ' ') && (a[i] != '/') )
{
printf("%c", a[i]);
}
++i;
} while ((a[i] != ''));


Regis

Marc Lasson
Le #583595
John Ramm wrote:

Tu voulais certainement faire :

if ((a[i] != ' ') && (a[i] != '/'))

Je vais tenter d'expliquer, mais ca risque d'être barbant.

if ((a[i] != ' ') || (a[i] != '/'))
printf("%c", a[i]);


En francais, ca donne:

Si dans la case il n'y a pas espace (A) OU s'il n'y a pas un slash (B),
Alors afficher son contenu.

si on a un espace A est vrai et B est faux, donc (A ou B) est vrai, donc
on affiche.
si on a un slash A est faux et B est vrai, donc (A ou B) est vrai, donc
on affiche.
si on a un autre caractere, A et B sont vrais, donc (A ou B) est vrai,
donc on affiche.

bah c'est quand qu'on affiche pas ? c'est quand A ET B sont faux.
C'est-à-dire quand la case contient un espace et qu'elle contient un
slash. Mais elle ne contient jamais les deux, donc ce cas ne se produit
jamais.

Au [tout] debut quand on a un peu de mal avec la logique, on peut
faire ce qu'on appelle une table de vérité.

A : "la case ne contient pas un espace" (a[i] != ' ')
B : "la case ne contient pas un slash" (a[i] != '')
C : "la case doit etre affichée" (ce qu'il y a dans le if)

(V pour Vrai et F pour Faux)

A | B | C
---------
V | V | V On reconnait l'opération logique ET,
V | F | F donc C = A ET B.
F | V | F
F | F | F C'est pourquoi il faut utiliser && et non ||.

--
Marc.

Régis Troadec
Le #583594
Salut,

"Emmanuel Delahaye"
In 'fr.comp.lang.c', "John Ramm"
j'ai un comportement bizarre d'un programme..

char const a[] = "arf yop/bijoure";
do {


if ((a[i] != ' ') || (a[i] != '/'))

printf("%c", a[i]);

++i;

} while ((a[i] != 'e'));

normalement il devrait afficher:

arfyopbijoure

cependant ce n'est pas le cas. pq?


Parce que l'équation booleenne est fausse.

if (a[i] != ' ' && a[i] != '/')

ou

if (!(a[i] != ' ' || a[i] != '/'))


Oups, mauvaise application du theoreme de De Morgan,
tu voulais dire ( !( !(a[i] != ' ') || !(a[i] != '/') ) )

Regis

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/



Yves ROMAN
Le #583367

In 'fr.comp.lang.c', "John Ramm"
j'ai un comportement bizarre d'un programme..
[...]



Parce que l'équation booleenne est fausse.

if (a[i] != ' ' && a[i] != '/')

ou

if (!(a[i] != ' ' || a[i] != '/'))
Lapsus :

if (!(a[i] == ' ' || a[i] == '/'))


Yves ROMAN
Le #583366

Salut,

"John Ramm" 404794ac$
Bonjour,

j'ai un comportement bizarre d'un programme..

char const a[] = "arf yop/bijoure";
do {


if ((a[i] != ' ') || (a[i] != '/'))

printf("%c", a[i]);

++i;

} while ((a[i] != 'e'));



Precision :

Si tu veux afficher le e a la fin, ce n'est pas bon,
qd l'expression du while est evaluee lorsque l'on arrive sur
la lettre e, celle-ci devient fausse, par consequent, tu manques un
tour de boucle.
Si c'est toute la chaine que tu veux traiter, utilise le caractere de fin de
chaine ''
(zero, pas o) ajouté implicitement a l'initialisation du tableau a :

char const a[] = "arf yop/bijoure";

do {
if ( (a[i] != ' ') && (a[i] != '/') )
{
printf("%c", a[i]);
}
++i;
} while ((a[i] != ''));



Si la chaine est vide, tu risques de déborder.
(Au fait, ca donne quoi printf("%c",0) ?)

Il vaut mieux un while-do qu'un do-while :

for ( i=0 ; a[i] != '' ; i++ )
{
if ( (a[i] != ' ') && (a[i] != '/') )
{
printf("%c", a[i]);
}
}


Publicité
Poster une réponse
Anonyme