/* IFT1169 - démonstration #10 - exercice 01 - 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. 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); sort(line1.begin(), line1.end()); } // Retourne vraie si les deux phrases sont des anagrammes, // maj/min et espaces blancs sont ignores lors du test bool anagrams(string line1, string line2){ standardize(line1); standardize(line2); return line1 == line2; // Vrai si les deux lignes ont exactement les mêmes caractères au même position } // 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, line2; cout << "\nEntrez une phrase: \n" ; getline(cin,line1); cout << "\nEntrez la seconde phrase: \n" ; getline(cin,line2); if (line1.size() < 4) /* termine si moins de 2 caractères (autres que newline et null) */ break; cout << "\n\nPhrase 1: " << line1 << "\n"; cout << "Phrase 2: " << line2 << "\n\n"; if (anagrams(line1, line2)) cout << "OUI! Les deux chaînes sont anagrammes.\n"; else cout << "NON! Les deux chaînes ne sont pas anagrammes.\n"; cout << "\n\n\n"; } return 0; }