| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1749 人关注过本帖, 1 人收藏
标题:一段需要修改的C++程序,大家有兴趣的看看
只看楼主 加入收藏
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
结帖率:96.55%
收藏(1)
已结贴  问题点数:20 回复次数:16 
一段需要修改的C++程序,大家有兴趣的看看
今天有人问我这样一个问题,我把它放在这里大家一起看看吧。
程序代码:
#include <iostream>
#include <string>
int main()
{
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;

    string str_c = "carnivore";
    string str_p = "pianist";
    string str_t = "tree";
    string str_g = "game";
    string str_prefix = "A maple is a ";
    string str_reInputInfo = "Please enter a c, p, t, or g: ";
    char ch;
    bool bool_hasInput = false;

    cout << "Please enter one of the following choices:" << endl;
    cout << "c) " << str_c << "\t\t\t"
        << "p) " << str_p << "\n"
        << "t) " << str_t << "\t\t\t\t"
        << "g) " << str_g << "\n";
    do
    {
        while (cin >> ch)
        {
            switch(ch)
            {
            case 'c':cout << str_prefix + str_c + '.'; goto label;
            case 'p':cout << str_prefix + str_p + '.'; goto label;
            case 't':cout << str_prefix + str_t + '.'; goto label;
            case 'g':cout << str_prefix + str_g + '.'; goto label;
            }
            cout << str_reInputInfo;
        }
        cin.clear();
    }while(1);
    label:

    return 0;
}
问题:(1)能否修改程序让程序不使用goto语句?
      (2)这个程序可以避免全部的数字、符号、无效字母和多数像ctrl+C这样的输入,可不能避免ctrl+Z的输入,当输入ctrl+Z后不能按预期的那样提示信息。如何修改程序?
搜索更多相关主题的帖子: 兴趣 
2010-12-08 23:10
Lyone
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:99
专家分:195
注 册:2010-12-7
收藏
得分:3 
1:label后面就一个return 0 了?那就直接把goto label写成return 0 不行么?
2010-12-09 13:56
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
你说的也可以,但我放在帖子里的程序是我把源程序(源程序是一个非常庞大的程序段)极度精简后的程序,如果在源程序中使用这样的修改,不利于阅读,而且稍有不慎会出现程序流程上的逻辑错误,所以我们一般不在程序的中间,尤其是在main()函数这样的重要函数的中间添加程序的出口。
2010-12-09 18:39
xin310923
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:203
专家分:325
注 册:2009-12-22
收藏
得分:3 
你说的也不是不行,但你在中间添加程序的出口后是不是会影响整个程序的运行呢,或者改变程序原意。
2010-12-09 22:08
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:4 
这就用 goto 也没事。这个地方就(至少你给的这个程序)就属于用 goto 反而使程序的流程更清晰的一个例子。
2010-12-09 23:25
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:4 
同意楼上的看法.
这里如果不用goto似乎没有更好的方法!

值得大家一起来讨论一下。

我置顶了。


[ 本帖最后由 南国利剑 于 2010-12-10 00:51 编辑 ]

南国利剑
2010-12-10 00:48
makebest
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:658
专家分:962
注 册:2005-3-17
收藏
得分:5 
要不用 gogo 就要多写些语句了, 定义一个变量, 加到循环控制条件中, 在 goto 的地方给这个变量赋值就可以退出循环了
要避免 ctrl-Z 就不行了, 因为这个按键有特殊功能, 不会被程序接收, 它表示输入结束,  cin>>ch 条件不成立.
2010-12-10 09:17
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
收藏
得分:1 
程序代码:
class CCmdProc;
typedef void (CCmdProc::*PFUN)();
struct CmdProc
{
    char cCmd[15];
    char cInfo[15];
    PFUN pfun;
};

程序代码:
CmdProc obj[] = {
    {"help",        "查询命令",       CCmdProc::help   },
    {"exit",        "退出程序",    CCmdProc::exit   },
    {"create",        "创建链表",    CCmdProc::create },
    {"add",         "添加节点",    CCmdProc::add    },
    {"del",         "删除节点",    CCmdProc::del    },
    {"insert",      "插入节点",    CCmdProc::insert },
    {"clear",       "清空链表",    CCmdProc::clear  },
    {"size",        "查询人数",    CCmdProc::size   },
    {"pass",        "查询及格",    CCmdProc::pass   },
    {"find",        "查询信息",    CCmdProc::find   },
    {"show",        "显示信息",    CCmdProc::show   },
    {"fail",        "显示不及格",  CCmdProc::fail   }
};

const int g_size = sizeof(obj)/sizeof(CmdProc);

程序代码:
void CCmdProc::MenuProc()
{
    //Bar();
    help();
    while(1)
    {
        cout<<'>';
        CwjbString CTemp;
        cin>>CTemp;
        for(int i = 0; i < g_size; i++)
        {
            if(obj[i].cCmd == CTemp)
            {
                (this->*obj[i].pfun)();
                break;
            }
        }
        if(i == g_size)
        {
            cout<<"找不到该命令!"<<endl;
        }
    }
}
2010-12-10 21:07
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
收藏
得分:0 
while(a && b)
2010-12-10 21:23
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
感谢各位朋友能够关注我提出的这个问题,谢谢大家。
2010-12-11 21:02
快速回复:一段需要修改的C++程序,大家有兴趣的看看
数据加载中...
 
   



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

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