Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

condition

11 réponses
Avatar
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

10 réponses

1 2
Avatar
Kevin Barbier
Bonjour,

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


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

Ca marchera mieux comme ca ;)

Avatar
Luc Martineau
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

Avatar
Horst Kraemer
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

Avatar
Anthony Fleury
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

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "John Ramm" wrote:

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/

Avatar
Régis Troadec
Salut,

"John Ramm" a écrit dans le message de news:
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

Avatar
Marc Lasson
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.

Avatar
Régis Troadec
Salut,

"Emmanuel Delahaye" a écrit dans le message de news:

In 'fr.comp.lang.c', "John Ramm" wrote:

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/



Avatar
Yves ROMAN

In 'fr.comp.lang.c', "John Ramm" wrote:

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] == '/'))


Avatar
Yves ROMAN

Salut,

"John Ramm" a écrit dans le message de news:
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]);
}
}


1 2