1
votes

Initialiser des variables dans if else mais ne fonctionne pas, comment les initialiser correctement?

Débutant total à Java! J'ai besoin de savoir pourquoi «discount» et «discountnum» continuent de dire qu'ils doivent être initialisés lorsque j'initialise dans les instructions if else. Je ne veux pas prendre d'entrée utilisateur pour ces deux-là comme je le fais pour mes autres variables. Comment puis-je résoudre ce problème pour qu'il ne publie que les numéros?

import java.util.Scanner;
package com.company;

public class Coffee {

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        String name = scan.nextLine();
        double prevpurchases = scan.nextDouble();
        double saleamount = scan.nextDouble();
        double discountnum;
        double totalamount;
        int discount;
        double amountsaved;

        System.out.println("Welcome to Starbucks.\n"+
                "Please enter your name: " + name);

        System.out.println("Please enter the current purchase amount: " + saleamount);

        System.out.println("Please enter the number of purchases in the last month: " + prevpurchases);

        if (saleamount < 5){
            discountnum = 0;
            amountsaved = 0.00;
        } else {
            if (prevpurchases == 0) {
                discountnum = 0.05;
                discount = 5;
            }
            else if (prevpurchases >= 1 && prevpurchases <= 5){
                discountnum = 0.10;
                discount = 10;
            }
            else if (prevpurchases >= 6 && prevpurchases <= 10){
                discountnum = 0.15;
                discount = 15;
            }
            else if (prevpurchases >= 11 && prevpurchases <= 15){
                discountnum = 0.20;
                discount = 20;
            }
            else if (prevpurchases >= 16 && prevpurchases <= 20){
                discountnum = 0.25;
                discount = 25;
            }
            else if (prevpurchases >= 21){
                discountnum = 0.30;
                discount = 30;
            }
        }

        System.out.println("***********************\n" +
                "Receipt for " + name);
        System.out.println("You get a " + discount + "% discount.");

        amountsaved = saleamount * discountnum;
        totalamount = saleamount - amountsaved;

        System.out.println("Total amount due: $ " + totalamount);
        System.out.println("You saved $ " + amountsaved);
        System.out.println("***********************\n");

    }
}

EXEMPLE DE SORTIE:

Bienvenue dans Starbucks.

Veuillez entrer votre nom: Brian B Bryan

Veuillez entrer le montant actuel de l'achat: 12,78 $

Veuillez entrer le nombre d'achats au cours du dernier mois: 14


Reçu pour Brian B Bryan

Vous bénéficiez d'une réduction de 20%.

Montant total dû: 10,22 $

Vous avez économisé 2,56 $


p >


0 commentaires

3 Réponses :


0
votes

Initialisez-les dans la déclaration de variable avec une valeur, comme ceci:

double discountnum = 0;
double totalamount = 0;
int discount = 0;
double amountsaved = 0;


0 commentaires

1
votes

Vous "pourriez" avoir un cas, qui ne passera aucun de vos if-else-if. Essayez avec ce code.

if (saleamount < 5){
        discountnum = 0;
        amountsaved = 0.00;
    } else {
        if (prevpurchases == 0) {
            discountnum = 0.05;
            discount = 5;
        }
        else if (prevpurchases >= 1 && prevpurchases <= 5){
            discountnum = 0.10;
            discount = 10;
        }
        else if (prevpurchases >= 6 && prevpurchases <= 10){
            discountnum = 0.15;
            discount = 15;
        }
        else if (prevpurchases >= 11 && prevpurchases <= 15){
            discountnum = 0.20;
            discount = 20;
        }
        else if (prevpurchases >= 16 && prevpurchases <= 20){
            discountnum = 0.25;
            discount = 25;
        }
        else if (prevpurchases >= 21){
            discountnum = 0.30;
            discount = 30;
        } else {
            //this is the missing/needed initialization
            //if neither one of the tests you have above, you need to somehow initialize the variable.
        }
    }


0 commentaires

0
votes

Le problème en question peut en effet être résolu par l'une ou l'autre des suggestions des autres personnes. En plus de vous donner une solution rapide, je voudrais donner une certaine intuition sur pourquoi vous obtenez les erreurs:

Le compilateur, c'est-à-dire. le programme qui (simplifié) va de votre code Java -> code octet Java (version allégée de ce que vous avez écrit) -> code machine (0 et 1) doit appliquer certaines règles. Comme Java est un langage de programmation orienté objet de haut niveau, il vous cache beaucoup de détails. Par exemple, vous n'avez jamais à vous soucier de en mémoire quelque chose est stocké, vous serez alerté une fois que vous sortez des limites d'un tableau, et après avoir utilisé un objet vous jamais em > doivent s'en débarrasser manuellement (c'est-à-dire libérer l'espace occupé par celui-ci).

Ça a l'air génial, non? Eh bien, le problème est que Java, ce faisant, doit vérifier pour vous des choses que dans d'autres langages de programmation (par exemple C), le programmeur doit gérer. Bien que vous sachiez qu'un certain chemin à travers vos instructions if ne sera jamais emprunté, le compilateur ne peut pas être sûr à 100% du code que vous avez fourni. Regardons l'exemple suivant:

    int lel;
    lel = 10;

Même ce snippé simpliste va déstabiliser le compilateur. Le problème sous-jacent de ce que j'ai décrit ci-dessus est en fait plus technique, à savoir que les variables ne sont pas évaluées au compilation , mais au runtime . En un mot, le compilateur traite lel et test comme une boîte noire contenant une valeur de type. Les valeurs qu'ils détiennent ne sont d'aucune utilité à la compilation.

Par conséquent, le compilateur ne sait pas que test est vraiment toujours vrai. D'un autre côté, si vous deviez écrire:

    int lel;
    if(true)
    {
        lel = 10;
    }

le compilateur, comme true n'est pas une variable mais une valeur, l'évalue à la compilation. Par conséquent, vous n'obtenez pas d'erreur. Le dernier exemple est l'utilisation du mot-clé final . final signifie qu'une valeur ne sera pas modifiée après sa définition. Comme cela équivaut fondamentalement à ce que la variable soit constante, le compilateur "regarde" la valeur de la variable et ne la traite pas comme une boîte noire. Par exemple, si vous remplaciez boolean test = true; par final boolean test = true; , le compilateur traitera test comme une valeur. Par conséquent, il est déjà clair au moment de la compilation, que l'instruction if est toujours évaluée à true.

Dans l'un des deux exemples (c'est-à-dire if (true) {...} code > et final boolean test = true; , le compilateur réalisera très certainement que l'instruction if autour de lel = 10; est inutile et la réécrira en:

XXX


0 commentaires