/* IFT1169 - démonstration #10 - exercice 02 - 01-avril -2006 v1.03 M.Lokbani - gcc3.4.2 26-novembre -2003 v1.02 M.Lokbani - comments + gcc3.2 23-juin -2000 v1.01 M.Lokbani - mise à jour comments + compilateur 30-novembre -1999 v1.00 M.Lokbani - écriture du code à partir de K.Zalewski 13/05/1996 & N.Dale, C.Weems, & J.McCormick, Programming and Problem Solving with Ada, D. C. Heath and Co., 1994. Chose nouvelle, la fonction palindrome. contact: lokbani@iro.umontreal.ca Copyright (C) 1999-2006 Université de Montréal Département d'informatique et de Recherche Opérationnelle Mohamed Lokbani -- Tous Droits Réservés -- All Rights Reserved -- Description: ------------ Une série de fonctions et un programme test pour tester si une chaîne est une anagramme d'une autre. */ #include #include #include #include using namespace std; // Conversion de majuscule vers minuscule void lowercase(string& line1) { for (int i = 0; line1[i] != '\0'; ++i) if ('A' <= line1[i] && line1[i] <= 'Z') line1[i] += 32; } // On se sépare des espaces blancs dans la phrase void remove_blanks(string& line1){ string::iterator i = remove(line1.begin(), line1.end(), ' '); // i pointe après le dernier caractère line1.erase(i, line1.end()); } // La phrase est mise en minuscule, sans espaces blancs puis triée void standardize(string& line1){ lowercase(line1); remove_blanks(line1); } // Remplies le vecteur dans le sens avant void convert_back(string s, vector & x){ string::iterator i; for(i=s.begin(); i != s.end(); ++i) x.push_back(*i); } // Remplies le vecteur dans le sens arrière void convert_front(vector & y, vector & x){ vector::reverse_iterator i; for(i= y.rbegin(); i != y.rend() ; i++) x.push_back(*i); } bool palindrome(string s){ // Traitement sur la phrase en entrée, Min/Maj et espaces blancs. standardize(s); vector v1,v2; // Copie la chaîne dans le vecteur v1 (a l'endroit) convert_back(s,v1); // Duplique le vecteur v1, mais a l'envers. convert_front(v1,v2); // Vrai si dans un sens ou dans l'autre, le même contenu. return v2==v1; } // Lit deux phrases en entrée et teste si les deux sont des anagrammes // termine si la première phrase a moins de 2 caractères, ou CTRL-C int main() { while (true) { string line1; cout << "\nEntrez une phrase: \n\n" ; getline(cin,line1); if (line1.size() < 4) /* termine si moins de 2 caractères (autres que newline et null) */ break; cout << "\n" << line1 << "\n : "; if (palindrome(line1)) cout << "OUI! La chaîne est palindrome.\n"; else cout << "NON! La chaîne n'est pas palindrome.\n"; cout << "\n\n\n"; } return 0; }