| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 524 人关注过本帖
标题:初学者提问:超初级习题求解
只看楼主 加入收藏
zig219
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-5-29
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
初学者提问:超初级习题求解
刚刚学C,采用书籍是 Ivor Horton 的《C语言入门经典》第四版。问题来自书中第三章篇尾的习题4.

原题:
习题3.4 修改本章最后的计算器例子,让用户选择输入y或Y,以执行另一个计算,输入n或N就结束程序。(注意:这需要实用goto语句,下一章将介绍一个更好的方法。)

我的代码是:

#include <stdio.h>

int main(void)
{
    //declare variables
    double operand_1 = 0.0;
    double operand_2 = 0.0;
    char operator = 0;
    char restart = 0;
   
    //input algorithm
    again: printf("Please enter your algorithm: ");
    scanf("%lf %c %lf",&operand_1,&operator,&operand_2);
   
    //calculations
    switch (operator) {
        case '+':
            printf("= %.2lf\n\n",operand_1 + operand_2);
            goto yn;
            break;
            
        case '-':
            printf("= %.2lf\n\n",operand_1 - operand_2);
            goto yn;
            break;
            
        case '*':
            printf("= %.2lf\n\n",operand_1 * operand_2);
            goto yn;
            break;
            
        case '/':
            if (operand_2 == 0) {
                printf("Can't divide by 0, please try again.\n\n");
                goto again;
            } else {
                printf("= %.2lf\n\n",operand_1 / operand_2);
                goto yn;
            }
            break;
            
        default:
            printf("Incorrect operator, please try again.\n\n");
            goto again;
            break;
    }
   
    //continue or not
    yn:
        printf("Would you like to continue? (Y/N)\n\n");
        scanf("%c",&restart);
   
        if (restart == 'y' || restart == 'Y'){
            goto again;
        }else if (restart == 'n' || restart == 'N'){
            return 0;
        }else{
            printf("invalid charactor, please enter \"Y\" or \"N\".\n\n");
            goto yn;
        }
   
    return 0;
}

Run的结果是这样:

Please enter your calculation: 1+1
= 2.00

Would you like to continue? (Y/N)

invalid charactor, please enter "Y" or "N".

Would you like to continue? (Y/N)

进行一次计算后,显示“Would you like to continue? (Y/N)”,然后没有输入"Y" 或 "N"的机会,直接就执行后边的if-else,得到结果“invalid charactor, please enter "Y" or "N".”,再次 goto yn,才停下来让人输入Y/N。

我觉得问题可能出在:从switch方法中的语句 goto yn 之后,printf();后边的scanf();没有执行。可是。。。这是为啥啊。。。难道还有其它问题?我检查了几遍代码,以现有知识没有发现什么明显错误(小弟还没学到循环呢。。。)。

求前辈们帮忙指点。
搜索更多相关主题的帖子: 计算器 include double C语言 
2014-05-29 13:26
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:20 
没看过你用的参考书, 不知道你是否已经看到scanf()相关内容.  

你的程序中添加一句就可以了
程序代码:
   
    //input algorithm
    again: printf("Please enter your algorithm: ");
    scanf("%lf %c %lf",&operand_1,&operator,&operand_2);
    getchar();                      //添加的内容在这里.
    //calculations
    switch (operator) {


原因是在你输入完你的计算内容后敲了一次回车,然后系统连同回车一块送入输入缓冲区, 当执行到
 printf("Would you like to continue? (Y/N)\n\n");
        scanf("%c",&restart);                            //这里
    
        if (restart == 'y' || restart == 'Y'){


注释中"这里"的时候,  scanf()就把回车键给读入了,结果就执行
 printf("invalid charactor, please enter \"Y\" or \"N\".\n\n");
            goto yn;
        

所以就得到了你的结果.  

添加getchar()后, 把第一次输入的回车符给吸收了,输入缓冲区里就没有东西了,然后再执行到
程序代码:
printf("Would you like to continue? (Y/N)\n\n");
        scanf("%c",&restart);                            //这里
    
        if (restart == 'y' || restart == 'Y')

的时候才会等待你的输入.  getchar()吸收回车符是常见的用法.
收到的鲜花
  • zig2192014-05-29 14:21 送鲜花  3朵   附言:回复速度快,解惑到位,清晰易懂。

代码测试环境:  WinXP+C-Free5.0.
2014-05-29 13:38
zig219
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-5-29
收藏
得分:0 
太感谢了! 病因、病理、解药一应俱全~
2014-05-29 14:18
zig219
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-5-29
收藏
得分:0 
我学过的内容中,scanf()没有详细的说明,只知道有这么种方法可以用。 getchar()也没出现过,更不知道回车也会进入输入缓冲区。多谢前辈介绍这些知识。
2014-05-29 14:45
快速回复:初学者提问:超初级习题求解
数据加载中...
 
   



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

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