注册 登录
编程论坛 C++教室

这个程序用bool变量为设么运行错误?

跳跳鱼 发布于 2012-08-23 22:31, 1742 次点击
这是一个求完数的程序
先给大家一个正确的程序,但是为什么改成bool变量后运行错误呢?
程序代码:
#include <iostream>
using namespace std;
int perfect(int);       //改为bool perfect(int);
int main()
{
    int number;
    cout<<"此程序将输出1000之内的所有完数:"<<endl;
    for(number=1;number<=10;number++)
    {  perfect(number);    //改为if(perfect(number)) cout<<number;
         
    }
return 0;

}
int perfect(int m )
{   
    int i;
    int t=0;
    for(i=1;i<m;i++)
    {  
            if(m%i==0)
            t=t+i;
    }                                        //为什么用bool变量就错了呢?,例如,若t==m,return true,然后在主函数中修改一下
    if(t==m)
    cout<<m<<endl;
    return 0;
}
   

程序的运行结果
只有本站会员才能查看附件,请 登录
改为bool变量后运行结果
只有本站会员才能查看附件,请 登录
为什么会出现这种情况呢?求解
46 回复
#2
zklhp2012-08-23 23:25
程序代码:

#include <iostream>

using namespace std;

bool perfect(int);

int main()
{
    int number;

    cout<<"此程序将输出1000之内的所有完数:"<<endl;
    for (number=1;number<=10;number++)
    {
        if (perfect(number))
        {
            cout<<number;
        }
    }
    return 0;
}

bool perfect(int m)
{  
    int i;
    int t=0;
    for (i=1;i<m;i++)
    {
        if(m%i==0)
            t=t+i;
    }
    if (t==m)
        return true;
    return false;
}


很奇怪啊 用g++编译运行确实有错误 其实我根本不会c++ 完全不懂。。
#3
pangding2012-08-23 23:43
把  cout<<number; 改成 cout << number << "  "; 之后观察输出发生什么变化再做判断。

50 都给我吧,哈哈。
#4
zklhp2012-08-23 23:45
以下是引用pangding在2012-8-23 23:43:45的发言:

把  cout<

没明白
#5
pangding2012-08-23 23:45
以下是引用zklhp在2012-8-23 23:25:51的发言:

 
#include  
 
using namespace std;
 
bool perfect(int);
 
int main()
{
    int number;
 
    cout<<"此程序将输出1000之内的所有完数:"<

小 z 上套喽。
#6
pangding2012-08-23 23:46
1
2
3

123
你能看出有什么区别吗?就是每个后面加个回车而已。
#7
zklhp2012-08-23 23:46
我改的那个也能编译运行。。
#8
pangding2012-08-23 23:48
是能你那个其实输出的是正确答案,只是人看着有些糊涂而已。
#9
zklhp2012-08-23 23:48
只有本站会员才能查看附件,请 登录
有意思的是这个 这个代码编译后运行是这个 难道不是用g++编译c++文件?
#10
zklhp2012-08-23 23:54
以下是引用pangding在2012-8-23 23:48:00的发言:

是能你那个其实输出的是正确答案,只是人看着有些糊涂而已。

这是次要的 上面那个是咋回事?
#11
pangding2012-08-23 23:56
你怎么出的那个错误?就是你 2楼 的代码吗?
#12
zklhp2012-08-23 23:58
以下是引用pangding在2012-8-23 23:56:26的发言:

你怎么出的那个错误?就是你 2楼 的代码吗?

对啊 有意思罢
#13
pangding2012-08-24 00:00
g++ 完了 echo $? 是 0 吗?
#14
zklhp2012-08-24 00:03
只有本站会员才能查看附件,请 登录


只有本站会员才能查看附件,请 登录


有意思罢

bash-3.1$ g++ --version
g++.exe (GCC) 4.7.0
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

bash-3.1$

mingw的g++


[ 本帖最后由 zklhp 于 2012-8-24 00:04 编辑 ]
#15
zklhp2012-08-24 00:06
只有本站会员才能查看附件,请 登录
直接运行
#16
pangding2012-08-24 00:13
你能用 gdb 调试一下吗?

方法是 gdb a.exe
进去之后
start
c
就会出现错误。
用 bt 可以看出错时的调用栈的结构。
#17
pangding2012-08-24 00:14
或者用 emacs 当前端调试也行。
#18
zklhp2012-08-24 00:15
libstdc++ 在这里面出错的。。

程序代码:


 #include <iostream>

using namespace std;

int main()
{
    int number = 5;

    cout<<"我打一个数"<<number<<endl;

    return 0;
}


c++好复杂啊
#19
zklhp2012-08-24 00:21
不玩了 睡觉、、 pangding版主记得把那个散分帖结了 嘻嘻
#20
pangding2012-08-24 00:26
可能是用 cout 输出非 ascii 码的问题。
#21
pangding2012-08-24 00:26
以下是引用zklhp在2012-8-24 00:21:20的发言:

不玩了 睡觉、、 pangding版主记得把那个散分帖结了 嘻嘻
好的。
#22
mfs1111162012-08-24 13:13
程序代码:
#include <iostream>

using namespace std;

bool perfect(int);

int main()
{
    int number;

    cout<<"此程序将输出1000之内的所有完数:"<<endl;
    for (number=1;number<=1000;number++)
    {
        if (perfect(number))
        {
            cout<<number<<'\t';
        }
    }
    cout<<endl;
    return 0;
}

bool perfect(int m)
{
    int i;
    int t=0;
    for (i=1;i<m;i++)
    {
        if(m%i==0)
            t=t+i;
    }
    if (t==m)
        return true;
    return false;
}
[attach]64392[/attach]源码同二楼,只是 加入一分格符\t,一个换行,再将原先number的循环(10)改到了1000,运行结果如上,可以通过……
顺便问一下,论坛里不能够搜索么?想找一下有关wchar_t的相关问题,不是很明白……


[ 本帖最后由 mfs111116 于 2012-8-24 13:16 编辑 ]
#23
跳跳鱼2012-08-24 13:22
我知道我错在哪儿了,return true,与return false 必须成对出现。。。。还有,我昨天晚上就离开了早了点,你们就聊这么欢。。。。
#24
mengcan5552012-08-24 17:04
#include <iostream>

using namespace std;

bool perfect(int);

int main()
{
    int number;

    cout<<"此程序将输出1000之内的所有完数:"<<endl;
    for (number=1;number<=10;number++)
    {
        if (perfect(number))
        {
            cout<<number<<endl;
        }
    }
    getchar();
    return 0;
}

bool perfect(int m)
{  
    int i;
    int t=0;
    for (i=1;i<m;i++)
    {
        if(m%i==0)
            t=t+i;
    }
    if (t==m)
        return true;
    return false;
}
我输出正常 是6
#25
mfs1111162012-08-24 17:51
  for (number=1;number<=10;number++)
楼上,你的循环上限是10,当然只能输出6了……第一个完数是6,第二个是28,第三个是456,在百度上可以找到……

[ 本帖最后由 mfs111116 于 2012-8-24 17:53 编辑 ]
#26
pangding2012-08-24 21:09
以下是引用跳跳鱼在2012-8-24 13:22:07的发言:

我知道我错在哪儿了,return true,与return false 必须成对出现。。。。还有,我昨天晚上就离开了早了点,你们就聊这么欢。。。。

其实不用,一般写 return t==m; 就行了。
#27
pangding2012-08-24 21:13
回复 22楼 mfs111116
可以搜呀。不过我搜了一下,老帖也介绍的不是太好。如果真想找资料,可能得自己用用搜索引擎了
#28
跳跳鱼2012-08-24 21:47
回复 2楼 zklhp
bool变量中 return true与return false必须成对出现吗?如果不是,为什么这道题必须都写上?
#29
zklhp2012-08-24 21:48
以下是引用跳跳鱼在2012-8-24 21:47:43的发言:

bool变量中 return true与return false必须成对出现吗?如果不是,为什么这道题必须都写上?

我都写上是为了好看。。
#30
跳跳鱼2012-08-24 21:50
回复 29楼 zklhp
。。。。。那为什么要是把return false 写上,这道题就运行错误啦???
#31
跳跳鱼2012-08-24 21:51
回复 30楼 跳跳鱼
打错了,是不写 return false 就错了?
#32
zklhp2012-08-24 21:53
以下是引用跳跳鱼在2012-8-24 21:50:41的发言:

。。。。。那为什么要是把return false 写上,这道题就运行错误啦???

什么运行错误?
#33
跳跳鱼2012-08-24 21:55
回复 32楼 zklhp
不写return false 结果就变成这样了
只有本站会员才能查看附件,请 登录

不信你试试?
#34
zklhp2012-08-24 21:56
  if (t==m)
        return true;
    return false;

如果不写return false; 那其他时候不就没返回值了
#35
zklhp2012-08-24 21:57
我的意思是 false是0 非0是true 不返回false也可以返回0嘛 不好看罢了
#36
跳跳鱼2012-08-24 22:03
回复 34楼 zklhp
所以说为了保险起见,还是都写上好喽?
你在看看下边这个求素数的程序,我要是再加上一个 return true 就会多一个错误的值
程序代码:
#include <iostream>
#include <cmath>
using namespace std;
bool su(int );
int main()
{ int j;
for(j=1;j<=10;j++)
{
    if(su(j))
     cout<<j<<endl;
}
return 0;
}
bool su( int n)
{
    if(n==1) return 0;
    for(int i=2;i<=sqrt(n);i++)
   
        if(n%i==0)
            return false;   
                    else return true;
}

这是结果
只有本站会员才能查看附件,请 登录
#37
zklhp2012-08-24 22:05
for(int i=2;i<=sqrt(n);i++)
{
        if(n%i==0)
            return false;   
                    else return true;
}
#38
跳跳鱼2012-08-24 22:08
以下是引用zklhp在2012-8-24 22:05:33的发言:

for(int i=2;i<=sqrt(n);i++)
{
        if(n%i==0)
            return false;   
                    else return true;
}

括号括起来也没用,我试了
#39
zklhp2012-08-24 22:10
不对啊 你这样一改不就变成找素数的代码了么
#40
zklhp2012-08-24 22:14
那你这个逻辑也得改

程序代码:

#include <iostream>
#include <cmath>
using namespace std;
bool su(int );
int main()
{
    int j;
    for(j=1;j<=10;j++)
    {
        if(su(j))
            cout<<j<<endl;
    }
    return 0;
}
bool su( int n)
{
    if(n==1) return 0;
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
            return false;  
    }
    return true;
}



最后都不返回 才返回一个true
#41
跳跳鱼2012-08-24 22:15
回复 39楼 zklhp
不太明白,能详细解释一下吗?谢谢
#42
zklhp2012-08-24 22:18
素数是 除了1和本身 不能被其他数整除的数 所以判断一个数是否是素数 只要用2到它本身减1的数除 如果都无法整除 就是素数 当然 实践中 除到小于等于自己的开方也就可以了

对准上述思路 你觉得你写的那个else对么 你写的就是 一旦不是2的倍数 都是
#43
zklhp2012-08-24 22:20
素数是 除了1和本身 不能被其他数整除的数

不知道是不是这么描述的 大概意思你应该知道、、、
#44
跳跳鱼2012-08-24 22:23
回复 43楼 zklhp
恩恩,我知道了,关于这道题bool变量,我想了很久都不太明白,今天终于搞清楚了,呵呵!
#45
pangding2012-08-24 22:39
以下是引用zklhp在2012-8-24 22:20:30的发言:

素数是 除了1和本身 不能被其他数整除的数

不知道是不是这么描述的 大概意思你应该知道、、、

是这么描述的,很专业。
#46
静若子水2012-08-25 00:29
好像逻辑没有问题啊,不过你的注释说,若t==m,则返回true,那不知道你是否有,else return false呢,或者确认默认返回是0?
#47
跳跳鱼2012-08-25 20:36
回复 46楼 静若子水
有逻辑错误的说的不是第一题,是后边一道求素数的题
1