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 :

Deux écritures différentes pour un même programme


Sujet :

avec Java

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut Deux écritures différentes pour un même programme
    Bonjour à tous, je viens vous demander de l'aide concernant un exercice que j'ai a faire.

    On me demande de corriger ce programme:

    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
    public TesterValiditer {
    public boolean testervalidite (int [ ][ ] grille ){
    for (int i = 0;i< grille.length; i++){
    int max = grille[i][0];
    for (int e = 1;e< grille[i].length; j++){
    if (grille[i][e]== max && max !=0){
    solution = false;
    // ici vous devez arrêter le programme
    }
    if (grille[i][e] !=0){
    nbelement++;
    }
    max = grille[i][e];
    }
    }
    if (solution && nbelements< 16){
    solution = false
    }
    return solution
    }
    public static void main (String [] args){
    //définition d'une grille pour le test
    int[ ][ ] grille= {{1,2},{3,4},{5,6},{7,8},{1,3},{4,6},{7,9}};
    }
    }
    Voila après correction:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    public class TesterValiditer {
     
     
     
    		public static void testervaliditer (int grille [][]){ 
     
    			 boolean solution = true; 
     
    			int nbelement = 0;  
     
     
     
    			for (int i = 0; i < grille.length; i++){ 
     
    				int max = grille [i][0]; 
     
    				for (int e = 1; e< grille [i].length; e++){ 
     
     
    					if (grille [i][e] == max && max != 0){    
     
    						solution = false; 
     
    						System.out.println ("la grille est non valide ! "); 
     
    						break; 
     
    					} 
     
    					if (grille [i][e] != 0) { 
     
    						nbelement++; 
     
    					} 
     
    					max = grille [i][e]; 
     
    				} 
     
    			} 
     
     
    			if (solution && nbelement < 16) { 
     
    				solution = false; 
     
    				System.out.println ("la grille est non valide ! "); 
     
    			} 
     
    		} 
     
    		public static void main (String [] args){ 
     
    	  	int[][] grille= {{1,2},{3,4},{5,6},{7,8},{1,3},{4,6},{7,9}}; 
     
    	  	testervaliditer (grille); 
     
    		}	 
     
    	}
    Par contre maintenant on me demande de proposer une autre écriture pour ce programme. Je dois avouer que je tourne en rond. Auriez-vous une idée à propos de cette réécriture?

  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 : 55
    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,

    Ce serait plus facile pour nous si on savait ce qu'est censé faire le programme (plutôt que de faire de la rétro-ingénierie). Et ce serait encore plus facile s'il y avait une indentation !

    Le but à priori, selon le premier code (après correction, et en prenant compte des commentaires) est de tester la validité d'un tableau à 2 dimensions sur le principe qu'il est invalide si
    • deux éléments successifs non nuls (différent de zéro) d'une même ligne sont égaux
    • il y a moins de 16 éléments non nuls, non compris le premier de chaque ligne


    Déjà, il y a une petite erreur dans ton programme, car pour moi il ne respecte pas "// ici vous devez arrêter le programme", même s'il donne le même résultat final que celui qui le ferait. Le break ne fait qu'arrêter la boucle sur e, pas celle sur i. On pourrait utiliser un label pour résoudre ça, ou utiliser une solution comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; solution && i < grille.length; i++) {
    Ensuite, tu devrais plutôt écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( testervaliditer (grille) ) {
     
    	System.out.println ("la grille est non valide ! "); 
     
    }
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static boolean testervaliditer (int grille [][]){ 
     
    	return solution;
     
    }
    Plutôt que d'afficher le message à l'intérieur de la méthode testervaliditer (qui devrait s'appeler testerValidite selon les conventions, et le nom dans le code d'origine).

    En plus, tu aurais une troisième solution pour arrêter le test au lieu du break, faire return solution;.

    Ensuite, pour répondre à ta question, il y a toujours plusieurs façons d'écrire un programme. Aussi faut-il savoir ce qu'il est censé faire et des contraintes (les spécifications). Par exemple, quand je vois une variable s'appeler max, je me dis qu'on est censé gérer une notion de maximum avec, or ce n'est pas le cas du code d'origine. Est-ce que ce nom devrait être changé pour un nom plus approprié ou est-ce que le programme ne fait pas du tout ce qu'il est censé faire.

    Après, au vu des déductions faites par rétro-ingénérie, et sans changer les types (genre collection au lieu de tableau, ou introduire une classe Grille...), je ne vois pas 36 manières d'écrire ce programme différemment. A part faire des foreach à la place des boucles (et, au lieu d'utiliser max, utiliser une valeur "precedent". On peut aussi modifier les deux tests et en faire 2 imbriqués à la place : les 2 excluent les éléments à 0 (on ne compte que des non nuls et on ne teste les éléments successifs que s'ils sont non nuls) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (grille [i][e] != 0) { 
     
        if ( grille[i][e]==max ) {
             solution = false;
             break;
        }
     
        nbelement++; 
     
    }
    Supprimer la variable solution, et faire des points de sorties multiples (enfin, faire l'inverse serait une possibilité, mais dans ce sens, ça me semble bizarre, mais c'est une option possible)

    Mais à part ça, je n'en vois pas. Après, selon les spécifications, ils pourraient y en avoir d'autres (comme retourner une valeur différente pour identifier le type d'invalidation par exemple, ou utiliser une Exception pour l'invalidation...).

    PS ah si, j'oubliais un truc : écris plutôt int[][] grille ) que cet horrible int grille [][], c'est plus lisible et plus cohérent (voire logique).

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut
    Tout d'abord je te remercie pour ta réponse et je vais direct corriger les erreurs que tu as noté, sinon concernant la consigne, on me donne le code comme ça sans l'indentation

    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
    public TesterValiditer {
    public boolean testervalidite (int [ ][ ] grille ){
    for (int i = 0;i< grille.length; i++){
    int max = grille[i][0];
    for (int e = 1;e< grille[i].length; j++){
    if (grille[i][e]== max && max !=0){
    solution = false;
    // ici vous devez arrêter le programme
    }
    if (grille[i][e] !=0){
    nbelement++;
    }
    max = grille[i][e];
    }
    }
    if (solution && nbelements< 16){
    solution = false
    }
    return solution
    }
    public static void main (String [] args){
    //définition d'une grille pour le test
    int[ ][ ] grille= {{1,2},{3,4},{5,6},{7,8},{1,3},{4,6},{7,9}};
    }
    }
    et ensuite on me demande ceci:
    Compilez le programme ci-dessous.
    Corriger toutes les erreurs.
    Terminez ce programme pour pouvoir tester testervalidite, puis affichez un message significatif avec la valeur retournée.
    Proposez une autre façon d'écrire la fonction testervalidite, puis testez-la.

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut
    J'ai essayé d'appliquer tes corrections mais j'ai du me planter quelque part car il me dit qu' il n'arrive pas à retourner une valeur de type boolean.

    Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    This method must return a result of type boolean

    at TesterValiditer2.testerValiditer(TesterValiditer2.java:3)
    at TesterValiditer2.main(TesterValiditer2.java:59)

    Voici le 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public class TesterValiditer2 {
    	public static boolean testerValiditer (int grille [][]){ 
     
    		boolean solution = true;
     
    		int nbelement = 0;
     
    		for (int i = 0; solution && i < grille.length; i++) {
     
    			int max = grille[i][0];
     
    			if ( testerValiditer (grille) ) {
     
    				System.out.println ("la grille est non valide ! "); 
     
    			}
     
     
    			for (int e = 1; e < grille[i].length; e++) {
     
    				if (grille[i][e] == max && max != 0) {
     
    					solution = false;
     
    					System.out.println("la grille est non valide ! ");
     
    					return solution;
     
    				}
     
    				if (grille[i][e] != 0) {
     
    					nbelement++;
     
    				}
     
    				max = grille[i][e];
     
    			}
     
    		}
     
    		if (solution && nbelement < 16) {
     
    			solution = false;
     
    			System.out.println("la grille est non valide ! ");
     
    		}
     
    	}
     
    	public static void main(String[] args) {
     
    		int[][] grille = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 }, { 1, 3 },
    				{ 4, 6 }, { 7, 9 } };
     
    		testerValiditer(grille);
     
    	}
     
    }

  5. #5
    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 : 55
    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
    Oui, il manque un return solution à la fin de la méthode.

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut
    En effet je n'avais pas vu merci

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut
    Bon il n'y a plus d'erreurs notées par eclipse, par contre lorsque j’exécute le programme j'ai une longue liste d'erreurs faisant référence à la ligne 5 et 13, mais je vois pas trop ce qui pose problème.

    Exception in thread "main" java.lang.StackOverflowError
    at TesterValiditer2.testerValiditer(TesterValiditer2.java:5)
    at TesterValiditer2.testerValiditer(TesterValiditer2.java:13)
    at TesterValiditer2.testerValiditer(TesterValiditer2.java:13)
    at TesterValiditer2.testerValiditer(TesterValiditer2.java:13)
    at TesterValiditer2.testerValiditer(TesterValiditer2.java:13)
    at TesterValiditer2.testerValiditer(TesterValiditer2.java:13)
    etc...

  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 : 55
    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
    Tu as mis cet appel dans testerValiditer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( testerValiditer (grille) ) {
     
    				System.out.println ("la grille est non valide ! "); 
     
    			}
    Donc tu as un appel récursif "inifini", puisqu'aucune condition n'empêche l'appel de cette méthode. A quoi sert cet appel récursif ?

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut
    En fait mit là comme ça il ne sert à rien j'ai du m'embrouiller quand j'ai corrigé, je l'ai enlevé et finalement ça marche.
    Merci pour ton aide

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/08/2009, 21h55
  2. Accès a deux bds différente configuré en même pour une application?
    Par bobby_bob dans le forum Persistance des données
    Réponses: 2
    Dernier message: 01/03/2007, 10h47
  3. Peut-on avoir deux fichier .htaccess pour 2 urlrewriting différents pour 1 même site
    Par JackBeauregard dans le forum Serveurs (Apache, IIS,...)
    Réponses: 3
    Dernier message: 30/09/2006, 08h35
  4. Réponses: 1
    Dernier message: 16/06/2006, 14h17
  5. Réponses: 8
    Dernier message: 11/03/2006, 18h40

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