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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 10 août 2014 à 23:12
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 10 août 2014 à 23:12
A voir également:
- Fonction, boucles et autre.
- Fonction si et - Guide
- Fonction moyenne excel - Guide
- Fonction somme excel - Guide
- Virginie organise un rallye avec 30 équipes. elle veut créer un code pour désigner chaque équipe. elle a commencé à la main, mais elle voudrait le faire calculer à l'aide d'une formule. proposez une formule comportant une seule fonction et à recopier vers le bas dans la colonne a du fichier à télécharger. quelle formule sera en a9 ? ✓ - Forum Programmation
- Fonction filtre excel n'existe pas - Forum Excel
4 réponses
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
10 août 2014 à 19:12
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
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.
"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.
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
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:
Par exemple j'ai essayé de faire ça:
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; } } }
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
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...).
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...).
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
10 août 2014 à 21:48
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 :
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 :
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 ;-)
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 ;-)
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
10 août 2014 à 23:12
10 août 2014 à 23:12
Remarque : dans ton cas d'utilisation cela donnerait :
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.
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.