За последние 24 часа нас посетили 22769 программистов и 1264 робота. Сейчас ищут 756 программистов ...

Помогите решить задачу

Тема в разделе "Сделайте за меня", создана пользователем zevs, 25 сен 2018.

  1. zevs

    zevs Новичок

    С нами с:
    25 сен 2018
    Сообщения:
    7
    Симпатии:
    1
    Второй день не могу не могу допереть как ее правильно решить.

    Условие:
    Школьник решил купить айфон и для этой цели взял кредит. Сумма кредита — 40000 р., банк в начале каждого месяца (включая первый) начисляет 3% от остатка долга за пользование кредитом и 1000 р. комиссии (да, а ты думал, обойдешься процентами?). После этого, в конце каждого месяца, наш герой идет в банк и пытается выплатить долг, но он не может заплатить более 5000 р за раз (сэкономленных на школьных завтраках). Вопрос, когда он избавится от долга? Во сколько школьнику обошелся айфон?


    То есть, каждый месяц банк начисляет процент и комиссию, увеличивая долг, и каждый месяц школьник его потихоньку выплачивает.

    Вот мой код с комментариями.
    https://ideone.com/IkbjG0
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    хрена банк поимел школьника еще на 60 000 помимо 40 кусков
     
  3. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Если срок не определен - цикл for() не подходит - необходимо while() использовать. Как раз в условие и поставить, что остаток неотрицательный.
     
  4. zevs

    zevs Новичок

    С нами с:
    25 сен 2018
    Сообщения:
    7
    Симпатии:
    1
    Может через while и легче, но задача в первую очередь предполагает решение через цикл for, т.к она взята после главы где объясняется данный цикл. Поэтому хотелось бы, что бы подсказали алгоритм действий в контексте цикла for и функции if. Просто не хочется идти и учить дальше язык, решив задачу другим более легким путем, не разобравшись в принципе взаимодействия for и if
     
  5. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    for и while впринципе легко заменяемы.
    PHP:
    1. for ($i = 0; $i < 123; $i++) {...}
    2.  
    3. $i = 0;
    4. while ($i < 123) {
    5. ...
    6. $i++;
    7. }
    тут могут быть любые инструкции и условия.
    Если с while выглядит так:
    PHP:
    1. $month = 1;
    2. while ($creditBalance > 0) {
    3.     $creditBalance = ....;
    4.     if ($creditBalance > $monthlyPayment) {
    5.         ...
    6.     } else {
    7.         ...
    8.     }
    9.     echo ...;
    10.     $month++;
    11. }
    то с for это можно записать так:
    PHP:
    1. for ($month = 1; $creditBalance > 0; $month++;) {
    2.     $creditBalance = ....;
    3.     if ($creditBalance > $monthlyPayment) {
    4.         ...
    5.     } else {
    6.         ...
    7.     }
    8.     echo ...;
    9. }
     
  6. zevs

    zevs Новичок

    С нами с:
    25 сен 2018
    Сообщения:
    7
    Симпатии:
    1
    Спасибо, завтра попробую. Сегодня целый день сижу на этой задаче, и уже даже таблетки от головной боли не помогают.
     
  7. zevs

    zevs Новичок

    С нами с:
    25 сен 2018
    Сообщения:
    7
    Симпатии:
    1
    https://ideone.com/kFoSdq#stdin
    Наконец то решил. 3 дня ушло на это. Причем что интересно, сегодня я как будто ясней понимал что делаю и для чего, чем когда начинал решать эту задачу 3 дня назад
     
    Maputo нравится это.
  8. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @zevs непонятно только от куда взялось 4000?
    PHP:
    1. if ($creditBalance < 4000) {...}
    Чем Вас не устроило:
    PHP:
    1. if ($creditBalance < $monthlyPayment) {...}
    ?
    Ну и по условию задачи банк начисляет проценты и комиссию в начале месяца - этот код можно поставить в начало тела цикла.
     
  9. zevs

    zevs Новичок

    С нами с:
    25 сен 2018
    Сообщения:
    7
    Симпатии:
    1
    4000 потому что когда банк начинает начислять проценты и комиссию, сумма становится больше ежемесячного платежа ( 5000), следовательно код начинает идти по обычному сценарию. Если написать:
    PHP:
    1. if ($creditBalance < $monthlyPayment) {...}
    то получится что вместе со всеми надбавками долг на 12 месяце составит 5260р, и следуя моему коду, ежемесячная оплата приравняется к сумме долга, т.е
    PHP:
    1. $monthlyPayment = $creditBalance;
    что уже будет неверно, т.к школьник не сможет оплачивать в месяц более чем 5000р.
    Поэтому от 5260 остается 260 на 13 месяц, которые с надбавками составляют 1260 ( примерно), и долг успешно погашается не уходя в минус.
     
  10. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    в реальной жизни нет никаких более лёгких циклов
    есть более более подходящие в конкретной ситуации
     
  11. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Это костыль, который не нужен. Если сумма больше 5000 - код и должен идти по обычному сценарию.
    Можно я приведу Вам для сравнения свой вариант, раз Вы уже написали свой? Результат такой же как и у Вас.
     
  12. zevs

    zevs Новичок

    С нами с:
    25 сен 2018
    Сообщения:
    7
    Симпатии:
    1
    Конечно, было бы интересно глянуть.
     
  13. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    PHP:
    1. $creditBalance = 40000; /* Долг перед банком */
    2. $percent = 1.03; /* Банк начисляет 3% в месяц от суммы */
    3. $servicePayment = 1000; /* А также 1000 рублей в месяц комиссии за обслуживание счета */
    4. $monthlyPayment = 5000; /* школьник платит 5000 р в месяц, это все, что ему дает мама на завтраки */
    5. $paymentTotal = 0; /* Сколько всего отдал банку школьник */
    6. for ($month = 1; $creditBalance > 0; $month++) {
    7.     $creditBalance = $creditBalance * $percent + $servicePayment;
    8.     if ($creditBalance > $monthlyPayment) {
    9.         $paymentTotal += $monthlyPayment;
    10.         $creditBalance -= $monthlyPayment;
    11.     } else {
    12.         $paymentTotal += $creditBalance;
    13.         $creditBalance = 0;
    14.     }
    15.     echo "$month месяц спустя: долг = $creditBalance руб, выплачено всего $paymentTotal руб.\n";
    16. }
    Результат
    Код (Text):
    1. 1 месяц спустя: долг = 37200 руб, выплачено всего 5000 руб.
    2. 2 месяц спустя: долг = 34316 руб, выплачено всего 10000 руб.
    3. 3 месяц спустя: долг = 31345.48 руб, выплачено всего 15000 руб.
    4. 4 месяц спустя: долг = 28285.8444 руб, выплачено всего 20000 руб.
    5. 5 месяц спустя: долг = 25134.419732 руб, выплачено всего 25000 руб.
    6. 6 месяц спустя: долг = 21888.45232396 руб, выплачено всего 30000 руб.
    7. 7 месяц спустя: долг = 18545.105893679 руб, выплачено всего 35000 руб.
    8. 8 месяц спустя: долг = 15101.459070489 руб, выплачено всего 40000 руб.
    9. 9 месяц спустя: долг = 11554.502842604 руб, выплачено всего 45000 руб.
    10. 10 месяц спустя: долг = 7901.137927882 руб, выплачено всего 50000 руб.
    11. 11 месяц спустя: долг = 4138.1720657184 руб, выплачено всего 55000 руб.
    12. 12 месяц спустя: долг = 262.31722768997 руб, выплачено всего 60000 руб.
    13. 13 месяц спустя: долг = 0 руб, выплачено всего 61270.186744521 руб.
     
    TeslaFeo нравится это.
  14. zevs

    zevs Новичок

    С нами с:
    25 сен 2018
    Сообщения:
    7
    Симпатии:
    1
    Блин действительно. У Вас одновременно простой и логичный код, но я не смог так написать.
     
  15. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    еще важный момент, начислять процент и комиссию ДО выплаты или ПОСЛЕ.
    это приходящее. Просто делай :)
     
  16. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Тут по условию в начале месяца % а потом комиссия
    Но в реальности как раз наоборот будет :D комиссиия а потом %
    Правда разница в итоге там около 600 рублей, кажется.
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Сорри за оффтоп, но задачу стоит перефразировать:

    Условие:
    Школьник решил купить айфон и для этой цели взял кредит. Сумма кредита — 40000 р., банк в начале каждого месяца (включая первый) начисляет 3% от остатка долга за пользование кредитом и 1000 р. комиссии (да, а ты думал, обойдешься процентами?). После этого, в конце каждого месяца, наш герой идет в банк и пытается выплатить долг, но он не может заплатить более 5000 р за раз (сэкономленных на школьных завтраках). Вопрос, какой IQ у манагера, выдававшего кредит? Какова его профпригодность и компетентность?