Vérifier que 2 nombres ne sont sur même ligne

Fermé
tortue60 Messages postés 250 Date d'inscription jeudi 21 mars 2013 Statut Membre Dernière intervention 1 septembre 2013 - 21 mars 2013 à 18:14
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 - 24 mars 2013 à 14:17
Bonjour,

Je souhaite faire un tableau de 4 sur 4 remplis avec les nombres de 1 à 4. Ce que je cherche c'est comment faire pour pas que les nombres ce trouvent deux fois sur la même ligne et deux fois sur la même colonne

Merci pour vos propositions

A voir également:

7 réponses

walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
21 mars 2013 à 19:21
Bonjour,

pouvez vous nous présenter une ébauche de ta part?
autrement, voila comment procéder:
- utiliser Math.random() pour générer un nombre aléatoire, et le changer pour avoir un nombre entre 1 et 4.
- utiliser une boucle while dans la boucle for pour tester la présence d'un nombre dêja enregistré.

NB:
- si tu vise un tableau comme celui du Sudoku en taille 4, alors ça va te demander un esprie dure en math et récursivité.
- si tu vise un tableau respectant exactement les consignes cité en message en haut, alors, il te faut une plage de nombre entre 1 et 7, pour éviter des situation de boucle infinie.

Bonne chance
0
tortue60 Messages postés 250 Date d'inscription jeudi 21 mars 2013 Statut Membre Dernière intervention 1 septembre 2013
21 mars 2013 à 21:15
Je vois pas trop comment faire pour la boucle while dans le for
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 22/03/2013 à 20:53
Bonsoir,
je te donne une explication, et si tu n'arrive pas à developper une ébauche, je passe au code:

int nbreGenere= (int) (Math.random()*max);
boolean existe=true
while(existe==true){
//regénération du nombre après avoir
//été trouvé dans une ligne ou une colonne
nbreGenere= (int) (Math.random()*max);
//éliminer le cas d'une valeur nulle
while(nbreGenere==0){
nbreGenere= (int) (Math.random()*max);
}
existe=false;
//recherche verticale
//bien sur si on est pas dêja à la 1iere ligne
if(i!=0){
for (int k = 0; k < i; k++){
if(monTableau[k][j]==nbreGenere){
existe=true;
}
}
}
if(j!=0){
//recherche horizontale
//bien sur si on est pas dêja à la 1iere colonne
for (int l = 0; l < j; l++){
if(monTableau[i][l]==nbreGenere){
existe=true;
}
}
}
}

à la sortie de cette boucle while, qui doit etre incluse dans les deux boucles for classiques (du tableau), tu seras sur que le nombre généré n'existe pas.

NB:
condition nécessaire, max=longeur+largeur du tableau.
alors tableau 4x4 implique max=8

Being normal is boring... being geek is interesting
0
tortue60 Messages postés 250 Date d'inscription jeudi 21 mars 2013 Statut Membre Dernière intervention 1 septembre 2013
22 mars 2013 à 21:52
j'avais déjà fait sa moi:

import java.util.Scanner;
public class tableau{
public static void main(String[] args) {

int[][] monTableau= new int[4][4];

//remplissage de la matrice monTableau
for (int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
monTableau[i][j]= (int) (int)(Math.random() * 4) + 1;
System.out.print(monTableau[i][j]);
}
System.out.println();
}

}

}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 22/03/2013 à 22:57
Bonsoir

ce qu'il faut, c'est, avant d'affecter la valeur (int)(Math.random() * 4) + 1 à monTableau[i][j], de vérifier si cette valeur existe dêja sur la ligne [i] et la colonne [j].
je t'ai déjà parlé de la contrainte sur le max lié a random, et pour l'éclairer, imagine que ton programme a généré des valeurs et il arrive à l'élément T[3][3] (v):
x y 1 z
a b 3 c
2 4 v .
. . . w

si tes valeurs sont >=1 et <=4, étant donné la contrainte cité en message en top haut, le programme ne trouvera jamais une valeur v, car ttes les valeurs possible sont dja enregistrées.

pour la valeur w, nous aurons 3+3 valeurs diffirentes, et en ajoutant w, nours devons avoir 7 valeurs diffirentes, d'ou le max doit etre 8

Being normal is boring... being geek is interesting
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 22/03/2013 à 22:58
essaie ce code:

public class tableau{
public static void main(String[] args) throws InterruptedException {
//Définition des dimensions
int longueur=9, largeur=9;
//déclaration du tableau
int[][] monTableau= new int[9][9];
//le max non atteint doit être au moin 18.
int max=longueur+largeur;
//remplissage de la matrice monTableau
for (int i = 0; i < longueur; i++){
for(int j = 0; j < largeur; j++){
//première génération pou l'élément T(0,0)
int nbreGenere= (int) (Math.random()*max);
boolean existe=true;
while(existe){
//regénération du nombre après avoir
//été trouvé dans une ligne ou une colonne
nbreGenere= (int) (Math.random()*max);
//éliminer le cas d'une valeur nulle
while(nbreGenere==0){
nbreGenere= (int) (Math.random()*max);
}
existe=false;
//recherche verticale
//bien sur si on est pas dêja à la 1iere ligne
if(i!=0){
for (int k = 0; k < i; k++){
if(monTableau[k][j]==nbreGenere){
existe=true;
}
}
}
if(j!=0){
//recherche horizontale
//bien sur si on est pas dêja à la 1iere colonne
for (int l = 0; l < j; l++){
if(monTableau[i][l]==nbreGenere){
existe=true;
}
}
}
}
//élément non trouvé puisque
//on a sortis de la boucle while
monTableau[i][j]=nbreGenere;
//un peu de stylisme pour l'affichage
if(monTableau[i][j]<10)
System.out.print("0"+monTableau[i][j]+" ");
else
System.out.print(monTableau[i][j]+" ");
}
System.out.println();
}
}
}

Being normal is boring... being geek is interesting
0
tortue60 Messages postés 250 Date d'inscription jeudi 21 mars 2013 Statut Membre Dernière intervention 1 septembre 2013
23 mars 2013 à 16:14
Il y aurai pas quelque chose de plus simple
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
23 mars 2013 à 17:35
plus simple !!!??
de quelle simplicité tu parle?
0
tortue60 Messages postés 250 Date d'inscription jeudi 21 mars 2013 Statut Membre Dernière intervention 1 septembre 2013
23 mars 2013 à 20:42
Bah je c pas trop
moi on m'a qu'il fallait que je fasse 4 for pour comparer les nombres: 2 pour l'horizontal et 2 pour le verticale
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
23 mars 2013 à 23:08
je pige rien ici.
0
tortue60 Messages postés 250 Date d'inscription jeudi 21 mars 2013 Statut Membre Dernière intervention 1 septembre 2013
24 mars 2013 à 00:03
JE voudrai un programme très simple à comprendre et à faire
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
24 mars 2013 à 00:34
Bonsoir tortue60

dans ce sujet, je pense que j'ai assez expliquer les points suivants:

1- le cahier de charge n'est pas réalisable avec des méthodes de programmation simples, parce que si tu demande un tableau comme celui du Sudoku, alors il te faut appliquer la récursivité. et je pense a ce stage, pour toi, la récursivité n'est une option.
2- les solutions proposées ne contiennent que des méthodes simples qui ne sont même pas limitées au JAVA, je parle bien sur du "for" et "while". l'utilisation seule des boucles "for" ne va pas garantir la génération des nombres valides avec random. d'où la nécessité des boucles while.
3- étant admis que la longueur de l'intervalle des nombres doit etre égale a la somme des dimensions du tableau, c'est a dire, dans ton cas, le tableau 4x4 implique des nombres entre 1 et 7 et pas entre 1 et 4, j'ai cité ci dessus un exemple pour montré l'impossibilité de réaliser ton cahier charge sans modification.

pour moi, je pense qu'il te faut 2 choses importantes:
- un cours complet du langage Java, pour pouvoir se familiariser avec les méthodes de calcul.
- beaucoup d'exercice d'entrainement en logique, pour pouvoir traduire un probleme en un programme informatique (l'algorithmique).

si tu en besoin, je peux te proposer des liens.

BONNE CHANCE.
0
tortue60 Messages postés 250 Date d'inscription jeudi 21 mars 2013 Statut Membre Dernière intervention 1 septembre 2013
24 mars 2013 à 10:36
salut,

Je voudrais bien des liens si tu en connais
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
24 mars 2013 à 14:17
pour le langage JAVA: http://www.siteduzero.com/informatique/exportPdf/apprenez-a-programmer-en-java
pour l'algorithmique: https://openclassrooms.com/fr/courses?categories=informatique&page=2&tags=algorithmique plusieurs tuto qui traite les différents aspect de programmation (trie, recherche...)
0