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

Задача Suitcases Load

При решаване на задача Suitcases Load Judge ми дава една грешка Test#2 (Runtime error).

Кода е по долу. Ако може някой да помогне!

import java.util.Scanner;

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

        double volRemain = Double.parseDouble(scan.nextLine());
      
        String volumeSuitcase = "";
        
        double volSuitcase = 0.00;
        int counter = 0;
        int a =0;
        int b = 1;

            while (true) {
                volumeSuitcase = scan.nextLine();
                if (volumeSuitcase.equals("End")) {
                    break;
                }

                volSuitcase = Double.parseDouble(volumeSuitcase);
                if (volRemain < volSuitcase) {
                    a = 1;
                    break;
                }else if (volRemain == volSuitcase && b == 1) {
                    if (volRemain != 0) {
                        counter++;
                    }
                    a = 1;
                    break;
                }
                counter++;
                if (counter % 3 == 0 && counter !=0) {
                    volSuitcase = volSuitcase * 1.10;
                }

                volRemain = volRemain - volSuitcase;
                b = 0;



            }
            if (a == 1) {
                System.out.println("No more space!");
                System.out.printf("Statistic: %d suitcases loaded.", counter);
            } else if (volumeSuitcase.equals("End")){
                System.out.println("Congratulations! All suitcases are loaded!");
                System.out.printf("Statistic: %d suitcases loaded.", counter);
            }

            }
        }


 

0
Programming Basics with Java
MartinBG avatar MartinBG 3751 Точки

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

 

  1. Давай смислени имена на всичко, което създаваш в програмите си (променливи, константи, класове, методи и т.н.) - имена като "a", "b", "temp" и др. подобни са изключително лоша пракика, дори и за променливи с много кратък живот, защото не носят никаква информация за четящия този код и много лесно може да доведат до грешки. Използването на "i" като име на итератора във for цикъл допустимо, но не и когато имаме вложени for цикли (напр. при обхождане на N-мерен масив), с уговорката, че for циклите са архаизъм и без друго.
  2. Използвай най-удачните типове за променливите си - защо "int a", вместо "boolean isSomethingMeaningful", след като тази променлива се ползва като флаг?
  3. Когато решаваш проблем, винаги се стреми към най-краткото и просто решение. Според едно популярно мнение, програмистите прекарват 90% процента от времето си в четене на код и само 10% - в писане. Четимостта е от изключително значение за подобряването на производителноста и за намаляванео на грешките/бъговете. В началото не винаги е лесно за постигане, но помага, ако разпишеш идеите си на лист хартия - така по-добре ще осмислиш проблема и ще стигнеш до оптималното решение.

 

Опиай се да приложиш горните съвети към кода, който си написал и с голяма вероятност ще откриеш сам къде е грешката. Ако все още не успяваш, постни тук новото си решение и с удоволствие ще го погледна.

 

Причината, поради която не ти посочих грешката е, че намирането ѝ в кода, който си постнал може да ми отнеме повече време от писането на горното, а то ще ти е хиляди пъти по-полезно в бъдеще, от решаването на тази конкретна задача.

0
14/04/2020 20:47:37
P_Donchev avatar P_Donchev 2 Точки

Здравей,

Подкрепям написаното от "MartinBG" - предполагам, че грешката е някъде в условията, които си задал. Задачата може да се реши и без тях. Успех!

Моето решение (100/100): https://pastebin.com/5tLjd0hd

1
MartinBG avatar MartinBG 3751 Точки

Привет,

Има един пропуск в решението ти, който Judge явно не хваща. :)

По условие трябва обема на всеки трети куфар (3, 6, 9, 12 и т.н.) да се увеличи с 10%, а в твоя код това се случва само за 3-тия.

0
15/04/2020 17:16:22
vlastomar avatar vlastomar 16 Точки

Здравейте,

Благодаря за коментарите и помощта. За лошо подреден код се извинявам. Първи ми код не беше такъв.

В случая за мен не е важно самото решение, а защо ми дава тази грешка.

Кода съм си го преработил и всички проверки излизат, обаче пак ми дава същата грешка.

Относно кода, който P_Donchev предостави: 

въведи 300 и пак 300 и кода няма да работи на това, както и 0 и 0.

Ще помоля MartinBG да провери следното. Защо ми дава тази грешка.:

import java.util.Scanner;

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

        double volRemain = Double.parseDouble(scan.nextLine());

        String volumeSuitcase = "";


        double counter = 0;
        boolean checkForBreak = false;

            while (true) {
                double volSuitcase = 0.00;
                volumeSuitcase = scan.nextLine();
                if (volumeSuitcase.equals("End")) {
                    break;
                }
                volSuitcase = Double.parseDouble(volumeSuitcase);
                if (volRemain < volSuitcase) {
                    checkForBreak = true;
                    break;
                }else if (volRemain == volSuitcase ) { //&& checkFor == true
                    if (volRemain != 0 && (counter + 1)% 3 != 0) {
                        counter++;
                    }
                   checkForBreak = true;
                    break;
                }
                counter++;
                if (counter % 3 == 0 && counter !=0) {
                    volSuitcase = volSuitcase * 1.10;
                }
                volRemain = volRemain - volSuitcase;
            }
            if (checkForBreak == true) {
                System.out.println("No more space!");
                System.out.printf("Statistic: %.0f suitcases loaded.", counter);
            } else if (volumeSuitcase.equals("End")){
                System.out.println("Congratulations! All suitcases are loaded!");
                System.out.printf("Statistic: %.0f suitcases loaded.", counter);
            }

            }
        }


 

0
vlastomar avatar vlastomar 16 Точки

И мерсиииииииииии

 

0
MartinBG avatar MartinBG 3751 Точки

Test #2 вхърля Exception (Runtime error) на този ред:

volSuitcase = Double.parseDouble(volumeSuitcase);

 

Double#parseDouble:

 

public static double parseDouble(String s)
                          throws NumberFormatException

Returns a new double initialized to the value represented by the specified String, as performed by the valueOf method of class Double.

Parameters:

s - the string to be parsed.

Returns:

the double value represented by the string argument.

Throws:

NullPointerException - if the string is null

NumberFormatException - if the string does not contain a parsable double.

 В случая не хвърля NullPointerException (NPE), защото ако volumeSuitcase беше null, програмата щеше да гръмне по-горе:

if (volumeSuitcase.equals("End"))

Между другото, при сравняване на литерал ("my literal") с променлива, винаги използвай следният формат, който ни предпазва от NPE, в случай че променливата е null:

"End".equals(volumeSuitcase)

 

Следователно, програмата гърми с NumberFormatException, от което следва, че volumeSuitcase е стринг, който не е валидно число, и по-точно - празен стринг:

добави if (volumeSuitcase.isEmpty()) break; 

преди volSuitcase = Double.parseDouble(volumeSuitcase); 

и програмата ще даде грешен резултат на 2-ри тест, вместо да крашне.

 

Причината да получим празен сринг, е че има пропуски/грешки в алгоритъма за товарене на куфарите и се стига до ситуация, при която в Judge свършват входните данни.

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

0
15/04/2020 18:58:24
vlastomar avatar vlastomar 16 Точки

Много благодаря за подробното обяснение.

0