Aller au contenu

Programmation Java/Générer un carré magique

Un livre de Wikilivres.

Ce programme permet de générer des carrés magiques d'ordre impair.

import java.io.*;
/*
Nom : Carre.java
Rôle : Construction d'un carré magique d'ordre impair.
Compilation : javac Carre.java
Exécution : java Carre.java <ordre>
	avec <ordre> : entier impair > 1
Résultat : dans un fichier texte nommé carre_ordre.txt
*/
public class Carre
{
	public static void main(String args[])
	throws Exception
	{
		int ordre, ligne, colonne;
		int maxValue = (int)Math.sqrt((double)Integer.MAX_VALUE);
		
		System.out.println("Début du programme.");

		// test du paramètre obligatoire : > 1 et impair
		if (args == null || args.length == 0)
		{
			System.out.println("Usage : java Carre <ordre>\n"+
				"\tavec <ordre> : entier > 1 et impair.");
			System.exit(1) ;
		}
		ordre = Integer.parseInt(args[0]);
		if (ordre <= 1 || (ordre%2) == 0 || ordre > maxValue )
		{
			System.out.println(ordre + " n'est pas impair ou n'est pas supérieur a 1" +
                            " ou est trop grand : > " + maxValue) ;
			System.exit(1) ;
		}
		System.out.println("Le paramètre " + ordre + " est correct : > 1 et impair");
				
		// Création du tableau
		int carre[][] = new int[ordre][ordre] ;
		
		System.out.println("Début du calcul");
		// Rangement 1er nombre n au milieu de la première ligne
		// Puis rangement des autres nombres.
		ligne = 0 ;
		colonne = ordre/2 ;
		for (int n=1; n<=(ordre*ordre); n++)
		{
			// Écriture dans le tableau dans la case calculée
			carre[ligne][colonne] = n ;

			// Détermination de la position de la prochaine case à écrire
			if ((n%ordre) == 0)
			{
				// Si débordement à gauche du tableau
				// Écriture dans la case sous le dernier nombre
				ligne++ ;
			}
			else
			{
				// Écriture dans la case en haut à gauche
				ligne = ((ligne == 0) ? ordre-1 : ligne-1);
				colonne = ((colonne == 0) ? ordre-1 : colonne-1);
			}
		} // for (int n=1; n<=ordre*ordre; n++)
		int sommeMagique = ordre * ( ordre * ordre + 1) / 2;

		// Création du fichier résultat
		String nomFic = "carre_" + ordre + ".txt";
		System.out.println("Fin du calcul, écriture du fichier "+ nomFic + "...");
		PrintWriter hFic = new PrintWriter(new BufferedWriter(new FileWriter(nomFic)));

		// Impression du tableau
		hFic.println("Carre magique d'ordre " + ordre);
		for (ligne=0; ligne<ordre; ligne++)
		{
			for (colonne=0; colonne<ordre; colonne++)
			{
				hFic.print(carre[ligne][colonne] + " ");
			}	
			hFic.println("") ;
		}
		hFic.println("La somme magique est " + sommeMagique);
		hFic.close();
		System.out.println("fin écriture, programme terminé.");
	} // public static void main(String args[])
} // public class Carre