Софтуерно Инженерство
Loading...
+ Нов въпрос
Chetiov avatar Chetiov 5 Точки

Помощ за задачка: Тръби в басейн Java

Знам че е обсъждана многократно въпросната задачка но в случая се налага да я решавам на Java и това ме спъва.

Ето условието:

Басейн с обем V има две тръби от които се пълни. Всяка тръба има определен дебит (литрите вода минаващи през една тръба за един час). Работникът пуска тръбите едновременно и излиза за N часа. Напишете програма, която изкарва състоянието на басейна, в момента, когато работникът се върне.
Вход
От конзолата се четат четири реда:
•    Първият ред съдържа числото V – Обем на басейна в литри – цяло число в интервала [1…10000].
•    Вторият ред съдържа числото P1 – дебит на първата тръба за час – цяло число в интервала [1…5000].
•    Третият ред съдържа числото P2 – дебит на втората тръба за час– цяло число в интервала [1…5000].
•    Четвъртият ред съдържа числото H – часовете които работникът отсъства – число с плаваща запетая в интервала [1.0…24.00]
Изход
Да се отпечата на конзолата едно от двете възможни състояния:
   До колко се е запълнил басейна и коя тръба с колко процента е допринесла. Всички проценти се свеждат до цяло число (без закръгляне).
   "The pool is [x]% full. Pipe 1: [y]%. Pipe 2: [z]%."
   Aко басейнът се е препълнил – с колко литра е прелял за даденото време, число с плаваща запетая
   "For [x] hours the pool overflows with [y] liters."
* Имайте предвид, че поради свеждането до цяло число се губят данни и нормално сборът на процентите да е 99%, а не 100%.

Ето моето решение:

import java.util.Scanner;

public class u18 {
    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        int volume = Integer.parseInt(console.nextLine());
        int pipe1 = Integer.parseInt(console.nextLine());
        int pipe2 = Integer.parseInt(console.nextLine());
        double hours = Double.parseDouble(console.nextLine());

        double water = pipe1 * hours + pipe2 * hours;
        if (water <= volume) {
            System.out.println("The pool is "
                    + (int)(water / volume * 100) + "% full." + " Pipe 1: "
                    + (int)(pipe1 * hours / water * 100) + "%." + " Pipe 2: "
                    + (int)(pipe2 * hours / water * 100) + "%.");
        } else {
            System.out.println("For " + hours + " hours the pool overflows with " + (int)(water - volume) + " liters.");
        }
    }
}

 

На пръв поглед изкарва точния резултат и все пак пустия джъдж дава 60 от 100. И не знам каде е грешката (ето Тук е задачката).

Тагове:
0
Основи на програмирането 17/11/2016 20:03:47
Chetiov avatar Chetiov 5 Точки

Оказа се че е от форматирането на числата вместо 5.50 джъджа очаква 5.5

След кратка корекция ето и работещ 100/100 код.

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

public class u18 {
    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        DecimalFormat format = new DecimalFormat("0.##");
        int volume = Integer.parseInt(console.nextLine());
        int pipe1 = Integer.parseInt(console.nextLine());
        int pipe2 = Integer.parseInt(console.nextLine());
        double hours = Double.parseDouble(console.nextLine());

        double water = pipe1 * hours + pipe2 * hours;
        if (water <= volume) {
            System.out.println("The pool is "
                    + (int)(water / volume * 100) + "% full." + " Pipe 1: "
                    + (int)(pipe1 * hours / water * 100) + "%." + " Pipe 2: "
                    + (int)(pipe2 * hours / water * 100) + "%.");
        } else {
            System.out.println("For " + format.format(hours) + " hours the pool overflows with " + format.format(water - volume) + " liters.");
        }
    }
}

 

0
Chetiov avatar Chetiov 5 Точки

Здравей колега всичко е наред получават ти се точни резултати проблема е във форматирането на изхода пример: При вход 929, 123, 321, 12 На теб ти изкарва: For 12.0 hours the pool overflows with 4399 liters. А джьджа очаква: For 12 hours the pool overflows with 4399 liters.

 

Идеята е да ти показва целите числа без .0 след тях! Аз този проблем го реших като използвах DecimalFormat суб клас за форматиране:

DecimalFormat beztochka = new DecimalFormat("0.##");

и отдолу принтираш като прилагаш форматирането така:

System.out.println("For " + beztochka.format(hours) + " hours the pool overflows with " + beztochka.format(water - volume) + " liters.");

Този принт е на моето решение при теб просто слагай форматирането пред твоите променливи.

1
23/01/2017 19:13:51
miroLLL avatar miroLLL 95 Точки

След подобрението все още съм на -27 точки до целта.. :D

http://pastebin.com/RLjPsY4E

Пробвах както при теб, да форматна и overflowa, но тогава дава още по-малко точки. Кофти, че не мога да видя какви тестове минават през програмата, за да видя точно къде бъркам и да ги оправя.. Гърмят ми 6,8,11 и 13 тест...

0
23/01/2017 21:59:26
Chetiov avatar Chetiov 5 Точки

Можеш да видиш тестовете ТУК

 

 

А това е моето 100/100 решение ако ще ти помогне.

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

public class Trubi {
    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        DecimalFormat format = new DecimalFormat("0.##");
        int volume = Integer.parseInt(console.nextLine());
        int pipe1 = Integer.parseInt(console.nextLine());
        int pipe2 = Integer.parseInt(console.nextLine());
        double hours = Double.parseDouble(console.nextLine());

        double water = pipe1 * hours + pipe2 * hours;
        if (water <= volume) {
            System.out.println("The pool is "
                    + (int)(water / volume * 100) + "% full." + " Pipe 1: "
                    + (int)(pipe1 * hours / water * 100) + "%." + " Pipe 2: "
                    + (int)(pipe2 * hours / water * 100) + "%.");
        } else {
            System.out.println("For " + format.format(hours) + " hours the pool overflows with " + format.format(water - volume) + " liters.");
        }
    }
}

 

0