IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Problème de déplacement


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Points : 36
    Points
    36
    Par défaut Problème de déplacement
    Bonjour, j'ai un problème qui est que dans un tableau, je n'arrive pas à déplacer vers le bas pour combler les cases qui sont à 0 par d'autres chiffres.
    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    public Container depBas()
    	{
    		int a=1;
    		boolean rempli = (false);
    		for(int i = nbLigneTab-1 ; i >= 0 ; i--) 
    		{
    			for(int j = 0 ; j <= nbColonneTab-1 ; j++)
    			{		
    				a=1;
    				if (tabEnt[i][j] == 0 )
    				{
    					rempli= (false);
     
    				}
    				while (rempli == (true) || a == i)
    				{
    					if (tabEnt[i-a][j] != 0 )
    					{
    						tabEnt[i][j]=tabEnt[i-a][j];
    						tabEnt[i-a][j]=0;
    						rempli=(true);
    					}
    					else
    					{
    						a=a+1;
    					}
    				}
    			}
    		}
     
    		return grille;
    	}

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu as déjà au moins 2 problèmes, dans ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a=1;
    if (tabEnt[i][j] == 0 )
    {
        rempli= (false);
    }
    while (rempli == (true) || a == i)
    rempli vaut toujours false au démarrage (tu le déclares et l'initialises comme çà boolean rempli = (false);), donc déjà la condition rempli==(true) est toujours fausse au moment d'entrer dans la boucle while.

    a vaut 1 donc pour qu'il soit égale à i, il faut que i valle 1. Comme il vaut nbLigneTab-1, au départ, il ne vaut pas 1, sauf quand nbLigneTab vaut 2, ou lorsque l'itération du for a atteint cette valeur : donc on entre dans cette boucle while que pour une seule ligne, celle telle que i valle 1.

    Ensuite, si on entre dans la boucle et que (tabEnt[i-a][j] != 0 ), on fait rempli=true et il n'y a rien dans le bloc de la boucle while qui ferait rempli=false. Donc, dans ce cas, et comme la condition du while est un or (||) avec rempli==true, tu as une boucle infinie (ça bouclera sans jamais s'arrêter). Dans le cas contraire, (tabEnt[i-a][j] == 0 ), a sera incrémenté, donc ne pourra plus valoir i, la seule condition valable de bouclage, et donc ça sortira de la boucle. En résumé, soit ça ne fait aucune itération, soit ça en fait une infinité, soit ça en fait 1.

    Pour réaliser un déplacement vers le bas, donc dans une colonne, il faut déjà commencer par traiter chaque colonne. Là, tes 2 boucles for font qu'on parcourt les lignes, et pour chaque ligne on parcourt chaque élément (de chaque colonne) : il te sera plus facile d'établir ton algorithme si tu échanges ces 2 boucles. Parcours tes colonnes, et pour chaque colonne, commence par déplacer le dernier élément de la colonne, donc celui situé sur la dernière ligne, puis le suivant, etc...

    Ton idée avec a, et i-a, est assez compliqué à apréhender. Pour faire le déplacement, soit tu déplaces un élément dans son suivant (donc +1 et pas -a), soit il faut déterminer le premier élément vide avant un élément non vide, dont l'index peut être appelé a, et déplacer vers cet élément a (et à ce moment décrémenter a), mais c'est un peu plus compliqué.

    Evites également les écritures du type : for(int j = 0 ; j <= nbColonneTab-1 ; j++), parce qu'elle ne te facilite pas la compréhension de ce que tu écris. Ecrit plutôt for(int j = 0 ; j < nbColonneTab ; j++)Le plus simple, donc, c'est :

    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    pour (indexColonne = 0 ; indexColonne < nbColonneTab ; indexColonne++)
       pour (indexLigne = nbLigneTab-2 ; indexLigne >= 0 ; indexLigne--) // on va de l'avant dernière ligne vers la première (pas besoin de chercher à déplacer la dernière ligne)
          si tabEnt[indexLigne][indexColonne] != 0, il y a quelque chose dans la case
             a = indexLigne + 1 // la ligne au dessus de la ligne actuelle
             tant que a<nbLigneTab et tabEnt[a][indexColonne] == 0 // tant que la ligne suivante est vide
                 déplacer tabEnt[a-1][indexColonne] vers tabEnt[a][indexColonne]
                 incrémenter a
             fin tant que
          fin si
       fin pour indexLigne 
    fin pour indexColonne

    ou déplace tabEnt[xd][yd] vers tabEnt[xa][ya] signifie :
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tabEnt[xa][ya] = tabEnt[xd][yd]
    tabEnt[xd][yd] = 0

    La version plus optimisée, mais plus compliquée, et de considérer que lorsqu'on parcourt les lignes du bas vers le haut, on détermine aussi les cases non vide, donc directement la case vers laquelle déplacer, sauf au début, où on ne connait pas encore la case non vide la plus haute.

    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    pour (indexColonne = 0 ; indexColonne < nbColonneTab ; indexColonne++)
       nonvide = -1 // on ne connait pas encore la dernière ligne non vide
       pour (indexLigne = nbLigneTab-2 ; indexLigne >= 0 ; indexLigne--) // on va de l'avant dernière ligne vers la première (pas besoin de chercher à déplacer la dernière ligne)
          si nonvide!=-1 // on connait la dernière ligne non vide
             on déplace tabEnt[indexLigne][indexColonne] vers tabEnt[nonvide][indexColonne] 
             nonvide--; // on passe à la case au dessus qui est forcément vide
          sinon si tabEnt[indexLigne][indexColonne] != 0, il y a quelque chose dans la case
             nonvide = indexLigne : on connait la dernière ligne non vide
             a = indexLigne + 1 // la ligne au dessus de la ligne actuelle
             tant que a<nbLigneTab et tabEnt[a][indexColonne] == 0 // tant que la ligne suivante est vide
                 déplacer tabEnt[a-1][indexColonne] vers tabEnt[a][indexColonne]
                 nonvide = a // la dernière non vide change, puisqu'on la déplace
                 incrémenter a
             fin tant que
          fin si
       fin pour indexLigne 
    fin pour indexColonne
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Points : 36
    Points
    36
    Par défaut
    J'ai essayé le premier pseudo-code et il fonctionne avec une petite erreur qui est que lors du déplacement, la case ne se vide pas lorsque celle-ci contient un nombre qui va se déplacer dans la case en dessous. Je vais résoudre cela et je vous remercie de votre aide.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    ou déplace tabEnt[xd][yd] vers tabEnt[xa][ya] signifie :
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tabEnt[xa][ya] = tabEnt[xd][yd]
    tabEnt[xd][yd] = 0
    Comment ne pourrait-elle pas se vider puisqu'on y met 0 ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Points : 36
    Points
    36
    Par défaut
    Moi j'ai juste rajouter cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tabEnt[a-1][j]= 0;
    En tout cas je vous remercie pour votre aide, cela m'a bien fais avancé dans mon projet.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par a.collery Voir le message
    Moi j'ai juste rajouter cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tabEnt[a-1][j]= 0;
    C'était bien ce qu'il fallait dans ton contexte.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Points : 36
    Points
    36
    Par défaut
    Si je voudrais déplacer en haut, que faudrait-il changer? svp

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    • Le sens de la boucle et de l'évolution de a (décrémenter au lieu de incrémenter) ;
    • Les décalages relatifs (genre quand on fait a-1 pour la case au dessus, faire a+1 au dessous) ;
    • Les conditions d'arrêt (la où on allait vers les dernières colonnes, on va vers les premières, donc il ne faut décrémenter .)


    Pour la version simple, non optimisée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    pour (indexColonne = 0 ; indexColonne < nbColonneTab ; indexColonne++)
       pour (indexLigne = 1 ; indexLigne < nbLigneTab ; indexLigne++) // on va de l'avant dernière ligne vers la première (pas besoin de chercher à déplacer la dernière ligne)
          si tabEnt[indexLigne][indexColonne] != 0, il y a quelque chose dans la case
             a = indexLigne - 1 // la ligne au dessous de la ligne actuelle
             tant que a>=0 et tabEnt[a][indexColonne] == 0 // tant que la ligne suivante est vide
                 déplacer tabEnt[a+1][indexColonne] vers tabEnt[a][indexColonne]
                 décrémenter a
             fin tant que
          fin si
       fin pour indexLigne 
    fin pour indexColonne
    Pour les déplacements vers la droite et la gauche, c'est pareil sauf qu'il faut échanger lignes et colonnes (donc les deux boucles pour, et la dimension variable dans le tableau tab[indexLigne][a] au lieu de tab[a][indexColonne] par exemple).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Points : 36
    Points
    36
    Par défaut
    Je vous remercie pour l'aide que vous m'avez apporté.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de déplacement d'un objet dessiné
    Par mhamedbj dans le forum Graphisme
    Réponses: 4
    Dernier message: 04/05/2012, 17h32
  2. Problème de déplacement d'image.
    Par xenium dans le forum Dreamweaver
    Réponses: 3
    Dernier message: 30/04/2007, 20h12
  3. Probléme avec déplacement de JPanel
    Par evie62 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 16/01/2007, 10h38
  4. Problème de déplacement de fichier sur le Disque Dur
    Par DeFCrew dans le forum Sécurité
    Réponses: 8
    Dernier message: 11/09/2006, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo