| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1754 人关注过本帖
标题:C实现的超市收款程序,但总是少收一分钱,什么原因啊?这样下去要赔死的。。 ...
只看楼主 加入收藏
wxjoy0423
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2012-7-18
收藏
 问题点数:0 回复次数:15 
C实现的超市收款程序,但总是少收一分钱,什么原因啊?这样下去要赔死的。。。
大牛给看下
题目要求如上,源程序如下:
    float money;
    int n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10;  //分别表示要收100 50 20 10 5 2 1 0.5 0.1 0.05 0.01的张数
    printf("input the totalmoney :");
    scanf("%f",&money);
   
    if
        ((int)money/100>=0)
    {
   
        n0=(int)money/100;
    }
    else{
        printf("input error");
    }
      
    n1=(money-n0*100)/50;
    n2=(money-n0*100-n1*50)/20;
    n3=(money-n0*100-n1*50-n2*20)/10;
    n4=(money-n0*100-n1*50-n2*20-n3*10)/5;
    n5=(money-n0*100-n1*50-n2*20-n3*10-n4*5)/2;
    n6=(money-n0*100-n1*50-n2*20-n3*10-n4*5-n5*2)/1;
    n7=(money-n0*100-n1*50-n2*20-n3*10-n4*5-n5*2-n6)/0.5;
    n8=(money-n0*100-n1*50-n2*20-n3*10-n4*5-n5*2-n6-n7*0.5)/0.1;
    n9=(money-n0*100-n1*50-n2*20-n3*10-n4*5-n5*2-n6-n7*0.5-n8*0.1)/0.05;
    n10=(money-n0*100-n1*50-n2*20-n3*10-n4*5-n5*2-n6-n7*0.5-n8*0.1-n9*0.05)/0.01;
   
    printf("We need %d张100元 %d张50元 %d张20元 %d张10元 %d张5元 %d张2元 %d张1元 %d张5角 %d张1角 %d张5分 %d张1分\n",n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10);
搜索更多相关主题的帖子: 100 源程序 money 
2012-07-19 08:16
xchieftain
Rank: 2
等 级:论坛游民
帖 子:5
专家分:12
注 册:2012-7-19
收藏
得分:0 
你去试下在scanf("%f",&money);下面加一句
printf("\nmoney=%f\n",money); 那么你就知道为什么了;解决办法: 把float 换成 double
2012-07-19 11:15
ly2222
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:217
专家分:618
注 册:2012-6-15
收藏
得分:0 
路过,帮顶。
2012-07-19 22:08
jtx0329
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2012-07-19 23:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
没仔细测试你的程序,但看代码,估计是运算失去精度。我换了一种数据类型,没发现问题:

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 TonyDeng 于 2012-7-20 11:21 编辑 ]

授人以渔,不授人以鱼。
2012-07-20 05:11
奋斗猪
Rank: 2
来 自:奋斗的途中
等 级:论坛游民
帖 子:43
专家分:91
注 册:2012-7-4
收藏
得分:0 
学习了,原来收款问题可以这样解决。
还有精度问题,呵呵

贵在坚持!
2012-07-20 06:34
blza3127672
Rank: 2
等 级:论坛游民
帖 子:13
专家分:13
注 册:2012-7-19
收藏
得分:0 
我测试你的程序,没发现那里有问题。。。
建议你把5分和1分去掉吧,现在社会不用5分钱和1分了、、
我从你哪里的程序改了下。。结果还是一样。。错的话说说。。
还有那个if语句去掉了。。我觉得不需要。。如果你觉得需要跟我说说。

# include <stdio.h>
int main (void)
{
    float money;
    int n0,n1,n2,n3,n4,n5,n6,n7,n8;  //分别表示要收100 50 20 10 5 2 1 0.5 0.1的张数
    printf ("input the totalmoney :");
    scanf ("%f",&money);

    n0 = (money / 100)
    n1 = (money - n0*100) / 50;
    n2 = (money - n0*100-n1*50) / 20;
    n3 = (money - n0*100-n1*50-n2*20) / 10;
    n4 = (money - n0*100-n1*50-n2*20-n3*10) / 5;
    n5 = (money - n0*100-n1*50-n2*20-n3*10-n4*5) / 2;
    n6 = (money - n0*100-n1*50-n2*20-n3*10-n4*5-n5*2) / 1;
    n7 = (money - n0*100-n1*50-n2*20-n3*10-n4*5-n5*2-n6) / 0.5;
    n8 = (money - n0*100-n1*50-n2*20-n3*10-n4*5-n5*2-n6-n7*0.5) / 0.1;
      
    printf ("We need\n %d张100元\n %d张50元\n %d张20元\n %d张10元\n %d张5元\n %d张2元\n %d张1元\n %d张5角\n %d张1角\n",n0,n1,n2,n3,n4,n5,n6,n7,n8);
    return 0;
}
2012-07-20 08:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
更换的数据类型是Decimal,128位的,精度达28位,是FCL专门用于金融领域而设计的数据类型(另外有BigInteger大数类型),这种是没有精度损失的。我写CLR版本的C/C++不熟,用C#的代码如下:

程序代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace test2
{
    class Program
    {
        // 货币数据结构
        class Money
        {
            public Decimal Denomination;    // 面额
            public Int32 Quantity;          // 数量
        }

        static List<Money> data = new List<Money>()
            {
                new Money() { Denomination = 100M, Quantity = 0 },
                new Money() { Denomination = 50M, Quantity = 0 },
                new Money() { Denomination = 20M, Quantity = 0 },
                new Money() { Denomination = 10M, Quantity = 0 },
                new Money() { Denomination = 5M, Quantity = 0 },
                new Money() { Denomination = 2M, Quantity = 0 },
                new Money() { Denomination = 1M, Quantity = 0 },
                new Money() { Denomination = 0.5M, Quantity = 0 },
                new Money() { Denomination = 0.2M, Quantity = 0 },
                new Money() { Denomination = 0.1M, Quantity = 0 },
                new Money() { Denomination = 0.05M, Quantity = 0 },
                new Money() { Denomination = 0.02M, Quantity = 0 },
                new Money() { Denomination = 0.01M, Quantity = 0 }
            };

        static void Main(string[] args)
        {
            Decimal total;
            do
            {
                Console.Write("请输入金额:");
            } while (!Decimal.TryParse(Console.ReadLine(), out total));

            Console.WriteLine("\n总金额: {0:N}", total);
            Console.WriteLine("需要货币列表:");
            for (Int32 index = 0; index < data.Count; ++index)
            {
                data[index].Quantity = Decimal.ToInt32(total / data[index].Denomination);
                total -= data[index].Denomination * data[index].Quantity;
                Console.WriteLine("{0,4}: {1}",
                    data[index].Denomination,
                    (data[index].Quantity != 0) ? data[index].Quantity.ToString() : "");
            }

            Console.Write("\n按<Enter>键结束程序...");
            Console.ReadLine();
        }
    }
}


你尝试三点:
1.先按我这里的算法用C测试结果,看还有没有丢失数据;
2.如果上面测试仍然无法解决问题,就要改数据类型,必须使用.NET的类库编程;
3.如果实在不能用.NET编程,考虑把数据乘以100转换为整数做整数运算,不要使用浮点数。

授人以渔,不授人以鱼。
2012-07-20 11:36
wxjoy0423
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2012-7-18
收藏
得分:0 
回复 8楼 TonyDeng
用第三点就行了 数据直接乘以100 用int类型的就能解决
2012-07-20 11:59
wxjoy0423
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2012-7-18
收藏
得分:0 
回复 2楼 xchieftain
试过了 double类型的也有这个问题
2012-07-20 12:00
快速回复:C实现的超市收款程序,但总是少收一分钱,什么原因啊?这样下去要赔死 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020664 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved