// ATTENTION, je n'avais pas défini de format pour le stockage des données dans le fichier // on considèrera que les données sont séparé par des ";" class Date { int jour; int mois; int annee; Date(int jour, int mois, int annee) { this.jour = jour; this.mois = mois; this.annee = annee; } Date(Date d) { jour = d.jour; mois = d.mois; annee = d.annee; } } class Heure { int heure; int minute; Heure(int h, int m) { heure = h; minute = m; } Heure(Heure h) { heure = h.heure; minute = h.minute; } } class EmissionTV { int idu; // idu pour identifiant unique Date date; Heure heure; String nom; int duree; String chaineTV; // j'ai décidé de faire 2 constructeurs en plus de celui pour la copie // mais la seconde solution est meilleur comme on le verra dans la fonction "saisirEmissionTV()" plus loin EmissionTV(int id, int j, int m, int a, int heures, int minutes, String nom, int duree, String chaineTV) { idu = id; date = new Date(j, m, a); heure = new Heure(heures, minutes); this.nom = nom; this.duree = duree; this.chaineTV = chaineTV; } EmissionTV(int id, Date d, Heure h, String nom, int duree, String chaineTV) { idu = id; date = new Date(d); // on se souvient que c'est pour ce genre d'opération qu'on a fait un constructeur par recopie // "date = d" ne marchant pas -- cf le cours heure = new Heure(h); this.nom = nom; this.duree = duree; this.chaineTV = chaineTV; } EmissionTV(EmissionTV e) { idu = e.idu; // comme on fait une copie on ne modifie pas l'identifiant unique. date = new Date(e.date); // on se souvient que c'est pour ce genre d'opération qu'on a fait un constructeur par recopie // "date = e.date" ne marchant pas -- cf le cours heure = new Heure(e.heure); nom = e.nom; duree = e.duree; chaineTV = e.chaineTV; } } Date saisirDate() { int j, m, a; Date d; do { j = askInteger("Veuillez saisir le jour (entre 1 et 31)"); } while (!(j>=1 && j<=31)); do { m = askInteger("Veuillez saisir le mois (entre 1 et 12)"); } while(!(m>=1 && m<=12)); do { a = askInteger("Veuillez saisir l'année (au delà de 2020)"); } while(a<2020); d = new Date(j, m, a); return d; } Heure saisirHeure() { int heure, m; Heure h; do { heure = askInteger("Veuillez saisir les heures (entre 0 et 23)"); } while (!(heure>=1 && heure<=23)); do { m = askInteger("Veuillez saisir les minutes (entre 0 et 59)"); } while(!(m>=0 && m<=59)); h = new Heure(heure, m); return h; } EmissionTV saisirEmissionTV() { int id; Date date; Heure heure; String nom; int duree; String chaineTV; EmissionTV e; do { id = askInteger("Veuillez saisir un identifiant unique (>0)"); } while(id <= 0); date = saisirDate(); heure = saisirHeure(); do { nom = askString("Veuillez saisir le nom de l'émission TV -- non nul"); } while(nom.equals("")); do { duree = askInteger("Veuillez saisir la durée de l'émission TV en minutes (>0)"); } while(duree <= 0); do { chaineTV = askString("Veuillez saisir le nom de la chaine TV -- non nul"); } while(chaineTV.equals("")); e = new EmissionTV(id, date, heure, nom, duree, chaineTV); // on voit bien ici que le second constructeur proposé était mieux // sinon ce n'était pas pratique de réutiliser saisirDate et saisirHeure return e; } EmissionTV lireEmissionTV(String s) { // variables pour récupérer les différentes valeurs stockées int id; int j, m, a; int heure, min; Date d; // Peut être supprimé si on utilise la solution commentée à la fin Heure h; // Peut être supprimé si on utilise la solution commentée à la fin String nom; int duree; String chaineTV; // variable pour reconstruire EmissionTV EmissionTV e; String[] tab = split(s, ";"); // découpe selon les ";" id = int(tab[0]); j = int(tab[1]); m = int(tab[2]); a = int(tab[3]); heure = int(tab[4]); min = int(tab[5]); nom = tab[6]; duree = int(tab[7]); chaineTV = tab[8]; d = new Date(j, m, a); h = new Heure(heure, min); e = new EmissionTV(id, d, h, nom, duree, chaineTV); // Les 3 lignes du dessus peuvent être remplacé par un appel au premier constructeur e = new EmissionTV(id,j, m, a, heure, min, nom, duree, chaineTV); return e; } void ecrireDate(Date d, PrintWriter o) { o.print(d.jour+";"+d.mois+";"+d.annee); } void ecrireHeure(Heure h, PrintWriter o) { o.print(h.heure+";"+h.minute); } void ecrireEmissionTV(EmissionTV e, PrintWriter o) { // Noter bien qu'on utiliser des print et seulement à la fin un println o.print(e.idu+";"); ecrireDate(e.date, o); o.print(";"); ecrireHeure(e.heure, o); o.print(";"); o.print(e.nom+";"+e.duree+";"+e.chaineTV); o.println(); // pour passer à la ligne suivante } void ModificationProgrammation(String nomFichier, int identifiant) { String[] lines = loadStrings(nomFichier); PrintWriter out; out = createWriter(nomFichier); EmissionTV e; for(String line : lines) { e = lireEmissionTV(line); if (e.idu == identifiant) { modifierlesDifferentsChampsDelEmissionTV(e); } ecrireEmissionTV(e,out); } out.flush(); out.close(); } void afficheEmissionTV(EmissionTV e) { println("L'émission TV identifiée par ["+e.idu+"] intitulée ["+e.nom+"] diffusée sur ["+e.chaineTV+"] à ["+ e.heure.heure+":"+e.heure.minute+"] le ["+e.date.jour+"/"+e.date.mois+"/"+e.date.annee+"] dure ["+e.duree+"] minutes"); } void afficheMenuModification() { println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); println("1) Pour modifier le nom de l'émission"); println("2) Pour modifier le nom de la chaine TV"); println("3) Pour modifier la durée de l'émission"); println("4) Pour modifier la date de l'émission"); println("5) Pour modifier la date de l'émission"); println("0) Pour sortir des modifications"); println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); } void modifierlesDifferentsChampsDelEmissionTV(EmissionTV e) { int choix=0; do { switch(choix) { case 1: do { e.nom = askString("Veuillez saisir le nom de l'émission TV -- non nul"); } while(e.nom.equals("")); break; case 2: do { e.chaineTV = askString("Veuillez saisir le nom de la chaine TV -- non nul"); } while(e.chaineTV.equals("")); break; case 3: do { e.duree = askInteger("Veuillez saisir la durée de l'émission TV en minutes (>0)"); } while(e.duree <= 0); break; case 4: // attention ici on ne peut pas utiliser la fonction saisirDate par exemple // e.date = saisirDate(); ne fonctionnerait pas à cause de ce qui est expliqué dans le cours "Info 2 SCP-Cours2.pdf" en diapo 17 do { e.date.jour = askInteger("Veuillez saisir le jour (entre 1 et 31)"); } while (!(e.date.jour>=1 && e.date.jour<=31)); do { e.date.mois = askInteger("Veuillez saisir le mois (entre 1 et 12)"); } while(!(e.date.mois>=1 && e.date.mois<=12)); do { e.date.annee = askInteger("Veuillez saisir l'année (au delà de 2020)"); } while(e.date.annee<2020); break; case 5: // même remarque pour saisirHeure() -- diapo 17 du cours "Info 2 SCP-Cours2.pdf" do { e.heure.heure = askInteger("Veuillez saisir les heures (entre 0 et 23)"); } while (!(e.heure.heure>=1 && e.heure.heure<=23)); do { e.heure.minute = askInteger("Veuillez saisir les minutes (entre 0 et 59)"); } while(!(e.heure.minute>=0 && e.heure.minute<=59)); break; } afficheEmissionTV(e); afficheMenuModification(); choix = askInteger("Votre choix ?"); } while(choix !=0); } // Ceci est une fonction supplémentaire que j'utilise dans le setup juste "pour le plaisir" void afficheLesEmissionTVsLuDepuisFichier(String nomFichier) { String[] lines = loadStrings(nomFichier); EmissionTV e; for(String line : lines) { e = lireEmissionTV(line); afficheEmissionTV(e); } } void setup() { // "final" sert à dire que c'est une constante final String leNomDuFichier = "programmeTV.dat"; // J'ajoute ce code pour voir le contenu du fichier avant modification afficheLesEmissionTVsLuDepuisFichier(leNomDuFichier); int id; do { id = askInteger("Veuillez saisir l'identifiant unique de l'émission à modifier (>0)"); } while(id <= 0); ModificationProgrammation(leNomDuFichier, id); // J'ajoute ce code pour voir le contenu du fichier apres modification afficheLesEmissionTVsLuDepuisFichier(leNomDuFichier); }