Je débute en JAVA et je me suis trouvé des petits exercices pour apprendre petit à petit. Malheureusement certains exercices ne sont pas corrigés et j’ai besoin d’aide pour la solution.
L’énoncé c’est:
"Soit un dessin carré de n*n éléments (n impair) que l’on veut construire sur un écran. Chaque élément est représenté par le signe ’ - ’ sauf les éléments des diagonales (principale et secondaire) représentés par le signe ’ + '. Ecrire un algorithme qui, quelque soit n>2, valeur saisie au clavier, affiche un carré à l’écran.
Eemple:
Pour n=5, l’affichage obtenu est le suivant:
±–+
-±±
–±-
-±±
±–+
"
C’est un exercice qui se situe vraiment tout au début de la programmation java c’est à dire juste dans l’utilisation des boucles for, while, do while, if.
avec une matrice de caractères ?
Je ne sais pas si ma définition est bonne pour la matrice dans le code mais l’idée générale est présente.
Pour demander à l’utilisateur de rentrer un nombre au clavier, de mémoire il faut utiliser la classe Scanner.
int i,j;
char [][] matrice;
n = SaisirN() //Fonction à définir
matrice = new char[n][n];
//Remplissage simple de la matrice
for( i = 0 ; i < n ; i++ )
{
for( j = 0 ; j < n ; j++ )
{
matrice[i][j] = '-';
}
}
//Remplissage des diagonales
for( i = 0 ; i < n ; i++ )
{
//Diagonale haut gauche vers bas droite
matrice[i][i] = '+';
//Diagonale haut droite vers bas gauche
matrice[n-i-1][n-i-1] = '+';
}
Afficher( matrice) //Fonction à définir
Le problème c’est que “la fonction” matrice je l’ai pas encore vu mais je vais voir pour me baser sur ce que tu as écrit je penses que ça peut m’aider.
Car je viens de trouver comment alterner les + et les - en gros de mettre les + en premier et en dernier (±----+) ou les faire bouger (-±—±) mais il me reste un problème c’est de faire un mixe de tout ça afin d’avoir la figure demander.
Niveau code pour le moment j’ai ceci qui me donne (±----+ n fois entré)
int n=7;
for(int l=1; l<n; l++){
for (int i=1; i<=n; i++){
if ((i==1)||(i==n))
System.out.print("+");
else
System.out.print("-");
}
System.out.println();
}
Et :
int n=7;
for(int l=1; l<n; l++){
for (int i=1; i<=n; i++){
if ((i==2)||(i==n-1))
System.out.print("+");
else
System.out.print("-");
}
System.out.println();
où je fais bouger les + dans la figure en gros -±—±
Mais je n’arrive pas à faire un mixe pour avoir le décalage le long du carré. Le problème c’est de trouver les bonnes conditions pour finaliser la figure !!
Edité le 18/09/2009 à 11:37
pour toute les lignes de 1 à n inclus
pour chaque position de caractere de 1 à n inclus
//gestion diagonale gauche
si position == ligne : écrire ‘+’
//gestion diagonale droite
sinon si position == ( n - lignes + 1) : écrire ‘+’
sinon : écrire ‘-’
fin pour
fin pour
int ligne, position, n;
n=... // todo
for( ligne = 1 ; ligne == n ; ligne++ )
{
for( position = 1 ; position == n ; position++ )
{
//Diagonale gauche
if( position == ligne) System.out.print( "+");
//Diagonale droite
elsif( position == ( n - ligne + 1)System.out.print( "+"); //elsif ou else if ????
//Sinon
else system.out.print( "-");
//Saut de ligne
System.out.println();
}
}
Je te remercie Jiheme44 j’ai du seulement corriger 2 petites erreures dans le code que tu m’as donné. Il fallait mettre ligne<=n et position<=n en mettant les deux avec ==n il n’y avait rien qui s’afficher.
Mais tu as réussi à me donner le code auquel je pensais mais que je n’arrivais pas à mettre en forme je m’embrouillais avec les boucles.
Waw, 2 boucles, un test par caractère… Heureusement qu’on n’est plus sous ZX Spectrum…
Bon, une algo, ça ressemblerait à ça
Soit n un entier supérieur à 2.
Soit l une liste de n caractères "-"
Soit compteur un entier égal à 1
Tant que compteur est inférieur ou égal à n,
Soit la une copie de l
remplacer le caractère en position compteur de la par le caractère "+"
remplacer le caractère en position n - (compteur - 1) de la par le caractère "+"
afficher la
revenir à la ligne
incrémenter compteur
--
La Bonne méthode ta était donnée par jiheme44 dans son 1er poste mais il faut pour cela que tu deroule la matrice
je Copie son code, comment les ligne a modifié et donne ma correction
int i,j;
//char [][] matrice;
char [] matrice;
n = SaisirN() //Fonction à définir
//matrice = new char[n][n];
matrice = new char[n * n];
//Remplissage simple de la matrice
for(int i = 0 ; i < n ; i++ )
{
for(int j = 0 ; j < n ; j++ )
{
//matrice[i][j] = '-';
matrice[i*n +j] = '-';
}
}
//Remplissage des diagonales
for(int i = 0 ; i < n ; i++ )
{
//Diagonale haut gauche vers bas droite
// matrice[i][i] = '+';
matrice[i*n + i] = '+';
//Diagonale haut droite vers bas gauche
// matrice[n-i-1][n-i-1] = '+';
matrice[(n-i-1)*n +(n-i-1)] = '+';
}
Afficher( matrice) //Fonction à définir
Voila le code de la matrice gerer par tableau horizontale
Attention a la déclaration des index (i et j) dans les boucles.
Si non d’un point de vu algorithmique (le plus important dans ce cas là), il faut comprendre que le rang de la ligne donne la position des deux ‘+’ à mettre sur chacun gardons ton exemple de 5*5
n° rang ligne rang caractère (garder en mémoire que les rang en programmation commence a 0 et non 1)
1 -->0–> ±–+ 0 et 4
2 -->1–> -±± 1 et 3
3 -->2–> --±- 2
4 -->3–> -±± 3 et 1
5 -->4–> ±–+ 4 et 0
En effectuant cette analyse tu vois de suite que une règle ce dessine et l’algorithme qui en correspond (je reste sous la forme sans matrice)
Entier rangLigne
Tableau de caractère TabC
Entier n
faire
saisir n
tant que n <=2
tabC <- tableau de n*n caractère
remplir tabC avec le caractère '-'
pour toute les ligne à partir de rangLigne<-0 jusqu'à n avec un pas de 1
faire
tabC reçoit '+' au rang rangLigne*n + rangLigne
tabC reçoit '+' au rang rangLigne*n + n - rangLigne - 1
fin pour
Désolé si vous avez du mal a le comprendre mais indiqué le rang dans un tableau ou encore un boucle for en algorithmique est compliqué
Pour un traitement par colonne le code reste me même (avantage du carré)