| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2042 人关注过本帖, 1 人收藏
标题:新年好,请指教,谢谢。
只看楼主 加入收藏
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:0 
谢夸奖
2013-02-09 21:47
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:0 
程序代码:
#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;
}


代码已完成,请高手看看注释处的问题

[ 本帖最后由 心灯甚亮 于 2013-2-9 23:20 编辑 ]
2013-02-09 22:11
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:0 
上述代码中
sizeof(foodMenu)的值是16(4个指针的字节数),sizeof(drinkMenu)的值是8(2个指针的字节数),按说除以4就能正确执行的,但不能。。。。。。
2013-02-09 23:27
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:0 
说实话,这段代码的确不很清晰,大家将就着看
2013-02-09 23:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
呵呵,实际操作一下就知道效果了嘛,当自己是收银员,想像顾客会怎么购物。
你那注释的问题,sizeof()算的是参数的数据类型尺寸,你传入的那个参数是指针,sizeof()它就只能得到指针的尺寸,不是数组的尺寸。

授人以渔,不授人以鱼。
2013-02-09 23:39
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:0 
嗯,按T版说的,注释处的问题就不难理解了,但是我单独输出sizeof它们的值,却是16与8
2013-02-09 23:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你foodMenu储存的就是4个指针呀,每个指针是4byte,求出4个元素,就是16了。
drinkMenu也是这样,那里是2个指针。(题目说有3种饮料,不是2种)

[ 本帖最后由 TonyDeng 于 2013-2-9 23:47 编辑 ]

授人以渔,不授人以鱼。
2013-02-09 23:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
汉堡要追加一种食品的处理呢,你没了。

授人以渔,不授人以鱼。
2013-02-09 23:47
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:0 
回复 17楼 TonyDeng
既然这样,sizeof(它们),再除以4,就应该得到4以及2,就不会出现越界问题,可还是出现了啊,,,,
(我反应并不快嘛,呵呵)
2013-02-09 23:48
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:0 
有点晕,休息一会我再写
2013-02-09 23:49
快速回复:新年好,请指教,谢谢。
数据加载中...
 
   



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

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