C.检查浮点输入的小数位数

C.检查浮点输入的小数位数,c,error-checking,C,Error Checking,早上好。我编写的代码用于计算事务中给定的更改量,仅更改部分,忽略纸面更改。我想做一个错误检查,以确保用户输入的#不超过小数点后2位。这是我的密码 #include <stdio.h> #include <stdlib.h> void intro(); void instructions(); void getvalues(float *owe, float *paid); float totalchange(float *owe, float *paid); void q

早上好。我编写的代码用于计算事务中给定的更改量,仅更改部分,忽略纸面更改。我想做一个错误检查,以确保用户输入的#不超过小数点后2位。这是我的密码

#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;
}
#包括
#包括
void intro();
无效指令();
作废价值(浮动*欠,浮动*付);
浮动总额变化(浮动*欠,浮动*付);
空舱(浮动*变更);
空一角硬币(浮动*变化);
无效镍币(浮动*变化);
空便士(浮动*兑换);
int main()
{
浮动欠款=0.0,已付=0.0,变动;
INTA=2;
简介();
指令();
printf(“是否继续?\n1:继续\n0:退出\n”);
scanf(“%i”和“&a”);
如果(a==0)
出口(0);
while(a==1){
获取价值(欠、付、付);
当(欠>付)
获取价值(欠、付、付);
变更=总变更(欠、付);
宿舍(更换);
一角硬币(零钱);
镍币(零钱);
便士(零钱);
printf(“是否要进行另一次计算?\n1:继续\n0:退出\n”);
scanf(“%i”和“&a”);
}
返回0;
}
void intro(){
printf(“程序:家庭作业1第1部分:更改计算器\n作者:Jason Golightly\n日期:5-13-15\n版本1.0\n\n”);
}
无效指令(){
printf(“此程序旨在计算购买后所给零钱的硬币比例。\n”);
printf(“出现提示时,请输入购买金额和支付金额。\n支付的金额必须超过购买金额。\n”);
}
作废getvalues(浮动*欠下,浮动*支付){
printf(“请以美元/美分的格式输入金额\n\n采购金额?\n”);
scanf(“%f”,欠下);
printf(“\n已付金额?\n”);
scanf(“%f”,已付);
printf(“\n”);
如果(*欠款>*已支付)
printf(“错误。请输入有效金额。\n”);
如果(*欠==*已支付)
printf(“您已经给出了确切的更改。\n”)
}
浮动总额变化(浮动*欠下,浮动*已付){
INTA;
a=(*已付-*欠)*100;
a=a%100;
printf(“总变更=%i\n”,a);
返回a;
}
空舱(浮动*变更){
int-q;
q=*变化/25;
printf(“季度=%i\n”,q);
*变化=*变化-25*q;
}
空一角硬币(浮动*变化){
int d;
d=*变化/10;
printf(“一角硬币=%i\n”,d);
*变化=*变化-10*d;
}
无效镍币(浮动*更换){
int n;
n=*变化/5;
printf(“镍币=%i\n”,n);
*变化=*变化-5*n;
}
空便士(浮动*兑换){
INTP;
p=*变化/1;
printf(“便士=%i\n\n”,p);
*变化=*变化-1*p;
}
另外,如果您没有注意到,我对编程相当陌生。如果你看到我还有什么可以做得更好的,请随时指出


感谢Jason,避免精确浮点计算的简单方法是将输入读取为字符串,将其解析为
int
,并将其显示为*##

i、 e

这个实际数字基本上是美元*100+美分-这是一个
int
。 现在执行所有计算并如下显示:

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

在<代码>解析> /代码>例程中,在遇到<代码>后,只考虑前两个数字。< /代码>


是C中解析例程的一个示例。

只是几句警告,与您的问题无关:使用浮点变量进行货币操作适用于简单的学校练习,而不是在现实生活中,因为固有的舍入问题。此外,由于四舍五入,在比较相等或不相等时,您应该小心,因为两个应该相等的浮点变量实际上可能不相等。至于您的问题,使用标准的
scanf
函数,您无法阻止用户输入比您想要的更多的数字。您可能必须自己一次读取和解析一个字符的输入。@Joachim。我知道你在说什么,因为事实上,我大部分时间都在犯错误,正因为如此。如果我投入3.45美元,价值实际上会变成3.4500005美元,或者类似的东西。那么,如何在不使用浮动的情况下实现这一点呢?您必须使用浮动,这可能超出了您的任务范围。
float f = (float)actual_number/100.f ;
printf("%.2f", f);