Задача Calculate Discount [Workshop 3 - Loops]

preparation

#1

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

Натъкнах се на проблем с тази задача: https://judge.telerikacademy.com/problem/00304discount

Опитвам се да измисля решение без arrays, както и се очаква.

Логиката ми е следната:

  1. Инициализирам variable discount = 0;
  2. Потребител въвежда общия брой N на продуктите/цените
  3. Първи for loop задава N пъти нови полета за въвеждане на отделните цени
    3.1. Същият for loop обновява variable discount с 35% от въведената от потребителя ценя
    ** Тук някъде греша **
  4. Втори for loop показва variable discount в толкова редове, колкото потребителят първоначално е въвел (N).

Проблемът обаче е, че винаги се появява discount-a на последно въведената цена - тъй като не знам как discount variable-a да се запазва някъде след всеки iteration на първия loop.

Тоест въвеждам:
2
50
40

И получавам:
14,00
14,00

Може ли малко помощ? Ето ми го кода: https://github.com/PetarBivolarski/Telerik-Academy/blob/master/Workshop%203%20-%20Loops/Calculate%20Discount

П.С. Условие на задачата:

Calculate Discount

You need to calculate the discounted price for each item in your shopping cart. The discount is 65%, a real deal for you.

Input

  • On the first line, you will receive N - the number of the items in your shopping cart
  • On the next N lines you will each item’s price

Output

  • On each line in the output print the discounted price of the item with two digits after the decimal point (Math rules for rounding apply)

Input

Copy

2
50
40

Output

Copy

17.50
14.00

Input

Copy

4
9.99
19.99
29.99
39.99

Output

Copy

3.50
7.00
10.50
14.00

Благодаря предварително!

Поздрави,
Петър


#2

Помисли за принтирането. Имаш два цикъла, които синтактично са верни, но кой цикъл кога се изпълнява и каква съответно е стойността на променливата?


#3

Според мен няма нужда от втори for цикъл.


#4

Колега, принтирай си направо тази променлива , където изчисляваш отстъпката, махни изцяло втория фор и си ти :wink:


#5

Здравейте!

Благодаря за съветите!

Код от типа на:

for (int i = 1; i <= n; i++) {
   String price = userInput.nextLine();
   itemPrice = Double.parseDouble(price);
   discounted = itemPrice * (1 - 0.65);
   System.out.println(decimals.format(discounted));
}

За съжаление показва отстъпката след всяко написване на цена, а задачата е списъкът с отстъпките да се покаже накрая, след като потребителят е въвел всички цени. Редактирах си първия пост с условието, за да е по-ясно.

Пробвах и нещо по-екстравагантно от сорта на втори for loop в първия, чиято променлива да започва след като първия loop свръшва (int j = n+1; j <= (n+n)+1; j++), но изглежда не работят така нещата на практика.

Ако имате някакви идеи, ще се радвам да чуя.

П.С. А код с принтирането на променливата discount извън самия for loop, показва единствено отстъпката на последно въведената цена, като прескача всички други - което ме връща на първоначалния проблем.

Благодаря за отделеното време!

Поздрави,
Петър


#6

Ами, ако искаш наведнъж, което се съмнявам judge да иска :slight_smile: Напиши го с масив-че :slight_smile: ето ти бърз код , но на C# :slight_smile: , мисля че ще го разбереш, макар че не е на твоя език !

sample


#7

И един съвет , недей да робуваш на тези очаква се без лист , масив и тн… , имай предвид че винаги ще трябва да търсиш и да гледаш някакви неща напред, като цяло програмата е направена така, че да те стимулира да се ровиш сам и да research-ваш някакви неща , никой никога няма да ти каже "НЕ, за тази задача не може да използваш ТОВА или онова, защото е от следващата лекция… :slight_smile: "


#8

Би трябвало и така да мине в judge


#9

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

Горният код с един for loop и println вътре получава 80 от 100 точки:
judge

Досетих се, че проблемът е може би свързан с Math rounding, който се споменава в задачата, и затова махнах NumberFormat decimals = new DecimalFormat("#0.00"); и decimals.format от самия println накрая.

На тяхно място сложих следното в самия for loop, което ми изкара 100 от 100 точки:

        for (int i = 1; i <= n; i++) {
        String price = userInput.nextLine();
        itemPrice = Double.parseDouble(price);
        discounted = itemPrice * (1 - 0.65);
        BigDecimal rounded = BigDecimal.valueOf(discounted);
        rounded = rounded.setScale(2, RoundingMode.HALF_UP);
        System.out.println(rounded);
    }

Сега остава единствено да разберем, как авторите на задачата биха я решили с loop, така че отстъпките да се появяват накрая в списък след като потребителят е въвел всички цени.

Ще попитам на другия уъркшоп и ще споделя тук решение.

Благодаря до тук и поздрави!
Петър


#10

Предполагам че вътре в Loop-а, можеш да направиш един StringBuilder и просто да прибавяш всяка отстъпка към настоящият string + \n за може да ти бута всяка нова отстъпка на нов ред. И накрая просто принтираш ; )


#11

Благодаря ти! Точно със StringBuilder се получи output-a в правилната последователност:

stringbuilder2

Проблемът е решен. : )

Поздрави,
Петър