Loading...
Vladmir avatar Vladmir 2 Точки

Java Syntax Homework - Problem 4. Calculate expression

Здравейте Колеги,

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

Примерно за следните input данни:

1.25

1.22

  1.24

F1 result: 239530.27; F2 result: 1.00; Diff: 119764.40

Аз получавам:

F1 result: 239531.06; F2 result: 1.00; Diff: 119764.80

В няколкото решения от колеги предоставени последните дни, наблюдавам подобно отклонение.

По-долу е изчислението на F1, което съм имплементирал:

float resultFormulaOne = (float)Math.pow((Math.pow(a,2) + Math.pow(b,2))/(Math.pow(a,2) -
                Math.pow(b,2)),(a + b + c )/Math.sqrt(c));

Някой успял ли е да получи output както е в примерите към условието? Би ли споделил как го е постигнал? Предполагам е нещо свързано или с кастването или приоритет на операциите.

Тагове:
1
Java Advanced
Gratsiela avatar Gratsiela 4 Точки

И при мен се получи почти същото. Аз разделих формулата на две части обаче:

//first formulae
        double grade = (a + b + c)/ Math.sqrt(c);
        double firstPart = (a*a + b*b) / (a*a - b*b);
        double firstFormula = Math.pow(firstPart,grade);

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

F1 result: 239531.35; F2 result: 1.00; Diff: 119764.94

Нещо е сбъркано.

0
Ivailo_Kodov avatar Ivailo_Kodov 97 Точки

По - добре си използвай функцията Math.Pow, вместо a*a и b*b ., защото и аз така в началото го направих от мързел ама бягаха резултатите ..

1
Gratsiela avatar Gratsiela 4 Точки

Ок сега резултата сега е :

F1 result: 239531.06; F2 result: 1.00; Diff: 119764.79

 

но пак не съвпада с тоя от примерите. Защо така убягва

public class CalculateExpression {
    public static void main(String[] args) {
        Scanner inputA = new Scanner(System.in);
        Scanner inputB = new Scanner(System.in);
        Scanner inputC = new Scanner(System.in);
        float a = inputA.nextFloat();
        float b = inputB.nextFloat();
        float c = inputC.nextFloat();
        //first formulae
        double grade = (a + b + c)/ Math.sqrt(c);
        double firstPart = (Math.pow(a,2) + Math.pow(b,2)) / (Math.pow(a,2) - Math.pow(b,2));
        double firstFormula = Math.pow(firstPart,grade);
        //(a2 + b2-c3)^(a-b)
        double secondFormula= Math.pow((Math.pow(a,2) + Math.pow(b,2) - Math.pow(c,3)),(a-b));

        double avgNumbers = (a + b + c)/3;
        double avgFormulae = (firstFormula + secondFormula)/2;
        double diff = avgFormulae - avgNumbers;

        System.out.printf("F1 result: %.2f; F2 result: %.2f; Diff: %.2f",firstFormula,secondFormula,diff);
        //imam razminavane v pyrvata formula i na diff

    }
}

ето го целия код

0
Ivailo_Kodov avatar Ivailo_Kodov 97 Точки

Значи първо, не е нужно да слагаш 3 пъти скенер за всяко число.. един Scanner ти стига.. и вече си ги правиш  3-те променливи с него, и също така си смени типа данни да не е Float,а  double ..  и би трябвало да се оправи :) 

3
geiff avatar geiff 71 Точки

Аз я правя с тези формули: 

double resultF1 = Math.pow((Math.pow(a, 2) + Math.pow(b, 2)) / (Math.pow(a, 2) - Math.pow(b, 2)),
                           (a + b + c)/ Math.sqrt(c)) ;
double resultF2 = Math.pow((Math.pow(a, 2) + Math.pow(b, 2) - Math.pow(c, 3)),
                            (a - b));
double averNumbers = (a + b + c) / 3;
double averFormula = (resultF1 + resultF2) / 2;
double diff = Math.abs(averNumbers - averFormula);

и ми се получава точно както е дадено.

0
martinski avatar martinski 66 Точки

Здрвейте.Не е объркана задачата,предполагам някъде ви бягат приоритетите на отделните операции.Препоръчвам да ползвате double и слагайте скоби навсякъде.

Дайте пълен код на задачата за да се види къде е грешката.

Ето едно работещо решение - http://pastebin.com/WHeFGRgt

Поздрави.

0
Ivailo_Kodov avatar Ivailo_Kodov 97 Точки

Аз ги получавам коректно..формулата , която си качил ми е 100% еднаква с твойта .. А иначе за diff =Average (a, b, c) – Average (f1, f2). , което не си го показал. Пробвай да използваш double, тъй като си мисля, че Math.Pow() връща - double като тип и да не би с float да се реже кофти и оттам да идва малката разлика ..

0
Alex0101 avatar Alex0101 374 Точки

Здравей колега, аз го направих на три части f1 f2 f3 , като просто гледах да ги изчисля най- просто.

Прилагам моя гитхъб, ако искаш да я погеднеш. Мое мнение е, че за квадрат по лесно се ползва а*а , от колкото Math.pow(a,2)

Дано да съм бил полезен поздрави.

https://github.com/AlexanderKrustev/SoftUni/blob/master/Java/JavaSyntax

 

0
20/03/2016 10:31:33
TihomirDimov avatar TihomirDimov 161 Точки

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

import java.util.Scanner;
import java.math.*;

public class Problem04CalculateExpression {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Please enter value for \"a\"");
        double numA = input.nextDouble();
        System.out.println("Please enter value for \"b\"");
        double numB = input.nextDouble();
        System.out.println("Please enter value for \"c\"");
        double numC = input.nextDouble();
        double resultFormulaOne = formulaOne(numA, numB, numC);
        double resultFormulaTwo = formulaTwo(numA, numB, numC);
        double difference = Math.abs(averageResult(numA, numB, numC) - averageResult(resultFormulaOne, resultFormulaTwo));
        System.out.printf("F1 result: %.2f; F2 result: %.2f; Diff: %.2f", resultFormulaOne, resultFormulaTwo, difference);
    }

    public static double formulaOne(double num1, double num2, double num3) {
        double powA = Math.pow(num1, 2);
        double powB = Math.pow(num2, 2);
        double result = java.lang.Math.pow(((powA + powB) / (powA - powB)), ((num1 + num2 + num3) / Math.sqrt(num3)));
        return result;
    }

    public static double formulaTwo(double num1, double num2, double num3) {
        double powA = Math.pow(num1, 2);
        double powB = Math.pow(num2, 2);
        double powC = Math.pow(num3, 3);
        double result = java.lang.Math.pow((powA + powB - powC), (num1 - num2));
        return result;
    }

    public static double averageResult(double num1, double num2) {
        double result = (num1 + num2) / 2;
        return result;
    }

    public static double averageResult(double num1, double num2, double num3) {
        double result = (num1 + num2 + num3) / 3;
        return result;
    }
}
0
IskrenPenev avatar IskrenPenev 177 Точки

За колегите, при които има някакви разлики в стотните на резултатите, съветът ми е да не смесват float и  double.

Аз лично съм вкарал всяка формула в 1 метод, за да изглежда по прилежно. Колкото до това дали да се ползва Math.Pow(а,2) или а*а, няма никакво значение ако навсякъде позлвате един и същ тип данни съответно float или double

Това е моето решение http://pastebin.com/6HFeYqN8

0
gabi.ivanova avatar gabi.ivanova 370 Точки

Колеги, използвайте http://pastebin.com/ :) Ще стане страшно ако всички си пускат 50 редовите задачи

1
Happiness95 avatar Happiness95 5 Точки

Реших задачата и по двата начина .Няма разлика в скобите дали ще напишете а*а или Math.pow(a,2) ,единствената разлика е че явно math.pow е предназначена за дабъл а не за флоат и вади някакви минимални разлики.

0
stefan_maslarski avatar stefan_maslarski 14 Точки

Прегледай си типовете данни, сигурно там ти е проблема...

1
Vladmir avatar Vladmir 2 Точки

Разликата наистина се получава заради кастването към float. Явно наистина както спомена колега, не е добра идея pow, който връща double да се каства към float.

 

Благодаря Ви за активността колеги. Весел ден на всички,

0
baxlash avatar baxlash 31 Точки

Ето моето решение, което работи:

public class CalculateExpression {
	public static void main(String[] args) {
		Locale.setDefault(Locale.ROOT);
		Scanner scanner = new Scanner(System.in);
		double a = scanner.nextDouble();
		double b = scanner.nextDouble();
		double c = scanner.nextDouble();
		scanner.close();
		
		double f1Result = formulae1(a, b, c);
		double f2Result = formulae2(a, b, c);
		
		double averageInputs = average(a, b, c);
		double averageResults = average(f1Result, f2Result);
		
		System.out.printf("F1 result: %.2f; F2 result: %.2f; Diff: %.2f", f1Result,f2Result,averageResults-averageInputs);
	}

	static double formulae1(double a, double b, double c) {
		double partOne = (Math.pow(a, 2) + Math.pow(b, 2));
		double partTwo = (Math.pow(a, 2) - Math.pow(b, 2));
		double partThree = (a + b + c) / Math.sqrt(c);

		return Math.pow(partOne / partTwo, partThree);
	}

	static double formulae2(double a, double b, double c) {
		double aToSquare = Math.pow(a, 2);
		double bToSquare = Math.pow(b, 2);
		double cToCube = Math.pow(c, 3);

		return Math.pow(aToSquare + bToSquare - cToCube, a - b);
	}

	static double average(double a, double b) {
		return (a + b) / 2;
	}

	static double average(double a, double b, double c) {
		return (a + b + c) / 3;
	}
}

Направил съм отделни функции, които да смятат двете формули. Също така съм направил и функция да смята средното аритметично на две числа и override на същата функция, за да смята средно аритметично и с три числа.

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