commit 29bbe37f353b45ee899e25eba4f3e442344bfb54 Author: theking90000 Date: Tue Nov 26 20:28:03 2024 +0100 TP8: bieres diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c98f18f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vs +x64 diff --git a/TP8/Bieres/Biere2.txt b/TP8/Bieres/Biere2.txt new file mode 100644 index 0000000..b317b83 --- /dev/null +++ b/TP8/Bieres/Biere2.txt @@ -0,0 +1,11 @@ +Belge;Chimay bleue;Trappiste;9;5.2;Hainaut +Belge;Leffe blonde;Blonde;6.6;4.5;Namur +Belge;Hoegaarden;Pils;4.9;3.5;Flandre occidentale +Etrangere;Guinness;Stout;4.2;4.2;Irlande +Etrangere;Heineken;Pils;5;3;Pays-Bas +Belge;Paix Dieux;Blonde;10;4.9;Hainaut +Etrangere;Corona;Blonde;4.6;4.5;Mexique +Etrangere;Budweiser;Pils;5;4.5;Etats-Unis +Etrangere;Kronenbourg;Pils;4.5;2.5;France +Belge;Moinette;Blonde;8.5;5.2;Hainaut +Belge;Chouffe Cherry;Kriek;6.5;4.5;Luxembourg \ No newline at end of file diff --git a/TP8/Bieres/Bieres.sln b/TP8/Bieres/Bieres.sln new file mode 100644 index 0000000..e860fb4 --- /dev/null +++ b/TP8/Bieres/Bieres.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34221.43 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Bieres", "Bieres.vcxproj", "{B0790A3C-3DE5-447C-80FC-7F630D6D7ECD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B0790A3C-3DE5-447C-80FC-7F630D6D7ECD}.Debug|x64.ActiveCfg = Debug|x64 + {B0790A3C-3DE5-447C-80FC-7F630D6D7ECD}.Debug|x64.Build.0 = Debug|x64 + {B0790A3C-3DE5-447C-80FC-7F630D6D7ECD}.Debug|x86.ActiveCfg = Debug|Win32 + {B0790A3C-3DE5-447C-80FC-7F630D6D7ECD}.Debug|x86.Build.0 = Debug|Win32 + {B0790A3C-3DE5-447C-80FC-7F630D6D7ECD}.Release|x64.ActiveCfg = Release|x64 + {B0790A3C-3DE5-447C-80FC-7F630D6D7ECD}.Release|x64.Build.0 = Release|x64 + {B0790A3C-3DE5-447C-80FC-7F630D6D7ECD}.Release|x86.ActiveCfg = Release|Win32 + {B0790A3C-3DE5-447C-80FC-7F630D6D7ECD}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {405C11FC-BCB9-48E5-AF56-94243F892EF4} + EndGlobalSection +EndGlobal diff --git a/TP8/Bieres/Bieres.vcxproj b/TP8/Bieres/Bieres.vcxproj new file mode 100644 index 0000000..1b3ec5a --- /dev/null +++ b/TP8/Bieres/Bieres.vcxproj @@ -0,0 +1,138 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {b0790a3c-3de5-447c-80fc-7f630d6d7ecd} + Bieres + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/TP8/Bieres/Bieres.vcxproj.filters b/TP8/Bieres/Bieres.vcxproj.filters new file mode 100644 index 0000000..a679246 --- /dev/null +++ b/TP8/Bieres/Bieres.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Fichiers sources + + + + + Fichiers de ressources + + + \ No newline at end of file diff --git a/TP8/Bieres/Bieres.vcxproj.user b/TP8/Bieres/Bieres.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/TP8/Bieres/Bieres.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/TP8/Bieres/Côté_Bieres_VF.pdf b/TP8/Bieres/Côté_Bieres_VF.pdf new file mode 100644 index 0000000..86d8b4e Binary files /dev/null and b/TP8/Bieres/Côté_Bieres_VF.pdf differ diff --git a/TP8/Bieres/main.cpp b/TP8/Bieres/main.cpp new file mode 100644 index 0000000..876f0c4 --- /dev/null +++ b/TP8/Bieres/main.cpp @@ -0,0 +1,303 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +class Biere { + string nom; + string type; + float deg_alcool; + float prix; + string region; + +public: + void saisie(ifstream& stream); + // Saisie (mais depuis le clavier) + void saisie(); + void affichage(); + + float get_deg_alcool() { + return deg_alcool; + } + float get_prix() { + return prix; + } + + string get_nom() { + return nom; + } +}; + + +// Ici la fonction lecture n'est pas une template +// car il doit ajouter au bon conteneur en fonction du type de bire +// On aurait pu aussi imaginer une template, avec un "filtre", qui n'ajoute que +// dans le conteneur pass en paramtre si le type == filtre. +// Mais cela aurait ncessit 2lectures du fichier (ou une autre fonction) +void lecture_fichier(list& belges, vector& etrangeres, const string fname) { + ifstream file(fname); + + if (!file.is_open()) { + cout << "Erreur lors de l'ouverture du fichier" << endl; + return; + } + + while (!file.eof()) { + string type; + Biere b; + + getline(file,type, ';'); + b.saisie(file); + + if (type == "Belge") { + belges.push_back(b); + } + else { + etrangeres.push_back(b); + } + } +} + + +// La version template +// En soit le 2e paramtre (T) n'est pas vraiment ncessaire parce que toujours = "Biere" +// j'ai aucune ide de si il faut le mettre ou pas c'est un peu coup de poker avec +// Benjelloun, il peut te dire fallait pas le mettre pour la raison que j'ai cit ci-dessus +// mais aussi te dire mais il fallait le mettre (si on envisage l'inhritance d'une classe bire) +template +void lecture_fichier_filtre(C& conteneur, const string type, const string fname) { + ifstream file(fname); + + if (!file.is_open()) { + cout << "Erreur lors de l'ouverture du fichier" << endl; + return; + } + + while (!file.eof()) { + string t; + + getline(file, t, ';'); + if (t != type) { + file.ignore(200, '\n'); // passer la ligne, count=200 s'arrte ds que '\n'. + continue; + } + + T b; + b.saisie(file); + + conteneur.push_back(b); + } +} + +template +void affichage(C& c) { + for (auto& a : c) { + a.affichage(); + } +} + +string saisie_type_biere() { + string t; + cout << "Belge ou pas (O/N) :"; + cin >> t; cin.ignore(); + return t == "O" ? "Belge" : "Etranger"; +} + +// Pareil ici pour le type T = "Biere" +// j'aime beacoup la syntaxe +// using T = typename C::value_type +// qui vite de devoir passer T explicitement +// mais pas sur que les assistants connaissent tous/ benjelloun apprcie +template +void ajout(C& conteneur) { + T b; + b.saisie(); + conteneur.insert(conteneur.begin(), b); +} + +void saisie_seuil(int& s) { + cout << "Seuil : "; + cin >> s; +} + +template +void erase_seuil_alcool(C& cont, float seuil) { + // au lieu d'itrer on aurait aussi pu utiliser remove_if () + // mais lors il aurait fallut passer le "seuil" en paramtre avec l'quivalent + // d'un "higher order function" ou d'un lambda + // mais pas vu au cours donc on fait comme a. + + auto it = cont.begin(); + for (; it != cont.end(); /* il ne faut pas incrmenter l'itrateur chaque fois, si on supprime on skip l'lement */) { + // it-> est quivalent une drfrence (*it) + if (it->get_deg_alcool() >= seuil) { + it = cont.erase(it); + } + else { + it++; + } + } +} + +// T= tjr bire en soit +template +bool comparer_prix(T& a, T& b) { + return a.get_prix() < b.get_prix(); +} + +template +void plus_cher(C& cont) { + // pour obtenir les bires LES + chers ont peu soit + // itrer pour rcuprer le max() en prix + // puis ritr et n'afficher que les bires ou + // prix == max + // ou sort le conteneur O(N logN) puis prendre les N premier + // tant que N == prixPrecedent. + + // max_element marchera pas pour PLUSIEURS bires :( + auto it = max_element(cont.begin(), cont.end(), comparer_prix); + + if (it == cont.end()) { + cout << "Aucune bire dans le conteneur"; + return; + } + + // quivalent (*it).get_prix(); + float prixMax = it->get_prix(); + + for (auto& b : cont) { + if (b.get_prix() == prixMax) { + // b.affichage(); + cout << b.get_nom() << " au prix de " << setprecision(4) << b.get_prix() << " euros" << endl; + } + } + +} + +int menu() { + int choix; + cout << "1. Stocker les bires Belge(s) dans une List et les bires Etrangere(s) dans un Vector + Afficher" << endl + << "2. Ajouter au dbut une bire List ou au Vector des bires selon si la bire est Belge ou pas" << endl + << "3. Supprimer les bires dont le degr d'alcool est suprieure un seuil donn par lutilisateur" << endl + << "4. Afficher les bires les plus chres du List et du Vector" << endl; + + cout << "Choix:" << endl; + cin >> choix; + return choix; +} + +int main() { + list belges; + vector etrangeres; + + int seuil; + + setlocale(LC_ALL, ""); + + while (true) { + switch (menu()) { + case 1: + // Ici, aucune ide de la bonne version + // Aussi un coup de poker avec Benjelloun. + // (lecture du fichier 2x vs pas de template+2conteneurs en paramtres) + + // Avec la premire fonction lecture + // lecture_fichier(belges, etrangeres, "Biere2.txt"); + + // Avec la seconde utilisant des templates et un filtre + lecture_fichier_filtre, Biere>(belges, "Belge", "Biere2.txt"); + lecture_fichier_filtre, Biere>(etrangeres, "Etrangere", "Biere2.txt"); + + cout << "Bires Belges:" << endl; + affichage(belges); + cout << "Bires trangres" << endl; + affichage(etrangeres); + break; + + case 2: + if (saisie_type_biere() == "Belge") { + ajout, Biere>(belges); + cout << "Bires Belges:" << endl; + affichage(belges); + } + else { + ajout, Biere>(etrangeres); + cout << "Bires trangres" << endl; + affichage(etrangeres); + } + break; + + case 3: + saisie_seuil(seuil); + + erase_seuil_alcool(belges, seuil); + erase_seuil_alcool(etrangeres, seuil); + + cout << "Bires Belges:" << endl; + affichage(belges); + cout << "Bires trangres" << endl; + affichage(etrangeres); + + break; + + case 4: + cout << "Les bires belges la plus chres sont" << endl; + plus_cher(belges); + cout << "Les bires trangres la plus chres sont" << endl; + plus_cher(etrangeres); + + break; + default: + return 0; // sortie + } + } +} + +void Biere::saisie(ifstream& s) { + string tmp; + getline(s, nom, ';'); + getline(s, type, ';'); + + + getline(s, tmp, ';'); + + // POUR UNE RAISON QUE J'IGNORE compltement, sur VisualStudio 2022 + // Avec windows en FRANCAIS, le stof lis les nombre avec des VIRGULES et pas des points + // Il est ncessaire de retirer ceci en fonction de la plateforme ou du compilateur + // Voir mme de la langue de Windows (on pourra le faire mais je le fais pas) + replace(tmp.begin(), tmp.end(), '.', ','); + + + deg_alcool = stof(tmp); // fonction stof: String TO Float + + getline(s, tmp, ';'); + + // Pareil ici :/ + replace(tmp.begin(), tmp.end(), '.', ','); + + prix = stof(tmp); + + getline(s, region, '\n'); +} + +void Biere::affichage() { + cout << nom << "; " << type << "; " << deg_alcool << "; " << prix<<"; "<> deg_alcool; + cout << "Prix : "; + cin >> prix; cin.ignore(); + cout << "Rgion/Pays : "; + getline(cin, region); +} \ No newline at end of file