Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1307 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Une ligne de commande avec FOR que je comprends pas

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Une ligne de commande avec FOR que je comprends pas

n°1028962
zaynyy
Posté le 29-03-2005 à 20:37:54  profilanswer
 

Bonsoir,
désolé mais je ne savais pas ou mettre ce topic.
Il y a une ligne de commande que je n'arrive pas a saisir :
 
 
#include <stdio.h>
main()
{
 /* Déclarations */
 char TXT[201]; /* chaîne donnée       */
 int I,J;  /* indices courants         */
 int L;    /* longueur de la chaîne    */
 int C;    /* compteur des lettres 'e' */
 int AIDE; /* pour l'échange des caractères */
 
 /* Saisie des données */
 printf("Entrez une ligne de texte (max.200 caractères) :\n" );
 gets(TXT); /* L'utilisation de scanf est impossible pour */
 /* lire une phrase contenant un nombre variable de mots. */
 
 /* a) Compter les caractères */
 /* La marque de fin de chaîne '\0' est */
 /* utilisée comme condition d'arrêt. */
 for (L=0; TXT[L]; L++)
     ;
 printf("Le texte est composé de %d caractères.\n",L);
 
    getch();
    return 0;
}  
 
 
La boucle for se traduit comment svp?
Moi je lis, "pour l'entier L allant de 0 au caractere contenu en TXT[L] par pas de 1"
Et ce je ne comprends pas comment on peut partir d'un entier et arriver a un type caractere.
J'ai surement mal traduit cette ligne.
 
 
Cela se lit peut être pour le charactere contenu en TXT[0] au charactere contenue en TXT[L] non?


Message édité par zaynyy le 29-03-2005 à 20:41:27
mood
Publicité
Posté le 29-03-2005 à 20:37:54  profilanswer
 

n°1028966
Chronoklaz​m
Posté le 29-03-2005 à 20:41:13  profilanswer
 

Surement que L est la longueur de la chaine que tu vas recuperer sur ta ligne de commande, non ?


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1028969
WhatDe
Posté le 29-03-2005 à 20:44:35  profilanswer
 

Tant que TXT[L] est vrai.


---------------
[:whatde]
n°1028977
zaynyy
Posté le 29-03-2005 à 20:48:08  profilanswer
 

Ou sinon, c'est peut etre :
 
avec  
 
for ( <init.> ; <cond. répétition> ; <compteur> )
 
Pour L=0 on incrémente, tant que TXT[L] ... je ne sais pas cette condition de répitition!

n°1028982
WhatDe
Posté le 29-03-2005 à 20:49:42  profilanswer
 

WhatDe a écrit :

Tant que TXT[L] est vrai.


Bref tant que TXT[0] != '\0' ...


---------------
[:whatde]
n°1028984
zaynyy
Posté le 29-03-2005 à 20:51:27  profilanswer
 

WhatDe a écrit :

Tant que TXT[L] est vrai.


 
 
Ok merci !
Mais comment peut il etre vrai ou faux? C'est pas encore concret...
TXT[L] est bien un caractere ?

n°1028988
zaynyy
Posté le 29-03-2005 à 20:55:16  profilanswer
 

Ah ok merci tu répond plus vite que ma question!

n°1029007
zaynyy
Posté le 29-03-2005 à 21:14:33  profilanswer
 

WhatDe a écrit :

Bref tant que TXT[0] != '\0' ...


 
ce n'est pas plutot tant que TXT[L] != '\0'   ?
Car TXT[0] = caractere contenue en 0, dans la premiere case (premiere lettre de la chaine) donc il est fixe.
 
 
Pourquoi on ecrit pas plutot :
 
 
for (L=0; TXT[L] != '\0'; L++)
 
 
?


Message édité par zaynyy le 29-03-2005 à 21:33:45
n°1029055
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-03-2005 à 21:52:19  profilanswer
 

zaynyy a écrit :

Ok merci !
Mais comment peut il etre vrai ou faux? C'est pas encore concret...
TXT[L] est bien un caractere ?


Oui, mais quand il vaut 0 (ou '\0, c'est pareil) il est 'faux' (En C : 0=faux et <>0=vrai). Il vaut 0 quand on tombe sur le marqueur de fin de chaine.
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1029057
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-03-2005 à 21:54:04  profilanswer
 

zaynyy a écrit :


Pourquoi on ecrit pas plutot :

for (L=0; TXT[L] != '\0'; L++)




On pourrait. Mais les codeurs C aiment bien le code compact... Parfois ça devient illisible...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 29-03-2005 à 21:54:04  profilanswer
 

n°1029058
FlorentG
Unité de Masse
Posté le 29-03-2005 à 21:54:42  profilanswer
 

zaynyy a écrit :


Pourquoi on ecrit pas plutot :
 
 
for (L=0; TXT[L] != '\0'; L++)
 
 
?


Parce que c'est pareil, et ça fait 8 caractères en moins :D

n°1029077
zaynyy
Posté le 29-03-2005 à 22:17:33  profilanswer
 

Humm OK, bien reçu.
Donc TXT[L] dans cette ligne de commande peut etre traduite par "tant que TXT[L] est vrai, soit tant qu'il n'est pas égal à 0, marqueur de fin de chaine" .

n°1029316
Sve@r
Posté le 30-03-2005 à 02:50:03  profilanswer
 

zaynyy a écrit :

Humm OK, bien reçu.
Donc TXT[L] dans cette ligne de commande peut etre traduite par "tant que TXT[L] est vrai, soit tant qu'il n'est pas égal à 0, marqueur de fin de chaine" .


 
Exact
En fin de boucle, L contient le nb de caractères significatifs de "TXT" (sans compter l'octet valant '\0')

n°1029318
matafan
Posté le 30-03-2005 à 03:15:25  profilanswer
 

Il connaissait pas strlen() le gars ?

n°1029325
jagstang
Pa Capona ಠ_ಠ
Posté le 30-03-2005 à 04:24:17  profilanswer
 

matafan a écrit :

Il connaissait pas strlen() le gars ?


nettement moins performant


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°1029349
el muchach​o
Comfortably Numb
Posté le 30-03-2005 à 08:28:41  profilanswer
 

zaynyy a écrit :


Pourquoi on ecrit pas plutot :
 
for (L=0; TXT[L] != '\0'; L++ )
 
?


Te plains pas, il aurait même pu écrire  
 
for (L=0; TXT[L++]; )
 
 
voire, s'il est vraiment tordu
 
L = 0;
for (;L[TXT++]; )
 
:D
(tiens, un ancien jocebug qui est revenu, le ; final a disparu si je ne mets pas d'espace avant la parenthèse)
 
JagStang > en quoi strlen est moins performant ? Je dirais plutôt le contraire.


Message édité par el muchacho le 30-03-2005 à 08:34:55
n°1029363
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-03-2005 à 08:58:23  profilanswer
 

el muchacho a écrit :


L = 0;
for (;L[TXT++]; )



L = 0;
while (L[TXT++])


Citation :

JagStang > en quoi strlen est moins performant ? Je dirais plutôt le contraire.


Bof, je dirais que c'est pareil mais tant qu'on a pas fait les mesures...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1029401
el muchach​o
Comfortably Numb
Posté le 30-03-2005 à 09:47:32  profilanswer
 

Emmanuel Delahaye a écrit :


Citation :

JagStang > en quoi strlen est moins performant ? Je dirais plutôt le contraire.


Bof, je dirais que c'est pareil mais tant qu'on a pas fait les mesures...


 
Oui. Ca dépend des libs, je crois que certaines mettent une pincée d'asm derrière. Par contre, il est vrai que faire un strlen pour faire un strncpy derrière n'est pas forcément une bonne idée vu qu'on parcourt deux fois la même chaine.


Message édité par el muchacho le 30-03-2005 à 09:47:52
n°1029871
jagstang
Pa Capona ಠ_ಠ
Posté le 30-03-2005 à 15:41:14  profilanswer
 

Emmanuel Delahaye a écrit :


L = 0;
while (L[TXT++])


Citation :

JagStang > en quoi strlen est moins performant ? Je dirais plutôt le contraire.


Bof, je dirais que c'est pareil mais tant qu'on a pas fait les mesures...


 
ben tu parcours une fois la chaine pour trouver la len, puis une autre fois pour modifier. [:jagstang]


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°1029892
matafan
Posté le 30-03-2005 à 15:56:32  profilanswer
 

JagStang, stp explique ce qui te fais dire que strlen est "nettement moins performant".

n°1029958
jagstang
Pa Capona ಠ_ಠ
Posté le 30-03-2005 à 16:31:46  profilanswer
 

je t'explique comme je vois la chose.  
 
strlen parcours la chaine pour trouver sa taille (n itérations)
ensuite, tu parcours de 0 à strlen()-1 (à nouveau n itérations)
 
==> 2n
 
tandis que si tu te contente de faire ce test, tu ne fais que n itérations.
 
tout ceci valable sous réserver que la taille de la chaine ne peut être connue par le compilateur ou l'executable sans parcourir celle-ci à la recherche de '\0'
 


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°1031652
Sve@r
Posté le 31-03-2005 à 19:36:37  profilanswer
 

jagstang a écrit :

je t'explique comme je vois la chose.  
 
strlen parcours la chaine pour trouver sa taille (n itérations)
ensuite, tu parcours de 0 à strlen()-1 (à nouveau n itérations)
 
==> 2n
 
tandis que si tu te contente de faire ce test, tu ne fais que n itérations.
 
tout ceci valable sous réserver que la taille de la chaine ne peut être connue par le compilateur ou l'executable sans parcourir celle-ci à la recherche de '\0'


 
Le top du top:

for (L=0; L < strlen(TXT); L++)
    TXT[L]=...


 
G gagné... :bounce:  :D


Message édité par Sve@r le 31-03-2005 à 19:38:07
n°1031829
FlorentG
Unité de Masse
Posté le 31-03-2005 à 22:02:54  profilanswer
 

Faut gaffer avec les compilos de merde qui te retestent strlen à chaque bouclage ;)

n°1032080
el muchach​o
Comfortably Numb
Posté le 01-04-2005 à 09:02:23  profilanswer
 

Sve@r a écrit :

Le top du top:

for (L=0; L < strlen(TXT); L++)
    TXT[L]=...


 
G gagné... :bounce:  :D


Ah oui, là effectivement... le pire, c'est qu'on tombe de temps en temps sur ce genre de code.
 

Citation :

Faut gaffer avec les compilos de merde qui te retestent strlen à chaque bouclage ;)


A mon avis, la majorité des compilos vont te recalculer strlen  à chaque tour. Le compilo ne peut pas prévoir toutes les conneries que tu écris.


Message édité par el muchacho le 01-04-2005 à 09:04:26
n°1032119
Vinx
Posté le 01-04-2005 à 09:37:41  profilanswer
 

Surtout que la longueur de la chaine pourrait changer dans la boucle.


---------------
Slack powa | http://www.racingpneu.com
n°1032126
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-04-2005 à 09:44:13  profilanswer
 

Vinx a écrit :

Surtout que la longueur de la chaine pourrait changer dans la boucle.


En fait, le problème est là. Si la longueur change, on est obligé de laiser le strlen() dans le test, à moins de gérer la longueur à la main avec une variable...
 
Par contre, si la taille est fixe, il est préférable d'appeler le strlen() avant et de mettre la variable (invariante) dans la boucle:


size_t const len = strlen(TXT);
 
for (L=0; L < len; L++)
    TXT[L]=...


Message édité par Emmanuel Delahaye le 01-04-2005 à 09:44:46

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1032177
FlorentG
Unité de Masse
Posté le 01-04-2005 à 10:36:48  profilanswer
 

el muchacho a écrit :

Citation :

Faut gaffer avec les compilos de merde qui te retestent strlen à chaque bouclage ;)


A mon avis, la majorité des compilos vont te recalculer strlen  à chaque tour. Le compilo ne peut pas prévoir toutes les conneries que tu écris.


Genre le compilo .NET te sort le test de la boucle en passant par une variable temporaire :)

n°1032355
db__
spécialiste de l'à peu près
Posté le 01-04-2005 à 12:59:33  profilanswer
 

Citation :

je t'explique comme je vois la chose.  
 
strlen parcours la chaine pour trouver sa taille (n itérations)  
ensuite, tu parcours de 0 à strlen()-1 (à nouveau n itérations)  
 
==> 2n  
 
tandis que si tu te contente de faire ce test, tu ne fais que n itérations.  
 
tout ceci valable sous réserver que la taille de la chaine ne peut être connue par le compilateur ou l'executable sans parcourir celle-ci à la recherche de '\0'


Bonjour
Je ne parviens pas à saisir l'intéret de parcourir deux fois la chaine pour calculer sa longueur.
Je pense que le temps d'exécution doit être le même avec un léger avantage sur la boucle si le compilateur est bon car il y a l'économie d'un appel de fonction et de gestion du cadre de pile.
Quand on en est à ce genre d'optimisation qui ne favorise pas la lisibilité du code, il est temps de passer à l'assembleur.
Cordialement

n°1032359
jagstang
Pa Capona ಠ_ಠ
Posté le 01-04-2005 à 13:04:37  profilanswer
 

db__ a écrit :

Bonjour
Je ne parviens pas à saisir l'intéret de parcourir deux fois la chaine pour calculer sa longueur.
Je pense que le temps d'exécution doit être le même avec un léger avantage sur la boucle si le compilateur est bon car il y a l'économie d'un appel de fonction et de gestion du cadre de pile.
Quand on en est à ce genre d'optimisation qui ne favorise pas la lisibilité du code, il est temps de passer à l'assembleur.
Cordialement


 
justement, y'en a pas.
le fait de ne pas coder en ASM ne justifie pas un minimum d'optimisation
 
Amicalement


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°1032369
db__
spécialiste de l'à peu près
Posté le 01-04-2005 à 13:14:53  profilanswer
 

pour JagStang
Qu'est-ce qui te fait penser que strlen parcourt 2 fois la chaine ?
Il la parcourt une fois pour chercher le 0 ce qui lui permet de conaitre la longueur soit par itération d'un compteur pendant le parcourt soit par différence de pointeur entre l'arrivé et le départ.
A quoi peut bien servir le deuxième passage ?

n°1032372
jagstang
Pa Capona ಠ_ಠ
Posté le 01-04-2005 à 13:20:39  profilanswer
 

strlen une fois, la boucle une seconde fois.  
 
la je parle de la version  
taille = strlen(chaine)     // n fois
for i=0 to taille           // n fois


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°1032374
jagstang
Pa Capona ಠ_ಠ
Posté le 01-04-2005 à 13:21:10  profilanswer
 

donc, pas justifié de passer 2 fois bien entendu. j'espère qu'on s'est compris


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°1032400
db__
spécialiste de l'à peu près
Posté le 01-04-2005 à 13:34:52  profilanswer
 

Cette fois tout est clair.
Merci

n°1032676
matafan
Posté le 01-04-2005 à 17:46:53  profilanswer
 

C'est clair, mais c'est pas ce qui est fait ici... Il parcourt une fois la chaine a la main, pour trouver la longueur. En utilisant strlen c'est strlen qui aurait parcouru une fois la chaine, pour trouver la longueur. Comme il ne profite pas de son parcours pour faire autre chose avec sa chaine, strlen etait la meilleure solution, point. Evidemment si on a autre a faire en parcourant la chaine, il vaut evidemment mieux le faire a la main et s'arreter sur le '\0' final... Ce n'est pas le cas ici.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Une ligne de commande avec FOR que je comprends pas

 

Sujets relatifs
[SQL]Insérer une ligne automatiquement dans une autre tablecommande prog java
[JS] Supprimer les retours à la ligne d'une variable [resolu]question bateau: ecrire un retour ligne dans fichier
Ne pas afficher la fenêtre de commande MSDOSsoft d'envoi de commande UDP?
ListView : changer la couleur de fond, ligne par ligneAffichage d'1 var sur 1 ligne
commande par msnAller a la ligne...
Plus de sujets relatifs à : Une ligne de commande avec FOR que je comprends pas


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR