Incrementation dans un test ? - C++ - Programmation
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
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
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. (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 :
|
Mc
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 ?
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 ).
fgets, j'avais pensé l'utiliser, mais systematiquement il me rajoute un caractere d'office.
Par là je veux dire que :
Code :
|
ça ne me demande meme pas de caractere, mais il en stock un tout seul.
Donc je vai etre obliger de faire
Code :
|
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.
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 ). |
Le retour à la ligne?
edit: ah oui le \0 de terminaison, merci lam's
Marsh Posté le 23-11-2004 à 15:13:20
Slide 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 ?
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). |
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 .
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
Comme dit lam's, essaie de voir pour la STL
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 :
|
Voilà le code actuel, rien à dire cette fois :s ?
Edit : Petite correction x2
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 .
Marsh Posté le 23-11-2004 à 15:53:48
Slide a écrit : ?! |
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);
Marsh Posté le 23-11-2004 à 16:01:37
Merci pour tout à vous ts .
Voilà donc le code actuel (propre lol !).
Code :
|
Il y a t'il moyen de savoir la taille qu'occupe dans la memoire la saisie qui a été faite par fgets ?
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...
Marsh Posté le 23-11-2004 à 16:06:27
strlen(saisies)
edit :
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: |
et size_t ?
Marsh Posté le 23-11-2004 à 16:09:36
BlackGoddess a écrit : et size_t ? |
Vi, je venais juste de m'en rendre compte. Je pensais à autre chose.
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: |
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.
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 ..
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. |
Je mets size_t ? lol J'y avais pensé aussi, mais bon, comme c'est moi le noob là, j'evite les commentaires lol.
Marsh Posté le 23-11-2004 à 16:13:02
Taz a écrit : le cast du malloc alors |
C'est du C++...
Marsh Posté le 23-11-2004 à 16:14:37
PUTAIN QUI EST LE CON QUI A RÉPONDU FGETS !
string line;
getline(cin, line);
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).
Marsh Posté le 23-11-2004 à 16:21:13
ReplyMarsh Posté le 23-11-2004 à 16:29:18
getline, je change tout pour utiliser ca ? :s arg lol
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
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.
Marsh Posté le 23-11-2004 à 16:36:56
Taz, relis son post de 15h21:59.
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
Marsh Posté le 23-11-2004 à 16:43:13
gasp
y en a vraiment qui mettent toutes les chances de leur côtés
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.
Marsh Posté le 23-11-2004 à 16:46:17
Taz a écrit : gasp |
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.
Marsh Posté le 23-11-2004 à 16:47:08
Taz a écrit : gasp |
c'est ce qui t'es arrivé et tu en est revenu non? pas le peine de mouiller ton slip pour ça hein
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 |
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...
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. |
RCM:
Marsh Posté le 23-11-2004 à 18:44:57
schnapsmann a écrit : RCM:
|
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
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