Я гуглил это уже несколько дней, и я потерялся. Так что делаю CS50 онлайн и, кажется, не могу справиться с округлением чисел. Моя программа испортила умножение чисел с плавающей запятой, например 2.10, на целые числа, например 100, она выдала бы 209.xxxxxxxx
Как я уже сказал, я прочитал бесчисленное количество сообщений о том, что мне следует использовать ceilf и включить , но я получаю сообщение об ошибке
greedy.c :(. text + 0x74): undefined ссылка на `ceilf 'collect2: error: ld вернул 1 статус выхода make: *** [greedy] Ошибка 1 adam @ beethoven: ~ / projects / atom / edx / pSet1 / жадный $
Я видел сообщения о -lm и определенном файле, но, честно говоря, я не понимаю, что это значит.
Я никоим образом не ищу прямого решения, я просто ищу рекомендации по улучшению.
Вот мой код, возможно, не такой оптимизированный, как хотелось бы некоторым, но здесь я возвращаюсь к основам;)
#include <stdio.h>
#include <math.h>
int main() {
// Initialize Variables
int coinsTotal = 0,
quarter = 25,
dime = 10,
nickel = 5,
penny = 1,
cents;
float changeDue;
do {
printf("How much change are you owed? (Format = 0.00)($): ");
scanf("%f", &changeDue );
// Convert to cents
cents = changeDue * 100;
} while(cents <= 0);
while (cents >= quarter) {
cents = cents - quarter;
coinsTotal = coinsTotal + 1;
} if (cents == 0) {
printf("The miminum number of coins is: %d\n", coinsTotal);
} else {
while (cents >= dime) {
cents - dime;
coinsTotal = coinsTotal + 1;
} if (cents == 0) {
printf("The minimum number of coins is: %d\n", coinsTotal);
} else {
while (cents >= nickel) {
cents = cents - nickel;
coinsTotal = coinsTotal + 1;
} if (cents == 0) {
printf("The minimum number of coins is: %d\n", coinsTotal);
} else {
while (cents >= penny) {
cents = cents - penny;
coinsTotal = coinsTotal + 1;
} if (cents == 0) {
printf("The minimum number of coins is: %d\n", coinsTotal);
}
}
}
}
}
По сути, он должен определить минимальное количество монет, необходимое для получения заданной суммы. Это работает в большинстве случаев, пока поплавки не сломаются. Извините за заметки. Мне нравится писать то, что я сделал, чтобы лучше учиться.
Обновление Пытался скомпилировать GCC с помощью -lm, но все равно не удалось. adam @ beethoven: ~ / projects / atom / edx / pSet1 / greedy $ gcc -o foo -lm greedy.c /tmp/cc3qHAK7.o: в функции
main': greedy.c:(.text+0x6e): undefined reference to
ceilf 'collect2: error: ld вернул 1 статус выхода adam @ beethoven: ~ / проекты / атом / edx / pSet1 / жадный $РЕШЕНИЕ Вместо использования команды make я использовал gcc и добавил флаг -lm В конце команды
gcc -o foo greedy.c -lm
double
. 2) при преобразовании денег с плавающей запятой вint
используйтеround()
, как вcents = round(changeDue * 100);
- person chux - Reinstate Monica   schedule 03.09.2015round()
использованием? - person chux - Reinstate Monica   schedule 03.09.2015209.9xxxxxx'
.double round(double x)
от<math.h>
решает эту проблему, поскольку возвращает210.0
. Тем не менее, поддерживайте, что он не страдает той же бедой, что и ceilf, и ищу ваш пример того, какround(double)
является проблемой. OTOH - я вижу, чтоround()
в<math.h>
имеет ту же проблему, что вам нужно связать математическую библиотеку. Согласитесь с этим. Мое руководство было для ваших следующих проблем, поскольку вы запрашивали только рекомендации по улучшению - person chux - Reinstate Monica   schedule 03.09.2015