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 :

Variable rebelle ?


Sujet :

avec Java

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 274
    Points
    274
    Par défaut Variable rebelle ?
    Bonjour à tous,

    J'essaye de faire revenir grâce à la fonction afficherMenu() la valeur d'option du menu pour la traiter dans le main, mais les méthodes ne se déclenchent qu'à la deuxième tentative lors de la saisie utilisateur ... Que se passe t'il ? Merci


    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
    63
    64
    65
    66
    public static void main(String[] args) {
     
    		// Tableaux de données
     
    		String tabSections[] = new String[25];
    		String tabArticles[] = new String[100];
    		int[][] tabLignes = new int[3][100];
     
    		Terminal.sautDeLigne();
    		Terminal.ecrireString("\t"
    				+ "---------- Logiciel d'édition de devis / factures ----------");
    		Terminal.sautDeLigne();
    		afficherMenu();
     
    		// Déclenche les méthodes suivant le choix effectué dans le menu
    		// principal
     
    		int varChoixMenu=afficherMenu();
     
    		if (varChoixMenu == 1) {
    			creerSection(tabSections);
    		}
    		if (varChoixMenu == 2) {
    			afficherSections(tabSections);
    		}
    	}
     
    	public static int afficherMenu() {
     
    		// Affichage du menu principal
     
    		int varChoixMenu = 0;
     
    		Terminal.sautDeLigne();
    		Terminal.ecrireStringln("\t" + "\t" + "\t"
    				+ "1: Creer nouvelle section");
    		Terminal.ecrireStringln("\t" + "\t" + "\t"
    				+ "2: Ouvrir une section existante");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "3: Supprimer une section");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "4: Creer une ligne");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "5: Effacer une ligne");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "6: Voir Devis / Facture");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "7: Sortir");
    		Terminal.sautDeLigne();
     
    		// Enregistre et vérifie le choix utilisateur dans le menu principal
     
    		boolean testReponse = false;
     
    		while (testReponse == false) {
    			Terminal.sautDeLigne();
    			Terminal.ecrireString("\t" + "Veuillez entrer votre choix : ");
    			Terminal.sautDeLigne();
    			varChoixMenu = Terminal.lireInt();
     
    			if (varChoixMenu < 1 || varChoixMenu > 7) {
    				testReponse = false;
    				Terminal.ecrireString("\t"
    						+ "Le choix rentré n'est pas valide, vous devez rentrer un nombre entre 1 et 7");
    				Terminal.sautDeLigne();
    			} else {
    				testReponse = true;
    			}
    		}
    		return varChoixMenu;
    	}

  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,

    Il se passe tout simplement que tu appelles 2 fois de suite la méthode afficheMenu () :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    
    afficherMenu(); 
    
    // Déclenche les méthodes suivant le choix effectué dans le menu
    // principal
     
    int varChoixMenu=afficherMenu();
    
    ...

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 274
    Points
    274
    Par défaut
    Merci pour ta réponse, mais je ne vois toujours pas comment solutionner ça...

    Il devrait être simple de récupérer uniquement la valeur de varChoixMenu dand le main grâce à la fonction afficherMenu() ou bien ce n'est pas possible de le traiter ensuite dans le main ?

    Bref, je patine ...

  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 : 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
    Citation Envoyé par clickandgo Voir le message
    Merci pour ta réponse, mais je ne vois toujours pas comment solutionner ça...
    Euh, bah au moins, tu supprimes le premier appel

    Citation Envoyé par clickandgo Voir le message
    Il devrait être simple de récupérer uniquement la valeur de varChoixMenu dand le main grâce à la fonction afficherMenu() ou bien ce n'est pas possible de le traiter ensuite dans le main ?
    Mais, c'est simple ! Et c'est ce que tu fais, mais avant de le faire, tu appelles la méthode une première fois, tu ne récupères pas la valeur de choix qu'elle retourne et tu n'en fais rien.

    Donc le menu s'affiche, l'utilisateur saisit son choix. Et juste après tu rappelles la méthode : donc le menu s'affiche une seconde fois, et là tu récupères la valeur de choix que la méthode retourne et que tu la traites, pour appeler la méthode adéquate.

    Donc c'est normal que le menu s'affiche 2 fois, et qu'il faille saisir 2 fois le choix de menu 2 fois, puisque que la méthode qui fait ça est appelée 2 fois.


    En réalité, la solution serait de faire une boucle (comme je te l'ai indiqué dans l'autre discussion sur le même sujet, c'est-à-dire qu'on affiche le menu tant que l'utilisateur ne demande pas de sortir, et entre chaque choix autre que sortir, on traite le choix) :

    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
    ...
     
    int varChoixMenu;
     
    boolean run=true;
    while (run) {
       int varChoixMenu=afficherMenu();
     
     
    // Déclenche les méthodes suivant le choix effectué dans le menu
    // principal
       switch(varChoixMenu) {
       case 1:
    	creerSection(tabSections);
            break;,
       case 2:
            afficherSections(tabSections);
           break;
       case 7:
            // fin  programme
            run=false;
           break;
    }
     
    }
     
    // fin programme
    ...

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 274
    Points
    274
    Par défaut
    Merci mais il faut utiliser que les méthodes qu'on a dans le cour, les "case" ne sont pas autorisés ...

    C'est pour ça que j'essayais de le faire comme ça...

  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 : 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
    Bah, tu peux changer le switch par des "if else if" si tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ( varChoixMenu==1 ) {
    	creerSection(tabSections);
    } else if ( varChoixMenu==2) {
            afficherSections(tabSections);
    } else if ( varChoixMenu==7) {
            // fin  programme
            run=false;
    }
    Ça ne change rien à ton problème initial,, qui était t'appeler 2 fois de suite la méthode afficheMenu(), ni a sa solution (l'appeler qu'une fois).

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 274
    Points
    274
    Par défaut
    Bon, j'ai été trop vite ...

    Le code compile bien mais les options marchent en cycle 1 fois oui, 1 fois non.
    Faut il réinitialiser une variable ?

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    public static void main(String[] args) {
     
    		// Tableaux de données
     
    		String tabSections[] = new String[25];
    		String tabArticles[] = new String[100];
    		int[][] tabLignes = new int[100][3];
     
    		Terminal.sautDeLigne();
    		Terminal.ecrireString("\t"
    				+ "---------- Logiciel d'édition de devis / factures ----------");
    		Terminal.sautDeLigne();
     
    		boolean run = true;
    		while (run) {
    			// Déclenche les méthodes suivant le choix effectué dans le menu
    			// principal
    			int varChoixMenu = afficherMenu();
    			if (varChoixMenu == 1) {
    				creerSection(tabSections);
    			}
    			if (varChoixMenu == 2) {
    				afficherSections(tabSections);
    			}
    			if (varChoixMenu == 7) {
    				// Fin du programme
    				run = false;
    			}
    		}
     
    	}
     
    	public static int afficherMenu() {
     
    		// Affichage du menu principal
     
    		Terminal.sautDeLigne();
    		Terminal.ecrireStringln("\t" + "\t" + "\t"
    				+ "1: Creer nouvelle section");
    		Terminal.ecrireStringln("\t" + "\t" + "\t"
    				+ "2: Ouvrir une section existante");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "3: Supprimer une section");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "4: Creer une ligne");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "5: Effacer une ligne");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "6: Voir Devis / Facture");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "7: Sortir");
    		Terminal.sautDeLigne();
     
    		// Enregistre et vérifie le choix utilisateur dans le menu principal
     
    		boolean testReponse = false;
    		int varChoixMenu = 0;
     
    		while (testReponse == false) {
    			Terminal.sautDeLigne();
    			Terminal.ecrireString("  ==> " + "\t"
    					+ "Veuillez entrer votre choix : ");
    			Terminal.sautDeLigne();
    			varChoixMenu = Terminal.lireInt();
     
    			if (varChoixMenu < 1 || varChoixMenu > 7) {
    				testReponse = false;
    				Terminal.ecrireString("  ==> "
    						+ "\t"
    						+ "Le choix rentré n'est pas valide, vous devez rentrer un nombre entre 1 et 7");
    				Terminal.sautDeLigne();
    			} else {
    				testReponse = true;
    			}
    		}
    		return varChoixMenu;
    	}

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    On peux avoir le code de ta classe Terminal? Parce qu'on a pas la moindre foutue idée de ce que ça fait

  9. #9
    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
    Citation Envoyé par tchize_ Voir le message
    On peux avoir le code de ta classe Terminal? Parce qu'on a pas la moindre foutue idée de ce que ça fait
    C'est sûr que ça peut devenir utile à ce stade. J'ai une idée de ce que ça devrait faire, mais les sources nous permettront en effet comment ça le fait (ou pas)

    Par contre, je n'ai pas la moindre idée de ce que signifie :
    Citation Envoyé par clickandgo Voir le message
    ...mais les options marchent en cycle 1 fois oui, 1 fois non.

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 274
    Points
    274
    Par défaut
    Alors, concernant le cycle :

    Si je choisis une option dans le menu la première méthode va marcher, ensuite quand se représente le menu si on prend une autre option elle ne marche pas, le menu se représente alors et à la deuxième fois si on redemande la méthode qui ne marchait pas en première instance là la méthode fait son boulot ... Cela a t'il un rapport avec le return de la méthode afficherMenu() qui ne se fait pas bien ?

    Concernant la classe Terminale elle est imposée par notre tuteur et ne concerne que le formatage des différents types de variables apparemment.

    Merci

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par clickandgo Voir le message
    Concernant la classe Terminale elle est imposée par notre tuteur et ne concerne que le formatage des différents types de variables apparemment.

    Merci
    (Quand est-ce que les profs comprendront que cette classe est de la connerie ) Ell fait aussi la lecture du clavier, sauf qu'on a pas la moindre idée de comment elle lit le clavier et elle peux très bien être responsable de ton problème.

    Faudrait voir aussi ce que font creerSection et AfficherSection. Affiche aussi ce que tu obtiens avec Terminal.lireInt(). Parce que si c'est entre 3 et 6, la valeur est cceptée mais ne correspond à aucune action.

  12. #12
    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
    En tout cas, sans modification de ton code posté, avec creerSection() et afficherSection() qui ne font qu'un sysout de leur nom, et une classe Terminal que j'ai réécrite à l'intuit je ne constate qu'un fonctionnement normal et logique, une alternance d'affichages du menu, on entre un nombre, ça affiche le nom de la méthode corrrespondante, si choix 1 ou 2, et quand j'entre 7 le programme s'arrête.

  13. #13
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 274
    Points
    274
    Par défaut
    Merci pour vos réponses, je vous mets les méthodes, peut être sont elles fautives ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void creerSection(String[] tabSections) {
     
    		String varValeur = null;
    		Terminal.ecrireString("  ==> " + "\t"
    				+ "Veuillez rentrer le titre de la nouvelle section : ");
    		varValeur = Terminal.lireString();
    		remplirTab1Dim(tabSections, varValeur);
    		poursuivreCreation(tabSections);
    	}
    et

    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
    public static void remplirTab1Dim(String[] t, String varValeur) {
     
    		for (int i = 0; i < t.length; i++)
    			if (t[i] == null) {
    				t[i] = varValeur;
    				break;
    			}
    	}
     
    	public static void afficherTab1Dim(String[] t) {
     
    		// Vérifie que le tableau ne soit pas vide :
     
    		boolean estVide = true;
     
    		for (int i = 0; i < t.length; i++) {
    			if (t[i] != null) {
    				estVide = false;
    				break;
    			}
    		}
    		if (estVide) {
    			Terminal.sautDeLigne();
    			Terminal.ecrireString("  ==> "
    					+ "\t"
    					+ "-- AVERTISSEMENT : Aucune donnée n'a encore été enregistrée --");
    			Terminal.sautDeLigne();
    		} else {
     
    			// Affiche la liste des éléments du tableau
     
    			for (int j = 0; j < t.length; j++) {
    				if (t[j] != null) {
    					Terminal.ecrireStringln("\t" + "\t" + (j + 1) + ". " + t[j]);
    				}
    			}
    		}
    	}
    }

  14. #14
    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 peux nous la poster ta classe Terminal, juste pour voir ?
    Dans le code que tu as posté, je ne vois rien qui pourrait expliquer pourquoi une option marcherait qu'une fois sur 2 (maintenant le code n'est pas complet non plus).

  15. #15
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Tiens, le "projet" de nfa031 du CNAM. Voilà la classe Terminal, mais je doute que le problème vienne de là (même si moi non plus je ne le trouve pas...)

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    import java.io.*;
    public class Terminal{    
        static BufferedReader in =
    	new BufferedReader(new InputStreamReader(System.in));
        public static String lireString() // Lire un String
    	{
    	    String tmp="";
    	    char C='\0';
    	    try {
    		tmp = in.readLine();
    	    }
    	    catch (IOException e)
    	    {
    		exceptionHandler(e);
    	    }
    	    return tmp;
    	} // fin de lireString()
        public static int lireInt()  // Lire un entier
    	{
    	    int x=0;
    	    try {
    		x=Integer.parseInt(lireString());
    	    }
    	    catch (NumberFormatException e) {
    		exceptionHandler(e);
    	    }	
    	    return x ;
    	}
        public static boolean lireBoolean()  // Lire un entier
    	{
    	    boolean b = true;
    	    try {
    		b = Boolean.valueOf(lireString()).booleanValue();
    	    }
    	    catch (NumberFormatException e) {
    		exceptionHandler(e);
    	    }	
    	    return b;
    	}
        public  static double lireDouble()  // Lire un double
    	{
    	    double x=0.0;
    	    try {
    		x=Double.valueOf(lireString()).doubleValue();
    	    }
    	    catch (NumberFormatException e) {
    		exceptionHandler(e);
    	    }	
    	    return x ;
    	}
        public  static char lireChar()  // Lire un caractere
    	{
    	    String tmp=lireString();
    	    if (tmp.length()==0)
    		return '\n';
    	    else 
    	    {
    		return tmp.charAt(0);
    	    }
    	}
        public static void ecrireString(String s){ // Afficher un String
    	try{
    	    System.out.print(s);
    	} catch (Exception ex){
    	    exceptionHandler(ex);
    	}
        }
        public static void ecrireStringln(String s) // Afficher un String
    	{
    	    ecrireString(s);
    	    sautDeLigne();
    	} // fin de ecrireStringln()
        public static void ecrireInt(int i)  // Afficher un entier
    	{
    	    ecrireString(""+i);
    	}
        public static void ecrireIntln(int i)  // Afficher un entier
    	{
    	    ecrireString(""+i);
    	    sautDeLigne();
    	}
        public static void ecrireBoolean(boolean b){
    	ecrireString(""+b);
        }
        public static void ecrireBooleanln(boolean b){
    	ecrireString(""+b);
    	sautDeLigne();
        }
        public  static void ecrireDouble(double d)  // Afficher un double
    	{
    	    ecrireString(""+d);
    	}
        public  static void ecrireDoubleln(double d)  // Afficher un double
    	{
    	    ecrireDouble(d);
    	    sautDeLigne();
    	}
        public  static void ecrireChar(char c)  // Afficher un caractere
    	{
    	    ecrireString(""+c);
    	}  
        public  static void ecrireCharln(char c)  // Afficher un caractere
    	{
    	    ecrireChar(c);
    	    sautDeLigne();
    	}
        public static void sautDeLigne(){
    	try{
    	    System.out.println();
    	}catch(Exception ex){
    	    exceptionHandler(ex);
    	}
        }
        protected static void exceptionHandler(Exception ex){
    	TerminalException err = new TerminalException(ex);
    	throw err;
        }
        public static void ecrireException(Throwable ex){
    	ecrireString(ex.toString());
    	ex.printStackTrace(System.err);
        }
    }  
    class TerminalException extends RuntimeException{
        Exception ex;
        TerminalException(Exception e){
    	ex = e;
        }
    }
    Sinon tu peux poster ta classe d'un bloc? Ce sera plus simple pour trouver l'erreur...

  16. #16
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 274
    Points
    274
    Par défaut
    Voici donc la classe en entier (dans son état d'avancement) :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
     
    public class Projet_Devis_2014 {
     
    	public static void main(String[] args) {
     
    		// Tableaux de données
     
    		String tabSections[] = new String[25];
    		String tabArticles[] = new String[100];
    		int[][] tabLignes = new int[100][3];
     
    		Terminal.sautDeLigne();
    		Terminal.ecrireString("\t"
    				+ "---------- Logiciel d'édition de devis / factures ----------");
    		Terminal.sautDeLigne();
     
    		boolean run = true;
    		while (run) {
    			// Déclenche les méthodes suivant le choix effectué dans le menu
    			// principal
    			int varChoixMenu = afficherMenu();
    			if (varChoixMenu == 1) {
    				creerSection(tabSections);
    			}
    			if (varChoixMenu == 2) {
    				afficherSections(tabSections);
    			}
    			if (varChoixMenu == 7) {
    				// Fin du programme
    				run = false;
    			}
    		}
     
    	}
     
    	public static int afficherMenu() {
     
    		// Affichage du menu principal
     
    		Terminal.sautDeLigne();
    		Terminal.ecrireStringln("\t" + "\t" + "\t"
    				+ "1: Creer nouvelle section");
    		Terminal.ecrireStringln("\t" + "\t" + "\t"
    				+ "2: Ouvrir une section existante");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "3: Supprimer une section");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "4: Creer une ligne");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "5: Effacer une ligne");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "6: Voir Devis / Facture");
    		Terminal.ecrireStringln("\t" + "\t" + "\t" + "7: Sortir");
    		Terminal.sautDeLigne();
     
    		// Enregistre et vérifie le choix utilisateur dans le menu principal
     
    		boolean testReponse = false;
    		int varChoixMenu = 0;
     
    		while (testReponse == false) {
    			Terminal.sautDeLigne();
    			Terminal.ecrireString("  ==> " + "\t"
    					+ "Veuillez entrer votre choix : ");
    			Terminal.sautDeLigne();
    			varChoixMenu = Terminal.lireInt();
     
    			if (varChoixMenu < 1 || varChoixMenu > 7) {
    				testReponse = false;
    				Terminal.ecrireString("  ==> "
    						+ "\t"
    						+ "Le choix rentré n'est pas valide, vous devez rentrer un nombre entre 1 et 7");
    				Terminal.sautDeLigne();
    			} else {
    				testReponse = true;
    			}
    		}
    		return varChoixMenu;
    	}
     
    	public static void creerSection(String[] tabSections) {
     
    		String varValeur = null;
    		Terminal.ecrireString("  ==> " + "\t"
    				+ "Veuillez rentrer le titre de la nouvelle section : ");
    		varValeur = Terminal.lireString();
    		remplirTab1Dim(tabSections, varValeur);
    		poursuivreCreation(tabSections);
    	}
     
    	public static void afficherSections(String[] tabSections) {
    		Terminal.sautDeLigne();
    		Terminal.ecrireStringln("  ==> " + "\t"
    				+ "Liste des sections existantes :");
    		afficherTab1Dim(tabSections);
    		afficherMenu();
    	}
     
    	public static void effacerSection(String[] tabSections) {
     
    	}
     
    	public static void creerLigne() {
     
    	}
     
    	public static void afficherDocument() {
     
    	}
     
    	public static void poursuivreCreation(String[] tabSections) {
     
    		// Demande à l'utilisateur s'il veut poursuivre
    		// la création d'une autre ligne ou section par un sous-menu
    		// et teste si le choix rentré est correct
     
    		int choixPoursuivre = 0;
     
    		Terminal.sautDeLigne();
    		Terminal.sautDeLigne();
    		Terminal.ecrireString("  ==> " + "\t" + "\t"
    				+ "Que desirez vous faire ?");
    		Terminal.sautDeLigne();
    		Terminal.sautDeLigne();
    		Terminal.ecrireStringln("\t" + "1. = Creer une nouvelle ligne");
    		Terminal.ecrireStringln("\t" + "2. = Creer une nouvelle section");
    		Terminal.ecrireStringln("\t" + "3. = Voir document");
    		Terminal.ecrireStringln("\t" + "4. = Menu Principal");
    		Terminal.sautDeLigne();
    		Terminal.ecrireString("  ==> " + "\t" + "\t"
    				+ "Veuillez entrer votre choix : ");
     
    		// Teste la réponse utilisateur
     
    		boolean testReponse = false;
     
    		while (testReponse == false) {
    			Terminal.sautDeLigne();
    			choixPoursuivre = Terminal.lireInt();
     
    			if (choixPoursuivre < 1 || choixPoursuivre > 4) {
    				testReponse = false;
    				Terminal.ecrireString("  ==> "
    						+ "\t"
    						+ "Le choix rentré n'est pas valide, vous devez rentrer un nombre entre 1 et 4");
    				Terminal.sautDeLigne();
    				Terminal.ecrireString("  ==> " + "\t" + "\t"
    						+ "Veuillez entrer votre choix : ");
    			} else {
    				testReponse = true;
    			}
    			// Actions à éxécuter suivant le choix effectué dans le menu
     
    			if (choixPoursuivre == 1) {
    				creerLigne();
    			}
    			if (choixPoursuivre == 2) {
    				creerSection(tabSections);
    			}
    			if (choixPoursuivre == 3) {
    				afficherDocument();
    			}
    			if (choixPoursuivre == 4) {
    				afficherMenu();
    			}
    		}
    	}
     
    	public static void remplirTab1Dim(String[] t, String varValeur) {
     
    		for (int i = 0; i < t.length; i++)
    			if (t[i] == null) {
    				t[i] = varValeur;
    				break;
    			}
    	}
     
    	public static void afficherTab1Dim(String[] t) {
     
    		// Vérifie que le tableau ne soit pas vide :
     
    		boolean estVide = true;
     
    		for (int i = 0; i < t.length; i++) {
    			if (t[i] != null) {
    				estVide = false;
    				break;
    			}
    		}
    		if (estVide) {
    			Terminal.sautDeLigne();
    			Terminal.ecrireString("  ==> "
    					+ "\t"
    					+ "-- AVERTISSEMENT : Aucune donnée n'a encore été enregistrée --");
    			Terminal.sautDeLigne();
    		} else {
     
    			// Affiche la liste des éléments du tableau
     
    			for (int j = 0; j < t.length; j++) {
    				if (t[j] != null) {
    					Terminal.ecrireStringln("\t" + "\t" + (j + 1) + ". " + t[j]);
    				}
    			}
    		}
    	}
    }

  17. #17
    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,

    Tu ne dois pas rappeler afficheMenu dans une sous méthode comme tu le fais dans poursuivreCreation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (choixPoursuivre == 4) {
    				afficherMenu();
    			}
    Sinon tu "casses" la boucle principale ! Comme c'est elle qui traite les choix dans le menu, et que tu ne fais qu'afficher le menu, et en effet, les options qui y sont choisies ne sont pas traitées.

    Il faut que tu remontes dans tes appels jusqu'à revenir à la boucle principale. Si tu as besoin de faire des aller et retour entre sous-menu et sous-fonctions qui affichent elles-mêmes d'autres menus, prévois de retourner un boolean pour savoir si lorsque tu sors d'une sous-fonction, il faut remonter ou boucler sur le sous-menu.

  18. #18
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 274
    Points
    274
    Par défaut
    Je comprends le raisonnement mais je ne vois pas alors comment réafficher mon menu à chaque fois que nécessaire ...
    Peut on remonter une partie du code de afficherMenu() dans le main et ne garder le reste que pour que se fasse le return ou un truc du genre ?

  19. #19
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    La journée ayant été "rude", je dit peut être une bêtise, mais si le choix 4 n'exécute aucun traitement, tous les traitements de la boucle principale sont fait, donc elle recommence, donc le menu se réaffiche, non? Et comme les choix précédents semblent suffire à la gestion du sous-menu, il n'y a pas de problème...

  20. #20
    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 fais return pour sortir de ta méthode. Si cette méthode est appelée dans une boucle, tu fais return true ou false selon le cas à gérer, et dans la boucle d'appel, il y a un truc du genre if ( !methodeTruc(...) ) return; pour remonter à celle encore au dessus. Ca peut être un int au besoin, s'il y a plusieurs choix possible (remonter d'un niveau, de 2, ou remonter tout en haut...).

    Dans ton cas de poursuivreCreation(String[] tabSections), ça peut être par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void creerSection(String[] tabSections) {
               boolean run=true;
               while(run) {
    		String varValeur = null;
    		Terminal.ecrireString("  ==> " + "\t"
    				+ "Veuillez rentrer le titre de la nouvelle section : ");
    		varValeur = Terminal.lireString();
    		remplirTab1Dim(tabSections, varValeur);
    		run = poursuivreCreation(tabSections);
              }
    	}
    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
    public boolean poursuivreCreation(String[] tabSections) {
     
    ...
     
                 if (choixPoursuivre == 2) {
    				//creerSection(tabSections);
                     return true; // remonter dans l'appelant et reboucle
    	     }
     
                 if (choixPoursuivre == 4) {
    		 //		afficherMenu();
                     return false; // remonter dans l'appelant et ne boucle pas
                 }
     
           }
    }
    Enfin, il y a un moment ou les interfaces "complexes" nécessitent de faire des classes pour gérer plus facilement. Si tu n'as le droit qu'à pas grand chose pour faire ton projet, mais que les specs sont un peu complexes, ça risque de ressembler à une usine à gaz. Je pense que des classes, prévues pour gérer des menus récursifs, dans une boucle non récursive, faciliteraient grandement l'écriture de l'enchaînement des menus.
    En tout cas, un appel récursif comme tu le fais peut être assez dangereux : au bout d'un certain nombre d'actions, tu peux avoir un dépassement de stack.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2002, 13h32
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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