Bonjours,
J’ai un programme à faire, dans lequel si je tape plusieurs espaces de suite, ceux-ci doivent être remplacé par un seul espace.
Comment faire ce bout de programme ?
Bonjours,
J’ai un programme à faire, dans lequel si je tape plusieurs espaces de suite, ceux-ci doivent être remplacé par un seul espace.
Comment faire ce bout de programme ?
Bonjour,
Le plus simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 lire un caractère depuis l'entrée standard (fonction getchar) si caractère est ' ' et dernier_caractère est ' ' (== ou fonction isspace) alors ne rien afficher sinon afficher le caractère sur la sortie standard (fonction putchar) fin si stocker caractère dans dernier_caractère
Il suffit d'écrire le bon code. As-tu au moins réfléchi à un début d'algorithme . Les solutions ne tombent pas du ciel. Il faut réfléchir. Tu ne vas pas nous demander la solution de tous les exercices du K&R...
Je rappelle que tout programme informatique se résume en gros à un traitement de données selon le schéma bien connu :
Ici, les entrées, ce sont les caractères lus. Le traitement est le filtre que dois définir et les sorties sont les caractères affichés.
En gros, on te demande que les caractères de l'entrée soient recopiées en sortie, sauf si il y a plusieurs espaces à la suite, dans ce cas, tu n'en recopie qu'un.
Comment traduire 'à la suite' en programmation ? Tout simplement en se souvenant du caractère précédent (et oui, si il y a de la mémoire dans les ordinateurs, c'est que parfois il faut 'se souvenir' de certaines choses...).
En le comparant avec le caractère courant, on devrait pouvoir décider si il faut afficher celui-ci ou non...
Bref, il faut réfléchir...
Merci, je compte bien sûr réfléchir ! Ce que tu me dis j'y pense mais le problème est que j'ai un manque de vocabulaire et de connaissance. Et donc je n’arrive pas à appliquer ma réflexion sur mon programme n’ayant pas le vocabulaire. Connaitrais-tu une sorte de dictionnaire du langage c qui fasse algorithme au langage c ?
Ca n'a aucun sens. Le vocabulaire qu'il faut utiliser les celui de tous les jours. C'est ça l'intérêt de la programmation algorithmique. Et c'est indépendant du langage d'implémentation. Il s'agit d'une phase de réflexion qui a lieu bien en amont du codage.
http://emmanuel-delahaye.developpez.com/dev_proj.htm
ensuite, on utilise un langage plus formel (langage algorithmique), mais qui reste indépendant du langage d'implémentation.
http://emmanuel-delahaye.developpez.com/notes.htm#algo
le programme est censé me remplacer les espaces par un seul espace et j'ai beau tout essayer je n'arrive pas à les remplacer.Juste à les supprimer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) {printf("programme de comptabilisation compte les lignes, espaces et tabulations\npour afficher la comptabilisation faire entre, CRTL+Z puis entre\n"); int c, nc, es,tab ; nc = es = tab = 0; while ((c = getchar()) != EOF) { putchar(c); if (c == ' ') printf("\b"); else (c != ' ') c = ((getchar()) + ' '); if (c == '\n') ++nc; if (c == ' ') ++es; if (c == '\t') ++tab; } printf("programme de comptabilisation\n nombre de ligne : %d nombre d'espaces : %d nombre de tabulation : %d\n", nc, es, tab); system("PAUSE"); return 0; }
Oh ! Misère !
Ceci ne marchera pas. Tu ne peux pas mettre le marqueur EOF dans un caractère.
Code : Sélectionner tout - Visualiser dans une fenêtre à part while ((c = getchar()) != EOF)
Ça, je ne vois vraiment pas ce que c'est censé faire !
Code : Sélectionner tout - Visualiser dans une fenêtre à part else (c != ' ') c = ((getchar()) + ' ');
Le principe est pourtant simple : si tu veux remplacer tous les espaces par un espace, il te suffit d'afficher le premier et d'ignorer les suivants. Pour ce faire, tu conserves en mémoire la trace du dernier caractère saisi. Si celui que tu es en train de lire est un espace, tu regardes si le précédent l'était aussi. Si c'est le cas, tu ignores ce nouveau caractère, sinon tu l'affiche. Et en bas de ta boucle, tu mets à jour la valeur du caractère « enregistré ».
je ne vois pas ce que viennent faire le compteurs de tabs et de \n dans cette galère... Tu te trompes d'exercices ou tu tu pompes les mauvais corrigés...
Il faut que tu réfléchisses plus à ce que tu veux faire.
Déjà, tu peux partir de l'exercice précédent qui faisait la recopie exacte de chaque caractère saisi :
Maintenant, il faut mettre une condition pour les espaces.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 int c; while ((c = getchar()) != EOF) { putchar(c); }
Déjà, on peut séparer les traitements en 2 :
espace/non espace :
Pour le moment, on a strictement rien changé, mais on a préparé le terrain. Je conseille d'aller par étape et de vérifier que le fonctionnement n'est pas dégraté et qu'il tend bien vers le comportement voulu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int c; while ((c = getchar()) != EOF) { if (c == ' ') { putchar(c); } else { putchar(c); } }
Maintenant, ce qu'on voudrait dans la branche 'espace', c'est ajouter une condition telle que le premier espace rencontré soit affiché, mais pas les suivants si ils sont consécutifs.
Pour ça, une compteur peut faire l'affaire ou simplement une mémoire du caractère précédant. Si c'est un espace, on affiche pas, sinon, on affiche.
et il faut penser à enregistrer le caractère à chaque tour :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if (c != cprec) { putchar(c); }
On intègre tout ça dans l'algo :
Code : Sélectionner tout - Visualiser dans une fenêtre à part cprec = c;
on ne plus être très loin de la solution... C'était difficile ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 int c; while ((c = getchar()) != EOF) { if (c == ' ') { if (c != cprec) { putchar(c); } } else { putchar(c); } cprec = c; }
A l'arrache :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 hello world hello world ^Z Process returned 0 (0x0) execution time : 11.332 s Press any key to continue.
Je ne vois pas ce que tu veux dire. Il fallait bien une valeur différente d'un caractère pour se différencier (il n'existe pas de 'caractère de fin de fichier'[1]). Je ne comprend pas ce qui te dérange... Tu as une autre solution simple à proposer ?
------------------
[1] sauf cas très particulier des fichiers textes sous DOS (caractère 26 ou ^Z), et encore, j'ai cru comprendre que cette pratique était tombée en désuétude...
En fait, je m'apercois que je n'ai jamais testé mes fins de fichier ou entrées console de cette façon. Je considérais que getchar() me renvoyait un char et j'utilisais feof(stdin) - sur le descripteur du flux en lecture lui-même, donc - pour voir s'il y avait encore quelque à lire.
À noter que le Ctrl-D d'Unix n'a pas été choisi au hasard : il balance le code 04, qui correspond à un End Of Transmission dans le code ASCII.
Sur ? j'aurai dit -1:
cela donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <stdio.h> int main(void){ int c; printf("\n") for(;;){ c = getchar(); printf("%08X\n", c); if(EOF == c) { break; } } printf("\n"); return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 a\n 00000061 0000000A b\n 00000062 0000000A ^D FFFFFFFF
feof() ne fait pas ce que tu crois :
http://emmanuel-delahaye.developpez....tes.htm#saisie
http://emmanuel-delahaye.developpez....s.htm#fichiers
@mabu: C'est pourtant bien un code ASCII 4 qui est envoyé au système. Il traduit en fin de fichier, c'est tout.
Sous DOS et Windows, tu envoies un Ctrl-Z à la place (code ASCII 26, 0x14, "SUB"), et le système traduit en fin de fichier également...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager