Loading...
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

Scholarship - Conditional Statements - Java

Здравейте,

Judge ми дава 93/100, не мога да си открия грешката, ако може малко помощ.Благодаря предварително.

import java.util.Scanner;

public class scholarship {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
      
        double income = Double.parseDouble(scan.nextLine());
        double grade = Double.parseDouble(scan.nextLine());
        double minSalary = Double.parseDouble(scan.nextLine());
        double scholarshipSocial = minSalary * 0.35;
     
        boolean isItUnderTwo = income > minSalary || (grade > 2 && grade <= 4.50);
        boolean topScore = grade >= 5.50;
        boolean isItSocial = (income < minSalary || grade > 4.50);

        if (topScore){
            double scholarship = grade*25;
            if (scholarship >= scholarshipSocial){
                System.out.printf("You get a scholarship for excellent results %.0f BGN",Math.floor(scholarship));
            }else {
                System.out.printf("You get a Social scholarship %.0f BGN",Math.floor(scholarshipSocial));
            }
        } else if (isItUnderTwo){
            System.out.println("You cannot get a scholarship!");
        }else if (isItSocial){
            System.out.printf ("You get a Social scholarship %.0f BGN",Math.floor(scholarshipSocial));
        }

   
    }
}

Тагове:
0
Programming Basics
kkaraivanov avatar kkaraivanov 486 Точки

Здравей. Направи променливите :

scholarshipSocial = minSalary * 0.35;
и
scholarship = grade*25;

ето така :

scholarshipSocial = Math.Floor(minSalary * 0.35);
и
double scholarship = Math.Floor(grade*25);

 

0
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

Ох много благодаря, но пак не мина 93/100. Ето с корекция : 

 

double scholarshipSocial = Math.floor(minSalary * 0.35);

boolean isItUnderTwo = income > minSalary || (grade > 2 && grade <= 4.50);
boolean greaterScore = grade >= 5.50;
boolean isItSocial = (income < minSalary || grade > 4.50);

if (greaterScore){
    double scholarship = Math.floor(grade*25);

 

Не разбирам :(, грешката ми е на тест 14 от judge, какво ли му пуска като проверка, за да гърми.

P.S.: Иначе имах подобен случай с Math.ceil и floor при задачата sleepyCatTom, там не можах да схвана/ да се досетя и съвсем откровено налучках Math.ceil - a до като се чудех какво го мъчи ...

0
kkaraivanov avatar kkaraivanov 486 Точки

Ако искаш, ще ти дам линк към задачата, но е на С#.

0
kkaraivanov avatar kkaraivanov 486 Точки

Ето меоето решение на задачата:

using System;

namespace Scholarship
{
    class Program
    {
        static void Main(string[] args)
        {
            double incomePrice = double.Parse(Console.ReadLine());
            double averageSuccess = double.Parse(Console.ReadLine());
            double minimumSalary = double.Parse(Console.ReadLine());

            double scholarship = Math.Floor(minimumSalary * 0.35);
            double theBestSuccess = Math.Ceiling(averageSuccess * 25);
            double printEscelentScholership = 0;

            if (scholarship > theBestSuccess)
            {
                printEscelentScholership = scholarship;
            }
            else
            {
                printEscelentScholership = theBestSuccess;
            }

            if (incomePrice <= minimumSalary && averageSuccess > 4.5 && averageSuccess < 5.5)
            {
                Console.WriteLine($"You get a Social scholarship {scholarship} BGN");
            }
            else if (incomePrice <= minimumSalary && averageSuccess >= 5.5)
            {
                Console.WriteLine($"You get a scholarship for excellent results {printEscelentScholership} BGN");
            }
            else if (incomePrice > minimumSalary && averageSuccess >= 5.5)
            {
                Console.WriteLine($"You get a scholarship for excellent results {theBestSuccess} BGN");
            }
            else
            {
                Console.WriteLine("You cannot get a scholarship!");
            }
        }
    }
    public class MyClas
    {
        public MyClas(int myInt)
        {
            // logic and code for him
        }
    }

}

За Math.Ceil и Math.Floor може да те подведа с отговора си. Аз изграждам логиката си на база проблема в задачата, като ползвам Math.Ceil в изчисленията за да компенсирам загубите при закръгляне в реалните числа до цяло число. При извеждане на резултат, ако в условието не е посочено друго, ползвам Math.Floor за да илиминирам добавените закръглени стойности в изчислението. Математиката е точна наука, но в програмирането поради двоичното преобразуване в десетична бройна система с която сме свикнали да смятаме има разлики в стойностите. В C# и Java не съм тествал, но в С++ например: 

int a = 5;
int b = 3;
int c = a - b; // c ще бъде = 2

// но----->
double a = 5;
double b = 3;
double c = a - b; // c ще бъде равно на 2.0000003

Заради подобни стойности, дава грешка в изчисленията и Judge връща грешен отговор.

Естествено това си е мое обяснение на срещнатите проблеми до тук и неискам да те обърквам. Когато Judge ми върне грешка и се съмнявам в някои изчисления, проверявам кода и там където имам пресмятане с double и int ползвам Math.Ceil, а там където са double и double ползвам Math.Floor. Обикновено се получава, но ако не стане, търся друго решение. :)

0
26/10/2019 00:06:30
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

Ами добре да, благодаря ти, принципа нали трябва да е индентичен, само езика различен.

Нещо друго интересно обаче, което не разбирам, защо е така, ако мога да питам.Благодаря, че ми отговаряш... хаха

Тези двете задачи,единствения начин, по който ми премиха в judge беше, като закръгля операциите с Math.ceil, а резултата с floor:

Harvest

import java.util.Scanner;

public class Harvest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int vineyard = Integer.parseInt(scan.nextLine());
        double grapesPerMeter = Double.parseDouble(scan.nextLine());
        int litersNeeded = Integer.parseInt(scan.nextLine());
        int workers = Integer.parseInt(scan.nextLine());

        double grapesTotal = vineyard*grapesPerMeter;
        double wineTotal = (grapesTotal*0.40);
        double litersTotal = (wineTotal/2.5);

        if (litersTotal>=litersNeeded){
            double liters = Math.ceil(litersTotal-litersNeeded);
            double perPerson = Math.ceil(liters/workers);
            System.out.printf("Good harvest this year! Total wine: %.0f liters.%n" +
                    "%.0f liters left -> %.0f liters per person.",Math.floor(litersTotal),Math.floor(liters),perPerson);

        }else  {
            double less = Math.floor(litersNeeded-litersTotal);
            System.out.printf("It will be a tough winter!" +
                    " More %.0f liters wine needed.",Math.floor(less));
        }

    }
}

sleepyCatTom

import java.util.Scanner;

public class sleepyTomCat {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int freeDays = Integer.parseInt(scan.nextLine());
        double freeDaysPlay = freeDays * 127;
        double workDays = (365-freeDays)*63;
        double sleepNeeded = 30000;
        double totalPlay=freeDaysPlay+workDays;
        double sleepMinutes = sleepNeeded-totalPlay;



       if (sleepNeeded >= totalPlay){
           double hours = sleepMinutes/60;
           double minutes = sleepMinutes%60;
           System.out.printf("Tom sleeps well%n%.0f hours and %.0f minutes less for play",Math.floor(hours),minutes);
       }else {
           double hours = Math.ceil(sleepMinutes / 60);
           double minutes = Math.abs(sleepMinutes % 60);
           System.out.printf("Tom will run away%n%.0f hours and %.0f minutes more for play", Math.abs(hours), minutes);
       }

    }
}

Знам си, че кода ми е дървен , но се притеснявам, че в логиката ми бяга нещо. Знаеш ли защо трябва да закръгля операциите със ceil ? Или като цяло нещо не съм разбрала? Сигурно ми е глупаво питането, ама все пак

 

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