/* IFT1169 - démonstration #11 - exercice 04 - 08-avril -2006 v1.01 M.Lokbani - l'énoncé+solution + gcc3.4.2 à partir de l'énoncé de l'examen Final session Hiver 2005 - IFT1166 - 19-avril -2005 v1.00 M.Lokbani - code & comments Final H05 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: ------------ Écrire un programme qui réalise les opérations suivantes: -1- Lit le contenu d'un fichier passé en argument. Ce fichier contient un certain nombre de mots, chacun se trouvant sur une ligne séparée. -2- Affiche en sortie: a) Le nombre de mots répétés plus d'une fois, b) Le mot le plus répété, c) Le 10e mot lu, extrait de la liste des mots triée dans un ordre alphabétique croissant. La forme des lettres dans un mot n’est pas un élément discriminant. Un mot écrit en majuscule ou en minuscule, c’est exactement le même mot. Remarques --------- Il faudra utiliser un map, sinon vous avez de fortes chances d'utiliser un algorithme de l'ordre de O(n^2). */ #include #include #include #include #include #include using namespace std; int main(int argc,char* argv[]) { if (argc < 2) { cerr << "Erreur sur le nombre d'arguments: nom_du_programme nom_fichier_in\n"; exit(1); } const string filename(argv[1]); ifstream ifs(filename.c_str()); map m; // On commence par stocker les clés vector v; string s; while (ifs >> s){ transform(s.begin(),s.end(),s.begin(),(int(*)(int))tolower); m[s] = 0; // Tout à 0 } ifs.close(); // On itére une seconde fois pour calculer la fréquence string plusRepete; int plusRepetitions = 0; int motsRepetes = 0; ifstream ifs2(filename.c_str()); while (ifs2 >> s){ transform(s.begin(),s.end(),s.begin(),(int(*)(int))tolower); if (m[s] == 1) motsRepetes++; m[s] += 1; if (m[s] > plusRepetitions) { plusRepete = s; plusRepetitions = m[s]; } v.push_back(s); } ifs2.close(); sort(v.begin(), v.end()); cout << "Le nombre de mots repetes plus d'une fois: " << motsRepetes << endl; cout << "Le mot le plus repete: " << plusRepete << endl; cout << "Le 10e mot lu: " << v[9] << endl; return(0); }