Incrementation dans un test ?

Incrementation dans un test ? - C++ - Programmation

Marsh Posté le 23-11-2004 à 00:24:37    

Salut, je voudrais savoir si ce genre de bidouille ne pose pas de probleme :
 
 do
  ...;
 while ( (machine<>bidule) && (truc>++bidule) );
 
En pratique, je viens de tester sur DEV-C++, ça marche.
 
Mais, comme c'est un devoir que je dois rendre à un prof d'informatique, il faut que je sache si en theorie il est autorisé de faire une incremention sur une variable dans un test utilisant 2 fois cette meme variable.
 
Merci bcp :)


Message édité par Slide le 23-11-2004 à 01:47:14
Reply

Marsh Posté le 23-11-2004 à 00:24:37   

Reply

Marsh Posté le 23-11-2004 à 07:55:54    

ça fonctionne, mais ça n'est pas lisible. Surtout que bidule est incrémenter conditionnellement. Mieux vaut t'en passer

Reply

Marsh Posté le 23-11-2004 à 11:06:48    

ouaip, faut bien penser que l'opérateur && ne va passer à la 2e opérande que si la 1ère est vraie (si elle est fausse le && sera faux donc on s'en fout de la 2e), donc il n'incrémentera bidule que si machine <> bidule
 
ca sent la boucle infinie quand même [:figti]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-11-2004 à 14:45:42    

Masklinn a écrit :

l'opérateur && ne va passer à la 2e opérande que si la 1ère est vraie (si elle est fausse le && sera faux donc on s'en fout de la 2e), donc il n'incrémentera bidule que si machine <> bidule


 

Taz a écrit :

ça fonctionne, mais ça n'est pas lisible. Surtout que bidule est incrémenter conditionnellement. Mieux vaut t'en passer


 
C'est exactement ce que je veux en faite. :D (enfin je crois lol!)
Donc les operations vont se faire de gauche vers la droite en theorie ?
 
Sinon le code d'origine c'est ça (simplifié) :
 

Code :
  1. const char longueur=100; // Longueur maximale de la chaine a saisir.
  2. char* saisies;
  3. char compteur_saisie;
  4. saisies = (char*)malloc(2*longueur*sizeof(char));
  5. do
  6.   scanf("%c", (saisies+compteur_saisie*sizeof(char)) );
  7. while ( (*(saisies+compteur_saisie*sizeof(char))!=10 ) && (longueur>++compteur_saisie) );


 
Mc :)


Message édité par Slide le 23-11-2004 à 14:47:29
Reply

Marsh Posté le 23-11-2004 à 14:56:36    

Tu sais quoi ? On va t'aider à avoir une bonne note. Pour cela, il va te falloir complètement revoir certains trucs, pour arriver à du code lisible, facile à maintenir, et correct.  
On y va:
1. Très mauvais idée de stocker ta longueur dans un char. Sur la plupart des plate-formes, ça ne te donne une taille maximum qui n'est que de 127. Utilises plutôt size_t qui est un alias vers le bon type pour représenter des tailles mémoires.
 
4. Ton malloc, ça ne sert à rien de prendre 2* la longueur. Il ne te faut que longeur+1. D'autre part, sizeof (char) est forcément égal à 1.
 
7. Utilise un bête saisies+compteur ou (plus lisible) &saisies[compteur]
 
8. C'est ignoble. On te demandes de recoder fgets ou quoi ?
 

Reply

Marsh Posté le 23-11-2004 à 15:08:15    

Pour le 2*, en faite ca je l'avais fait pour tester un truc, j'ai oublié de le virer (oups :D).
 
fgets, j'avais pensé l'utiliser, mais systematiquement il me rajoute un caractere d'office.
 
Par là je veux dire que :
 

Code :
  1. fgets(saisies,1,stdin);


 
ça ne me demande meme pas de caractere, mais il en stock un tout seul.
 
Donc je vai etre obliger de faire  
 

Code :
  1. fgets(saisies,longueur+1,stdin);


 
Sauf que là, il y a un caractere en trop :(
 
Le prof va delirer si je fais ca, en faite on n'a pas encore vu ça en cours lol.

Reply

Marsh Posté le 23-11-2004 à 15:11:45    

Slide a écrit :

Pour le 2*, en faite ca je l'avais fait pour tester un truc, j'ai oublié de le virer (oups :D).
 
fgets, j'avais pensé l'utiliser, mais systematiquement il me rajoute un caractere d'office.


Le retour à la ligne?
edit: ah oui le \0 de terminaison, merci lam's


Message édité par masklinn le 23-11-2004 à 15:21:49

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-11-2004 à 15:13:20    

Slide a écrit :


fgets, j'avais pensé l'utiliser, mais systematiquement il me rajoute un caractere d'office.


Tu as du mal l'utiliser alors. Elle ne rajoute rien, et elle te garantis de mettre un 0 à la fin de ta chaîne. Par contre, le retour chariot est inclus dans la chaîne (s'il y a la place).  
Va voir là:
  http://www.cplusplus.com/ref/cstdio/fgets.html
 
Parce que franchement, ton code est immonde et aucun prof ne laissera passer ça. Sinon, tu pourras demander à ton prof pourquoi vous n'apprenez pas à utiliser les flux et la STL ?

Reply

Marsh Posté le 23-11-2004 à 15:21:59    

Masklinn a écrit :

Le retour à la ligne?


Oui et non.
En faite, c'est le 0 que Lam's vient d'expliquer.
(et Oui car il y a un retour chariot aussi).
 

Lam's a écrit :

Tu as du mal l'utiliser alors. Elle ne rajoute rien, et elle te garantis de mettre un 0 à la fin de ta chaîne. Par contre, le retour chariot est inclus dans la chaîne (s'il y a la place).  
Va voir là:
  http://www.cplusplus.com/ref/cstdio/fgets.html
 
Parce que franchement, ton code est immonde et aucun prof ne laissera passer ça. Sinon, tu pourras demander à ton prof pourquoi vous n'apprenez pas à utiliser les flux et la STL ?


 
Mon code est immonde ;) Je sais j'ai compris lol.
Pour les flux et compagnie, bha en faite on vient de commencer le C++, on en est au chapitre 5, et c'est une ecole en alternance ou je suis, chaqu'un doit faire des efforts en dehors des cours en faite.
 
Je viens d'ouvrir ta page, je vais lire.
 
Pour le 0 enfin de chaine, je suis obligé de vivre avec ? Car avec un scanf et un getchar (si je me trompe pas) il n'y en a pas :'(.

Reply

Marsh Posté le 23-11-2004 à 15:24:16    

Slide a écrit :

Pour le 0 enfin de chaine, je suis obligé de vivre avec ? Car avec un scanf et un getchar (si je me trompe pas) il n'y en a pas :'(.


Ben la chaine de caractères C c'est un tableau de chars tout moisi, donc \0 sert à savoir que t'es à la fin de la chaîne, s'tutile quand même histoire d'éviter de te ballader n'importe ou :whistle:  
 
Comme dit lam's, essaie de voir pour la STL


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-11-2004 à 15:24:16   

Reply

Marsh Posté le 23-11-2004 à 15:38:36    

Sinon je sujet, si ca vous interresses, c'est :
 

Citation :

Saisir un texte. Rangers les caractères en mémoire. Lire le contenu de la mémoire et y compter le nombre d'espaces et de lettres 'e'.


 
Ne me faite pas l'exo, k ? ;) Je veux le faire petit à petit (l'oiseau fait son nid ;p).
 

Code :
  1. const char longueur=100; // Longueur maximale de la chaine a saisir.
  2. char* saisies;
  3. saisies = (char*)malloc(longueur+1);
  4. fgets(saisies,longueur+1,stdin);


 
Voilà le code actuel, rien à dire cette fois :s ?
 
Edit : Petite correction x2


Message édité par Slide le 23-11-2004 à 15:45:44
Reply

Marsh Posté le 23-11-2004 à 15:48:35    

Lam's a écrit :

1. Très mauvais idée de stocker ta longueur dans un char. Sur la plupart des plate-formes, ça ne te donne une taille maximum qui n'est que de 127. Utilises plutôt size_t qui est un alias vers le bon type pour représenter des tailles mémoires.


 
?!
 
const size_t longueur à la place de const char longueur ? :s
 
 
EDIT :

Citation :

size_t correspond à un unsigned int.


Bon ben k, va pour size_t :).


Message édité par Slide le 23-11-2004 à 15:52:47
Reply

Marsh Posté le 23-11-2004 à 15:53:48    

Slide a écrit :

?!
 
const size_t longueur à la place de const char longueur ? :s


 
Exactement.
 
Sinon, en C++, on n'utilise d'habitude pas malloc, mais "new" et "delete". Tu verras ça sans doute plus tard. Sache juste que c'est pas une habitude que tu conserveras.
 
Et d'autre part, on aime bien prendre l'habitude de donner directement une valeur aux variables qu'on déclare. Donc:  
char * saisies = (char*)malloc(longueur+1);

Reply

Marsh Posté le 23-11-2004 à 16:01:37    

Merci pour tout à vous ts ;).
Voilà donc le code actuel (propre lol !).
 

Code :
  1. const size_t longueur=100; // Longueur maximale de la chaine a saisir. (size_t correspond à un unsigned int.)
  2. char* saisies = (char*)malloc(longueur+1);
  3. fgets(saisies,longueur+1,stdin);


 
Il y a t'il moyen de savoir la taille qu'occupe dans la memoire la saisie qui a été faite par fgets  ?

Reply

Marsh Posté le 23-11-2004 à 16:05:46    

Slide a écrit :

Il y a t'il moyen de savoir la taille qu'occupe dans la memoire la saisie qui a été faite par fgets  ?


Pas directement. Mais vu que c'est une chaîne classique terminée par un 0, tu peux bien sûr faire:
 
size_t taille = strlen(saisies);
 
Edit: j'ai mis un size_t plutôt, y a pas de raisons...


Message édité par Lam's le 23-11-2004 à 16:08:32
Reply

Marsh Posté le 23-11-2004 à 16:06:27    

strlen(saisies)
 
edit : :hot:


Message édité par blackgoddess le 23-11-2004 à 16:07:18

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-11-2004 à 16:08:31    

Lam's a écrit :

Pas directement. Mais vu que c'est une chaîne classique terminée par un 0, tu peux bien sûr faire:
 
int taille = strlen(saisies);


 
et size_t ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-11-2004 à 16:09:36    


Vi, je venais juste de m'en rendre compte. Je pensais à autre chose. :whistle:

Reply

Marsh Posté le 23-11-2004 à 16:11:27    

Lam's a écrit :

Pas directement. Mais vu que c'est une chaîne classique terminée par un 0, tu peux bien sûr faire:
 
int taille = strlen(saisies);


 
Ok, je vais faire comme ça.
Maintenant il ne me reste qu'à lire chaque Char dans la memoire et de compter le nombre de 'e' et de ' ', j'ai deja fait mon script avec un switch.
 
Je te remercie pour tout.

Reply

Marsh Posté le 23-11-2004 à 16:12:10    

le cast du malloc alors
 
/me récupère parès lecture de la boucle malloc-scanf(%c, etc ..

Reply

Marsh Posté le 23-11-2004 à 16:12:36    

Lam's a écrit :

Vi, je venais juste de m'en rendre compte. Je pensais à autre chose. :whistle:


 
Je mets size_t ? lol J'y avais pensé aussi, mais bon, comme c'est moi le noob là, j'evite les commentaires lol.

Reply

Marsh Posté le 23-11-2004 à 16:13:02    

Taz a écrit :

le cast du malloc alors
 
/me récupère parès lecture de la boucle malloc-scanf(%c, etc ..


C'est du C++... :(

Reply

Marsh Posté le 23-11-2004 à 16:14:37    

PUTAIN QUI EST LE CON QUI A RÉPONDU FGETS !
 
 
string line;
getline(cin, line);
 
:o

Reply

Marsh Posté le 23-11-2004 à 16:16:10    

Slide a écrit :

Je mets size_t ? lol J'y avais pensé aussi, mais bon, comme c'est moi le noob là, j'evite les commentaires lol.


Oui, utilise size_t.
 
J'avais mis int, parce que j'étais en train de me dire qu'il fallait d'indiquer que justement, size_t n'est pas forcément un int. Ca peut être autre chose en fonction de l'environnement (OS/Compilo).  

Reply

Marsh Posté le 23-11-2004 à 16:21:13    

Taz a écrit :

PUTAIN QUI EST LE CON QUI A RÉPONDU FGETS !
 
 
string line;
getline(cin, line);
 
:o


 
[:totoz]

Reply

Marsh Posté le 23-11-2004 à 16:29:18    

getline, je change tout pour utiliser ca ? :s arg lol


Message édité par Slide le 23-11-2004 à 16:33:02
Reply

Marsh Posté le 23-11-2004 à 16:31:00    

oui. fini les malloc et les pointeurs. Fais du C++. Je pense que tu comprendras facilement que dans la vie, on a autre chose à faire que des pointeurs++ et malloc/scanf(%c

Reply

Marsh Posté le 23-11-2004 à 16:34:38    

Bha le theme de mon chapitre, c les malloc et les pointeurs en faite :s, je l'ai pas dit, bon ok, dsl lol.

Reply

Marsh Posté le 23-11-2004 à 16:35:15    

mais tu fais du C ou du C++ bordel ?

Reply

Marsh Posté le 23-11-2004 à 16:36:56    

Taz, relis son post de 15h21:59.


Message édité par Lam's le 23-11-2004 à 16:37:24
Reply

Marsh Posté le 23-11-2004 à 16:40:55    

ben il doit sûrement faire du C
Comme souvent son cours doit s'appeller C++ alors qu'il ne commencera le C++ qu'après la moitié de l'année scolaire  :sarcastic:  
 

Reply

Marsh Posté le 23-11-2004 à 16:43:13    

gasp :/
y en a vraiment qui mettent toutes les chances de leur côtés

Reply

Marsh Posté le 23-11-2004 à 16:45:05    

Slide a écrit :

getline, je change tout pour utiliser ca ? :s arg lol


Bah c'est ce qu'on t'indique depuis le début de façon plus ou moins délicate en fait: ton code là, c'est du C, pas du C++. Mais pour pouvoir utiliser string, cin et autres, il te faudra connaître les iostreams et la STL. Bref, plus tard quoi.

Reply

Marsh Posté le 23-11-2004 à 16:45:25    

En faite c'est du C... :s lol.

Reply

Marsh Posté le 23-11-2004 à 16:46:17    

Taz a écrit :

gasp :/
y en a vraiment qui mettent toutes les chances de leur côtés


Le pire dans tous ça, c'est que dans la plupart des cas, c'est moi, le contribuable, qui paye pour ce type d'enseignement. Tu m'étonnes que les gens votent Chirac après ça.  :lol:

Reply

Marsh Posté le 23-11-2004 à 16:46:25    

donc on en revient à la question du cast

Reply

Marsh Posté le 23-11-2004 à 16:47:08    

Taz a écrit :

gasp :/
y en a vraiment qui mettent toutes les chances de leur côtés


c'est ce qui t'es arrivé et tu en est revenu non? pas le peine de mouiller ton slip pour ça hein [:petrus75]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 23-11-2004 à 18:09:57    

schnapsmann a écrit :

c'est ce qui t'es arrivé et tu en est revenu non? pas le peine de mouiller ton slip pour ça hein [:petrus75]


Je suis assez d'accord avec lui, l'intérêt d'apprendre le C en préalable à un cours de C++ m'échappe, ça ne me parait absolument pas une étape obligée.
C'est tjrs mieux que les facs qui décident de faire de Javascript le fondement de son enseignement, mais quand même... :/

Reply

Marsh Posté le 23-11-2004 à 18:16:52    

el muchacho a écrit :

Je suis assez d'accord avec lui, l'intérêt d'apprendre le C en préalable à un cours de C++ m'échappe, ça ne me parait absolument pas une étape obligée.
C'est tjrs mieux que les facs qui décident de faire de Javascript le fondement de son enseignement, mais quand même... :/


 
RCM:

  • parce que le C99 est quasiment un sous ensemble du C++?
  • à cause des concepts qui fuient?


Message édité par schnapsmann le 23-11-2004 à 18:34:36

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 23-11-2004 à 18:44:57    

schnapsmann a écrit :

RCM:

  • parce que le C99 est quasiment un sous ensemble du C++?
  • à cause des concepts qui fuient?


heink ? le C a une intersection non-nulle avec le C++, le C99 a plus de divergences avec le C++98 que le C ANSI

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed