PDA

Afficher la version complète : [Réglé] [Réglé]Palindrome



atlas
26/11/2004, 17h44
J'espère que Molodoi est en forme

sujet du programme :

faire une programme renvoyant la chaîne inverse d'une chaine de caractères .
ex : boujour donc chaine inverse = ruojuob
Si les chaines sont identiques , c'est un palindrome .

Voici ou j'en suis :


<iostream>
#include <cstring> // pour brancher les fonctions de gestion des strings
#include <algorithm> // la librairie algorithm est lié à la tres importante fonction reverse

using namespace std;

void affiche_tableau(int i= 0,int nbcaract, int tableau[])
{
reverse (tableau, tableau + nbcaract); // permet d'inverser la chaine envoyer dans le tableau
for (int i = 0; i < nbcaract; i++);
cout << tableau[i];//rempli le tableau au fur et à mesure et l'affiche à l'envers
}

int main()
{
string chainetapee;//il vaut mieux mettre string à la place de char en C++
string calculpalindrome;
int nbcaract;
string reponse;

do {

cout<<"Taper une chaine de caractère"<<endl;// affiche la phrase concernée
cin>>chainetapee;/*attend la frappe clavier*/

string::size_type nbcaract = chainetapee.size();
cout<<"Donc le nb de caractère ="<<nbcaract<<endl; //affiche le nombre de caractère

calculpalindrome = int affiche_tableau(nbcaract);


int strcasecmp (const char chainetapee, const char calculpalindrome);/* puis-je faire une comparaison autrement
quelque choise plus C++ utiliser les opérateurs == ne m'a pas convaincu
et faut que je creuse encore un peu la methode compare() */

if
(strcasecmp != 0)
do {
cout<<"L'inverse de"<<chainetapee<<"est"<<calculpalindrome<<endl;
cout<<"Raté "<<calculpalindrome<< " ce n'est pas un palindrome "<<endl;
}

else

do {
cout<<"L'inverse de"<<chainetapee<<"est"<<calculpalindrome<<endl;
cout<<"Votre chaîne de caractère "<<calculpalindrome<<" est un palindrome"<<endl;
}


cout<<"Voulez-vous continuer ? O/N"<<endl;
cin>>reponse;

}// ferme le 1er do


while (reponse =='O' || reponse=='o');

}// ferme main

et voici les bugs renvoyés par le compilateur


monpalindrome1.cpp: In function `void affiche_tableau(int, int, int*)':
monpalindrome1.cpp:8: error: default argument missing for parameter 2 of `void
affiche_tableau(int, int, int*)'
monpalindrome1.cpp:11: warning: name lookup of `i' changed
monpalindrome1.cpp:8: warning: matches this `i' under ISO standard rules
monpalindrome1.cpp:10: warning: matches this `i' under old rules
monpalindrome1.cpp: In function `int main()':
monpalindrome1.cpp:29: error: syntax error before `(' token
monpalindrome1.cpp:41: error: syntax error before `else'
monpalindrome1.cpp:49: error: syntax error before `<<' token
monpalindrome1.cpp: At global scope:
monpalindrome1.cpp:55: error: syntax error before `while'

molodoi
26/11/2004, 19h16
je regarde ça demain... Je suis crevé http://www.alionet.org/style_emoticons/<#EMO_DIR#>/coffee.gif

molodoi
27/11/2004, 11h16
Sorry de te le dure aussi platement mais je ne comprends absolument rien à ton code http://www.alionet.org/style_emoticons/<#EMO_DIR#>/mad.gif

Bon, voilà comment je vois la chose.

Les programmeurs sont des stratèges militaires. Leur devise est "Divide Ut Regnes" (diviser pour régner). L'idée est de découper un problème en plusieurs problèmes plus petits et donc, plus faciles. C'est le concept de découpe en sous-problème.

Dans le problème du palindrome, quels sont les sous-problèmes qu'on peut identifier? On peut, par exemple (il n'existe pas qu'une seule découpe d'un problème), envisager ceci Renverser un string
Tester l'existence d'un palindrome
Lire au clavier une chaîne de caractères
Chaque sous-problème peut-être vu comme une fonction et est donc indépendant des autres.

Soit


string reverse(string s)

Cette fonction va prendre en entrée un string s et renvoyer comme résultat "l'inverse" de s. Exemple: reverse(toto) = "otot"

Soit


bool isPalindrome(string s1, string s2)

qui retourne true si s1 est un palindrome de s2. false sinon

Soit


string readKeyboard()

qui retourne une chaîne de caractère lue au clavier.

Suivant cela, ton programme devient:


int reverse(string s){
//à toi de définir cette méthode.
}

bool isPalindrome(string s1, string s2){
//à toi de définir cette méthode.
}

string readKeyboard(){
//à toi de définir cette méthode.
}

int main(){
string chaineLueAuClavier;
string chaineRenversee;

chaineLueAuClavier = readKeyboard();

chaineRenversee = reverse(chaineLueAuClavier)

if(isPalindrome(chaineLueAuClavier, chaineRenversee){
cout <<"La chaine de caractère est un palindrome"<< end1;
}
else{
cout <<"La chaine de caractère n'est pas un palindrome"<<end1;
}
}//fin main

Bon travail http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif

PS: évite d'utiliser des do...while c'est illisible.

abgech
28/11/2004, 09h43
Il me parait inutile d'inverser la chaine, c'est même contre-performant, tant en terme de place mémoire que de vitesse d'exécution. Définir plutôt un module (ici version C):

/*---------------------------------------------------------
| RECHERCHE SI UNE CHAINE DE CARACTERES EST UN PALINDROME |
| ON ADMET QUE LES ESPACES EVENTUELS ONT ETE SUPPRIMEE |
| QU'ILS FONT PARTIE DU PALINDROME. |
---------------------------------------------------------*/
int palindrome1(char phrase[] // INPUT: PHRASE A TESTER
)
{
int lphrase; // LONGUEUR DE LA PHRASE
int xp; // INDICE DE PARCOURS DE LA PHRASE

lphrase = strlen(phrase);
for (xp = 0; xp < (lphrase / 2) + 1; xp++)
if (phrase[xp] != phrase[lphrase-xp-1])
return 0;
return 1;
}

Si le compilateur utilisé a une optimisation plutôt faiblarde (style Borland):

/*---------------------------------------------------------
| RECHERCHE SI UNE CHAINE DE CARACTERES EST UN PALINDROME |
| ON ADMET QUE LES ESPACES EVENTUELS ONT ETE SUPPRIMEE |
| QU'ILS FONT PARTIE DU PALINDROME. |
---------------------------------------------------------*/
int palindrome2(char phrase[] // INPUT: PHRASE A TESTER
)
{
int lphrase; // LONGUEUR DE LA PHRASE
int nbcar; // NOMBRE DE CARACTERES A TESTER
int xp; // INDICE DE PARCOURS DE LA PHRASE

nbcar = ((lphrase = strlen(phrase)) / 2) + 1;
for (xp = 0; xp < nbcar; xp++)
if (phrase[xp] != phrase[lphrase-xp-1])
return 0;
return 1;
}



Je ne partage pas ton avis Molodoi concernant do ... while.
Le C/C++ a trois type de boucle;

for:
Utilisé lorsque les bornes sont définies à l'entrée dans la boucle. Je sais, on peut aussi l'utiliser autrement et le faire se comporter comme un while.

while:
Utilisé lorsque les bornes ne sont pas définies à l'entrée dans la boucle. Le test est placé au début, si la condition n'est pas remplie à l'entrée dans la boucle, l'instruction commandée peut très bien ne pas être exécutée.

do ... while:
Utilisé lorsque les bornes ne sont pas définies à l'entrée dans la boucle. Le test est placé en fin, quel que soit l'état de la condition à l'entrée dans la boucle, l'instruction commandée est exécutée, au moins une fois.

Il est vrai que le do ... while s'utilise moins que les autres types de boucle. Néanmoins il est irremplaçable dans le cas suivant:

FAIRE lecture d'une donnée
| test de plausibilité de la donnée
REFAIRE tant que donnée non plausible

Navré pour la mauvaise présentation du code, mais je ne vois pas trop comment faire autrement, j'ai pourtant tapé "CODE" avant mais avec pour seul effet de me mettre
sous le curseur.
onne journée à tous[CODE]ffff

atlas
28/11/2004, 11h06
Oki ;merci je reste sur mes positions tant pis et je me dirige résolu vers le c++ .
Je suis déja en train de mélanger le c et le c++ .Et les mélanges d'alcools ça promet une belle mine dans le crâne ...

Je garde ce style


reverse (s.begin(), s.end());

fouck
29/11/2004, 19h15
bonjour à tous

je suis nouveau sur ce forum et espère pouvoir vous apporter ma modeste contribution

le problème du palindrome a une solution particulierement elegante gràce à la recursivité

cette solution ressemble beaucoup à celle de abprfr

en effet un mot est un palindrome si :
-sa longueur est inferieure ou egale à 1
-si les deux lettres placées à c'est extrémité sont egales et le reste du mot est un palindrome

ceci nous devoile une solution particulierement seduisante qui se passe de toute boucle

cependant tt n'est pas rose au pays de la recursivité!!
les appels recursifs successifs font que le programme va effectuer des copies locales des chaines de caractères successives à traiter
a chaque passage ds la fonction on aura un mot copié en memoire dont la longueur sera de la longueur du mot precedent - 2
pire le compilateur ne pouvant reserver que des blocs de 4 octets en memoire et un char faisant 1 octet , la taille occupé par le mot ne descendra que ts les 2 passages dans la fonction mais de 4 octets

ainsi pour un mot de 255 char on aura réservé initialement 256 octets
au deuxième passage 256 octets
au troisième 252
au 4eme 252
au 5eme 248
et ainsi de suite

on peut donc calculer que l'espace memoire necessaire pour tester un mot de 255 octets est à peu près de 8320 octes

cela peu paraitre derisoire mais ce genre d'etude peut s'averer crucial ds certains cas ou la logueur des données à traiter devient considerable

cependant dans le cas du palindrome la taille des données est relativement modeste

connaissez vous en effet un palindrme plus grand que

ÉSOPE RESTE ICI ET SE REPOSE

je pense que la recursivité constitue une approche originale et trop souvent oublié par les programmeurs en C/C++ et tous ceux qui font de la programmation imperative en generale

alexmic
29/11/2004, 19h52
Ben au moins un :

TU L AS TROP ECRASE, CESAR, CE PORT SALUT (30 lettres)

EDIT e: en trichant (google < n'est pas un palindrome)
"Émile - Éric, notre valet, alla te laver ton ciré élimé" (42 lettres)

abgech
30/11/2004, 09h07
Pour atlas,
C'est normal que tu mélange C et C++. C++ est un sur-ensemble de C ! Tout, enfin pratiquement tout, ce que tu écris en C est compilable avec un compilateur C++. C++ ajoute à C, essentiellement, des éléments de programmation orientée objet. Pour un programmeur C, les différences syntaxiques s'apprennent en une demi journée. Il en va tout autrement de la sémantique, c'est un changement complet de paradigme de programmation, et là, il faut beaucoup, beaucoup plus de temps pour absorber la différence. Le C demeure irremplaçable, pour des raisons de performance, pour les applications de bas niveau (temps réel, OS, compilateurs, etc). Je suis plus réservé à l'égard de C++, il me paraît inutilement touffu, pour faire du développement orienté objet, je lui préfère java, plus simple et qui a le mérite (enfin, en principe et jusqu'à maintenant) d'être interopérable.

Pour fouck,
Tu as raison, la récursivité est une solution élégante (pour un matheux tout au moins). Par contre, elle est extrémement contre-performante: cascade d'appel (autant que la moitié des caractères de la chaîne) avec tout l'overhead sous-jacent: sauvegarde partiel du contexte, passage des paramètres, génération des variables locales, etc, suivie d'une cascade de retours.
On peut montrer que toute solution récursive peut être transformée en solution itérative. Dans la mesure du possible, il faut préférer la solution itérative, incomparablement plus efficace. Mais il y a des cas ou cette solution est diaboliquement compliquée à mettre en oeuvre, par exemple, la mise à jour d'un B-arbre, alors on préfère la solution récursive, dans le cas du B-arbre, la perte d'efficacité joue un rôle limité, puisque, la plupart du temps, on fait, simultanément un accès au disque.
D'autre problèmes sont plus nuancés, je pense à un compilateur. La récursivité permet d'analyser une expression algébrique, comportant 7 à 8 niveaux de priorité en un maximum d'une centaine d'instructions et sans se casser la tête. La solution itérative prend nettement plus d'instructions, sans compter les maux de tête et les bug initiaux. Par contre, au niveau du code produit, la différence est dramatiquement inverse en terme de temps de calcul. Alors que choisir ?

molodoi
30/11/2004, 10h13
Originally posted by abprfr@Tue 30 Nov 2004 08:07
Je suis plus réservé à l'égard de C++, il me paraît inutilement touffu, pour faire du développement orienté objet, je lui préfère java, plus simple et qui a le mérite (enfin, en principe et jusqu'à maintenant) d'être interopérable.

http://www.alionet.org/style_emoticons/<#EMO_DIR#>/blink.gif On a le même avis...

Qui plus est, les librairies standards de Java m'ont tjrs semblé bien mieux documentées que celles en C++

Et pour finir, atout non négligeable: Java est 100% orienté objet, contrairement à C++ (en raison de la compatibilité avec le C).

Mais bon, faut pas se voiler la face: Java a aussi des inconvénients.


Originally posted by abprfr@Tue 30 Nov 2004 08:07
Tu as raison, la récursivité est une solution élégante (pour un matheux tout au moins).

Juste une petite note pour signaler que, généralement, la récursivité, bien qu'élégante, est très mal comprise des programmeurs.

lucienmathieu
30/11/2004, 16h13
Si un palindrome est egal a la chaine renversee, tu as juste a faire une comparaison des chaines. Ce qui est directement fournit par l'operateur == de String.

Pour lire la chaine, cin te permettra effectivement de lire la chaine, il faut toujours penser que tu dois reutiliser du code qui existe deja.

Comme molodoi l'a specifier, une petite fonction String reverseString(String) devrait te suffire.

Une autre option, tu peux toujours creer un classe derivee de String, vu que la chaine renversee est effectivement une chaine, tu devras lui ajouter une methode reverse protected... mais bon ca devient complex peut-etre... mais le code de la fonction main deviendrait

String str;
RString reverse;

cin << str;
reverse = str; //ca renverse la chaine;

if (reverse == str) {
cout << "c'est un palindrome" << endl;
}



Normalement si tu renverse le dernier character et le premier, l'avant-dernier et le deuxieme... et ainsi de suite jusqu'au milieu de la chaine, tu devrais avoir quelque chose comme un for (i=0; i < milieu; i++) {
character = string[i];
string[i] = string[len + 1 - i];
string[len + 1 - i] = character;
}

un truc du style, ca devrait te permettre de retourner la chaine, bon il faudra calculer le milieu, mais ca je te laisse trouver ;-P

fouck
30/11/2004, 20h20
abprfr ton message m'a particulieremnt interessé

je suis tout à fait d'ccord avec toi pour ce qui est de la contre performance de la solution recurcive.c'est exactement ce que je tentais d'expliquer assez simplement en detaillaint (un tout petit peu car mon niveau ne me permet pas de le faire plus) le fait que pour traiter une chaire de 255 char il falait quelque chose comme 8000 octets (de memoire ca doit etre à peu près ca et si je me suis pas planter en le calculant g fait ca vite fait)

cependant en regardant les differents autres post d'atlas sur le forum il m'a semblé qu'il avez commencé la prog depuis relativement peu de temps et je me suis dit que lui soumettre (très humblement) ce mode de programation pouvait lui apporter un regard different et puis comme tu l'as dit toi meme c surtout elegant pour les matheux et g été élevé a la sauce math sup/spe avec de la prog en caml langage qui tu en conviendra se prete très surtout à ce genre de programmation fonctionnelle et recursive mais je ne l'utilise pour ainsi dire plus maintenant que je fait plus de programmation imperative

dans ton dernier post tu parle d'analyse algèbrique sur 7 ou 8 niveaux d'instructions imbriqués dans les compilateurs
cela m'interresse beaucoup

je develloppe en effet un programme de calcul matriciel en C++
celui ci comportera un analyseur d'expression algébrique et devra pouvoir reutiliser des variables definit par l'utilisateur

g déjà quelques pistes, cependant si tu savais de quel coté chercher afin de rendre mon analyseur relativement efficace toute aide de ta part serais la bienvenue

abgech
30/11/2004, 22h04
fouck,

Le décodage d'uen expression algébrique en version récursive ne pose aucun problème et est programmé en une demi-journée.
Dans un premier temps on transforme la notation infixe habituelle en notation postfixée, la fameuse notation polonaise inversée de HP (pub non payée, hélas). Puis ensuite on évalue l'expression inversée à l'aide d'une pile opérationnelle.
C'est dans la première phase qu'intervient la récursivité, par exemple, pour trois niveaux de priorité (parenthèse, + ou -, * ou /), on écrit 3 modules: expression, terme, facteur. expression appelle terme qui appelle facteur qui appelle expression lorsqu'il trouve une (. Chacun des modules en C occupe exactement 6 lignes !. En fait, tu considères que ton expression est un arbre n-aire (n est le nombre de niveau de priorité).

La deuxième phase, évaluation par pile opérationnelle est absolument triviale.

Comme tu vois, pas vraiment compliqué. Par contre peu efficace en terme de vitesse d'exécution; en terme de place mémoire, correct.

J'utilisais cet exemple comme TP dans le cadre d'un cours d'algorithme que je professais il y a encore quelques mois (je suis maintenant à la retraite ! Youpi). Si tu me passes ton adresse courriel, je t'envoie bien volontiers un extrait du cours ainsi que le corrigé du TP écrit en C.

lucienmathieu
01/12/2004, 16h12
Salut fouck,

le calcul matriciel est un peu plus complique qu'un simple calcul, si c'etait pour de simple operation, je t'aurais conseille de faire un tour du cote du code de bc.

je ne sais pas si tu avais vu la librairie de matcom, mais bon ca peut te donner des idees. math tools (http://www.mathtools.com/), matcom est un convertiseur C++ des fichier de mathlab...

DavidDeTroyes
01/12/2004, 18h22
Et si l'arôme des bottes révèle ma déviante et naïve dame, le verset t'obsède, moraliste (88 lettres !!!)

J'ai battu le record ? Je sort ?

molodoi
01/12/2004, 18h45
Originally posted by DavidDeTroyes@mercredi 01 décembre 2004 à 17:22
Je sort ?
<div align='right'><{POST_SNAPBACK}> (index.php?act=findpost&pid=9590)[/quote]

il me semble que ce serait une bonne idée

http://www.alionet.org/style_emoticons/<#EMO_DIR#>/bleh.gif

atlas
01/12/2004, 19h28
Bon tant pis je voulaiss chercher encore un peu mais je suis en train de me battre avec Anjuta qui bug de partout mais qui est prometteur ...

Voici ou j'en suis et ma philosophie : "moins je code mieux je me porte ..."

Voici la dernière étape que j'aie a franchir : récuperer une de mes chaines , l'initiale ou la finale pour que la comparaison fonctionne correctement .

NB : Et pis une stupidité j'arrive pô a frapper au clavier le symbol de la barre verticale " || "
A chaque fôa , je suis obligé de faire des copier-coller .Hem .....
Et ya quelque chose qui cafouille dans ma boucle infinie .Argh .....

Et voici le code :

[CODE]
#include <iostream>
#include <cstring> // pour brancher les fonctions de gestion des strings
#include <algorithm>
#include "stdio.h"
//#include <string>
using namespace std;

int main(){

string entree;
string sauventree;
char reponse;

do
{

cout <<"Taper une chaine au clavier"<<entree;// attend la frappe clavier

sauventree = entree; // j'essaye de stocker la valeur quelque part
getline(cin, entree);
reverse(entree.begin(), entree.end());
cout << "reverse: " << entree << endl;

if (sauventree == entree)
cout<<"Bingo!C'est un palindrome"<<endl;

if (sauventree != entree)
cout<<"He non ! Ce n'est pas un palindrome"<<endl;
cout<<"Voulez-vous continuer?O/N"<<endl;
cin>>reponse;

}

while (reponse=='O' || reponse=='o');

}//fin main

atlas
02/12/2004, 11h42
A mon avis il vaut mieux mettre

string sauventree (entree);
à la place de
sauventree = entree;

Mais c'est toujours pas ça

molodoi
02/12/2004, 12h32
Qq commentaires...


Originally posted by atlas+Wednesday 01 December 2004 à 18:28--><div class='quotetop'>Citation (atlas @ Wednesday 01 December 2004 à 18:28)</div>
sauventree = entree; // j'essaye de stocker la valeur quelque part[/b]

A priori, je dirais que tu affectes à sauventree l'adresse de l'objet sur lequel pointe entree...

Donc, en gros, si tu modifies entree, tu modifies sauveentree

<!--QuoteBegin-atlas@Wednesday 01 December 2004 à 18:28
if (sauventree == entree)

A priori, je dirais que tu teste l'égalité de pointeur et non l'égalité de deux chaînes de caractères... Sauf si l'opérateur '==' a été redéfini dans la classe string

PS: j'en branle pas une en C++. Il est donc possible que je raconte des conneries http://www.alionet.org/style_emoticons/<#EMO_DIR#>/mad.gif

Neolinux
02/12/2004, 13h56
Salux !

Pour ceux que cela semble intéresser, le record du plus long palindrome en français est de 5566 lettres. On peut le trouver ici (http://www.fatrazie.com/GdPalindrome.htm).

alexmic
02/12/2004, 15h05
Originally posted by Neolinux@Thursday 02 December 2004 à 12:56
Salux !

Pour ceux que cela semble intéresser, le reccord du plus long palindrome en français est de 5566 lettres. On peut le trouver ici (http://www.fatrazie.com/GdPalindrome.htm).
<div align='right'><{POST_SNAPBACK}> (index.php?act=findpost&pid=9724)[/quote]

Ouais mais là ça ne veut lpus rien dire. déjç rien que la première phrase est incompréhensible. http://www.alionet.org/style_emoticons/<#EMO_DIR#>/scratch.gif je comprend rien je me sens con http://www.alionet.org/style_emoticons/<#EMO_DIR#>/bang.gif

lucienmathieu
02/12/2004, 15h10
Alexmic, t'es pas tout seul... j'y comprends rien, autant faire un peu de calcul matriciel au moins la tu as des regles bien precises ;-P

A croire que les nuits sont longues dans les chaumieres...

euh, molo, c'est pas un pointeur la... sinon il aurait declare sa variable sauventree et entree comme suit.

string * sauventree;
string * entree;

je suppose aussi que string est un classe et quel contiendra un pointeur sur char du style char * __string;

normalement la classe string devrait definir l'operateur ==, meme l'operateur d'entree >>

il etait facile de definir un classe derivee de string, par exemple reverseString et d'ajouter a reverseString la methode reverse protegee, de maniere a pouvoir y faire appel et renversee la chaine.

Par contre, je ne sais plus si il faut uniquement definir le constructeur ou si il faut redefinir aussi l'operateur = ou encore pire juste redefinir l'operateur de casting sur string...

Je m'amuserai a faire l'exercice a ma sauce quand j'aurai du temps libre ;-P

On devrait se faire une petite classe Matrice aussi, ce serait marrant avec des operateurs *, /, + et - histoire de rigoler... en plus ca pourrait etre utile pour les fans de programmation 3D... on verra si on peut faire tenir des reels, des scalaires et des matrices dans cette petite classe... J'ai trouve une bonne explication du calcul matriciel, ca me rappel mon syllabus de math... en mieux...
Univ Paris (http://www.math-info.univ-paris5.fr/~graff/L1_S1/Poly/chap10.pdf)

Par contre mathlab, c'est trop interprete a mon gout...

Ah oui tant que j'y pense, une gestion des exceptions si le calcul n'est pas bon, on retourne une exception explicative a l'utilisateur.

Neolinux
02/12/2004, 15h33
Salux !

http://www.alionet.org/style_emoticons/<#EMO_DIR#>/blushing.gif Sorry pour avoir pollué ce sujet (pas taper, pas taper !), c'était juste pour info. En fait un palindrome ne doit pas forcément dire quelque chose de cohérent, mais pouvoir se lire dans les deux sens.

Mais je suis d'accord, il faut vraiment avoir du temps à perdre pour chercher à battre ce genre de record. Ceci dit, il y en a qui sont encore plus stupides, il suffit de tomber, en zappant, sur l'émission des records pour s'en convaincre. http://www.alionet.org/style_emoticons/<#EMO_DIR#>/laugh.gif

Bon, je vous laisse revenir aux palindromes qui concernent la programmation. http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wink.gif

lucienmathieu
02/12/2004, 15h40
Pas de probleme, ca fait toujours plaisir d'etre un peu plus cultive qu'a la derniere connection... y a pas que la programmation dans la vie... y a ma ps2 aussi!

molodoi
02/12/2004, 16h58
Originally posted by lucienmathieu@jeudi 02 décembre 2004 à 14:10
euh, molo, c'est pas un pointeur la... sinon il aurait declare sa variable sauventree et entree comme suit.

string * sauventree;
string * entree;
<div align='right'><{POST_SNAPBACK}> (index.php?act=findpost&pid=9733)[/quote]

alors, dans le cas supra, c'est une référence... Donc, égalité de référence...

Le C++, c'est barbare http://www.alionet.org/style_emoticons/<#EMO_DIR#>/mad.gif

atlas
03/12/2004, 16h54
Ni réference ,ni pointeur , une simple affectation devrait suffire
Voici la solution (j'aie un peu crossposté j'avoue ...Shame on me !)


#include <iostream>
#include <cstring>
#include <algorithm>
#include "stdio.h"

using namespace std;

int main(){

string reponse;

do
{
string entree;
cout <<"Taper une chaine au clavier"<<entree;
getline(cin, entree);

string chaine(entree.rbegin(), entree.rend());
cout << "reverse: " << chaine << endl;

if (entree == chaine)
cout<<"Bingo!C'est un palindrome"<<endl;

else
cout<<"He non ! Ce n'est pas un palindrome"<<endl;

cout<<"Voulez-vous continuer?O/N"<<endl;
getline(cin, reponse);

}

while (reponse=="O" || reponse=="o");

}//fin main

Conclusion :si votre petite amie vous dit "irehc nom emia't ej" déduisant que:
non seulement ce n'est pas un palindrome mais qu'il faut en plus contacter de toute urgence votre exorciste le plus proche pour une extrême onction-minute(prévoyez 200$ la séance)

Dixit : le film l'exorciste ou "Buffy contre les vampires" (et je vous prie de ne pas remettre en cause ma culture cinématographique)

DavidDeTroyes
03/12/2004, 18h23
... tu lui repond "eirehc am ,issua iom ,emai't ej" et vous vous faite une seance d'exorcisme à 2, c'est plus sympa ! http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif

Mystico
03/12/2004, 18h57
hum ... exorcisme ... peu de chance ...y a mieu que ca a faire a deux http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wub.gif

molodoi
05/12/2004, 15h16
Originally posted by Mystico@vendredi 03 décembre 2004 à 17:57
hum ... exorcisme ... peu de chance ...y a mieu que ca a faire a deux http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wub.gif
<div align='right'><{POST_SNAPBACK}> (index.php?act=findpost&pid=9842)[/quote]

surtout si c'est avec Buffy http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wub.gif http://www.alionet.org/style_emoticons/<#EMO_DIR#>/blushing.gif

DavidDeTroyes
06/12/2004, 12h37
Buffy ? C'est qui ca ?

Si vous pratiquiez l'exorcisme comme je le preatique avec ma petite amie, vous adoriez aussi !!! http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif

lucienmathieu
06/12/2004, 16h37
molo, pas de reference... sinon ce serait string & entree pour la référence...
ce qu'atlas fait est une simple déclaration de variable...

Par contre, il faudra qu'il nous explique son getline(cin, entree) et le rend, rbegin de string...

Beau programme, çà vaut un 10/10 ;-P

On ne sait pas mettre les variables en début de programme?

atlas
06/12/2004, 20h28
getline(cin, entree) // est meilleur que cin tout court parce que ça intègre les espaces .cin>> fait des "séparations"

le rbegin() et le rend() sont des ReverseIterators ça intégre la fonction reverse(entree.begin , entree.end)

lucienmathieu
07/12/2004, 14h16
Et tout ca en standard C++, c'est quand meme fantastique...