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, operację matematyczną oraz.
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 najprostszej 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 robi to co powinien. Mimo to wiele osób zauważyła szereg możliwości ulepszenia swoich programów! Pierwszą rzeczą na którą powinniśmy zwrócić uwagę to obsługa 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 sprawdźcie 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, chętnie pomożemy :) Do zobaczenia w poniedziałek na kolejnym wyzwaniu!