2015-05-10 4 views
1

Доброе утро. Код, который я написал, предназначен для расчета суммы изменения, указанной в транзакции, только для части изменения, изменение бумаги игнорируется. Я хотел бы выполнить проверку ошибок, чтобы убедиться, что введенный пользователем # не превышает 2 десятичных знаков. Это мой код.C. Проверить ввод поплавка на определенное количество знаков после запятой

#include <stdio.h> 
#include <stdlib.h> 
void intro(); 
void instructions(); 
void getvalues(float *owe, float *paid); 
float totalchange(float *owe, float *paid); 
void quarters (float *change); 
void dimes (float *change); 
void nickels (float *change); 
void pennies (float *change); 

int main() 
{ 
    float owe = 0.0, paid = 0.0, change; 
    int a = 2; 
    intro(); 
    instructions(); 

     printf("Would you like to continue?\n1: Continue\n0: Exit\n"); 
     scanf("%i", &a); 
     if (a== 0) 
      exit(0); 

     while (a == 1){ 
      getvalues(&owe, &paid); 
      while (owe > paid) 
       getvalues(&owe, &paid); 
      change = totalchange(&owe, &paid); 
      quarters (&change); 
      dimes (&change); 
      nickels (&change); 
      pennies (&change); 

      printf("Would you like to make another calculation?\n1: Continue\n0: Exit\n"); 
      scanf("%i", &a); 
    } 

    return 0; 
} 

void intro(){ 
    printf("Program: Homework 1 Part 1 :: Change Calculator\nAuthor: Jason Golightly\nDate:5-13-15\nVersion 1.0\n\n"); 
} 


void instructions(){ 
    printf("This program is designed to calculate the coin\nportion of the change given after a purchase.\n"); 
    printf("When prompted, please enter the purchase amount and the amount paid.\nThe amount paid must exceed the purchase amount.\n"); 
} 

void getvalues(float *owe, float *paid){ 

     printf("Please enter the amounts in a dollars.cents fashion\n\nPurchase amount?\n"); 
     scanf("%f", owe); 
     printf("\nAmount paid?\n"); 
     scanf("%f", paid); 
     printf("\n"); 
     if (*owe > *paid) 
      printf("ERROR. Please enter valid amounts.\n"); 
     if (*owe == *paid) 
      printf("You have given exact change.\n") 

} 

float totalchange(float *owe, float *paid){ 
    int a; 
    a = (*paid - *owe)*100; 
    a = a % 100; 
    printf("total change = %i\n",a); 
    return a; 
} 
void quarters (float *change){ 
    int q; 
    q = *change/25; 
    printf("Quarters = %i\n", q); 
    *change = *change - 25*q; 
} 
void dimes (float *change){ 
    int d; 
    d = *change/10; 
    printf("Dimes = %i\n", d); 
    *change = *change - 10*d; 
} 

void nickels (float *change){ 
    int n; 
    n = *change/5; 
    printf("Nickels = %i\n", n); 
    *change = *change - 5*n; 
} 
void pennies (float *change){ 
    int p; 
    p = *change/1; 
    printf("Pennies = %i\n\n", p); 
    *change = *change - 1*p; 
} 

Также, если вы не заметили, я довольно новичок в программировании. Если вы увидите что-нибудь еще, что я мог бы сделать лучше, пожалуйста, не стесняйтесь указать на это.

Спасибо, Джейсон

+0

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

+0

Что касается вашей проблемы, используя стандартную функцию 'scanf', вы не сможете остановить ввод пользователем большего количества цифр, чем вы хотите. Вам, вероятно, придется читать и разбирать входной символ за раз. –

+0

@ Joachim. Я знаю, что вы говорите, потому что я на самом деле получаю неправильные значения большую часть времени и из-за этого. Если я ставлю $ 3,45, значение фактически станет 3.4500005 или что-то в этом роде. Итак, как это сделать, не используя поплавок? –

ответ

1

На простом подходе избежать расчета в -точном с плавающей точкой, чтобы прочитать входные данные в виде строки, разобрать его в int, а также отображать его в формате *. ##

т.е.

char number[11]; 
scanf("%10s", number); 
int actual_number = parse(number); // parse the string here. 

Это фактическое число в основном доллар * 100 + центов - который является int. Теперь выполнять все вычисления и отображения, как это:

float f = (float)actual_number/100.f ; 
printf("%.2f", f); 

В parse рутиной, вы только рассмотреть первые две цифры после столкновения с .

Here пример подпрограммы синтаксического анализа в С.

Смежные вопросы