pierwszy program w JAVIE - potrzebna pomoc

0

Witam
Dostałem zadanie napisania swojego pierwszego programu i oczywiście mam z nim trochę problemów.
Poniżej zamieszczam treść zadania

area [figura] [dane wejściowe], czyli area square 2 wyświetli pole dla kwadratu o boku 2.

  • Analogicznie area rectangle 2 4 spowoduje obliczenie pola prostokąta o bokach 2 i 4.
  • Komenda showall wypisuje zawartość bufora na ekran w formie:
    [data i godzina operacji]: [figura] [pole]
  • Poza komendami area oraz showall aplikacja ma umożliwiać
  • Wyświetlenie powitania „Welcome to Area Calculator. Enter command.” poprzez wydanie komendy hello
  • Zakończenie pracy poprzez wydanie komendy exit
  • W przyszłości system może zostać potencjalnie rozbudowany o kolejne komendy, np. saveall oraz procedurę liczenia obwodu figury geometrycznej. Zaplanuje architekturę rozwiązania w taki sposób aby spełnienie tych wymagań nie wymagało nadmiernych nakładów pracy.

Chciałem wykorzystać HashMap, ale wtedy po wpisaniu "default" wywala mi błąd (nie wiem dlaczego) dlatego zrobiłem to trochę łopatologicznie.
Wyłożyłem się również na opcji showall, nie wiem czy struktura powinna być inna do jej wykorzystania? Czy może nie znalazłem odpowiedniej funkcji.

public static void main(String[] args) {
        
    /* HashMap<String, Integer> commands = new HashMap<String, Integer>();
        
         commands.put("hello", 1);
      
         commands.put("area", 2);
          
         commands.put("showall", 3);
            
         commands.put("exit", 4);
         */
      
        boolean ok = true;
        Scanner s = new Scanner(System.in);
        
        while (ok) {
            System.out.print("calculator > ");
            String commandString = s.nextLine();
            
            switch(commandString)
            {            
            case "hello":
            System.out.println("Welcome to Area Calculator. Enter command.");
            break;
    
            case "area":
                System.out.println("Podaj figure");
                Scanner scan = new Scanner(System.in);
            String figura= scan.nextLine();
            
            switch(figura)
            {
            case "square":
                double a;
                Scanner bok = new Scanner(System.in);
                System.out.println("podaj dlugosc boku a");
                a = bok.nextDouble();
                System.out.println("area = "+a*a);
                break;
                
            case "rectangle":
                double b;
                double c;
                
                Scanner sciany = new Scanner(System.in);
                System.out.println("podaj dlugosc boku b");
                b = sciany.nextDouble();
                System.out.println("podaj dlugosc boku c");
                c = sciany.nextDouble();
                System.out.println("area = "+b*c);
                
                break;
                
            case "circle":
                double r;
                
                Scanner promien = new Scanner(System.in);
                System.out.println("podaj dlugosc promienia r");
                r = promien.nextDouble();
                System.out.println("area = "+(Math.PI)*r*r);
                
                break;
            }
        
        break;
        
            case "showall":
                   break;

            case "exit":
                System.exit(0);

            default:
                System.out.println("unknown command");
            }
                
            System.out.println("Command: " + commandString);
        }
        s.close();        
    }
} 

Proszę o pomoc gdyż w tym momencie już bardziej z ciekawości chciałbym się dowiedzieć jak powinno być dobrze rozwiązane to zadanie.
Z góry dziękuję za wszelką pomoc.

pozdrawiam

1
  1. Do czego Ci służy HashMapa commands?
  2. Warto zapamiętywać wpisywane polecenia w pewnej kolekcji (np. ArrayList<String>), przyda się do showall.
  3. Ja zrozumiałem treść zadania inaczej niż Ty. Użytkownik ma wpisać od razu polecenie square 3, Ty masz je wczytać i wykonać, bez dodatkowego pytania o długość boku.
0

ad1. HashMapa miała służyć do dodawania komend, np jeżeli chciałbym w przyszłości szybko dodać możliwość obliczania pół kolejnych figur.
ad3. Też tak to zrozumiałem, ale nie wiem jakiej użyć funkcji, lub w jaki sposób zastosować już wykorzystane aby po wpisanie w jednej linii : "area square 3" zostało wyliczone pole i pokazane jako wynik, dlatego zrobiłem to łopatologicznie, czy można zrobić to przy pomocy "case" czy należy użyć innej funkcji?

1

Ja bym zaczął od utworzenia interfejsu Command, który by miał 1 metodę execute.

0

wielkie dzięki za wszystkie odpowiedzi:)
jeżeli jeszcze macie jakieś propozycje, lub uwagi, ewentualnie jakieś rozwiązania które by najlepiej odpowiadałyby temu programowi to proszę piszcie.
Dzisiaj/jutro spróbuję je zastosować i podzielę się efektem z wami.

1

Czytasz polecenie cmd = scan.nextLine(); dzielisz je na tokeny tokens = cmd.split(" ");. W switch-u korzystasz z tokens[0].

0

Pierwsze co zrób podziel to na wartswy na kartce papieru, naucz sie tego od początku, o warstwach i SOLID jest kupa informacji w sieci.
Potem napisz sobie testy jUnit i dopiero pisz kod. Dla mnie ten kod jest nieczytelny. Zanim zaczniesz programować, poczytaj o architekturze, inżynieirii oprogramowania, solid, kiss i dry. Zawsze potem jak to napiszesz wedlug tych zasad możesz wejsc na priv i pokazac. Z chęcią ocenię.

0

czy mógłbym uzyskać jakiś podobny przykład do mojego zadania do zastosowania tokenów? Przeanalizowałbym go sobie i spróbował wykorzystać.
Na ten moment niestety wychodzi mi to samo co miałem wcześniej, ale inaczej zapisane, czyli ciągle stoję w miejscu:/

1
        ArrayList<String> commands = new ArrayList<String>(); //to się przyda do polecenia showall
 
        while (true) {
            System.out.print("calculator > ");
            String commandString = s.nextLine();
            commands.add(commandString);
            String[] tokens = commandString.split(" ");
 
            switch(tokens[0])
            {            
                case "hello":
                    System.out.println("Welcome to Area Calculator. Enter command.");
                    break;
 
                case "area":
                    if(tokens.length<3)
                    {
                        System.out.println("Niepoprawne polecenie");
                        break;
                    }               
                    switch(tokens[1])
                    {
                        case "square":
                            try
                            {
                                double a = Double.parseDouble(tokens[2]);
                                System.out.println("area = "+a*a);
                            }
                            catch(NumberFormatException e)
                            {
                                System.out.println("Niepoprawne polecenie");
                            }                               
                            break;
 
                        case "rectangle":
                            if(tokens.length<4)
                            {
                                System.out.println("Niepoprawne polecenie");
                                break;
                            }           
                            try
                            {
                                double a = Double.parseDouble(tokens[2]);
                                double b = Double.parseDouble(tokens[3]);
                                System.out.println("area = "+a*b);
                            }
                            catch(NumberFormatException e)
                            {
                                System.out.println("Niepoprawne polecenie");
                            } 
                            break;
 
                        case "circle":
                            try
                            {
                                double r = Double.parseDouble(tokens[2]);
                                System.out.println("area = "+Math.PI*r*r);
                            }
                            catch(NumberFormatException e)
                            {
                                System.out.println("Niepoprawne polecenie");
                            }                               
                            break;
                        default:
                            System.out.println("Niepoprawne polecenie");            
                    }
                    break;
0

Wielkie dzięki, to nawet za dużo niż potrzebowałem, widzę po tym kodzie że jeszcze długa droga przede mną.
dzięki jeszcze raz.
pozdrawiam

0

witam
udało mi się coś takiego osiągnąć, troszkę zmodyfikowałem kod, dodałem parę linijek i nawet działa:) (chociaż bez użytkownika bogdans bym był w ciemnej norze, jeszcze raz ogromne dzięki!!)
Panowie i Panie specjaliści, czy ten kod jest czytelny i czy ta forma jest w miarę przejrzysta, czy może warto jeszcze nad nim posiedzieć i zmodyfikować?
I ogólnie czy są jakieś uwagi co do użytych rozwiązań?

import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
public class AreaCalculator {
	
	public static void main(String[] args) {
	 
	        boolean ok = true;
	        Scanner s = new Scanner(System.in);
	 
	        ArrayList<String> commands = new ArrayList<String>();
	        
	        while (ok) {
	            System.out.print("calculator > ");
	            String commandString = s.nextLine();
	            
	            String[] tokens = commandString.split(" ");
	 
	            switch(tokens[0])
	            {            
	                case "hello":
	                    System.out.println("Welcome to Area Calculator. Enter command.");
	                    break;
	 
	                case "area":
	                    if(tokens.length<3)
	                    {
	                        System.out.println("Unknown command");
	                        break;
	                    }               
	                    switch(tokens[1])
	                    {
	                        case "square":
	                            try
	                            {
	                                double a = Double.parseDouble(tokens[2]);
	                                Date datSqArea=new Date();
	                                System.out.println("area = "+a*a);
	                                commands.add("\n"+datSqArea+": square "+a*a);
	                                
	                            }
	                            catch(NumberFormatException e)
	                            {
	                                System.out.println("Unknown command");
	                            }                               
	                            break;
	 
	                        case "rectangle":
	                            if(tokens.length<4)
	                            {
	                                System.out.println("Unknown command");
	                                break;
	                            }           
	                            try
	                            {
	                                double a = Double.parseDouble(tokens[2]);
	                                double b = Double.parseDouble(tokens[3]);
	                                Date datRecArea=new Date();
	                                System.out.println("area = "+a*b);
	                                commands.add("\n"+datRecArea+": rectangle "+a*b);
	                            }
	                            catch(NumberFormatException e)
	                            {
	                                System.out.println("Unknown command");
	                            } 
	                            break;
	 
	                        case "circle":
	                            try
	                                {
	                                double r = Double.parseDouble(tokens[2]);
	                                Date datCirArea=new Date();
	                                System.out.println("area = "+Math.PI*r*r);
	                                commands.add("\n"+datCirArea+": circle "+Math.PI*r*r);
	                            }
	                            catch(NumberFormatException e)
	                            {
	                                System.out.println("Unknown command");
	                            }                               
	                            break;
	                            
	                        case "exit":
	        	                System.exit(0);
	        	 
	                        default:
	                            System.out.println("Unknown command");     
	                            
	                            
	                    }
	                    break;
	                case "showall":
	                	System.out.println(commands);
	                	break;
	                case "exit":
	                    System.exit(0);
	     
	                default:
	                    System.out.println("unknown command");
	            }
	 
	            System.out.println("Command: " + commandString);
	        
	             }
	        s.close();    }

	} 

pozdrawiam

0

nie wykonując polecenia s.close(); pojawia mi się wykrzyknik przy kodzie Scanner "s = new Scanner(System.in);" z informacją: Resource leak: 's' is never closed, dlatego na końcu zamykam ją.

0

Na jakim końcu? Ta instrukcja się nigdy nie wykona.
Kompilator Javy z Oracla nie ma żadnych zastrzeżeń do kodu bez s.close();, Eclipse też nie ma.

0

hmm, to skąd informacja: "Resource leak: 's' is never closed, "? Dla mnie jako dla osoby początkującej wykrzyknik przy jakimkolwiek kodzie oznacza że coś jest nie tak.
Ogólnie program działał poprawnie po usunięciu tej linijki, ale obawiałem się że w pewnym momencie może się pojawić jakiś błąd

0

Imho, program, który zgłasza w tym przypadku resource leak jest mało inteligentny. Wymaganie s.close(); jest uzasadnione po czymś takim

Scanner s == new Scanner(new File("BleBle"));
0

ok, to dzięki za wielką pomoc i wszystkie informacje:)
temat możemy już zamknąć
pozdrawiam!

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