Простая программа для изменения в C; Не понимая инициализации
Я работал над программой в течение нескольких дней в классе C моего новичка. Я уже написал, переписал, разбил и переписал этот код, погуглив все мои вопросы с небольшой помощью. Я подозреваю, что я делаю неправильно, очень просто, но я думаю, что просто не понимаю.
Программа предназначена для того, чтобы запросить у кассира цену, предложенную сумму, рассчитать изменение и сообщить кассиру, сколько из каждого счета / монеты нужно вернуть. Код из void main(void) в change=round был предоставлен моим инструктором. Я понимаю, что именно так я должен превратить двойное число в целое число. Потребовалось много времени, чтобы выяснить, что lf был единственным форматом, который будет работать для моего scanf, и мой инструктор специально попросил использовать много определений.
Когда программа запускается, она успешно запрашивает цену и уплаченную сумму, но изменение всегда выводится до –2 147 483 648 (что, я знаю, является наименьшим значением для int). Я, однако, не знаю, почему он выбирает это значение. Математика для изменения = раунд, где она рассчитывает оплаченную стоимость, была предоставлена моим инструктором, и я не играл с ней.
Кроме того, мой компилятор выдает мне предупреждение "_____ используется неинициализированным для этой функции" для "двадцатых, десятков, пятерок" и т. Д., Перечисленных в разделе // Список изменений. Я думал, что инициализировал их, когда я перечислил их как int наверху? То, как мой инструктор описывал вещи до сих пор, показалось мне немного эзотерическим, поэтому я уверен, что мне просто не хватает чего-то очень простого. Любые объяснения различий между int и int*, или почему%f не будет работать там, где я перечислил%lf, также будут с благодарностью, так как они были для меня предыдущими головными болями и были вознаграждены бонусными интернет-баллами.
Заранее спасибо. Надеюсь, я отформатировал все в порядке.
#include <stdio.h>
#define TWENTY 2000
#define TEN 1000
#define FIVE 500
#define SINGLE 100
#define QUARTER 25
#define DIME 10
#define NICKEL 5
#define PENNY 1
void main(void)
{
int round(double num)
{
return (int) (num + 0.5);
}
int change, // to be paid, in cents
twenties, tens, fives, singles, quarters, dimes, nickels, pennies;
//bills and coins used
double cost, // item cost, in dollars and cents
paid; // amount paid, in dollars and cents
change = round((paid - cost) * 100.0);
//Ask for cost
printf("Enter amount cost ($): ");
scanf("%lf", &cost);
//Ask for amount paid
printf("Enter amount tendered ($): ");
scanf("%lf", &paid);
//Change list
printf("Change is: %d\n", change);
printf("$20 bills: %d\n", twenties);
printf("$10 bills: %d\n", tens);
printf("$5 bills: %d\n", fives);
printf("$1 bills: %d\n", singles);
printf("Quarters: %d\n", quarters);
printf("Dimes: %d\n", dimes);
printf("Nickels: %d\n", nickels);
printf("Pennies: %d\n", pennies);
//Calculations
twenties = (change / TWENTY);
change = (change % TWENTY);
tens = (change / TEN);
change = (change % TEN);
fives = (change / FIVE);
change = (change % FIVE);
singles = (change / SINGLE);
change = (change % SINGLE);
}
1 ответ
Основная проблема заключается в том, что вы действительно распечатываете неинициализированные переменные:
// Here they are:
int change, twenties, tens, fives, singles, quarters, dimes, nickels, pennies;
// Then you print it out, still unitialized:
printf("$20 bills: %d\n", twenties);
// Then you give it a value
twenties = (change / TWENTY);
Операторы внутри блока выполняются в том же порядке, что и операторы. Назначение представляет собой немедленный расчет; это не настройка формулы для будущего (или прошлого) применения.
Чтобы это исправить, вам нужно переместить все операторы присваивания (twenties =
и т. д.) до printf
заявления.
Вы делаете ту же ошибку с change
, Сначала вы пишете:
// here "paid" and "cost" are uninitialized
change = round((paid - cost) * 100.0);
а затем вы даете им значения:
// too late, horse has bolted
scanf("%lf", &cost);
scanf("%lf", &paid);
Суммы должны быть введены до расчета изменения. Что должно быть до того, как монеты будут рассчитаны по изменению.
Еще одна вещь заключается в том, что round
Функция должна быть перемещена до начала main()
, В Стандарте С запрещено иметь определения вложенных функций.