0
votes

Impossible de calculer correctement la boucle

Je termine actuellement une mission pour un système de billetterie simple et je suis perplexe quant à la façon dont la boucle ne calcule pas correctement.

Fondamentalement, le programme consiste à calculer le coût total d'un achat de billets dans un cinéma local, cependant, lorsque l'utilisateur saisit un type et une quantité de ticket particuliers, la boucle est censée se réinitialiser, l'utilisateur entre un second type de ticket et une deuxième quantité, et ce processus doit être répété un nombre illimité de fois jusqu'à ce que l'utilisateur coupe la boucle, et le coût total calculé pour toutes les boucles est présenté.

J'ai eu de l'aide ici et en personne avec mon code, et je suis perplexe quant à la raison pour laquelle cette boucle ne boucle pas correctement! Une seule boucle est parfaitement calculée mais une deuxième boucle échoue.

J'ai actuellement essayé d'utiliser une classe énumérée qui m'a aidé à résoudre d'autres problèmes liés aux calculs de tickets.

package ticketingsystem;

/**
 *
 * @author 
 */
enum TicketType {
    child(18), adult(36), senior(32.5);

    TicketType(double price) {
        this.price = price;
    }

    private double price;

    public double getPrice() {
        return price;
    }
}

J'ai également lié les prix de billetterie à une classe d'énumération, les détails comme suit:

package ticketingsystem

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class ticketingsystem {

    /**
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String order, again;
    int quantity = 0;
    double totalPrice;
        totalPrice = 0;
    TicketType ticketType;

    System.out.println("  ");

    System.out.println("Welcome to the cinemas!");

    System.out.println(" ");
    System.out.println("MAIN MENU");
    System.out.println(" ");
    System.out.println("The cinema has the following options");
    System.out.println(" ");
    System.out.println("1 = Child (4-5 yrs)");
    System.out.println("2 = Adult (18+ yrs)");
    System.out.println("3 = Senior (60+ yrs)");

    do {
      System.out.println(" ");
      System.out.print("Enter your option: ");
      order = br.readLine();

      switch (order.toLowerCase()) {
        case "1":
          ticketType = TicketType.child;
          break;

        case "3":
          ticketType = TicketType.senior;
          break;

        default:
          ticketType = TicketType.adult;
          break;
      }

      System.out.print("Enter the number of tickets: ");
      quantity = Integer.parseInt(br.readLine());

      totalPrice += ticketType.getPrice() * quantity;
      System.out.printf("You are purchasing %s tickets at %.2f \n", ticketType, ticketType.getPrice());

      System.out.print("Do you wish to continue?  (Y/N) : ");
      again = br.readLine(); 
    }
    while (again.equalsIgnoreCase("y"));

    System.out.println(" ");
    System.out.printf("Total Price           : $%.2f \n", totalPrice);
  }
}

Le résultat attendu est la boucle à répéter un nombre infini de fois, tout en conservant les chiffres calculés précédemment aussi longtemps que l'utilisateur le souhaite.

Il n'y a pas de message d'erreur, cependant le système n'a pas de sortie après avoir entré le type de ticket et la quantité pendant la deuxième boucle.


9 commentaires

Dans votre boucle, la quantité est toujours nouvellement définie. totalPrice est accumulé sur la boucle. Est-ce exact?


votre programme compile-t-il? vous n'avez pas d'erreur totalPrice n'a peut-être pas été initialisé?


Oui c'est correct. Oui, il y a l'erreur de prix total mais il se compile et s'exécute toujours ... Pensez-vous qu'il y a un problème ici que je n'ai pas encore vu?


Est-ce une erreur ou un avertissement? S'il s'agit d'une erreur, vous exécuterez une ancienne version du code (car cette version n'a pas été compilée). S'il ne s'agit que d'un avertissement, il doit s'initialiser à 0.0 par défaut. Essayez de faire un clean and build dans votre IDE- pour en être sûr.


c'est une erreur, veuillez reconstruire votre projet


hmm non, cela semble être juste un avertissement lors de la réinitialisation de l'IDE .. aucun message d'erreur et le problème persiste


J'ai oublié de mentionner, j'ai également utilisé les prix des tickets avec une classe enum (j'ai édité ma question avec quelques suggestions de débogage de l'IDE complétées à l'instant).


J'ai utilisé tout votre code exactement et le programme fonctionne correctement. Si vous voulez l'exécuter à l'infini, pourquoi ne pas coder en dur les entrées?


Les constantes d'énumération doivent être en UPPER_SNAKE_CASE .


3 Réponses :


0
votes

Lorsque j'ai essayé avec les codes suivants, tout fonctionne bien.

Welcome to the cinemas!

MAIN MENU

The cinema has the following options

1 = Child (4-5 yrs)
2 = Adult (18+ yrs)
3 = Senior (60+ yrs)

Enter your option: 1
Enter the number of tickets: 1
--> You are purchasing 1 - CHILD Ticket(s) at $18.0

Do you wish to continue?  (Y/N) : y

Enter your option: 2
Enter the number of tickets: 2
--> You are purchasing 2 - ADULT Ticket(s) at $36.0

Do you wish to continue?  (Y/N) : y

Enter your option: 3
Enter the number of tickets: 3
--> You are purchasing 3 - SENIOR Ticket(s) at $32.5

Do you wish to continue?  (Y/N) : n

==> Total Price : $187.5    

Vous pouvez vérifier le résultat de mon test ici.

package mm.com.java.so.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TicketingSystem {

    enum TicketType {

        CHILD(18), ADULT(36), SENIOR(32.5);

        TicketType(double price) {
            this.price = price;
        }

        private double price;

        public double getPrice() {
            return price;
        }
    }

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String type, again;
        int quantity = 0;
        double totalPrice = 0;
        TicketType ticketType;

        System.out.println("Welcome to the cinemas!\n");

        System.out.println("MAIN MENU\n");
        System.out.println("The cinema has the following options\n");
        System.out.println("1 = Child (4-5 yrs)");
        System.out.println("2 = Adult (18+ yrs)");
        System.out.println("3 = Senior (60+ yrs)");

        do {

            System.out.print("\nEnter your option: ");

            type = br.readLine();

            switch (type) {
                case "1":
                    ticketType = TicketType.CHILD;
                    break;

                case "2":
                    ticketType = TicketType.ADULT;
                    break;

                default:
                    ticketType = TicketType.SENIOR;
                    break;
            }

            System.out.print("Enter the number of tickets: ");

            quantity = Integer.parseInt(br.readLine());

            totalPrice += ticketType.getPrice() * quantity;

            System.out.printf("--> You are purchasing %s - %s Ticket(s) at $%s\n", quantity, ticketType, ticketType.getPrice());

            System.out.print("\nDo you wish to continue?  (Y/N) : ");

            again = br.readLine();

        } while (again.equalsIgnoreCase("y"));

        System.out.printf("\n==> Total Price : $%s \n", totalPrice);
    }
}

REMARQUE: Si vous êtes développeur JAVA, vous devez suivre les règles et réglementations JAVA lorsque vous codez (par exemple, le nom de la classe). J'ai formaté votre code. veuillez vérifier attentivement.

Ce code a fonctionné sans erreur sur mon PC.


2 commentaires

Ah excellent merci beaucoup !! Oui cela fonctionne parfaitement! J'ai été perplexe là-dessus pendant si longtemps! Le problème que j'ai eu n'était pas d'utiliser les majuscules dans la classe enum.


Alors, acceptez la réponse et votez. N'oubliez pas, vous êtes dans stackoverflow.



1
votes

Je n'ai pas trouvé de problème dans votre code lorsque je l'ai exécuté. s'il vous plaît voir la sortie ci-dessous lorsque j'exécute votre code, il calcule parfaitement:

Welcome to the cinemas!

MAIN MENU

The cinema has the following options

1 = Child (4-5 yrs)
2 = Adult (18+ yrs)
3 = Senior (60+ yrs)

Enter your option: 2
Enter the number of tickets: 2
You are purchasing adult tickets at 36.00 
Do you wish to continue?  (Y/N) : Y

Enter your option: 3
Enter the number of tickets: 1
You are purchasing senior tickets at 32.50 
Do you wish to continue?  (Y/N) : Y

Enter your option: 1
Enter the number of tickets: 1
You are purchasing child tickets at 18.00 
Do you wish to continue?  (Y/N) : N

Total Price           : $122.50 


0 commentaires

2
votes

FWIW, je viens également d'essayer le code de votre question initiale publiée.

Le seul problème avec le code de votre question était un point-virgule manquant dans l'instruction package dans le public class ticketingsystem main class.

Ceci est une erreur, ce qui signifiait que lorsque vous avez compilé, il aurait échoué et aurait simplement exécuté une version précédente du code. C'est probablement pour cette raison que vous n'avez pas obtenu le résultat escompté (vous utilisiez une ancienne version).

Voici une transcription de ma session utilisant votre code exact (plus un point-virgule sur l'instruction package de la classe principale):

Welcome to the cinemas!

MAIN MENU

The cinema has the following options

1 = Child (4-5 yrs)
2 = Adult (18+ yrs)
3 = Senior (60+ yrs)

Enter your option: 1
Enter the number of tickets: 2
You are purchasing child tickets at 18.00 
Do you wish to continue?  (Y/N) : y

Enter your option: 2
Enter the number of tickets: 3
You are purchasing adult tickets at 36.00 
Do you wish to continue?  (Y/N) : n

Total Price           : $144.00 

Cinéma cher!

FWIW, comme l'a dit R. Katnaan, vous devez suivre les règles de syntaxe. Cependant, la capitalisation des noms d'élément d'énumération n'est pas une règle du langage. C'est une convention fortement préconisée (norme de codage). Je suis d'accord que vous devriez utiliser Capitals pour vos éléments d'énumération, mais ce n'est pas ce qui a cassé le code selon votre question ...

Si vous suivez cette convention de codage, vous devriez également utiliser Capital CamelCase pour la classe (interface et enum names) et autres. Par exemple, utilisez public class TicketingSystem et non public class ticketingsystem . Voici quelques guides pour les conventions de dénomination. N'oubliez pas que ce sont des guides et non des règles appliquées par le compilateur:

Les conventions sont importantes car elles donnent au lecteur de votre code des indices sur ce qu'il pourrait regarder. Par exemple, si je vois x = SOME_VALUE; Je suppose que x se voit attribuer une constante par opposition à x = someValue; Je suppose que x se voit attribuer la valeur d'un autre variable. Et ainsi de suite ...


0 commentaires