| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 301 人关注过本帖
标题:各水平阶段的都看一下哈
只看楼主 加入收藏
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
结帖率:100%
收藏
已结贴  问题点数:35 回复次数:7 
各水平阶段的都看一下哈
程序代码:
#include <stdio.h>

#define TAX 0.05

char *foodMenu[]= {"fish","chips","hamburgers","with cheese"};
float foodPrice[]= {3.00,2.00,3.00,4.00};
int foodOrder[]= {0,0,0,0};

char *drinkMenu[]= {"soft drinks","coffees or teas"};
float drinkPrice[]= {1.00,1.00};
int drinkOrder[]= {0,0};

int OrderFood(char ** foodMenu,int foodOrder[]);
float ComputeFood(int foodOrder[]);

int OrderDrink(char ** drinkMenu,int drinkOrder[]);
float ComputeDrink(int drinkOrder[]);

int main(void)
{
    do {
        system("cls");
        printf("CFOOD FISH && CHIPS && BURGERS\n\n");
        OrderFood(foodMenu,foodOrder);
        OrderDrink(drinkMenu,drinkOrder);

        float priceFood=ComputeFood(foodOrder);
        float priceDrink=ComputeDrink(drinkOrder);
        float priceTotal=priceFood+priceDrink;
        float tax=TAX*priceTotal;
        float owing=priceTotal*(1.0+TAX);

        printf("Total Food\t%5.2f\n",priceFood);
        printf("Total Drink\t%5.2f\n",priceDrink);
        putchar('\n');
        printf("Total Order\t%5.2f\n",priceTotal);
        printf("Tax\t\t%5.2f\n",tax);
        printf("----------------------------\n");
        printf("Total owing\t%5.2f\n",owing);

        float money=0.0;
        float moneyGet;
PAY:
        printf("\nPlease give me the money:");
        while(scanf("%f",&moneyGet)!=1)
            fflush(stdin);
        money+=moneyGet;
        if(money<owing)
            goto PAY;

        printf("Amount tendered\t%.2f\n\n",money);

        float change=money-owing;
        printf("Chang\t\t%5.2f\n",change);

        fflush(stdin);
    } while(getchar()!='N');

    return 0;
}

int OrderFood(char ** foodMenu,int foodOrder[])
{
    printf("--------FOOD\n");
    int i;
    for(i=0; i<sizeof(foodMenu); i++)
    {
        printf("How many orders of %s?\tprice:$%.2f\n",foodMenu[i],foodPrice[i]);
        while(scanf("%d",&foodOrder[i])!=1)
            fflush(stdin);
    }
    putchar('\n');
    return 0;
}

int OrderDrink(char ** drinkMenu,int drinkOrder[])
{
    printf("--------DRINK\n");
    int i;
    for(i=0; i<sizeof(drinkMenu)-2; i++)//这里不减2就会出现越界读取的问题,不知道为什么,在OrderFood函数里也有类似一句,但它工作正常,我猜应该会有隐含的问题,望高手解答,谢谢
    {
        printf("How many %s?\tprice:$%.2f\n",drinkMenu[i],drinkPrice[i]);
        while(scanf("%d",&drinkOrder[i])!=1)
            fflush(stdin);
    }
    putchar('\n');
    return 0;
}

float ComputeFood(int foodOrder[])
{
    float total=0.00;
    int i;
    for(i=0; i<sizeof(foodPrice)/sizeof(float); i++)
    {
        total+=(foodOrder[i]*foodPrice[i]);
        if(i==3)
        {
            total-=(foodOrder[3]*foodPrice[2]);
            total+=(foodOrder[3]*foodPrice[5]);
        }
    }
    return total;
}

float ComputeDrink(int drinkOrder[])
{
    float total=0.00;
    int i;
    for(i=0; i<sizeof(drinkPrice)/sizeof(float); i++)
    {
        total+=(drinkOrder[i]*drinkPrice[i]);
    }
    return total;
}


这是我给下面这个帖子写的解决代码
https://bbs.bccn.net/thread-398467-2-1.html
另立一帖,请高手解决注释中的问题,可用分不多,狠狠抛出35给肯帮我解决问题的高手,就当做给他贺年啦
2013-02-09 23:36
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3452
专家分:19340
注 册:2012-3-31
收藏
得分:5 
看看

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2013-02-10 09:34
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:5 
祝楼主新春愉快
2013-02-10 11:16
phoenix01
Rank: 1
等 级:新手上路
帖 子:1
专家分:5
注 册:2012-12-20
收藏
得分:5 
这里我想 sizeof 返回的是类型 char ** 的长度,并不是想当然 foodMenu 与 drinkMenu 内容的长度。
期待真正了解 sizeof 用法的人解释。
最后,大家新年快乐!
2013-02-10 13:07
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:5 
代码太复杂
2013-02-10 13:19
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:0 
应该说代码太长。。。。耐心看看吧
2013-02-10 13:33
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:15 
很多的问题。祸根在于你将函数形参变量名取的与全局变量名相同,它遮盖了原定义。

你将全局变量传给了形参,这保证你可以正确读到全局变量中的内容,也正因此蒙蔽了你。

但sizeof返回的是形参指针的尺寸,而非全局变量的尺寸。OrderFood函数之所以出现问题那不过纯属巧合,你的全局foodMenu数组中正好有4个元素,而(32位编译器中任何)指针的尺寸也是4字节,数值上相等。而OrderDrink就没那么好运了,它只有两个元素,所以你才有减2这样的困惑。

修改方法,既然使用了全局数组,那还有什么必要通过形参来传递它?删掉该形参。

即使这样问题还没有彻底解决,你sizeof的用法不对。

sizeof返回的是变量以字节为单位的尺寸,对于定长数组,sizeof返回的是数组元素所占用字节数的总合,即数组元素数乘以元素的尺寸。

看你的代码你并不是不知道这一点,下面的两个函数你写的是sizeof(foodPrice)/sizeof(float),怎么上面的两个函数就忘了呢?

最后再说说你的设计。很不合理。

数据是固化在程序里的,哪天这个小餐厅推出了新菜品你还得重新修改代码、重新编译,这个成本也太高了。

更合理的设计是菜单应该独立于程序本身,商业级程序多会使用数据库来存储这一信息,作业级的也至少应该用一个文本文件或二进制文件来存储。

编程说白了就是根据问题设计合理的解决方案。设计合理的解决方案无非即是,设计合理的数据存储格式以及在此格式上的合理的操作方法。

重剑无锋,大巧不工
2013-02-10 14:25
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:0 
谢版主指教,这几天作业多,没时间写了,今年六月会考完我完成这个程序
2013-02-10 14:45
快速回复:各水平阶段的都看一下哈
数据加载中...
 
   



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

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