Fonction, boucles et autre.

Résolu/Fermé
Booniak Messages postés 11 Date d'inscription vendredi 1 août 2014 Statut Membre Dernière intervention 29 août 2014 - 10 août 2014 à 17:42
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 10 août 2014 à 23:12
Salut à tous!
J'aimerais savoir si on peut factoriser ceci d'une façon ou d'une autre:
for(meter_col=0;meter_col<size_col;meter_col++)
    		for(meter_row=0;meter_row<size_row;meter_row++)
    			

Et comment appliquer ensuite cette fonction(appelons la fonction_tableau)?
Aussi t'en que j'y suis est ce que je peux faire:
JOptionPane.showMessageDialog(fonction_tableau()("Valeur tableau"));

Enfin comment mélanger JOptionPane...avec des boucles?
Pas mal de choses restent flou pour moi autour des possibilités des fonctions, alors merci d'avance de clarifier ma vue, d'éclairer mes lanternes,-image poétique n°3 introuvable-.

4 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
10 août 2014 à 19:12
Bonjour,

"Pas mal de choses restent flou pour moi"
Pour moi c'est surtout tes questions qui sont floues...

"J'aimerais savoir si on peut factoriser ceci d'une façon ou d'une autre:
for(meter_col=0;meter_col<size_col;meter_col++)
    for(meter_row=0;meter_row<size_row;meter_row++)"

P'têt ben qu'oui, p'têt ben qu'non... ça dépend ce que tu fais de ces valeurs après !

"comment appliquer ensuite cette fonction"
De quelle fonction tu parles ? En Java on ne parle pas de fonctions, mais de méthodes, car ça s'applique à un objet.

"est ce que je peux faire: fonction_tableau()("Valeur tableau")"
Si "fonction_tableau" renvoie un objet, tu peux lui appliquer une deuxième méthode, la syntaxe correcte étant
fonction_tableau().methode("Valeur tableau")
mais si "fonction_tableau" renvoie un tableau tu peux faire
fonction_tableau()[indice]
.

Remarque : il y a des conventions de nommage en Java, en particulier les noms sont en CamelCase, on ne mets donc pas de tirets pour découper les noms mais des majuscules : meterCol, sizeCol, meterRow, sizeRow, fonctionTableau, etc.
0
Booniak Messages postés 11 Date d'inscription vendredi 1 août 2014 Statut Membre Dernière intervention 29 août 2014 5
10 août 2014 à 20:16
Hum comment me faire comprendre, je veux éviter de marquer ça à chaque fois que je veux l'appliquer à un tableau pour le traiter:
for(colMeter=0;colMeter<colSize;colMeter++)
    	
    		for(rowMeter=0;rowMeter<rowSize;rowMeter++)

Par exemple j'ai essayé de faire ça:
boolean[][] emptyTable= new boolean[colSize][rowSize];
    		int colSize=10;
    		int rowSize=10;
    		int colMeter, rowMeter;

//tentative de création d'une fonction pour accéder aux cases du tableau.
    public static void tableRoute(boolean emptyTable[][]) 
    {
    	for(colMeter=0;colMeter<colSize;colMeter++)
    	
    		for(rowMeter=0;rowMeter<rowSize;rowMeter++)
    					
    }
    
    public static boolean tableFilling(boolean emptyTable[][])
    {
//application de la fonction
    	tableRoute();
    	{
    		if(Math.random()<0.7)
    		{
    			return emptyTable[colMeter][rowMeter]=true;
    		}
    		else
    		{
    			return emptyTable[colMeter][rowMeter]=false;
    	    } 
    	}
     }
0
flomine Messages postés 274 Date d'inscription vendredi 2 janvier 2009 Statut Membre Dernière intervention 4 décembre 2017 126
10 août 2014 à 21:05
Si tu veux analyser chaque cellule, c'est bien la seule méthode que tu peux utiliser (tableau une dimension = une boucle; tableau deux dimensions = deux boucles incrustées etc).
Par contre c'est tout à fait normal que cela ne fonctionne, tu utilises des variables avant qu'elles ne soient déclarées. Ici pour ce que tu veux faire, utilise les en tant que variables globales (tableau taille...).
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
10 août 2014 à 21:48
Tu ne peux pas faire ça comme ça, il faudrait plutôt réfléchir dans l'autre sens, toi tu cherches un mécanisme qui remplacerait les boucles, alors qu'il faudrait plutôt un mécanisme qui remplace le contenu exécuté à chaque boucle, par exemple avec un objet Action qui va dire quoi faire à chaque tour de boucle.

Exemple complet :

package ccm.kx;

interface Action<State, Parameter>
{
    State execute(State state, Parameter param);
}

class MatrixState<Data, Result>
{
    public final Data[][] matrix;
    public final Result result;
    
    public MatrixState(Data[][] matrix, Result result)
    {
        this.matrix = matrix;
        this.result = result;
    }
}

class MatrixParameter
{
    public final int row;
    public final int col;
    
    public MatrixParameter(int row, int col)
    {
        this.row = row;
        this.col = col;
    }
}

abstract class MatrixAction<Data, Result> implements Action<MatrixState<Data, Result>, MatrixParameter>
{
    public static <Data, Result> Result execute(Data[][] matrix, Result init, MatrixAction<Data, Result> action)
    {
        MatrixState<Data, Result> state = new MatrixState<Data, Result>(matrix, init);
        
        for (int row = 0; row < matrix.length; row++)
            for (int col = 0; col < matrix[row].length; col++)
                state = action.execute(state, new MatrixParameter(row, col));
        
        return state.result;
    }
}

public class Test
{
    public static void main(String[] args)
    {
        Integer[][] matrix = {{1,2,3},{4,5,6},{7,8,9}};
        
        Integer sum = MatrixAction.execute(matrix, 0, new MatrixAction<Integer, Integer>()
        {
            @Override
            public MatrixState<Integer, Integer> execute(MatrixState<Integer, Integer> state, MatrixParameter param)
            {
                return new MatrixState<Integer, Integer>(state.matrix, state.result + state.matrix[param.row][param.col]);
            }
        });
        
        Long mul = MatrixAction.execute(matrix, 1L, new MatrixAction<Integer, Long>()
        {
            @Override
            public MatrixState<Integer, Long> execute(MatrixState<Integer, Long> state, MatrixParameter param)
            {
                return new MatrixState<Integer, Long>(state.matrix, state.result * state.matrix[param.row][param.col]);
            }
        });

        System.out.println(sum); // 1+2+3+4+5+6+7+8+9 = 45
        System.out.println(mul); // 1*2*3*4*5*6*7*8*9 = 362880
    }
}


Remarque : avec les nouvelles notions introduites en Java 8, le main pourrait se simplifier. Voir : Java - Les Structures fonctionnelles

Je n'ai pas de Java 8 installé sous la main, mais sauf erreur cela donnerait ceci :

public static void main(String[] args)
{
    Integer[][] matrix = {{1,2,3},{4,5,6},{7,8,9}};
    
    Integer sum = MatrixAction.execute(matrix, 0,
            (state, param) -> new MatrixState<Integer, Integer>(state.matrix, state.result + state.matrix[param.row][param.col]));        
    Long mul = MatrixAction.execute(matrix, 1L, 
            (state, param) -> new MatrixState<Integer, Long>(state.matrix, state.result * state.matrix[param.row][param.col]));

    System.out.println(sum); // 1+2+3+4+5+6+7+8+9 = 45
    System.out.println(mul); // 1*2*3*4*5*6*7*8*9 = 362880
}

Cependant, on fait ce genre de codes lorsque l'on commence à avoir un besoin très important à itérer plusieurs boucles de manières différentes. Dans la grande majorité des cas on utilisera les deux boucles imbriquées, ça n'a jamais tué personne ;-)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
10 août 2014 à 23:12
Remarque : dans ton cas d'utilisation cela donnerait :

public static void main(String[] args)
{
    Boolean[][] table = new Boolean[5][5];
    
    // Remplissage
    MatrixAction.execute(table, null, new MatrixAction<Boolean, Void>(){
        @Override
        public MatrixState<Boolean, Void> execute(MatrixState<Boolean, Void> state, MatrixParameter param) {
            state.matrix[param.row][param.col] = Math.random()<0.7;
            return state;
        }
    });

    // Affichage
    MatrixAction.execute(table, null, new MatrixAction<Boolean, Void>(){
        @Override
        public MatrixState<Boolean, Void> execute(MatrixState<Boolean, Void> state, MatrixParameter param) {
            System.out.print(state.matrix[param.row][param.col]);
            if (param.col==state.matrix[param.row].length-1)
                System.out.println();
            else
                System.out.print('\t');
            return state;
        }
    });
}

Tu remarqueras que la mise en place de cette architecture est finalement plus compliquée que la double imbrication de base que l'on cherchait à simplifier. Il faudrait que l'opération à remplacer soit bien plus importante que cela pour voir l'intérêt de cette solution.
0