Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2023, 11:16   #1
YaLubluMamu
Пользователь
 
Регистрация: 22.10.2022
Сообщений: 37
По умолчанию Программа "Банкомат"

Напишите программу, имитирующую работу банкомата. Выберите структуру данных для хранения купюр разного достоинства в заданном количестве. При вводе пользователем запрашиваемой суммы денег, скрипт должен вывести на консоль количество купюр подходящего достоинства. Если имеющихся денег не хватает, то необходимо напечатать сообщение «Операция не может быть выполнена!». Например, при сумме 5370 рублей на консоль должно быть выведено «5*1000 + 3*100 + 1*50 + 2*10».
YaLubluMamu вне форума Ответить с цитированием
Старый 27.02.2023, 11:26   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Цитата:
Сообщение от YaLubluMamu Посмотреть сообщение
2*10
Банкоматы мелочь не выдают...
Arigato вне форума Ответить с цитированием
Старый 27.02.2023, 12:36   #3
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Код:
<?php
class Atm
{
    private int $sum;
    private array $answer = [];

    public const NOTE = [
        5000,
        1000,
        500,
        200,
        100,
        50,
        10,
    ];

    public function __construct(int $sum)
    {
        $this->sum = $sum;
    }

    public function calculate(): self
    {
        foreach (self::NOTE as $note) {
            $count = (int)($this->sum / $note);
            if ($count < 1) {
                continue;
            }
            $this->answer[$note] = $count;
            $this->sum %= $note;
        }
        return $this;
    }

    public function getAnswer(): array
    {
        return $this->answer;
    }
}
$sum = 5370;
$object = new Atm($sum);
$answer = $object->calculate()->getAnswer();
print_r($answer);
Valick вне форума Ответить с цитированием
Старый 27.02.2023, 13:15   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Valick, а где сообщение об ошибке
macomics вне форума Ответить с цитированием
Старый 27.02.2023, 13:29   #5
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

macomics, виноват, пока дочитывал окончание задания забыл начало задания))
Valick вне форума Ответить с цитированием
Старый 27.02.2023, 14:06   #6
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Код:
<?php
class Atm
{
    private array $answer = [];
    private array $note = [
        5000 => 1,
        1000 => 2,
        500 => 3,
        200 => 4,
        100 => 5,
        50 => 6,
        10 => 7,
    ];

    public function giving(int $sum): self
    {
        $this->answer = [];
        foreach ($this->note as $note => $countNote) {
            $count = (int)($sum / $note);
            if ($count > $countNote || $count < 1) {
                continue;
            }
            $this->note[$note] -= $count;
            $this->answer[$note] = $count;
            $sum %= $note;
        }
        if ($sum > 0) {
            $this->answer = ['Операция не может быть выполнена!'];
        }

        return $this;
    }

    public function getBalance(): int
    {
        $sum = 0;
        foreach ($this->note as $note => $countNote) {
            $sum += $note * $countNote;
        }

        return $sum;
    }

    public function getAnswer(): array
    {
        return $this->answer;
    }
}

$object = new Atm();
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
print_r($object->giving(5370)->getAnswer());
echo '<hr />';
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
print_r($object->giving(5370)->getAnswer());
echo '<hr />';
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
print_r($object->giving(955)->getAnswer());
echo '<hr />';
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
print_r($object->giving(950)->getAnswer());
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
Valick вне форума Ответить с цитированием
Старый 27.02.2023, 14:17   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Код:
if ($count > $countNote || $count < 1) {
                continue;
            }
А зачем отдавать больше мелочи. Сначала надо отдать максимум больших купюр. Т.е при $count > $countNote надо не просто continue, а еще и вычесть из $sum ($countNote * $note)

Код:
    public function giving(int $sum): self
    {
        $this->answer = [];
        foreach ($this->note as $note => $countNote) {
            $count = (int)($sum / $note);
            if ($count < 1) continue;
            if ($count > $countNote) $count = $countNote;
            $this->answer[$note] = $count;
            $sum -= $note * $count;
        }
        if ($sum > 0) {
            $this->answer = ['Операция не может быть выполнена!'];
        } else {
            foreach ($this->answer as $note => $countNote) // Иначе ОБХСС загребет
                $this->note[$note] -= $countNote;
        }

        return $this;
    }

Последний раз редактировалось macomics; 27.02.2023 в 14:24.
macomics вне форума Ответить с цитированием
Старый 27.02.2023, 14:26   #8
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Сначала надо отдать максимум больших купюр
цикл от больших купюр к меньшим, так что всё правильно у меня

Да, вы правы, задача оказалась чуть сложнее, чем представлялась
Обеденного перерыва не хватило, поесть поиграть с сыном в Асфальт9 и написать код :D

Последний раз редактировалось Valick; 27.02.2023 в 14:30.
Valick вне форума Ответить с цитированием
Старый 27.02.2023, 17:18   #9
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Код:
<?php
class Atm
{
    private int $sum;
    private array $answer = [];
    private array $note = [
        5000 => 2,
        1000 => 2,
        500 => 10,
        200 => 4,
        100 => 5,
        50 => 6,
        10 => 7,
    ];

    public function giving(int $sum = 0): self
    {
        $balance = $this->note;
        $this->sum = $sum;
        $this->answer = [];
        foreach ($this->note as $note => $countNote) {
            $this->extract($note);
        }
        if ($this->sum > 0) {
            $this->answer = ['Операция не может быть выполнена!'];
            $this->note = $balance;
        }

        return $this;
    }

    private function extract(int $currentNote): void
    {
        $count = (int)($this->sum / $currentNote);
        if ($count < 1) {
            return;
        }
        if ($count > $this->note[$currentNote]) {
            $count = $this->note[$currentNote];
        }
        $this->note[$currentNote] -= $count;
        $this->answer[$currentNote] = $count;
        $this->sum -= $currentNote * $count;
    }

    public function getBalance(): int
    {
        $sum = 0;
        foreach ($this->note as $note => $countNote) {
            $sum += $note * $countNote;
        }

        return $sum;
    }

    public function getAnswer(): array
    {
        return $this->answer;
    }
}

$object = new Atm();
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
print_r(
    $object->giving(100)
        ->getAnswer()
);
echo '<hr />';
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
print_r(
    $object->giving(15370)
        ->getAnswer()
);
echo '<hr />';
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
print_r(
    $object->giving(5370)
        ->getAnswer()
);
echo '<hr />';
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
print_r(
    $object->giving(955)
        ->getAnswer()
);
echo '<hr />';
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
print_r(
    $object->giving(950)
        ->getAnswer()
);
echo 'Баланс: ' . $object->getBalance();
echo '<hr />';
Valick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо написать "таймер", который будет запускаться при нажатии кнопки "Start", приостанавливаться на "Pause", и сбрасываться на "Reset" billiejean78 JavaScript, Ajax 1 03.09.2021 08:58
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Программа "банкомат" Of_value Общие вопросы по Java, Java SE, Kotlin 1 06.10.2014 19:23