Cześć!
Miło mi zagościć na Waszym forum. Jestem budowlańcem pracującym w zawodzie, jednak z różnych przyczyn uczę się programowania. Padło na Javę. Nie wiem czy dobrze czy źle, jakoś sobie poradzę.
Napisałem prostą aplikację na ArrayList umożliwiającą dodawanie produktów, wpisywanie ceny jednostkowej, ilości i w efekcie otrzymywanie wartości do zapłaty za każdy produkt. Aplikacja potrafi też wyznaczyć wartości netto/brutto/vat. Można dodać rabat w procentach, a także bon obniżający o dowolną kwotę.
Chciałbym dodać jeszcze możliwość usuwania odpowiedniego produktu, ale to nie o tym. Chciałbym tą aplikację ulepszyć, uporządkować w taki sposób, żeby można było ją ewentualnie zamieścić w CV. Wiem, że powinienem dodać także funkcje uniemożliwiające wpisanie złych wartości (np. liczb w nazwę produktu, słów w cenę) by uniknąć wywalania aplikacji.
Problem w tym, że nie wiem jak się do tego zabrać. Czy są do tego jakieś wytyczne? Nie można chyba po prostu napisać wszystkiego na zasadzie "if zły_input wpisz_poprawnie". Chyba, że można?
Aplikacja jest zrobiona na listach. Pytanie brzmi, czy jest to dobre wyjście? Próbowałem wcześniej napisać podobny program, który w liście przechowywał obiekt, na który składało się kilka parametrów (np. produkt, cena, ilość). Ale przyznam szczerze, że potraciłem się gdy miałem się odwoływać do pól obiektu, który tak na prawdę jest jedną pozycją na liście (nie do końca mój umysł to ogarnął). Może jednak warto przerobić tą aplikację na klasy? Wklejam poniżej kod i czekam na uwagi. Pamiętajcie, że nie jestem programistą, nie studiowałem informatyki i mogę nie zrozumieć skrótów myślowych. Ale spróbuję :)
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
public class Main
{
public static void main(String[] args)
{
List<Product> product = new ArrayList<>();
Scanner sc = new Scanner(System.in).useLocale(Locale.GERMAN);
double totalPrice = 0;
System.out.println("Witaj w programie Paragon v1.0. Autor: Zaklinacz_kabli");
String login = getLogin(sc);
while (true)
{
printOptions();
String option = sc.nextLine();
switch (option)
{
case "1":
addProducts(product, sc);
totalPrice = priceToPay(product, totalPrice);
System.out.println("Kwota do zapłaty: " + totalPrice);
break;
case "2":
totalPrice = discount(sc, totalPrice);
break;
case "3":
totalPrice = coupon(sc, totalPrice);
break;
case "4":
netVatGross(totalPrice);
break;
case "5":
printRecipe(product, totalPrice, login);
break;
case "6":
removeProduct(product, sc);
break;
case "0":
exitApp();
break;
default:
System.out.println("Nie ma takiej opcji, wprowadź ponownie: ");
break;
}
}
}
//Metoda removeProduct służąca do usuwania produktów na podstawie indeksów przypisywanych w momencie dodawania produktów
private static void removeProduct(List<Product> product, Scanner sc)
{
System.out.println("Wybierz, który produkt chcesz usunąć.");
product.forEach(System.out::println);
System.out.println("Podaj nr produktu: ");
product.remove(sc.nextInt()-1);
sc.nextLine();
for (int i=0;i<product.size();i++)
{
product.get(i).setIndex(i+1);
}
System.out.println("Produkt został usunięty!");
}
//Metoda netVatGross obliczająca wartości netto, brutto i vat
private static void netVatGross(double totalPrice)
{
System.out.println("Wartość netto:");
System.out.println(round(totalPrice * 0.77, 2));
System.out.println("VAT:");
System.out.println(round(totalPrice * 0.23, 2));
System.out.println("Wartość brutto:");
System.out.println(round(totalPrice, 2));
}
/*Metoda discount pobierająca od użytkownika zniżkę wyrażoną w [%],
* a następnie obniżająca rachunek o podaną zniżkę*/
private static double discount(Scanner sc, double totalPrice)
{
System.out.println("Podaj zniżkę w %:");
double discount = round(sc.nextDouble(), 2);
sc.nextLine();
System.out.println("Kwota przed zniżką:");
System.out.println(totalPrice);
System.out.println("Kwota po zniżce:");
totalPrice = round(totalPrice * (1 - discount / 100), 2);
System.out.println(totalPrice);
return totalPrice;
}
/*Metoda coupon pobierająca od użytkownika bon zmniejszający rachunek o konkretną wartość*/
private static double coupon(Scanner sc, double totalPrice)
{
System.out.println("Podaj wielkość bonu:");
double coupon = round(sc.nextDouble(), 2);
sc.nextLine();
System.out.println("Kwota przed bonem:");
System.out.println(totalPrice);
System.out.println("Kwota po bonie:");
totalPrice = round(totalPrice - coupon, 2);
System.out.println(totalPrice);
return totalPrice;
}
//Metoda getLogin pobierająca od użytkownika-kasjera jego numer
private static String getLogin(Scanner sc)
{
System.out.println("Podaj swój numer kasjera: ");
String login = sc.nextLine();
System.out.println("Witaj " + login);
return login;
}
private static void addProducts(List<Product> product, Scanner sc)
{
System.out.println("Podawaj kolejno: nazwę produktu, ilość i cenę detaliczną.");
System.out.println("Aby zakonczyć dodawanie produktów w polu nazwy wpisz cyfrą zero ('0') lub 'exit'");
while (true)
{
String name;
double quantity;
double pricePerUnit;
try
{
name = sc.nextLine();
if (name.equals("0") || name.equals("exit"))
{
break;
}
quantity = sc.nextDouble();
sc.nextLine();
pricePerUnit = sc.nextDouble();
sc.nextLine();
product.add(new Product(product.size()+1,name, round(quantity, 2), round(pricePerUnit, 2)));
System.out.println("Dodano produkt: " + "\n" + product.get(product.size()-1));
} catch (InputMismatchException e)
{
System.out.println("Błąd podczas wprowadzania danych! Powtórz ostatni wpis.");
}
}
}
private static double priceToPay(List<Product> product, double totalPrice)
{
for (Product p : product)
{
totalPrice += p.getPrice();
}
return round(totalPrice, 2);
}
private static void printRecipe(List<Product> product, double totalPrice, String login)
{
product.forEach(System.out::println);
System.out.println("Kwota do zapłaty: " + totalPrice);
System.out.println("Rachunek utworzony przez kasjera nr: " + login);
}
public static double round(double value, int places)
{
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
private static void printOptions()
{
System.out.println("Wybierz opcję: ");
System.out.println("1 - dodaj produkt");
System.out.println("2 - dodaj znizke/upust/rabat");
System.out.println("3 - dodaj bon");
System.out.println("4 - wyznacz netto/brutto/vat");
System.out.println("5 - wyświetl produkty");
System.out.println("6 - usuń produkt");
System.out.println("0 - wyjdź z programu ");
}
private static void exitApp()
{
System.out.println("Do widzenia!");
System.exit(0);
}
}
Klasa Product to pola ze zmiennymi, konstruktor, settery i gettery i nadpisana metoda toString() z formatem drukowania:
String.format(""%s\t%s\t%.02f\t%.02f\t%.02f",index,name,quantity,pricePerUnit,price);
Jeśli coś by było niejasne to odpowiem jak najszybciej. Czy to jest dobry sposób wklejania kodu?