| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1628 人关注过本帖
标题:新手求解惑,while用getchar作判断条件与switch语句的问题
只看楼主 加入收藏
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
结帖率:50%
收藏
 问题点数:0 回复次数:11 
新手求解惑,while用getchar作判断条件与switch语句的问题
这是我从VC里直接拷过来的 中文有点乱码 不过应该不影响运行

程序是一个简单的工资系统
用getchar函数在while语句中作判断条件
然后循环体里用switch语句
理想状态是输入1-4,程序计算出结果,然后再次出现提示界面,再次输入
错误输入情况下进入default 然后提示再次输入
只到输入5,退出循环

可实际情况是
输入1-4后,虽然会正确计算出结果,但接着又执行了default语句提示输入错误,然后才是继续输入
调试了很久也不知道问题出在哪了



#include <stdio.h>

#define A 8.75
#define B 9.33
#define C 10.00
#define D 11.20
#define tax_1 0.15
#define tax_2 0.20
#define tax_3 0.25

void ch7_8(void);

int main(void)
{
    ch7_8();
    return 0;
}

void ch7_8(void)
{
    printf("*************************************************************************\n");
    printf("Enter the number corresponding to the desired pay rate or action:\n");
    printf("1) $8.75/hr                2) $9.33/hr\n");
    printf("3) $10.00/hr                4) $11.20/hr\n");
    printf("5) quit\n");
    printf("*************************************************************************\n");
    char chr;
    double time;
    double pay1,pay2;
    while( (chr=getchar())!='5' )
    {
        printf("chr111=%c\n",chr);
        switch(chr)
        {
            case '1':
                printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&sup1;¤×÷&Ecirc;±&frac14;&auml;&pound;&ordm;");
                scanf("%lf",&time);
                if(time<=40.0)
                    pay1=time*A;
                else
                    pay1=(40.0+(time-40.0)*1.5)*A;
                if(pay1>450.0)
                    pay2=pay1-(300.0*tax_1+150.0*tax_2+(pay1-450.0)*tax_3);
                else
                {
                    if(pay1<=450.0 && pay1>300.0)
                        pay2=pay1-(300.0*tax_1+(pay1-300)*tax_2);
                    else
                        pay2=pay1-pay1*tax_1;
                }
                printf("&Auml;ú&micro;&Auml;&Euml;°&ordm;ó&sup1;¤×&Ecirc;&Icirc;&ordf;&pound;&ordm;%lf\n",pay2);
                break;
            case '2':
                printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&sup1;¤×÷&Ecirc;±&frac14;&auml;&pound;&ordm;");
                scanf("%lf",&time);
                if(time<=40.0)
                    pay1=time*B;
                else
                    pay1=(40.0+(time-40.0)*1.5)*B;
                if(pay1>450.0)
                    pay2=pay1-(300.0*tax_1+150.0*tax_2+(pay1-450.0)*tax_3);
                else
                {
                    if(pay1<=450.0 && pay1>300.0)
                        pay2=pay1-(300.0*tax_1+(pay1-300)*tax_2);
                    else
                        pay2=pay1-pay1*tax_1;
                }
                printf("&Auml;ú&micro;&Auml;&Euml;°&ordm;ó&sup1;¤×&Ecirc;&Icirc;&ordf;&pound;&ordm;%lf\n",pay2);
                break;
            case '3':
                printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&sup1;¤×÷&Ecirc;±&frac14;&auml;&pound;&ordm;");
                scanf("%lf",&time);
                if(time<=40.0)
                    pay1=time*C;
                else
                    pay1=(40.0+(time-40.0)*1.5)*C;
                if(pay1>450.0)
                    pay2=pay1-(300.0*tax_1+150.0*tax_2+(pay1-450.0)*tax_3);
                else
                {
                    if(pay1<=450.0 && pay1>300.0)
                        pay2=pay1-(300.0*tax_1+(pay1-300)*tax_2);
                    else
                        pay2=pay1-pay1*tax_1;
                }
                printf("&Auml;ú&micro;&Auml;&Euml;°&ordm;ó&sup1;¤×&Ecirc;&Icirc;&ordf;&pound;&ordm;%lf\n",pay2);
                break;
            case '4':
                printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&sup1;¤×÷&Ecirc;±&frac14;&auml;&pound;&ordm;");
                scanf("%lf",&time);
                if(time<=40.0)
                    pay1=time*D;
                else
                    pay1=(40.0+(time-40.0)*1.5)*D;
                if(pay1>450.0)
                    pay2=pay1-(300.0*tax_1+150.0*tax_2+(pay1-450.0)*tax_3);
                else
                {
                    if(pay1<=450.0 && pay1>300.0)
                        pay2=pay1-(300.0*tax_1+(pay1-300)*tax_2);
                    else
                        pay2=pay1-pay1*tax_1;
                }
                printf("&Auml;ú&micro;&Auml;&Euml;°&ordm;ó&sup1;¤×&Ecirc;&Icirc;&ordf;&pound;&ordm;%lf\n",pay2);
                break;
            default:
                printf("&Auml;ú&micro;&Auml;&Ecirc;&auml;&Egrave;&euml;&Oacute;&ETH;&Icirc;ó&pound;&iexcl;\n");
                break;
        }
        printf("*************************************************************************\n");
        printf("Enter the number corresponding to the desired pay rate or action:\n");
        printf("1) $8.75/hr                2) $9.33/hr\n");
        printf("3) $10.00/hr                4) $11.20/hr\n");
        printf("5) quit\n");
        printf("*************************************************************************\n");
        printf("chr222=%c\n",chr);
    }
}
搜索更多相关主题的帖子: default 运行程序 include 
2013-03-17 23:01
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
好像不能插入图片啊
2013-03-17 23:04
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
程序代码:
#include <stdio.h>

#define A 8.75
#define B 9.33
#define C 10.00
#define D 11.20
#define tax_1 0.15
#define tax_2 0.20
#define tax_3 0.25

void ch7_8(void);

int main(void)
{
    ch7_8();
    return 0;
   // system("pause");
    }

void ch7_8(void)
{
    printf("*************************************************************************\n");
    printf("Enter the number corresponding to the desired pay rate or action:\n");
    printf("1) $8.75/hr                2) $9.33/hr\n");
    printf("3) $10.00/hr                4) $11.20/hr\n");
    printf("5) quit\n");
    printf("*************************************************************************\n");
    char chr;
    double time;
    double pay1,pay2;
    while( (chr=getchar())!='5' )
    {
        printf("chr111=%c\n",chr);
        switch(chr)
        {
            case '1':
                printf("请输入工作时间:");
                scanf("%lf",&time);
                if(time<=40.0)
                    pay1=time*A;
                else
                    pay1=(40.0+(time-40.0)*1.5)*A;
                if(pay1>450.0)
                    pay2=pay1-(300.0*tax_1+150.0*tax_2+(pay1-450.0)*tax_3);
                else
                {
                    if(pay1<=450.0 && pay1>300.0)
                        pay2=pay1-(300.0*tax_1+(pay1-300)*tax_2);
                    else
                        pay2=pay1-pay1*tax_1;
                }
                printf("您的税后工资为:%lf\n",pay2);
                break;
            case '2':
                printf("请输入工作时间");
                scanf("%lf",&time);
                if(time<=40.0)
                    pay1=time*B;
                else
                    pay1=(40.0+(time-40.0)*1.5)*B;
                if(pay1>450.0)
                    pay2=pay1-(300.0*tax_1+150.0*tax_2+(pay1-450.0)*tax_3);
                else
                {
                    if(pay1<=450.0 && pay1>300.0)
                        pay2=pay1-(300.0*tax_1+(pay1-300)*tax_2);
                    else
                        pay2=pay1-pay1*tax_1;
                }
                printf("您的税后工资为:%lf\n",pay2);
                break;
            case '3':
                printf("请输入工作时间");
                scanf("%lf",&time);
                if(time<=40.0)
                    pay1=time*C;
                else
                    pay1=(40.0+(time-40.0)*1.5)*C;
                if(pay1>450.0)
                    pay2=pay1-(300.0*tax_1+150.0*tax_2+(pay1-450.0)*tax_3);
                else
                {
                    if(pay1<=450.0 && pay1>300.0)
                        pay2=pay1-(300.0*tax_1+(pay1-300)*tax_2);
                    else
                        pay2=pay1-pay1*tax_1;
                }
                printf("您的税后工资为%lf\n",pay2);
                break;
            case '4':
                printf("请输入工作时间:");
                scanf("%lf",&time);
                if(time<=40.0)
                    pay1=time*D;
                else
                    pay1=(40.0+(time-40.0)*1.5)*D;
                if(pay1>450.0)
                    pay2=pay1-(300.0*tax_1+150.0*tax_2+(pay1-450.0)*tax_3);
                else
                {
                    if(pay1<=450.0 && pay1>300.0)
                        pay2=pay1-(300.0*tax_1+(pay1-300)*tax_2);
                    else
                        pay2=pay1-pay1*tax_1;
                }
                printf("您的税后工资为%lf\n",pay2);
                break;
            default:
                printf("您的输入有误!\n");
                break;
        }
//        printf("&Auml;ú&micro;&Auml;&sup1;¤×&Ecirc;&micro;&Egrave;&frac14;&para;&Icirc;&ordf;&pound;&ordm;%.2f/hr,&Euml;°&Ccedil;°&sup1;¤×&Ecirc;&Icirc;&ordf;&pound;&ordm;%lf\n",A,pay);
//        printf("&Auml;ú&micro;&Auml;&Euml;°&Ccedil;°&sup1;¤×&Ecirc;&Icirc;&ordf;&pound;&ordm;%lf\n",pay1);
//        printf("&Auml;ú&micro;&Auml;&Euml;°&ordm;ó&sup1;¤×&Ecirc;&Icirc;&ordf;&pound;&ordm;%lf\n",pay2);
        printf("*************************************************************************\n");
        printf("Enter the number corresponding to the desired pay rate or action:\n");
        printf("1) $8.75/hr                2) $9.33/hr\n");
        printf("3) $10.00/hr                4) $11.20/hr\n");
        printf("5) quit\n");
        printf("*************************************************************************\n");
        printf("chr222=%c\n",chr);
    }
}

这是把乱码改过之后的代码
2013-03-17 23:10
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

运行结果是这样的。。。
那几个chr=的输出语句我是用来检测chr的变化的
2013-03-17 23:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
getchar()是会读入回车的,它进入了default分支。

授人以渔,不授人以鱼。
2013-03-17 23:12
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
回复 5楼 TonyDeng
那它是在什么时候读入的啊
我用单步调试的时候发现chr的值改变的 就是不知道是什么时候在哪里改变的
2013-03-17 23:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
getchar()是在键盘输入数据按下回车后开始读入数据的,比如你输入1<Enter>,第一个getchar()读入'1',第二个getchar()读入'\n'。getchar(),你不按回车,程序不会继续执行,换言之,你按下1234<Enter>,也是可能的,这个时候,程序就每个getchar()读一个字符。这样,你明白这种程序设计的暗病在哪里了吗?

授人以渔,不授人以鱼。
2013-03-17 23:24
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
回复 7楼 TonyDeng
恩 发现问题在哪了
可是不知道要怎么改
要加个诸如'#'之类的作输入结束符可以吗
或者有更好的方法
2013-03-17 23:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
用循环读getchar(),直至遇到'\n'为止,然后只使用第一个读入的字符,其余的全部舍弃不要——但要注意检查第一个是不是'\n',用户有可能什么也不输入就直接敲回车。

本来有更好的读键盘函数,但那是跟平台有关的,对非要守标准的人来说,他们接受不了,所以就不教你了。

授人以渔,不授人以鱼。
2013-03-17 23:30
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
回复 7楼 TonyDeng
刚改了一下
加了个个 case'\n':break;
然后把最后的几行printf注释了就达到设计要求了
不知道还有什么更好的方法?
2013-03-17 23:31
快速回复:新手求解惑,while用getchar作判断条件与switch语句的问题
数据加载中...
 
   



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

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