Loading...
kneav avatar kneav 7 Точки

Задача: 04 Квартално Магазинче ( 03.3 PB-Java-Nested-Conditional-Statements-Lab)

import java.util.Scanner;

public class SmallShop {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        String product = scan.nextLine();
        String town = scan.nextLine();
        double quantity = Double.parseDouble(scan.nextLine());

        double price = 0;

        switch (product) {
            case "coffee":
                switch (town) {
                    case "Sofia":
                        price = 0.5;
                        break;
                    case "Plovdiv":
                        price = 0.4;
                        break;
                    case "Varna":
                        price = 0.45;
                        break;
                }
                break;
            case "water":
                switch (town) {
                    case "Sofia":
                        price = 0.8;
                        break;
                    case "Plovdiv":
                    case "Varna":
                        price = 0.7;
                        break;
                }
                break;
            case "beer":
                switch (town) {
                    case "Sofia":
                        price = 1.2;
                        break;
                    case "Plovdiv":
                        price = 1.15;
                        break;
                    case "Varna":
                        price = 1.10;
                        break;
                }
                break;
            case "sweets":
                switch (town) {
                    case "Sofia":
                        price = 1.45;
                        break;
                    case "Plovdiv":
                        price = 1.30;
                        break;
                    case "Varna":
                        price = 1.35;
                        break;
                }
                break;
            case "peanuts":
                switch (town) {
                    case "Sofia":
                        price = 1.6;
                        break;
                    case "Plovdiv":
                        price = 1.5;
                        break;
                    case "Varna":
                        price = 1.55;
                        break;
                }
                break;
        }
        double order = price * quantity;
        System.out.println(order);
    }
}

Резултататите са ми :

water
Plovdiv
3
2.0999999999999996

 

при показания от условията:

вход

изход

 

water

Plovdiv

3

2.1

 

В лекцията задачата беше решена в комбинация:

if (...) {

    switch (...):

         case....

 

break;

} else if (....) 

{

    switch (...):

         case....

 

break;

.....

 

И резулатата нямаше такива аномалии, но доколото си спомням от април или март лекцията проблем и невъзможност на double да се ползва в switch конструкция. Заради него ли се получва? Променливата нали price  само променя ст-ст според условието? Не се създава в switch. Защо в лекцията се получава без въпросните деления с отклонения на ниво процесор .00000001?

Тагове:
0
Copywriting Secrets 15/05/2020 19:15:35
MartinBG avatar MartinBG 4803 Точки

Примитивните числа с плаваща запетая (float, double) в Java не могат да покрият с точност всички възможни стойности и са само приблизителни. За работа с гарантирана точност трябва да се използва BigDecimal.

Проблемът с тази задача (срещан и при други стари такива), е че в условието не е указано с каква точност да се закръгли резултата, преди да бъде изведен (например, ако се искаше закръгляне до вторият знак, всичко щеше да е точно).

За да бъдат нещата още по-трудни, понякога Judge очаква резултата да е форматиран според определен език (най-често C#), което налага допълнителни гимнастики за натъкмяване на изхода, ако решението е на друг език:

Java double-to-String метод, имитиращ C# (за 100/100 точки в Judge при някои задачи) 

 

EDIT:

Конкретно тази задача за да мине в Judge, изходът трябва да се форматира с DecimalFormat по този начин:

import java.text.DecimalFormat;
import java.util.Scanner;

public class SmallShop {
    public static void main(String[] args) {

        // ...

        double order = price * quantity;
        DecimalFormat df = new DecimalFormat("0.####");

        System.out.println(df.format(order));
    }
}

 

0
15/05/2020 20:06:53
kneav avatar kneav 7 Точки
import java.util.Scanner;

public class SmallShop {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        String product = scan.nextLine();
        String town = scan.nextLine();
        double quantity = Double.parseDouble(scan.nextLine());

        double price = 0;

        if (product.equals("coffee")) {
            if (town.equals("Sofia")) {
                price = 0.5;
            } else if (town.equals("Plovdiv")) {
                price = 0.4;
            } else if (town.equals("Varna")) {
                price = 0.45;
            }
        } else if (product.equals("water")) {
            if (town.equals("Sofia")) {
                price = 0.8;
            } else if ((town.equals("Plovdiv")) || (town.equals("Plovdiv"))) {
                price = 0.7;
            }
        } else if (product.equals("beer")) {
            if (town.equals("Sofia")) {
                price = 1.2;
            } else if (town.equals("Plovdiv")) {
                price = 1.15;
            } else if (town.equals("Varna")) {
                price = 1.1;
            }
        } else if (product.equals("sweets")) {
            if (town.equals("Sofia")) {
                price = 1.45;
            } else if (town.equals("Plovdiv")) {
                price = 1.30;
            } else if (town.equals("Varna")) {
                price = 1.35;
            }
        } else if (product.equals("peanuts")) {
            if (town.equals("Sofia")) {
                price = 1.6;
            } else if (town.equals("Plovdiv")) {
                price = 1.5;
            } else if (town.equals("Varna")) {
                price = 1.55;
            }
        }
        double order = price * quantity;
        System.out.println(order);
    }
}

Няма вариянт да е по различен от горните с принт лайн. Но сме на още Basic ниво и работим само с int или double. 

Иначе бих му сложил един принтФ до знак 1 или 2, но няма да получа :

вход

изход

sweets

Sofia

2.23

3.2335

 

0
MartinBG avatar MartinBG 4803 Точки

@kneav

Редактирах си поста с решение за тази задача.

За подробности прочетете темата, към която съм дал линк.

0
kneav avatar kneav 7 Точки

Мерси!!!

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.