/**
* 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