[C] boucle

Fermé
johan - 15 nov. 2005 à 10:43
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 - 15 nov. 2005 à 14:05
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

dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
15 nov. 2005 à 11:16
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
0
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 _ .
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
15 nov. 2005 à 11:29
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
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
15 nov. 2005 à 11:36
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
0

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

Posez votre question
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
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
15 nov. 2005 à 11:46
Dans ton for il manque pas un if?
Apres tout tu en mets bien un dans ton while...

a+
dje-dje
0
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 .
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
15 nov. 2005 à 12:11
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
0
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
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
15 nov. 2005 à 12:28
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
0
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...
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
15 nov. 2005 à 13:27
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
0
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 ;-)
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
15 nov. 2005 à 13:33
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
0
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; 
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 :-)
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
15 nov. 2005 à 13:40
Mais le if en commentaire pour voir s'il t'ecrit correctement ta phrase

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

a+
dje-dje
0
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?
0