Wyzwanie Java #2: Rozwiązanie

Radosław Szmit 27 kwietnia 2018
 

Drugie nasze wyzwanie było już znacznie trudniejsze od poprzedniego, wymagało większego wysiłku, zabawy z kodem czy nawet w niektórych przypadkach doczytania czegoś dodatkowo by zrealizować wasze pomysły. Mimo to poszło Wam świetnie, nadesłaliści wiele różnych, prawidłowych i bardzo ciekawych rozwiązań.

Zadanie polegało na stworzeniu uproszczonej wersji kalkulatora. Nasz program miał działać w sposób podobny do poniższego, czyli pobierać od użytkownika dwie liczby oraz operację matematyczną.

Proszę podaj w oddzielnych linijkach jakąś liczbę, operację matematyczną +,-,*,/,%, a następnie kolejną liczbę:
12
+
3
Twój wynik to: 15
Chcesz wykonać kolejne działanie? Wpisz literę t lub n.

W najprosztszej postaci nasz program mógłby wyglądać na przykład tak:

package pl.kodolamacz;

import java.util.Scanner;

public class SimpleCalculator {

    public static void main(String[] args) {

        var scanner = new Scanner(System.in);

        System.out.println("Proszę podaj w oddzielnych linijkach jakąś liczbę, operację matematyczną +,-,*,/,%, a następnie kolejną liczbę:");

        String runAgain;
        do {

            var x = scanner.nextDouble();
            scanner.nextLine();

            var operation = scanner.nextLine();

            var y = scanner.nextDouble();
            scanner.nextLine();

            double result;
            if (operation.equals("+")) {
                result = x + y;
            } else if (operation.equals("-")) {
                result = x - y;
            } else if (operation.equals("*")) {
                result = x * y;
            } else if (operation.equals("/")) {
                result = x / y;
            } else if (operation.equals("%")) {
                result = x % y;
            } else {
                System.out.println("Nieznana operacja!");
                result = 0;
            }
            System.out.println("Twój wynik to: " + result);

            System.out.println("Chcesz wykonać kolejne działanie? Wpisz literę t lub n.");
            runAgain = scanner.nextLine();

        } while (runAgain.equals("t"));

        scanner.close();
    }

}

Powyższy program robit to co powinien. Momo to wiele osób zauważyła szerek możliwości ulepszenia swoich programów! Pierwszą rzeczą na którą powinniśmy zwrócić uwagę, to obsługwa sytuacji wyjątkowych takich jak podanie napisu zamiast liczby i odwrotnie, podanie złego znaku operacji, czy nawet dzielenie przez zero. W kolejnych wyzwaniach powiemy sobie więcej o błędach i wyjątkach w Javie, ale już tutaj warto w jakimś zakresie je obsłużyć.

Pamiętajcie także, że w Javie liczby niecałkowite zapisujemy jako double a nie int, czyli korzystając z tego drugiego typu danych (lub innego całkowitego), utracimy informację o części ułamkowej wyniku, stąd w powyższym przykładzie pracujemy na double. Jeśli korzystaliście z int sprawdzcie wynik dzielenia z resztą w waszym kalkulatorze. :)

Wiele też osób w swoim zakresie zauważyła, że ciąg warunków if-els, można zmienić na instrukcję switch. Tą instrukcję wprowadzimy oficjalnie w jednym z kolejnych wyzwań, ale jak najbardziej także tutaj można jej użyć.

Innym problemem który także spotykaliście, to funkcja nextDouble lub podobna w klasie Scanner, która czyta samą liczbę a nie całą linijkę, dlatego trzeba było albo konwertować linię samodzielnie do liczby albo po wczytaniu liczby dodatkowo wczytać linię do końca.

Pamiętajcie też, że zmienne muszą być zawsze zadeklarowane przed użyciem, a także kompilator nie pozwoli nam napisać kodu gdzie świadomie nic nie przypisujemy do zmiennej a potem chcemy jej użyć, stąd w powyższym przykładzie przypisanie zera gdy użytkownik podał błędną operację matematyczną.

Ostatnią radą dla Was jest różnica między Stringiem, czyli ciągiem znaków, a pojedynczym znakiem czyli typem char. Obsłudze napisów poświęcimy oddzielne wyzwanie, ale już tutaj trzeba pamiętać, że napis, czyli String to zestaw znaków, więc “a” nie jest równoważne z ‘a’, bo jedno to napis (String) a drugie jeden konkretny znak! Pamiętajcie też, że łańcuchy znaków zawsze porównujemy dla bezpieczeństwa metodą equals a nie ==, pomimo, że w niektórych przypadkach może to zadziałać, o czym także powiemy sobie w wyzwaniu dotyczącym napisów.

Jeśli macie więcej pytań lub problemów, piszcie do nas śmiało na Facebooku, chętnie pomożemy. :) Do zobaczenia w poniedziałek na kolejnym wyzwaniu!

Radosław Szmit

Opiekun bootcampu Full-stack w Kodołamacz.pl. Inżynier oprogramowania, specjalista Big Data, trener IT. Absolwent Politechniki Warszawskiej aktualnie pracujący nad rozprawą doktorską z zakresu Big Data i NLP. Twórca polskiej wyszukiwarki internetowej NEKST stworzonej przez Instytut Podstaw Informatyki Polskiej Akademii Nauk oraz Otwartego Systemu Antyplagiatowego realizowanego przez Międzyuniwersyteckie Centrum Informatyzacji. Zawodowo konsultant IT specjalizujący się w rozwiązaniach Java Enterprise Edition, Big Data oraz Business Intelligence, trener IT w firmie Sages.
Komentarze
Ostatnie posty
Data Science News #204
Data Science News #203
Data Science News #202
Data Science News #201