Cash

Коротко

Создайте программу, которая будет определять минимальное количество монет, необходимых для выдачи сдачи.

$ ./cash
O hai! How much change is owed?
0.41
4

Объяснение

image alt text

Перед вами устройство для выдачи монет. В каждой синем цилиндре, находится стопка одинаковых монет. Удобная вещь для хранения мелочи. Выдавая сдачу покупателю, вы скорее всего постараетесь это сделать наименьшим количеством монет. К счастью, программисты пришли на помощь кассирам всего мира и создали то, что уменьшило это возвращаемое число металлических кругляшек: алгоритм жадности.

Предположим, что кассир, у которого есть данное устройство, распределяющее четвертаки, десятицентовики, пятицентовики и пенни, должен вернуть сдачу покупателю. Нажатие кнопок устройства минимальным количеством раз, приведет к желаемому результату. Если, к примеру, какому-то покупателю кассир должен 41 цент, по логике первой монетой которую он даст покупателю будет та, что с наибольшим номиналом (самая крупная монета), а именно 25 центов. (Отлично, мы очень быстро справляемся с решением данной проблемы, подбираясь к желаемым 0 центам за минимальное количество шагов). Мы уменьшили размер проблемы с 41 до 16 центов, т.к. 41 - 25 = 16. Это остаток той же проблемы, только на этот раз с меньшей величиной. Мы не можем использовать еще 25 центов (из имеющихся монет 25, 10, 5 и 1 центов), т.к. кассир не хочет отдавать лишние центы покупателю, поэтому он и перейдет к следующей монетке с номиналом в 10 центов, сократив проблему (или долг перед покупателем) до 6 центов. Тут ничего не остается кроме как воспользоваться монетой в 5 центов, а затем и в 1 цент. Все, проблема решена. В итоге покупатель получил сдачу одной монетой в 25 центов, одной в 10, в 5 и 1 цент: в общем 4 монеты.

Описание

Напишите в файле cash.c, находящемся в папке ~/workspace/pset1/, программу, которая сперва спрашивает пользователя, сколько ему должны сдачи и затем отображает минимальное количество монет, необходимых для формирования этой самой сдачи.

Воспользуйтесь get_float функцией Библиотеки CS50, чтобы получить данные предоставляемые пользователем (сумму сдачи) и функцией printf библиотеки Standard I/O (помните stdio.h?) чтобы вывести на экран ваш ответ. В вашем распоряжении есть следующие монетки: четвертаки (25¢), десятицентовики (10¢), пятицентовики (5¢) и пенни (1¢).

Мы не просто так просим вас использовать get_float, таким образом вы сможете принимать доллары и центы, даже без самого знака доллара. Другими словами, если какому-то покупателю задолжали $9.75, пользователь будет вводить 9.75 а не $9.75 или 975. Но если кому-то мы должны ровно $9, пусть ввод будет выглядеть так 9.00 или просто 9, но опять же не так $9 и не так 900. Конечно, так как число должно будет введено ввиде float‘a (или значение с плавающей запятой). Более вероятно что ваша программа будет работать с вводимым числом 9.0 или 9.000; Вам не надо беспокоиться, ввел ли человек данные в денежном формате.

Не надо проверять, не слишком ли большое число ввел пользователь для float‘a. Функция get_float сделает за вас основную работу, но она не сможет проследить отрицательное число.

Если пользователь не предоставит положительное число, ваша программа должна будет просить его ввести число заново.

Обратите внимание, чтобы наша программа смогла проверить вашу работу, убедительно просим сделать так, чтобы в последней строке был код, который распечатывает количество затраченных монет (integer) и завершается \n.

Использование

Ваша программа должна проделывать тоже самое, что показано в примере ниже.

$ ./cash
O hai! How much change is owed?
0.41
4
$ ./cash
O hai! How much change is owed?
-0.41
How much change is owed?
-0.41
How much change is owed?
foo
Retry: 0.41
4

Проверка

check50 cs50/2018/x/cash

Стиль

style50 cash.c

Закачать

submit50 cs50/2018/x/cash

Вас потребуют ввести логин (GitHub username) и пароль (GitHub password) от вашей учетной записи на Github’е, которую вы можете завести, пройдя по данной ссылке https://github.com/join.

Зайдите на сайт cs50.me, используя всё ту же учетную запись GitHub’а и нажмите на зеленую кнопку authorize submit50 (Это действие производится только один раз).

Подсказки

Помните о неточности значения float‘a (что после запятой могут быть не только нули). К примеру, 0.1 нельзя до конца представить как float (десятичное дробное число или не целое число). Попробуйте отобразить его значение дополнив заполнитель числом 55, вот так:

float f = 0.1;
printf("%.55f\n", f);

Поэтому, до того как производить какие-то вычисления с предоставленным вам числом от пользователя, обязательно переведите данные в центы (т.е. float переведите в int) чтобы миновать кое-какие мелкие ошибки, но вместе образующие огромные проблемы в дальнейшем! Конечно не надо вслепую переводить введенное пользователем число float в int! В конце концов, сколькими центам может равняться доллар?

Не забудьте округлить (round) ваши центы, не выходите за пределы понятия центов!