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

Langage Java Discussion :

Ecriture d'un Scanf


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut Ecriture d'un Scanf
    Bonjour,

    Dans le cadre d'un projet pour apprendre à des lycéens la programmation, je dois réaliser un système d'entrée très simplifié. Pour cela j'avais dans l'idée de créer un scanf.

    J'ai écris une classe :
    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
     
    package org.unice.javaschool.actions;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    import org.eclipse.core.runtime.IProgressMonitor;
    import org.eclipse.core.runtime.IStatus;
    import org.eclipse.core.runtime.jobs.Job;
     
    public class Input {
     
    	/*
    	 * Permet de definir un equivalent a scanf mais aussi de rendre la saisie de valeur par les lyceens
    	 * plus simple.
    	 * 
    	 * 
    	 * Explication du fonctionnement :
    	 * Etape 1 : decomposition de la chaine en un tableau de caractere (exemple : s = "%s %d %f" t = {s,d,f}
    	 * Etape 2 : verification qu'il existe pour chaque caractere un objet du bon type
    	 * Etape 3 : faire le cast et assigner les resulats aux objets (fait en meme temps que l'étape 2)
    	 */
     
    	//constantes
    	private final char entier = 'i';
    	private final char flottant = 'f';
    	private final char decimal = 'd' ;
    	private final char caractere = 'c';
    	private final char string = 's';
     
    	//variables necessaires
    	private BufferedReader br ;
    	private String[] tokens;
    	private String[] entree;
     
    	public Input(){
    		br = new BufferedReader( new InputStreamReader( System.in ) );
    	}
     
    	private void decomposition(String s){
    		tokens = s.split("%");
    		try {
    			entree = br.readLine().split(" ");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.println("tokens :"+tokens[0]);
    		System.out.println("tokens :"+tokens[1]);
    		System.out.println("entre : "+entree[0]);
    	}
     
    	private void association(Object a , Object ... laSuite){
    		/*
    		 * On verifie que la taille du tableau de token vaut le nombre d'objet
    		 * Si non concordence, on renvoie une exception
    		 * Puis on verifie les types
    		 */
     
    		//-1 a cause du premier token qui est vide car split de "%i" donne " " puis "i"
    		if (tokens.length-1 == laSuite.length+1){
    			verification(tokens[1],a,entree[0]);
    			for (int i = 2 ; i < tokens.length ; ++i){
    				for (Object o : laSuite){
    					for (int j = 1 ; j < entree.length ; ++j){
    						verification(tokens[i],o,entree[j]);
    					}
    				}
    			}
    		}
    	}
     
     
    	private void verification(String s, Object a,String entree) {
    		// TODO Auto-generated method stub
    		System.out.println("Verification s : "+s);
    		switch(s.charAt(0)){
    		case entier :
    			if (a instanceof Integer){
    				a = Integer.parseInt(entree);
    				System.out.println("a : "+a);
    			}
    			break;
    		case flottant :
    			if (a instanceof Float){
    				a = Float.parseFloat(entree);
    			}
    			break;
    		case decimal :
    			if (a instanceof Double){
    				a = Double.parseDouble(entree);
    			}
    			break;
    		case caractere :
    			if (a instanceof Character){
    				a = entree.charAt(0) ;
    			}
    			break;
    		case string :
    			if (a instanceof String){
    				a = entree ;
    			}
    			break;
    		}
    	}
     
     
    	public void read(final String s, final Object a , final Object ... laSuite){
    		//la lecture s'effectue dans decomposition
    		decomposition(s);
    		association(a,laSuite);
    	}
     
    }
    code exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int b ;
    Input in = new Input();
    System.out.println("Quel est ton age ?");
    in.read("%i", b);
    System.out.println("Age : "+b);

    Seulement, je tourne en rond depuis 2 heures sans trouver de solution à un problème.

    Lorsque j'effectue un appel à ma fonction read, je passe en paramètre les variables à modifier mais comme ce sont des types primitifs, les variables sont passées par valeur (il y a donc recopie). Comment faire pour modifier ses variables et que cela dur au delà de la méthode comme si elles étaient passé par référence ?

    Je ne peux malheureusement pas retourner un tableau d'object puis redonner en dehors de la fonction, la valeur à chaque variable.

    edit : je sai que je pourrais aussi écrire une fonction scanInt() qui renverrait un int et faire un scan spécialisé pour chaque type mais j'aimerais évité cette solution si il y en a une autre.

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Et la classe Scanner ne répond pas à ton besoin ?... Pourquoi ?...

    Sinon, pour répondre à tes questions... ben fait comme fait la classe Scanner, si pour une raison qui m'échappe elle ne te convient pas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut
    Merci !
    En fait je ne connaissais pas cette classe.

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

Discussions similaires

  1. lecture/ecriture des broches RTS/CTS du port RS232
    Par .:: sly51 ::. dans le forum C
    Réponses: 3
    Dernier message: 24/10/2006, 15h28
  2. Ecriture d'une procedure stockée XP
    Par WOLO Laurent dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/07/2003, 13h09
  3. [debutant]la fonction scanf
    Par kalaka dans le forum C
    Réponses: 7
    Dernier message: 01/07/2003, 15h15
  4. Réponses: 13
    Dernier message: 14/06/2003, 22h15
  5. Réponses: 6
    Dernier message: 10/09/2002, 03h35

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