Un prototype correct pour la fonction inversion est:Citation:
Envoyé par thewho
ou encoreCode:int inversion (char *sz1,char *sz2);
Les deux notations sont strictement équivalentes.Code:int inversion (char sz1[],char sz2[]);
Thierry
Version imprimable
Un prototype correct pour la fonction inversion est:Citation:
Envoyé par thewho
ou encoreCode:int inversion (char *sz1,char *sz2);
Les deux notations sont strictement équivalentes.Code:int inversion (char sz1[],char sz2[]);
Thierry
est équivalent àCode:void fonction(char *chaine[]);
ThierryCode:void fonction(char **chaine);
Ok merci j'ai modifié, mais j'ai encore un paquet d'erreur - cette fois lors de la compilation -Citation:
Envoyé par mujigka
Code:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 #include <stdlib.h> #include <string.h> // chaine de caractere sur lesquelles on travaille => variable globale int compression (char *sz1,char *sz2) // compresse une chaine de caractere { int i,j,n=0;j=0; for (i=0;*sz1[i]!=0;i++) n++; for (i=0;i<n;i++) if (*sz1[i]!=' ') { *sz2[j]=*sz1[i]; j++; } strcpy(*sz1,*sz2); printf("apres compression : %s\n",*sz2); return 0; } int inversion (char *sz1,char *sz2) // inverse les caractères d'une chaine : abc=>cba { char c; int i,j,n; n=0; j=1; for (i=0;*sz2[i]!=0;i++) n++; for(i=0;i<n/2;i++) { c=*sz2[i]; *sz2[i]=*sz2[n-j]; *sz2[n-j]=c; j++; } printf("apres inversion : %s\n\n",*sz2); return 0; } int test_palindrome (char *sz1,char *sz2) { return (strcmp(*sz1,*sz2)); } int main(int argc, char *argv[]) { char sz1[50], sz2[50]; fgets(sz1,sizeof(sz1),stdin); compression(&sz1,&sz2); inversion(&sz1,&sz2); if (!(test_palindrome(&sz1,&sz2))) puts("c'est un palindrome"); else puts("ce n'est pas un palindrome"); system("PAUSE"); return 0; }
c'est pas les adresses que l'on rentre en paramètre ? 8OCitation:
Envoyé par mujigka
roh nan nul complétement a coté de la plaqueCitation:
c'est pas les adresses que l'on rentre en paramètre ?
dsl :oops:
Bonjour,
Je fais à peu près le même exercice.
Pourquoi utilisé deux chaînes de caractères?
On peu pour vérifier si une chaîne est un palindrome comparer le premier caractère avec le dernier, le second avec l'avant dernier, ainsi de suite jusqu'au milieu de la chaîne!
pour la compression, je l'ai fait avec 2 chaines :Citation:
Envoyé par Lucky-94
dans une boucle for, on lit la 1ere caractère par caractère, et si on a un espace, on passe au suivant, sinon on copie sur la 2eme.
toi tu parlais directement de comparer, mais il faut d'abord enlever les blancs :)
Quel est l'entrée de ta chaîne à étudier?
Les espaces peuvent être ignorés dès la saisie (ou lecture) des carctères de la chaîne de caractère.
Je ne vois pas vraiment comment ... on récupère une entrée clavier avec fgets, et ensuite on travaille dessus. Dans mon prog, l'entrée c'est sz1.Citation:
Envoyé par Lucky-94
Tu fais une entrée caractère par caractère.
Ainsi tu conserves que les caractères alphabétiques et supprimes tout le reste, caractères numériques, espaces, caractères de ponctuation, comme le sugérait déjà "thewho". De plus tu peux en profiter pour modifier tout les caractères dans la même case.
Par contre, cela ne résoud pas le problème des accents. Il faut donc convenir que l'entrée se fera sans.
A lire d'urgence :Citation:
Envoyé par olivier1209
http://emmanuel-delahaye.developpez.....htm#param_tab
Ah, enfin ! je me demandais si cette remarque allait venir. La solution du posteur original est affreusement compliquée, avant de pondre du code, il faut le concevoir !!Citation:
Envoyé par Lucky-94
Candide
Je comprends rien au pointeurs :scarymov: !!!Citation:
Envoyé par Emmanuel Delahaye
j'ai pourtant écrit ce que l'on m'a indiqué ...
Je n'ai pas bien compris ce que tu voulais dire, à par une vérité évidente : il faut penser son algo avant d'écrire un prog.Citation:
Envoyé par c-candide
Malgré la simplicité de l'énoncé et le classicisme de la question (je crois que la question des palindromes est de celles les plus traitées en C), cet exercice met en jeu de nombreuses notions plus ou moins élémentaires : utilisation de fonctions, utilisation ou pas de variables globales, branchement, itérations, entrées/sorties, manipulation de chaînes.
Quand on est débutant je trouve que c'est beaucoup trop de choses à maîtriser en même temps, je ne te jette pas la pierre, tu es comme beaucoup, t'as envie de jouer en faisant du C et en plus la plupart des livres font comme ça ce qui est selon moi une profonde erreur. Il vaut mieux se concentrer sur des programmes SOBRES et DEPOUILLES qui font des taches atomiques. Apprentissage et surchage ne font pas bon ménage, enfin c'est mon opinion.
Tout le monde te reprend sur la forme et à juste titre mais personne ne te reprend sur le fond. Après tout si tu es débutant en C, ton programme n'est pas si mal même s'il est largement perfectible. Par contre ta méthode pour tester si c'est un palondrome ou pas est très maladroite. Je m'explique : d'abord, tu parcours la chaîne pour trouver sa longueur et puis tu la parcours à nouveau pour la COPIER sans les blancs dans un autre tableau, pour la recopier ensuite dans la chaine initiale, toutes ces copies sont couteuses et totalement inutiles. Ensuite, tu recopies une moitié de ta chaîne sz2 dans l'autre, totalement inutile aussi.
Une question simple comme cella-là doit être résolue de manière simple, ton travail de codage doit commencer par ça. Sans compter que ton code ne marche pas s'il y a un espace (blanc) au début ou s'il y a plusieurs espaces consécutifs.
Je me considère moi aussi comme débutant (un an et demi de C, c'est peu) et je poste mon code que je soumets à la critique :
Naturellement, on est loin d'un programme complet et robuste.Code:
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
30
31
32 #include <stdio.h> #include <string.h> int main(void) { char chaine[50]; printf("Entrer une chaine (au plus %d caracteres) : \n",49); fgets(chaine,50,stdin); chaine[strlen(chaine)-1]='\0'; int longueur=strlen(chaine); int gauche=0, droite = longueur-1; while (gauche < droite) { while (chaine[gauche] == ' ') gauche++; while (chaine[droite] == ' ') droite--; if (chaine[gauche] != chaine[droite]) { printf("Palindrone ? NON. \n"); return 0; } gauche++; droite--; } printf("Palindrone ? OUI. \n"); return 0; }
Candide
Citation:
Envoyé par c-candide
Je suis d'accord avec toi sur beaucoup de chose. Chacun son programme, sa manière de penser. Moi j'avoue, de temps en temps, ça fait un peu bricolage mais mon prog il marche :pingoin2: !!
Moi aussi je suis débutant (4 mois de C), et j'ai commencé par des programmes plus petits. Et c'est pour cela que j'ai proposer cet exercice dans ce forum. Le palindrome permet comme tu l'as dit à juste titre d'appliquer pas mal de connaissances, encore faut-il avoir les bases.
Je vais regarder pourquoi ton programme compile, se lance, mais la fenetre se ferme dès que l'on rentre quelque chose 8O .
Je n'ai pas l'impression que tu ais compris ce qu'est un palindrome ... :?
compression puis inversion ...
ensuite comparaison ...
reportes toi au 1er poste ...
:fessee: :fessee:
Non, non, il y a certains standards à respecter pour coder, ça demande assez peu d'imagination. Si tu veux "penser", étudie ton algorithme (enfin algorithme pour tester un palindrome, c'est beaucoup dire)Citation:
Envoyé par olivier1209
A mon avis programmation -- surtout en C -- et bricolage font assez mauvais ménage. Vaut mieux prendre les bonnes habitudes au départ, après c'est difficile de changer.Citation:
Envoyé par olivier1209
Il faut sans doute insérer cette ligneCitation:
Envoyé par olivier1209
Probablement ton IDE est Dev-cpp. Utilise Code-Blocks par exemple et tu n'auras plus à ajouter cette ligne.Code:system("pause");
Candide
La bonne stratégie, c'est de prendre les liens que t'a passé Emmanuel et de les lire attentivement. Pose des questions s'il y a des concepts que tu ne comprends pas. Construis-toi des petits programmes de tests pour étudier:Citation:
Envoyé par olivier1209
- les pointeurs
- les chaînes de caractères
- le passage de pointeurs en arguments de fonctions
- le passage de tableaux en arguments de fonctions
- le passage de chaînes de caractères en arguments de fonctions
Il est important de comprendre en profondeur tous ces concepts avec des programmes modestes. Le site d'Emmanuel explique tous les concepts clés du langage C de manière très pédagogique. De ce point de vue, c'est une référence qu'il faut lire absolument. La programmation ne s'apprend pas en jonglant à l'aveugle avec des éléments de syntaxe. Il y a des fondamentaux à comprendre. Et une fois que ces fondamentaux sont acquis, il est possible de construire dessus et de s'attaquer à des problèmes plus compliqués.
Bonne chance, et n'hésite pas à poser des questions s'il y a des choses que tu ne comprends pas.
Thierry Chappuis
Tu crois ?Citation:
Envoyé par olivier1209
"Reporte-toi au 1er post."Citation:
reportes toi au 1er poste ...
4 fautes en 5 mots, apprends déjà l'orthographe avant de venir me donner des conseils infondés.
Candide