Loading...
Radoslav.Tsanev avatar Radoslav.Tsanev 1 Точки

Programming Basics - януари 2017 - задача от предишен изпит

 Здравейте ,някой може ли да ми каже къде бъркам в писането на кодът?
Условие на задачата:

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

  • Банята е наполовина по-малка от най-малката стая.
  • Втората стая е 10% по-голяма от най-малката стая.
  • Третата стая е 10% по-голяма от втората стая.

Към общата площ трябва да се прибавят 5% за коридор. На входа програмата получава и цена на квадратен метър.

Вход

Входът се чете от конзолата и съдържа точно 3 реда:

  • Първия ред – площта на най-малката стаяреално число в интервала [1.00...100.00]
  • Втория ред – площта на кухнятареално число в интервала [1.00...100.00]
  • Третия редцена на квадратен метърреално число в интервала [1.00...1000.00]

Изход

Да се отпечата на конзолата цената на жилището, форматирана до вторият знак след десетичната запетая.

Примерен вход и изход

Вход

Изход

Обяснения

20

10

699.99

63356.09

Втората стая = 20 + 10% = 22

Третата стая = 22 + 10% = 24.20

Банята = 20 / 2 = 10

Обща площ = 20 + 10 + 22 + 24.20 + 10 = 86.20 + 5% коридор = 86.20 + 4.31 = 90.51

Цена = 90.51 * 699.99 = 63356.094900000004

Решение:

import java.util.Scanner;

public class HousePrice {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double smallroom = Double.parseDouble(scanner.nextLine());
        double kitchen = Double.parseDouble(scanner.nextLine());
        double pricemetyr = Double.parseDouble(scanner.nextLine());
        double secondroom = smallroom * (1 / 10) + smallroom;
        double thirdroom = secondroom * (1 / 10) + secondroom;
        double bath = smallroom / 2;
        double koridor = ((smallroom + kitchen + secondroom + thirdroom + bath) * (1 / 20));
        double area = (smallroom + kitchen + secondroom + thirdroom + bath + koridor);
        double result = area * pricemetyr;
        System.out.println(result);

    }

}

Отговорът ми е 55999.2 вместо 63356.09.
0
Общи приказки
ppbaev avatar ppbaev 157 Точки

напиши само System.out.println(1 / 10);  и го пусни и виж резултата, от там ще се усетиш къде е проблема

0
01/02/2017 21:12:58
Radoslav.Tsanev avatar Radoslav.Tsanev 1 Точки

Не ти хващам идеята как като принтирам число ще се получи ? пробвах

0
ppbaev avatar ppbaev 157 Точки

идеята е да видиш, че като работиш с цели числа(integer) и разделиш 1 на 10 с оператора / се получава 0, а не 0.1 както очакваш, и да го google-неш защо е така и да си решиш задачата сам

или гледай лекцията за прости пресмятания с числа пак

0
01/02/2017 22:24:03
Radoslav.Tsanev avatar Radoslav.Tsanev 1 Точки

затова ползвам double ,за да мога да си работя с дробни числа.

0
LepTon avatar LepTon 6 Точки

На първо четене вместо 1/10 и 1/20 ги замести съответно с 0,5 и 0,05.

А ето код за 100 точки:

package com.company;
import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
       Scanner input = new Scanner(System.in);
      double areaMinRoom = Double.parseDouble(input.nextLine());
      double areaKitchen = Double.parseDouble(input.nextLine());
      double priceOneMetar = Double.parseDouble(input.nextLine());
      double areaBadRoom = 0.5 * areaMinRoom;
      double areaTwoRoom = 1.1 * areaMinRoom;
      double areaThreeRoom = 1.1 * areaTwoRoom;
      double allArea = areaMinRoom + areaKitchen + areaBadRoom + areaTwoRoom + areaThreeRoom;
      double areaKoridor = allArea * 0.05;
      double totalArea = allArea + areaKoridor;
      double priceTotalArea = priceOneMetar * totalArea;
      System.out.printf("%.2f%n", priceTotalArea);
    }
}

 

0
Radoslav.Tsanev avatar Radoslav.Tsanev 1 Точки

Искаш да кажеш с 0.1 и 0.05.Зааместих и получих почти същия отговор 63356,09,но не разбирам защо като са написани по този начин - 1/10 ,1/20 ... не се получава? и благодаря за отговора!

0
Radoslav.Tsanev avatar Radoslav.Tsanev 1 Точки

Като смених стойностите стана 100/100.С този код :

import java.util.Scanner;

public class HousePrice {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double smallroom = Double.parseDouble(scanner.nextLine());
        double kitchen = Double.parseDouble(scanner.nextLine());
        double pricemetyr = Double.parseDouble(scanner.nextLine());
        double secondroom = smallroom * (0.1) + smallroom;
        double thirdroom = secondroom * (0.1) + secondroom;
        double bath = smallroom / 2;
        double koridor = ((smallroom + kitchen + secondroom + thirdroom + bath) * (0.05));
        double area = (smallroom + kitchen + secondroom + thirdroom + bath + koridor);
        double result = area * pricemetyr;
        System.out.printf("%.2f" , result);

    }

}
0
LepTon avatar LepTon 6 Точки

При 1/10 и 1/20 се получава целочислено деление т.е. отрязва се дробната част, докато  0.5 и 0.05 са дробни числа и не си форматирал изхода до втория знак.

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