Distributeur automatique de billets en Java


J'ai essayé de comprendre ce qui ne va pas avec ce programme que j'écris. Voici la description complète de ce que j'essaie de faire: Utilisez la classe de compte créée dans l'exercice de programmation 9.7 pour simuler un distributeur automatique de billets. Créer dix comptes dans un tableau avec id 0, 1, . . . , 9, et le solde initial $100. Le système invite l'utilisateur à entrer un id. Si l'id est entré incorrectement, demander à l'utilisateur d'entrer un code correct. Une fois qu'un id est accepté, le menu principal s'affiche comme indiqué dans le exemple d'exécution. Vous pouvez entrer un choix 1 pour afficher le solde actuel, 2 pour retirer de l'argent, 3 pour déposer de l'argent et 4 pour quitter le menu principal. Une fois que vous quittez, le système demandera à nouveau un ID. Ainsi, une fois que le système démarre, il ne s'arrêtera pas.

Le programme affiche désormais uniquement les 100 default par défaut après chaque achat. J'ai réalisé que le problème est que mes comptes sont recréés à chaque fois après une transaction. Ma question est fondamentalement que puis je faire ou où puis je réécrire le création de compte donc j'évite ce problème. Je suis nouveau dans la programmation, donc je me bats toujours. Merci à l'avance.

import java.util.Date;
import java.util.Scanner;
public class test {

    public static void main(String[] args) {

            mainMenuOptions();      
    }
            //main menu option method
    public static void mainMenuOptions(){
        Scanner input = new Scanner(System.in);
        //enter id
        System.out.println("Enter an id: "); 
        int id = input.nextInt();
        //create accounts
          Account [] accounts = new Account[10];
        //initialize 100 dollars
        for (int i = 0; i < accounts.length; i++) { 
            accounts[i] = new Account(i, 100); 
        }
        int index = -1; 
        for(int i = 0; i < accounts.length; i++) {
            if(accounts[i].getid() == id) {
            index = i; 
            i = accounts.length;
            }               
        }
        if(id <= 9){
            //main menu
            mainMenu();
            //user enters choice in main menu   
            int enterchoice = input.nextInt();                          
            if(enterchoice == 1){
                System.out.println("The balance is " + accounts[index].getbalance());
                mainMenuOptions();
            }
            else if(enterchoice == 2){
                System.out.println("Enter an amount to withdraw ");
                double amount = input.nextDouble();
                //withdraw method
                accounts[index].withdraw(amount);
                mainMenuOptions();
            }
            else if(enterchoice == 3){
                System.out.println("Enter an amount to deposit ");
                double amount = input.nextDouble();
                //deposit method
                accounts[index].deposit(amount);
                mainMenuOptions();
            }
            else if(enterchoice == 4){
                mainMenuOptions();
            }   
        }
        else{
            System.out.println("Please enter a correct id");
            mainMenuOptions();
        }

    }
    //main menu method
    public static void mainMenu(){
        System.out.println("Main menu"+"\n1:check balance"+"\n2:withdraw"
                +"\n3:deposit"+"\n4:exit"+"\nEnter a choice");

    }
    }
        class Account{
            private int id = 0;
            private double balance = 0;
            private double withdraw = 0;
            private double deposit = 0;
            private double amount = 0;

            Account(){
            }

            Account(int id, double balance){
                this.id = id;
                this.balance = balance;
            }

            public int getid(){
                return this.id;

            }
            public void setid(int newid){
                id = newid;
            }
            public double getbalance(){
                return this.balance;
            }
            public void withdraw(double amount){
                balance = balance - amount;
            }

            public void deposit(double amount){
                balance = balance + amount;
            }
        }

EDIT: Quand je vais vérifier le solde, il me fera revenir aux scanners pour l'id et le choix. Je ne sais pas quel est le problème ici, quelqu'un peut-il essayer d'exécuter mon code ou me donner un aperçu de ce qui pourrait être le problème. Grâce. Le programme est censé être capable de passer par n'importe quel choix de transactions, simulant un distributeur automatique de billets, l'id étant un nombre compris entre 0 et 9. Voici la nouvelle mise à jour du code.

import java.util.Date;

Importer java.util.Scanner;

public class test {

    private static Account[] accounts = new Account[10];

    public static void main(String[] args) {
        accounts();
        mainMenuOptions();      
}
    //main menu option method
    public static void mainMenuOptions() {
        Scanner input = new Scanner(System.in);

        int enterchoice = -1;
        int id=-1;
        while (enterchoice != 4) {
          mainMenu();
          System.out.println("Enter an id: ");
          id = input.nextInt();
          //enter id
          System.out.println("Enter choice:  ");
           enterchoice = input.nextInt();

          int index = -1;
          for (int i = 0; i < accounts.length; i++) {
            if (accounts[i].getid() == id) {
              index = i;
              break;
            }
          }
          if (enterchoice == 1) {
            System.out.println("The balance is " + accounts[index].getbalance());       
          } else if (enterchoice == 2) {
            System.out.println("Enter an amount to withdraw ");
            double amount = input.nextDouble();
            //withdraw method
            accounts[index].withdraw(amount);               
          } else if (enterchoice == 3) {
            System.out.println("Enter an amount to deposit ");
            double amount = input.nextDouble();
            //deposit method
            accounts[index].deposit(amount);
          } 
        }
      }

     public static void accounts() {
        //create accounts
        //initialize 100 dollars
        for (int i = 0; i < accounts.length; i++) {
            accounts[i] = new Account(i, 100);
        }
    }
    //main menu method
    public static void mainMenu(){
        System.out.println("Main menu"+"\n1:check balance"+"\n2:withdraw"
                +"\n3:deposit"+"\n4:exit");

    }
    }
        class Account{
            private int id = 0;
            private double balance = 0;
            private double withdraw = 0;
            private double deposit = 0;
            private double amount = 0;

            Account(){
            }

            Account(int id, double balance){
                this.id = id;
                this.balance = balance;
            }

            public int getid(){
                return this.id;

            }
            public void setid(int newid){
                id = newid;
            }
            public double getbalance(){
                return this.balance;
            }
            public void withdraw(double amount){
                balance = balance - amount;
            }

            public void deposit(double amount){
                balance = balance + amount;
            }
        }
Author: Jake, 2016-02-20

5 answers

Donc vous pouvez le faire comme ceci bro:

public class test {

private Account [] accounts = new Account[10];

public static void main(String[] args) {

        mainMenuOptions();      
}
        //main menu option method
public static void mainMenuOptions(){
    Scanner input = new Scanner(System.in);
    //enter id
    System.out.println("Enter an id: "); 
    int id = input.nextInt();

    //initialize 100 dollars
    for (int i = 0; i < accounts.length; i++) { 
        accounts[i] = new Account(i, 100); 
    }
    int index = -1; 
    for(int i = 0; i < accounts.length; i++) {
        if(accounts[i].getid() == id) {
        index = i; 
        i = accounts.length;
        }               
    }

Maintenant, l'objet vit en dehors de la méthode, donc quand la méthode se ferme, il ne détruira pas l'objet. Les comptes persisteront et vous devriez être en mesure de faire ce que vous cherchez à faire à partir de là.

J'ai eu le même problème il y a quelque temps où j'avais des données qui étaient toutes arraylist. J'avais l'objet déclaré au niveau de la classe, et il existait dans chaque boucle de mon instruction For provoquant des entrées doublées dans la liste. Je l'ai déplacé à l'intérieur de l'instruction For et j'ai réalisé que chaque fois que l'instruction For terminait une boucle, elle détruisait l'objet et le réinstallait.

Essayez ceci, je pense qu'il devrait se débarrasser du problème avec l'objet de compte recréé chaque fois que vous invoquez la méthode mainMenuOptions ().

Si vous vous inquiétez des dépassements de mémoire dans les applications plus grandes, vous pouvez également le faire comme l'autre affiche en parlait en le créant dans le principal comme ceci

 public class test {

public static void main(String[] args) {
        Account [] accounts = new Account[10];
        mainMenuOptions(accounts);      
}
        //main menu option method
public static void mainMenuOptions(Account accounts){
    Scanner input = new Scanner(System.in);
    //enter id
    System.out.println("Enter an id: "); 
    int id = input.nextInt();

    //initialize 100 dollars
    for (int i = 0; i < accounts.length; i++) { 
        accounts[i] = new Account(i, 100); 
    }
    int index = -1; 
    for(int i = 0; i < accounts.length; i++) {
        if(accounts[i].getid() == id) {
        index = i; 
        i = accounts.length;
        }               
    }

Dans cette version, vous avez créé l'objet à vivre à l'intérieur de la méthode main. ici, j'ai instancié l'objet et l'ai passé comme argument à mainMenuOptions. De cette façon, si vous décidez que vous ne voulez pas que cela soit globalement disponible pour toutes les sous-méthodes dans main, vous pouvez maintenant le faire vivre dans l'espace de la méthode main uniquement et l'utiliser comme argument si nécessaire.

Ces deux solutions fonctionneront. Ma première suggestion est le rapide et sale car c'est un petit programme. Cependant, dans les grands programmes que vous pouvez utiliser la deuxième méthode pour prévenir l'objet d'être disponible pour utilisation dans d'autres méthodes contenues dans la classe.

 0
Author: Tom L'esperance, 2016-02-21 15:37:44

Vous appelez récursivement mainMenuOptions() chaque fois que votre "transaction" se termine. Cette fonction recrée tous les comptes à chaque fois.

Vous devez créer les comptes une seule fois, de préférence sur une fonction distincte appelée en dehors de mainMenuOptions(), après l'invocation principale et avant la mainMenuOptions(). Pour ce faire, vous devrez faire du tableau accounts une propriété de votre classe principale (test) ou le passer à mainMenuOptions ().

 1
Author: Paulo Araújo, 2016-02-20 18:17:46

Essayez de déplacer votre objet accounts en dehors de la méthode mainmenuoptions et déclarez-le sous la classe.

Votre objet est détruit à la fin de la méthode après son appel.

 1
Author: Tom L'esperance, 2016-02-20 18:18:49

Vous appelez mainMenuOptions() ce qui rendra tous les comptes initialisés à 100$.

Je soupçonne que vous souhaitez maintenir le programme en cours d'exécution et que vous essayez de le faire en appelant mainMenuOptions() quoi qu'il arrive.

Pour maintenir le programme en cours d'exécution, essayez de:

  • initialise les comptes en dehors de mainMenuOptions(), dans une méthode distincte appelée une fois.
  • Ensuite, appelez la méthode principale où vous recevez une option de l'utilisateur et quittez uniquement lorsque l'utilisateur entre une sortie option-4

Exemple:

mainMenu();
System.out.println("Enter Option: "); 
int option = input.nextInt();
while(option != 4) { // keep looping unless user wants to exit
// process the option [deposit, withdrawal etc]

mainMenu();
System.out.println("Enter Option: "); 
int option = input.nextInt();
}

//at this point the user selected exit and you can terminate or do whatever

Vous pouvez essayer quelque chose comme ça. L'idée est de garder demandant à l'utilisateur une option jusqu'à ce qu'il décide de le quitter. Vous pouvez adapter à vos besoins.

Modifier:

    public class test {

      private static Account[] accounts = new Account[10];

  public static void main(String[] args) {

      accounts();
      mainMenuOptions();
    }
    //main menu option method
  public static void mainMenuOptions() {
    Scanner input = new Scanner(System.in);

    int enterchoice = -1;
    int id=-1;
    while (enterchoice != 4) {
      mainMenu();
      System.out.println("Enter choice: ");
      enterchoice = input.nextInt();
      //enter id
      System.out.println("Enter an id: ");
       id = input.nextInt();

      int index = -1;
      for (int i = 0; i < accounts.length; i++) {
        if (accounts[i].getid() == id) {
          index = i;
          break;
        }
      }
      if (enterchoice == 1) {
        System.out.println("The balance is " + accounts[index].getbalance());
      } else if (enterchoice == 2) {
        System.out.println("Enter an amount to withdraw ");
        double amount = input.nextDouble();
        //withdraw method
        accounts[index].withdraw(amount);
      } else if (enterchoice == 3) {
        System.out.println("Enter an amount to deposit ");
        double amount = input.nextDouble();
        //deposit method
        accounts[index].deposit(amount);
      } 
    }
  }

  public static void accounts() {
    //create accounts
    //initialize 100 dollars
    for (int i = 0; i < accounts.length; i++) {
      accounts[i] = new Account(i, 100);
    }
  }

  //main menu method
  public static void mainMenu() {
    System.out.println("Main menu" + "\n1:check balance" + "\n2:withdraw" + "\n3:deposit" + "\n4:exit" + "\nEnter a choice");

  }
 1
Author: Ivo, 2016-02-20 23:34:14

Ok, donc je me suis finalement assez ennuyé pour charger votre code et le regarder. Maintenant, cela ressemble à un devoir, donc je ne vais pas publier la solution parce que vous allez être un codeur de merde si vous ne savez pas comment résoudre ces choses vous-même. Donc, je vais vous donner un indice énorme.

Regardez votre ligne commentée sous où vous avez créé les comptes. Tu as fait une boucle là-bas.

//initialize 100 dollars
    for (int i = 0; i < accounts.length; i++) { 
        accounts[i] = new Account(i, 100); 
    }

Je veux vous demander quelque chose, si j'appelle mainMenuOptions et exécute ce segment de code, que se passe - t-il lorsque j'atteins cette boucle la prochaine fois que j'exécute cette méthode?

Pensez-y, Vous réaliserez rapidement pourquoi vous avez des problèmes. Vous devrez toujours placer l'objet compte en dehors de mainMenuOptions pour empêcher la destruction des comptes, mais vous devrez également faire quelque chose avec cette boucle d'initialisation.

Exécutez votre code après avoir déplacé les comptes à l'extérieur au niveau de la classe, et essayez de jouer avec 2 des comptes en effectuant un dépôt, changer de compte, faire un dépôt, revenir au premier compte et faire une demande de solde.

Insérez un point d'arrêt à cette partie initialiser le solde du compte de votre code si vous rencontrez toujours des problèmes. Je suis assez positif que vous allez vous gifler dans le front et crier "wtf pensais-je?"

J'ai foi en toi, mon homme. Vous avez obtenu ce. frappez-moi si vous avez besoin d'un autre indice.

Sur une note latérale, assurez - vous de rendre l'objet comptes statique également lorsque vous le placez sous classe. Impossible d'avoir une référence statique à un objet dynamique. L'IDE de l'écorce à vous. EX:

    public class test {

private static Account [] accounts = new Account[10];

public static void main(String[] args) {

        mainMenuOptions();      
}
 1
Author: Tom L'esperance, 2016-02-21 15:40:23