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 :

Boucle pour une chaine arithmétique


Sujet :

Langage Java

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut Boucle pour une chaine arithmétique
    j'ai une expression arithmétique que je reçois dans deux vecteurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String[] val = textField.getText().split("\\D");
    String[] op = textField.getText().split("\\d");
    je fais une boucle avec un switch pour faire le calcul que voici
    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
     
    int res;
    for (int i = 1; i < val.length; i++) {
         switch (op[i-1]) {
    	case "+":
    		if(i == 1){
    	         	res = Integer.valueOf(val[0]);
    			res = res + Integer.valueOf(val[i]);
    		}else{
    			res = res + Integer.valueOf(val[i]);
    		}
    		break;
     
    	case "-":
    		if(i == 1){
    			res = Integer.valueOf(val[0]);
    			res = res - Integer.valueOf(val[i]);
    		}else{
    	        	res = res - Integer.valueOf(val[i]);
    		}
    		break;
     
    	case "*":
    		if(i == 1){
    			res = Integer.valueOf(val[0]);
    			res = res * Integer.valueOf(val[i]);
    		}else{
    			res = res * Integer.valueOf(val[i]);
    		}
    		break;
     
    	case "/":
                    if (Integer.valueOf(val[i]) != 0) {
    			if(i == 1){
    				res = Integer.valueOf(val[0]);
    				res = res + Integer.valueOf(val[i]);
    		       }else{
    				res = res / Integer.valueOf(val[i]);
    			}
    		}else{
    			JOptionPane.showMessageDialog(null, "Division par 0 impossible", "Erreur division", JOptionPane.WARNING_MESSAGE);
    		}
    		break;
    	}
    }
    txtRes.setText(String.valueOf(res));
    j'ai essayé cette chaine 5+6-2*3=27 alors ça m'a donné -1
    je ne trouve pas l'erreur ??

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonjour,

    Vous n'avez pas pris en compte le fait que la multiplication est prioritaire !

    Il faudrait d'abord regarder tous les signes, exécuter en premier les multiplications ou divisions.

    Du coup, lorsque vous calculez 5 + 6 - 2 * 3, votre code fait ceci :
    5 + 6 = 11
    11 - 2 = 9
    9 * 3 = 27
    OS : LinuxMint 20

  3. #3
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    en fait j'ai pu résoudre ce problème, mais pour la priorité je ne sais pas encore comment procéder, pourriez vous me guider??

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    En algoritme cela donnerait ceci :

    1- regarder tous les signes un par un.
    2- a chaque signe, deux cas possibles :
    Si c'est un + OU UN -, L'OPÉRATION N'EST PAS PRIORITAIRE, on passe
    sI C'EST UN * OU UN /, L'OPÉRATION EST PRIORITAIRE ET IL FAUT DONC EXÉCUTER L'OPÉRATION.
    3-Une fois tous les signes vus, il faut revoir encore tous les signes et faire ceci :
    Si c'est un + ou un -, on exécute l'opération
    Si c'est un * ou un / on passe.

    Du coup avec un tel algoritme, l'opération 5 + 6 - 2 * 3 se caclculerai comme ceci :
    + n'est pas prioritaire, on passe
    - n'est pas prioritaire, on passe
    * est priororitaire donc je calcule avec les deux chiffres de part et d'autre du signe -> 2 * 3 = 6
    il n'y a plus de signe à vérifier, je recommence la boucle
    signe + je calcule -> 6 + 5 = 11
    signe -, je calcule 11 - 2 = 9
    signe multiplier, déjà vu donc je passe
    plus de signes à vérifier -> résultat = 9
    OS : LinuxMint 20

  5. #5
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    ce procédé je le connais parfaitement, mais le problème que je rencontre et dans le parcours de mes deux vecteurs, la recherche du signe prioritaire et simple mais le fait de retourner afin de terminer les autres opérations je pense pas que c'est faisable avec les vecteurs, il nous faut à la place implémenter 2 files, on place l'opérateur prioritaire avec les opérandes et ainsi de suite.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Je ne comprends pas pourquoi tu parles de vecteurs. En java, un vecteur est la classe Vector (https://docs.oracle.com/javase/7/doc...il/Vector.html) il me semble, mais je n'ai jamais exploré cela.

    Dans ton code je vois deux tableaux de String (String[]) et pas de Vector.
    La boucle que tu as faite, il faut la refaire, à part que dans la première, tu ne prends en compte que les * et les / (tu passes donc sur les + et les -)
    Dans la deuxième boucle, tu fait l'impasse sur les * et les / mais tu prends en compte les + et les -.
    OS : LinuxMint 20

  7. #7
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    oui pas vecteur tableau, j'ai dû me tremper, le code je l'ai refais et il fonctionne bien j'ai même ajouté le modulo et j'envisage d'ajouter d'autres fonctionalités

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Si tu veux bien ajouter le code de ta solution, cela pourra être utile à certains et certains pourrons même te conseiller pour écrire du code plus performant
    OS : LinuxMint 20

  9. #9
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    voilà le code après modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    res = Integer.valueOf(val[0]);
    for (int i = 1; i < val.length; i++) {
    	switch (op[i]) {
    		case "+":
    			res = res + Integer.valueOf(val[i]);
    			break;
    ...
     
    }
    txtRes.setText(String.valueOf(res));
    res = 0;

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    A noter qu'avec aussi le problème des parenthèses et autres symboles prioritaires en mathématiques, on préfère représenter ce genre de formule sous forme d'un arbre avant de la calculer, ce qui rends le calcul plus facile à faire et l'arbre peux se construire en scannant la chaine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          -
        /   \
      +       *
     / \     / \
    5   6   2   3


    Si on construit en scannant la chaine, ça fait ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    5 ->  noeud = (5)
    + ->  noeud = + (5)
    6 ->  noeud = + (5) (6)
    - ->  noeud = - ( + (5) (6))
    2 -> noeud = - ( + (5) (6) ) 2
    * -> prioritaire, on remplace l'élément de droite par un nouveau noeud:  - ( + (5) (6) ) (* (2) )
    3 -> on termine le sous noeud et on remonte d'un cran: - ( + (5) (6) ) (* (2) (3) )

    Et pour le calcul:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calcul (- ( + (5) (6) ) (* (2) (3) )) = calcul ( + (5) (6) ) - calcul (* (2) (3) )

Discussions similaires

  1. changer le style pour une chaine?
    Par nicekiller dans le forum C#
    Réponses: 11
    Dernier message: 23/06/2008, 06h47
  2. retourner un nombre pour une chaine de caractère
    Par cotede2 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/06/2008, 13h26
  3. Longueur retourner pour une chaine de caractére
    Par locs dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 10/09/2007, 15h19
  4. Fonction pour une chaine numérique
    Par miya dans le forum VB.NET
    Réponses: 5
    Dernier message: 10/05/2007, 14h21
  5. Et pour une chaine ?
    Par mick030118 dans le forum C
    Réponses: 7
    Dernier message: 12/03/2006, 11h19

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