[C] boucle [Fermé]

Signaler
-
dje-dje
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
-
bonjour , j'ai cette boucle :

while ( ( c = getchar() ) != EOF )

{



if ( c == ' ' )

putchar(b);


}


avec le for j'ai écrit çà mais çà ne marche pas...



for ( c = getchar() != EOF; c == ' ' )

quelqu'un a une idée de l'équivalent avec for ?
merci

21 réponses

Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
Un "for" doit recevoir 3 arguments et tu n'en donnes que 2.
Tu as des erreurs à la compilations?

Sinon, j'essaierais ca:
for ( c ; c = getchar() != EOF; c == ' ' )
ou
for ( c = getchar() ;c = getchar() != EOF; c == ' ' )


a+
dje-dje
non çà ne va pas , ah c'est fou ce que for est équivalent de while...

voici mon code avec while , ce programme remplace les espaces par _ :

int c;
char b = '_';

while ( ( c=getchar() ) !=EOF )
{
if ( c == '_' )
putchar(b);
}
return 0;

alors l'équivalent avec for c'est quoi , car j'ai essayé ta méthode dje , et quand je compile et que je lance le programme , je tape une phrase , j'appuie sur entrée , et il m'envoit une ligne de _ _ _ _ _ au lieu de remplacer les espaces par _ .
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
Reste cool.
For et while sont equivalents et font la même chose à 2 différences prêts qui sont les 2 arguments supplémentaires du for:
- On peut initialiser une variable qui servira de compteur
- On precise quel est la variable incrémenté et son incrémentation
Dans un while tu es obligé de préciser ces 2 données autrement:
- En initialisant ta variable compteur avant le while
- En incrémentant la variable compteur "à la main"

Met tout ton code pour que je puisse t'aider +

a+
dje-dje
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
Exemple de 2 boucles equivalents

Avec un while:
int i=0;
int som = 0;
while ( i<=10)
{
som=som+i;
}
printf("maintenant som vaut %d",som);

Avec un for:
int som = 0;
int i;
for(i=0;i<=10;i=i+1)
{
som = som +i;
}
printf("maintenant som vaut %d",som);


a+
dje-dje
code avec while :

int c;
char b = '_';

while ( ( c=getchar() ) !=EOF )
{
if ( c == '_' )
putchar(b);
}
return 0; 


code avec for :

int c;
char b = '_';

for ( c = getchar() ;c = getchar() != EOF; c == ' ' ) 
putchar(b);
}
return 0
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
Dans ton for il manque pas un if?
Apres tout tu en mets bien un dans ton while...

a+
dje-dje
non il ne manque pas de if , c'est incroyable que personne n'ait la solution à ce problème quand même , je commence à avoir les nerfs çà fait 1 journée que je suis deçu !
merci de ton aide dje .
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
Et si, il manque un if.
Dans ton while tu places ceci:
if ( c == '_' ) putchar(b);

Pourquoi n'est il pas dans ton for?

a+
dje-dje
il n'est pas dans le for , car le for c'est censé allégé le code ( donc entre autre d'enlever les if ) , puis si je lis littéralement ma bouycle for , çà me donne :

(pour la variable c qui prend un caractère en entrée ; si ce caractère est différent de EOF ; si ce caractère est égal à un espace )

putchar(b); /* j'affiche le contenu de la variable b */

c'est comme çà que je lis mon code moi
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
FAUX!
Archi faux!

Avec le while:
int c;
char b = '_';
while ( ( c=getchar() ) !=EOF )
{
if ( c == '_' )
putchar(b);
}
return 0;

Ca se lit:
Je crée un int c et un char b auquel j'affecte la valeur '_'
Tant que c qui recupere une valeur via getchar différente EOF
Si c est un '_' alors putchar(b)

Avec le for, tu mets ca:
int c;
char b = '_';
for ( c = getchar() ;c = getchar() != EOF; c == ' ' )
//en relisant , l'incrementation à la fin du for est louche (3em param)
putchar(b);
}
return 0

Ca se lit:
Je crée un int c et un char b avec la valeur '_'
Pour c allant de getchar à '' si c n'est pas EOF alors je fais putchar(b)
Mais dans le while tu as une deuxieme condition:
si c est un '_' alors putchar(b)

Un programme fait ce que tu lui demandes. Si ca compile et que ca ne fait pas ce que tu veux, c'est que tu te trompes.
Un for vaut un while. Mais ce que tu mets dans le while (a part l'incrementation) doit se retrouver dans le for.

Je te refait schematiquement
WHILE:
creation compteur et initialisation
while (condition d'arret souvent avec le compteur)
{
Ce que tu veux
Incrementation compteur
}

FOR:
creation compteur
for(initialisation compteur; condition d'arret svt avec compteur;incrementation compteur)
{
ce que tu veux
}

C'est OK?

a+
dje-dje
non je regrette ce n'est pas clair bon sang :

FOR:
creation compteur
for(initialisation compteur; condition d'arret svt avec compteur;incrementation compteur)
{
ce que tu veux
}

alors dans mon cas déjà il n'y a pas de compteur , on incrémente rien .

for ( c = getchar() ;c = getchar() != EOF; c == ' ' )

pour c qui prend un caractère en entrée ( ici çà va , j'initialise le truc ); si c est différent de EOF ( condition d'arret du compteur , pas de problème ); et ensuite mon c == ' ' n'est pas une incrémentation .

et tu as fait une petite erreur dans la lecture de mon code :

Si c est un '_' alors putchar(b) , c'est faux , moi je veux dire , si c est un espace ' ' , alors on remplace par _ , et non si c est '_' , mais bon c'est une inattention de ta part je crois , alors peux tu m'écrire le contenu du for car je nage complètement...
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
Quelle est l'operation que tu fais quand tu passes d'un caractere à l'autre? Tu refais un getchar().
Je pense que tu t'ai un peu pris les pinceaux dans la syntaxe du while qui est tres condensé.

Ton while (c'est un copier coller:
int c;
char b = '_';
while ( ( c=getchar() ) !=EOF )
{
if ( c == '_' )
putchar(b);
}
return 0;
Peut s'ecrire:
char b='_'
int c=getchar(); //initialisation
while(c != EOF) // while (condition)
{
if ( c == '_' ) putchar(b);// a priori c'est c==" " mais g copié collé
c = getchar(); // "incrementation"
}
C'est la même chose, mais moins d'instruction par ligne, ce qui est conseillé pour la clarté du code.(En dehors de toute consideration d'efficacité)

Le for donne donc:
int c;
char b='_';
for(c = getchar() ; c != EOF ; c = getchar())
// for (initialisation ; condition ; "incrementation")
{
if ( c == '_' ) putchar(b);// a priori c'est c==" " mais g copié collé
}

Tu vois mieux ce que je veux dire?

a+
dje-dje
oui , là pour le for je vois parfaitement mieux , c'est quand tu as écrit qu'on refait le getchar() , en fait c'est l'incrémentation , donc là çà va bcp mieux je te remercie pour ta patience .

PS : je préfère mon écriture while que la tienne , je la trouve plus claire , mais c'est une question de gout ;-)
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
De rien!
Je n'ecris pas comme ca mes whiles ^^
Je l'ai fait pour décomposer pour etayer mes propos.
L'ecriture de ton while est tout a fait correct. Par contre elle est moins "lisible".

a+
dje-dje
Je reprends ton code

int c; 
char b = '_'; 

while ( ( c=getchar() ) !=EOF ) 
{ 
if ( c == '_' ) 
putchar(b); 
} 

return 0;

Il ya une incrémentation, celle ci se apsse au niveau du getchar().
getchar lit le caractère et passe au caractère suivant.

Donc le for doit se comporter de la meme façon :

Initialisation :
 c=getchar()   
//Ceci n'est exécuté qu'au démarrage du fort

Condition :
 c!=EOF
//testé à chaque fois
Incrémentation :
c=getchar()
//fait à chaque passage dans le for

d'où le code :

int c; 
char b = '_'; 

for(c=getchar(); c!=EOF; c=getchar())
{ 
if ( c == '_' ) 
putchar(b); 
} 
return 0; 
on a crié victoire trop vite lol

voici mon code :

int c;
char b = '_';
for ( c = getchar() ; c != EOF; c = getchar() )
if ( c == ' ' )
putchar(b);
}
return 0 ;


je compile , je lance le prog , ensuite j'écris une phrase :

salut comment tu vas

je tape sur entrée et il m'affiche :

_ _ _

hors il devrait m'afficher :

salut_comment_tu_vas :-)
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
Mais le if en commentaire pour voir s'il t'ecrit correctement ta phrase

a+
dje-dje
Messages postés
1072
Date d'inscription
dimanche 11 février 2001
Statut
Membre
Dernière intervention
29 janvier 2006
206
for ( c = getchar() ; c != EOF ; c = getchar() ) {
  if ( c == ' ' ) c = '_' ;
  putchar(c) ;
}
Messages postés
10475
Date d'inscription
mardi 6 janvier 2004
Statut
Modérateur
Dernière intervention
28 janvier 2011
692
Ca semble plus simple
Marrant car depuis le debut il ne doit pas nous donner le bon code pour son while

a+
dje-dje
oui dje peut etre que je ne donne pas le bon while , d'où la confusion , par contre je reviens sur ce code :

for ( c = getchar() ; c != EOF ; c = getchar() ) {
if ( c == ' ' ) c = '_' ; /* cette ligne ici , je n'ai pas appris à écrire comme ceci , je précise que je débute le C depuis quelques jours */
putchar(c) ;
}

moi je pensais faire çà :

for ( c = getchar() ; c != EOF ; c = getchar() ) {
if ( c == ' ' )
putchar(b) ;
else if ( c != ' ' )
putchar (c)
}

qu'en dites vous?
1 2