Problem z przekazywaniem parametrow

0

Hej,

Stawiam pierwsze kroki w Jave i staram sie napisac prosty program, ktory pokazuje balance na koncie jednego uzytkownika, dane .
Mam menu glowne w ktorym jest 6 wyborow.

  1. opcja ma skladac depozyt...
    problem jest ze moja globalna zmienna nie przechowuje wartosci...nie wiem jak to ugryzc..

Opis problemu:
kiedy wybieram opcje jeden Depozyt, dodaje np 300 to program wyswietli ile dodalem i wroci do menu glownego.
Kiedy ponownie wybieram zloz depozyt to suma 300 z jakiegos powodu nie jest zapamietana. I np dodajac znow 200 , balance na koncie jest tylko 200, a nie 500 :(

Ktos pomoze albo nakieruje co robie zle:

Oto kod:

package gasaccount;
import java.util.Scanner;

public class GasAccount {

* declaring variables*
 private int intAccRefNo; 
 private String strNam,strAddres;
 private double dblBalance,dblUnits,dblUnitcost,cashin;

/**
 * @param args the command line arguments
 */
 
 
public static void main(String[] args) {

    
   MainMenu(); * calling main MENU *
    
}

static void MainMenu() *section call to display main menu *
{
menuMethod();
};

* DISPLAYING MENU *
*this portion of code displays main menu*

static void menuMethod ()
{

     System.out.println(" <MENU>  \n");
     System.out.println(" 1 - Make a deposit ");
     System.out.println(" 2 - Record meter reading ");
     System.out.println(" 3 - Display balance");
     System.out.println(" 4 - Account details ");
     System.out.println(" 5 - Help ");
     System.out.println(" 6 - Exit ");
     System.out.println(" \n ");
     

GasAccount NewAccount = new GasAccount();

Scanner in = new Scanner (System.in);
switch ( in.nextInt() )

{
case 1: NewAccount.Deposit();
break;
case 2: NewAccount.recordUnits();
break;
case 3: NewAccount.getBalance();
break;
case 4: NewAccount.displayAccountDetails();
break;
case 5: NewAccount.helpManual();
break;
case 6: NewAccount.exitProgram();
break;
default: System.err.println ( "Unrecognized option" );
break; }
} // END OF THE MAIN MENU SECTION

  • MAKE A DEPOSIT SECTION version 1*
    public void Deposit()
    {

    Scanner input = new Scanner (System.in);
    System.out.println("How much would like to deposit ?");
    cashin=input.nextInt();
    dblBalance=dblBalance+cashin;
    System.out.println("Your new balance is: "+dblBalance + "£");
    System.out.println(" \n ");
    MainMenu();// return to main menu

    }* END OF THE MAKE A DEPOSIT SECTION *

Gdzie popelniam blad ?

Z gory dziekuje za kazda porade.

0

Cały ten kod to jeden wielki błąd.

  1. Masz tu ewidentny stack overflow bo cały czas rekurencyjnie wołasz sobie MainMenu i kiedyś program się położy
  2. To mi wygląda na kod pisany przez kogoś kto próbuje pisać w Javie tak jak w C...
  3. Obiekt Account tworzysz sobie LOKALNIE w funkcji i wywołując ją drugi raz tworzysz NOWY OBIEKT. Tego pierwszego NIGDZIE nie zapamiętujesz to i nie dziwota że za każdym razem saldo konta jest zerowane.
0

Na mój gust program jest napisany idiotycznie, nie będę więc proponował poprawek. Przyczyna opisywanego zachowania tkwi w tym:

static void menuMethod ()
     {

         System.out.println(" <MENU>  \n");
         System.out.println(" 1 - Make a deposit ");
         System.out.println(" 2 - Record meter reading ");
         System.out.println(" 3 - Display balance");
         System.out.println(" 4 - Account details ");
         System.out.println(" 5 - Help ");
         System.out.println(" 6 - Exit ");
         System.out.println(" \n ");
         
   GasAccount NewAccount = new GasAccount(); //TU!!!!!

Za każdym razem tworzysz nowy obiekt, i pracujesz na zmiennych nowego obiektu.

0

Rozumiem.

Czy moglby ktos z Was wskazac mi przyklad prostego programu.

Menu z wyborem np.

  1. wplac depozyt
  2. wyplac pieniadze

Jak by to mialo wygladac ?

Bardzo bym prosil o jakis przyklad, bo juz mi sie to wszystko pomieszalo.

jakis prosty przyklad na pewno wieli by mi naswietlil.

Z gory dziekuje.

0

Nieładnie koledzy: tak żeście zbesztali pytającego że jeszcze mu ochota do nauki przejdzie. Może kod faktycznie jest pisany jakby java była językiem proceduralnym jak C ale jednak pytajacy zrobił o wiele więcej (napisał kompletny kod) niż większosć noobów piszących w tym dziale forum, a takich zjebek nie dostali.

0

:) Bardziej bym powiedzial zagrzeje mnie do walki.
Tak to prawda. Pisalem duzo kiedys w Atari basic, Visual Basic :D ... stad taki nawyk... od niedawna zaczlem sie bawic Java i jestem totalnym leszczem.

Mam problem przekazywaniem parametrow. Czytam rozne kursy ale nadal nie rozumiem prostoty ich dzialania.

Np. Jak przekazac wartosc liczbowa pomiedzy pewnymi porcjami kodu.

Na pewno jakis prosty przyklad typu:

kalkulacja 1+1 w jednej czesci i przekazanie jej wyniku do wyswietlenia w innej czesci programu.

lub wygenerowanie losowej liczby w jednej czesci i przekazanie jej do drugiej .

w Atari Basic to bylo proste bo pisales GOTO ....numer lini potem RETURN i juz ...

Szukam jakiegos opisu:

Proste menu:

  1. WPLAC
  2. WYPLAC
  3. POKAZ STAN KONTA
  4. WYJSCIE

po wyborze opcji 1-3 chcialbym aby program powracal do MENU wyboru.

Prosty program uzmyslowi mi jak to dziala.
Ja po prostu mam tak ze ucze sie na konkretnych przykladach.
Teoria opisowac malo mi z reguly mowi.

Z gory dziekuje za wszelka pomoc.

0
import java.util.Scanner;

public class GasAccount {

     private int intAccRefNo;
     private String strNam,strAddres;
     private double dblBalance,dblUnits,dblUnitcost,cashin;

    /**
     * @param args the command line arguments
     */
     
     
    public static void main(String[] args) {
       GasAccount newAccount = new GasAccount();
       while(true)
       {
           newAccount.displayMenu();
       }
    }
   
    private void displayMenu()
    {
        System.out.println(" <MENU>  \n");
        System.out.println(" 1 - Make a deposit ");
        System.out.println(" 2 - Record meter reading ");
        System.out.println(" 3 - Display balance");
        System.out.println(" 4 - Account details ");
        System.out.println(" 5 - Help ");
        System.out.println(" 6 - Exit ");
        System.out.println(" \n "); 
        Scanner in = new Scanner (System.in);
        int choice=7;
        try
        {
            choice=in.nextInt();
        }
        catch(Exception e)
        {
        }
        switch (choice)         
        {    
            case 1:          
              deposit();
              break;      
            case 2:         
              //NewAccount.recordUnits();
              break;  
            case 3:         
              //NewAccount.getBalance();
              break;  
            case 4:         
              //NewAccount.displayAccountDetails();
              break;  
            case 5:         
              //NewAccount.helpManual();
              break;
            case 6:         
              System.exit(0);
            default:        
              System.err.println ( "Unrecognized option" );    
              break;    
        }
     }


    private void deposit()
    {
        Scanner input = new Scanner (System.in);
        System.out.println("How much would like to deposit ?");
        try
        {
            cashin=input.nextInt();
        }
        catch(Exception e)
        {
            cashin=0;
        }
        dblBalance=dblBalance+cashin;
        System.out.println("Your new balance is: "+dblBalance + " L");
        System.out.println(" \n ");
     }
 }

Dodałem obsługę błędów, użytkownicy nie zawsze grzecznie wpisują liczby.

0

Bardzo dziekuje za pomoc. Dzis po szkole to przetestuje sobie.

Mam tylko jedno pytanie czy ten public void main moze byc zmieniony do private ?

pozdrawiam

0

Nie. Metoda main musi być public static void i jako argument przyjmować tablicę stringów.
Jak inaczej chciałbyś się do niej odwołać skoro do składników prywatnych masz dostęp tylko z "wewnątrz klasy". Jakbyś zrobił z niej private to nie miałbyś punktu dostępowego ;]

0

Dyskutowalem z jakims gosciem na jakims czacie przy omawianiu tego kodu sobie i napisal mi m.w cos takiego ...moze zle to zrozumialem : "Your object code should note have a public static void main method in it." ...ale nie wiem o co mu dokladnie chodzilo... Moze za bardzo wnikam po prostu i sie czepiam ...pomyslalem tylko, ze jezeli jest to private to wlasnie powinno tak jakos byc..

0

Och no miał rację, ale źle zrozumiałeś ;)
Ogólnie chodzi o to że klasy powinny zachowywać zasadę jednej odpowidzialności. Tzn jeśli mamy klasę do obsługi GasAccount to nie powinna mieć w sobie tej metody main. Metoda main powinna być w osobnej klasie.
@bogdans zrobił tak dla uproszczenia :)

0

aha rozumiem. Czyli metoda main powinna znajdowac sie w innej klasie ?. Tzn musze utworzyc nowa klase w tym samym projekcie np. mainMenu... i wkleic te porcje kodu wlasnie tam ?

0

Tak. Bo zauważ że klasa GasAccount nie powinna wykonywać tego co mamy w main. To powinna wykonywać jakaś klasa typu GasAccountManager.

0

Poki co, dzięki bardzo za pomoc. Coś mi pod kopulą pomału iskrzy. Znalazłem gdzie kiedys on-line jakies takie zadania do wykonania i staram sie jakoś je przerabiać by nauczyć się struktury programowania w Javie. Dlatego stąd też takie pytania.
Chcialem wpierw poznac prostote tego programu, bo widac, ze w dlaszej czesci jest bardziej skomplikowany...tzn z mojego punktu widzenia lol
Sa zadania, ktorych kompletenie nie rozumiem np. "The program should use the a menuMethod from within the program class." ale nie zawracam sobie tym glowy poki co mam nadzieje, ze to nie wyplywa jakos na calosc programu poki co. Chyba, ze jak mi sie wydaje to program uzywa juz menuMethod w klasie GasAccount...

1 użytkowników online, w tym zalogowanych: 0, gości: 1