/** * Une solution possible au TP1 * @author felipe * @version la seule * * Code de la version minimale (les bonus ne sont pas codes) * Note: les privates ne sont pas vraiment necessaires ici. * Note: toutes les methodes sont static car appellees du main * qui doit etre static * Note: je n'ai pas le temps de tester ce programme, aussi vous trouverez * probabalement des petites coquilles. Si je donne cette solution, * c'est pour que vous puissiez voir le decoupage en methode effectue, * le style des commentaires qui devraient figurer dans vos codes, etc. * N'hesitez pas a m'indiquer toute erreur que vous trouveriez dans ce code. * Note: les commentaires sont ici dans un format reconnu par javadoc. Ce n'est * pas impose (ni meme evoque) par l'enonce. C'est cependant une bonne * habitude a prendre que de commenter vos codes avec ce format. C'est * un format que vous pouvez egalement utiliser avec vos sources C/C++. * Javadoc vous permet de generer une documentation web directement a * a partir de votre code (ex: l'API que vous consultez regulierement) * Pour plus d'information, tapez: "man javadoc" dans une console. */ import Keyboard; import Grille; public class Tp1Solution { /** * Verifie si une valeur st entre deux autres * @param v la valeur * @param min la borne min * @param max la borne max * @return true si v est ente min et max */ private static boolean in (int v, int min, int max) { return (v >= min) && (v <= max); } /** * Effectue la saisie en effectuant eventuellement * un affichage * @param message le message a afficher avant la saisie. Si aucun message ne doit etre affiche, mettre a null * @param min la valeur minimale de la saisie * @param max la valeur maximale de la saisie * @return la reponse de l'utilisateur * * Note: boucle tant que l'utilisateur niaise */ private static int saisie(String message, int min, int max) { int rep; do { if (message != null) System.out.print(message); rep = Keyboard.readInt(); } while (! in(rep,min,max)); return rep; } /** * Affiche une ligne * @param ligne l'indice de ligne (1-indice) */ private static void afficheLigne(int ligne) { for (int i=1; i<=Grille.getLargeur(); i++) System.out.print(Grille.getValue(ligne,i) + " "); System.out.println(); } /** * Affiche une colonne * @param ligne l'indice de colonne (1-indice) */ private static void afficheColonne(int colonne) { for (int i=1; i<=Grille.getHauteur(); i++) System.out.print(Grille.getValue(i,colonne) + " "); System.out.println(); } /** * Moyenne d'une ligne * @param ligne l'indice de ligne (1-indice) * @return la moyenne * * Note: on suppose que getLargeur retourne une valeur strictement positive */ private static float moyenneLigne(int ligne) { float moy = 0.f; for (int i=1; i<=Grille.getLargeur(); i++) moy += Grille.getValue(ligne,i); return moy / Grille.getLargeur(); } /** * Moyenne d'une colonne * @param ligne l'indice de colonne (1-indice) * @return la moyenne * * Note: on suppose que getHauteur retourne une valeur strictement positive */ private static float moyenneColonne(int colonne) { float moy = 0.f; for (int i=1; i<=Grille.getHauteur(); i++) moy += Grille.getValue(i,colonne); return moy / Grille.getHauteur(); } /** * Verifie si la grille est palindromique * @return l'indice de la premiere ligne palindrome rencontree, 0 si aucune ligne n'est palindrome */ private static int palindromique() { for (int i=1; i= fin) return i; // cette ligne est palindrome ! } return 0; // aucune ligne palindrome } /** * Cherche la premiere occurrence d'une ligne qui se repete * @return l'indice de la ligne se repetant, 0 si aucune ligne ne se repete * * Idee on compare une ligne i (au debut la premiere) a toutes les lignes suivantes * Note: il est inutile d' aller comparer une ligne j avec une ligne i plus petite * car on a deja teste que i est differente de j (sinon on serait sorti) */ private static int repetition() { int nbCol = Grille.getLargeur(); // pour changer un peu ... int nbLig = Grille.getHauteur(); // pou changer un peu ... int c; // indice de colonne for (int i=1; i<=nbLig; i++) { for (int j=i+1; j<=nbLig; j++) { // testons si la ligne i se repete en ligne j for (c=1; (c <= nbCol) && (Grille.getValue(i,c) == Grille.getValue(j,c)); c++); if (c == (nbCol+1)) return i; // la ligne i se repete } } return 0; // aucune repetition rencontree } /** * Appellee par @see carreMagique * @param l la ligne de depart * @param c la colonne de depart * @param nb le nombre de pas de boucles a effectuer * @param dl increment ligne a ajouter a chaque pas de boucle * @param dc increment colonne a ajouter a chaque pas de boucle * @return la somme des chiffres rencontres */ private static int sommeDirection(int l, int c, int nb, int dl, int dc) { int somme = 0; for (int i=0; itrue si le carre ainsi delimite est magique */ private static boolean carreMagique(int ligne, int colonne, int longueur) { // quelques tests pour verifier que le carre est bien dans la grille ! if ( (! in(ligne + longueur,1,Grille.getHauteur())) || (! in(colonne+longueur,1,Grille.getLargeur())) ) { System.err.println("Ton carre magique n'est pas frais ..."); return false; } if (longueur == 1) return true; // pas du tout obligatoire // les tests sont concluants int somme; somme = sommeDirection(ligne,colonne,longueur,1,1); // diagonale \\ if (sommeDirection(ligne,colonne+longueur-1,longueur,1,-1) != somme) return false; // diagonale // for (int i= ligne; i < (ligne+longueur); i++) if (sommeDirection(i,colonne,longueur,0,1) != somme) return false; // ligne i for (int i= colonne; i < (colonne+longueur); i++) if (sommeDirection(ligne,i,longueur,1,0) != somme) return false; // colonne i // lignes, colonnes et diagonales somment a somme: carre magique ! return true; } /** * Les chaines sont copiees/collees de l'enonce * pour eviter les problemes de conformite a l'enonce * * @return le choix de l'utilisateur */ static private int menu() { System.out.println(); System.out.println("TP1 IFT1010 Hiver 2002"); System.out.println(); System.out.println("1 afficher une ligne"); System.out.println("2 afficher une colonne"); System.out.println("3 moyenne d'une ligne"); System.out.println("4 moyenne d'une colonne"); System.out.println("5 repetition de ligne"); System.out.println("6 palindrome"); System.out.println("7 carre magique"); System.out.println("0 quitter"); System.out.println(); return saisie("Votre choix : ",0,7); } /** * main */ public static void main (String [] args) { int rep; // la reponse au menu String message; // variable temporaire pour affichage float moy; // variable temporaire int r; // variable temporaire String message1 = "Entrez un numero de ligne entre 1 et " + Grille.getHauteur() + ": "; String message2 = "Entrez un numero de ligne entre 1 et " + Grille.getLargeur() + ": "; while ((rep = menu()) != 0 ) { switch (rep) { case 1: // AFFICHE_LIGNE afficheLigne(saisie(message1,1,Grille.getHauteur())); break; case 2: // AFFICHE_COLONNE afficheColonne(saisie(message2,1,Grille.getLargeur())); break; case 3: // MOYENNE_LIGNE moy = moyenneLigne(saisie(message1,1,Grille.getHauteur())); System.out.println("La moyenne de cette ligne est " + moy); break; case 4: // MOYENNE_COLONNE moy = moyenneColonne(saisie(message2,1,Grille.getLargeur())); System.out.println("La moyenne de cette colonne est " + moy); break; case 5: // REPETITION r= repetition(); if (r == 0) System.out.println("Aucune ligne ne se repete"); else { System.out.println("La ligne " + r + " se repete: " ); afficheLigne(r); } break; case 6: // LIGNE PALINDROMIQUE r = palindromique(); if (r == 0) System.out.println("La grille ne contient pas de ligne palindromique"); else { System.out.println("La ligne " + r + " est un palyndrome"); afficheLigne(r); } break; case 7: // CARRE MAGIQUE int min = Math.min(Grille.getHauteur(),Grille.getLargeur()); message = "Entrez une largeur entre 1 et " + min + ": "; System.out.println("Le carre " + (carreMagique(saisie(message1,1,Grille.getHauteur()), saisie(message2,1,Grille.getLargeur()), saisie(message,1,min)) ? "est" : "n' est pas") + " magique"); break; } } } } // classe