免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 955 | 回复: 4
打印 上一主题 下一主题

到底哪错了呢??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-13 11:12 |只看该作者 |倒序浏览
#include <iostream.h>;
#define N 200
class string
{
        int n;//用n表示单词个数
        char ch[N];

public:
        void setch();
        void setn();

        void getch();
        void getn();
};


void string::setch()
{
        cout<<"enter the string: ";
        cin.get(ch,N-1);
}
void string::setn()
{
        n=0;
        if(ch[0]!=' ')  n=1;
        for(int i=0;i<(N-2);i++)
        {
                if(ch==' '&&ch[i+1]!=' ')
                {        n++;
cout<<endl<<n<<ch<<ch[i+1]<<'@'<<endl;/*此句为检验n是如何变化而设*/
                }
        }
}



void string::getch()
{
        cout<<ch;
}
void string::getn()
{
        cout<<n;
}



int main()
{
        string st1;
       
        st1.setch();
        st1.setn();

        st1.getch();
        cout<<endl;
        st1.getn();
        cout<<endl;
       
        return 0;
}

如果输入“aaa  bbb abc",程序运行是对的,结果是n=3
但如果输入“aaa  bbb abc   ",结果就是n=4
为什么啊?
并且,我觉得这个程序写的很不好,维护起来很不方便。哪位高手能帮我改一下啊

论坛徽章:
0
2 [报告]
发表于 2004-03-13 16:14 |只看该作者

到底哪错了呢???

原帖由 "逆水的游鱼" 发表:

void string::setn()
{
n=0;
if(ch[0]!=' ') n=1;
for(int i=0;i<(N-2);i++)
{
if(ch==' '&&ch[i+1]!=' ')
{ n++;
cout<<endl<<n<<ch<<ch[i+1]<<'@'<<endl;/*此句为检验n是如何变化而设*/
}
}
}

--------------------------------
//用指针解决单词个数的累计,我没做测试,你自己试一下吧,思想是这样的
void string::setn()
{
n=0;
char *pstr;
pstr=ch;
while(*p) {
while(*p=' ' && *(p+1)!=' '&& *(p+1)){
n++;
}
p++;
}
}

论坛徽章:
0
3 [报告]
发表于 2004-03-14 18:36 |只看该作者

到底哪错了呢???

你应该给出对程序功能的简单描述,便于人们阅读程序。以下说说我对你写的程序的看法。至于你程序中的功能性错误,相信你自己可以解决,我就不说了。

类(class)是对数据以及对这些数据的操作的封装。
数据可以是简单类型的数据(如 int,double, char等)、数组或者类(可以是自定义的类,也可以使用他人提供的类,如C++标准库中的类库)。应该根据需要选择适当的数据类型。
对数据的操作一般是通过类的成员函数来实现的。如对数据的初始化、增加或者删除数据、修改数据、输出数据等等。

你这个程序中处理的数据是字符串。很自然地你想到用字符型数组来存储它。但是用数组存储数据有一个致命的弱点:它的大小是事先固定好的,如同你定义的 N=200 那样。所以你的程序就有了第一个限制:不能处理字符数超过 200 的情况。如果出现超过的情况,程序中要有对应的处理方式。你可能还不知道,新的C++标准中已经用一个叫 string 的类来代替常用的字符数组的形式,从而解决了这一问题。此为其一。

其二,你对类中数据的输入是通过成员函数setch()进行的,本无不妥之处;可是,你却对类中数据的输入方式作了限制:即只能通过键盘输入的方式得到你要处理的字符串。如果我程序中已经有了一个字符串,我如何能使用你的这个类来得到结果呢?还有,在创建这个类的对象的时候我如果想指定要处理的字符串,这也做不到吧。所以要好好考虑你的类的“接口”问题,尽量把情况考虑周全些,以方便使用。

其三,在调用成员函数 setn() 后得到了单词的个数 n。但是你能保证用户(包括你自己)一定是在调用了 setn() 之后才访问 n 的吗?不能保证!所以访问 n 并不一定能得到正确的结果。为此,你不得不为使用你这个类的用户制定一个规则,即:在访问真正的 n 之前,首先要调用 setn() 成员函数。这样就增加了使用者的负担。其实自然的情况是只要访问 n 就是我想要的正确结果。你如何使你的类实现这一点呢?

从源程序中可以看出,你还是在用旧标准写程序。建议你按照新的C++标准来书写C++程序,并积极使用C++标准库,会为你处理问题带来极大的方便。 C++ Primer(3rd)是一本不错的入门书和参考书,可以从网上下载阅读。

论坛徽章:
0
4 [报告]
发表于 2004-03-15 08:35 |只看该作者

到底哪错了呢???

呵呵,看看好象没错

论坛徽章:
0
5 [报告]
发表于 2004-03-15 19:01 |只看该作者

到底哪错了呢???

多谢楼上的几位大侠 :)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP