Професионална програма
Loading...
+ Нов въпрос
Olegati avatar Olegati 1 Точки

Въпрос 03. Harvest - More Exercises Conditional Statements

Здравейте, 

При първото решение на задачката получих 90/100 (Test 10 ми дава грешка): https://pastebin.com/NW3uqAsi

След това, намерих решение в форума и преправих кода 100/100: https://pastebin.com/BgzdJ6YA

Мисля че проблема е при закръгляването на резултата преди System.out.printf(" "); - Когато загръглих променливите в System.out.printf(" "); резултата се получи 100/100. 

Може ли някой да обясни защо става така, ако това е проблемът?

Благодаря!

Тагове:
0
Programming Basics with Java
MartinBG avatar MartinBG 3751 Точки

При задачи като тази е най-добре да следвате стриктно условието на заданието за да избегнете подобни грешки при гранични стойности.

Нека разгледаме следния код от задачата с 90/100 точки:

            litresWine = Math.floor(litresWine);
            double wineLeft = Math.ceil(litresWine - wineNeededForSale);
            double wineLeftPerWorker = Math.ceil(wineLeft / workers);

Да приемем, че:

litresWine = 10.99

wineNeededForSale = 5

workers = 4

И да сметнем:

            litresWine = Math.floor(litresWine); // 10.99 -> 10
            double wineLeft = Math.ceil(litresWine - wineNeededForSale); // (10 - 5) = 5
            double wineLeftPerWorker = Math.ceil(wineLeft / workers); // ceil(5/4) = ceil(1.25) = 2
            System.out.printf("Good harvest this year! Total wine: %.0f liters.", litresWine);
            System.out.println();
            System.out.printf("%.0f liters left -> %.0f liters per person.", wineLeft, wineLeftPerWorker);

При решението за 100/100 ще получим:

            double wineLeft = litresWine - wineNeededForSale; // 10.99 - 5.0 = 5.99
            double wineLeftPerWorker = wineLeft / workers; // 5.99 / 4 = 1.4975
            System.out.printf("Good harvest this year! Total wine: %.0f liters.", Math.floor(litresWine)); 
            // floor(10.99) = 10
            System.out.println();
            System.out.printf("%.0f liters left -> %.0f liters per person.", Math.ceil(wineLeft), Math.ceil(wineLeftPerWorker));
            // ceil(5.99) = 6, ceil (1.4975) = 2

Както се вижда от примера, при тези стойности първото решение ще отпечата "5 liters left...", а второто - "6 liters left...". Разбира се, има и стойности, при които двете решения ще дадат еднакъв резултат.

0
22/01/2021 00:20:39
Olegati avatar Olegati 1 Точки

Благодаря за отговора - разбрах грешката.

Или litresWine = Math.floor(litresWine); трябва да се премести най-отдолу, преди System.out.printf, за да не влияе на двете уравнения(wineLeft и wineLeftPerWorker). Или закръгляването трябва да става в System.out.printf();.

1