请教一个控制台c++简单程序,出现的错误及原因说明
本人基本掌握c语言,初学c++,有问题一c++程序请教:以下源代码是定义一个类,并用该类寻找规定范围(上限)中的素数,并打印出结果..可是一运行,就报错..当跟踪其运行时...
本人基本掌握c语言,初学c++,有问题一c++程序请教:
以下源代码是 定义一个类,并用该类寻找规定范围(上限)中的素数,并打印出结果..
可是一运行,就报错..当跟踪其运行时,发现连cout << i; 都不行..
即使加个stdio.h换成printf("%d",i);也是一样会出错,程序就停在那行.
这是老师布置的题目,我的代码,因为初学,不知道怎么错,而且,编译时没有报错..特此请教..
重点是希望能知道错在哪里,以及原因简单说明.
如果有更好的解决思路,亦可提出(main函数是给定的,不可改变),但是不要忘记帮我找错.
本人使用并将长期使用vc6.0学习.
#include<iostream>
using namespace std;
class CSieve
{
private:
int n; //范围
int *p; //分配与n大小相等的地址,其连续地址中的值1为素数
public:
CSieve(int nn)
{
n=nn+1;
p=NULL;
}
void FindPrime() //找素数
{
if (!p)
{
int i,j;
p=(int *)new int(n);
for (i=2; i < n; i++)
p[i] = 1;
for (i=2; i < n; i++)
{
if (p[i] == 1)
{
for (j=i*i; j <= n; j += i)
p[j] = 0;
}
}
}
}
void PrintPrime() //打印素数
{
int i,col=0;
if (p)
{
for (i=2;i<n;i++)
{
if (p[i]==1)
{
cout << i;
col++;
}
if (!(col%=8))
cout<<endl;
}
}
}
~CSieve(){free(p);} //释放空间
};
int main()
{
CSieve number(1000);
number.FindPrime();
number.PrintPrime();
return 0;
} 展开
以下源代码是 定义一个类,并用该类寻找规定范围(上限)中的素数,并打印出结果..
可是一运行,就报错..当跟踪其运行时,发现连cout << i; 都不行..
即使加个stdio.h换成printf("%d",i);也是一样会出错,程序就停在那行.
这是老师布置的题目,我的代码,因为初学,不知道怎么错,而且,编译时没有报错..特此请教..
重点是希望能知道错在哪里,以及原因简单说明.
如果有更好的解决思路,亦可提出(main函数是给定的,不可改变),但是不要忘记帮我找错.
本人使用并将长期使用vc6.0学习.
#include<iostream>
using namespace std;
class CSieve
{
private:
int n; //范围
int *p; //分配与n大小相等的地址,其连续地址中的值1为素数
public:
CSieve(int nn)
{
n=nn+1;
p=NULL;
}
void FindPrime() //找素数
{
if (!p)
{
int i,j;
p=(int *)new int(n);
for (i=2; i < n; i++)
p[i] = 1;
for (i=2; i < n; i++)
{
if (p[i] == 1)
{
for (j=i*i; j <= n; j += i)
p[j] = 0;
}
}
}
}
void PrintPrime() //打印素数
{
int i,col=0;
if (p)
{
for (i=2;i<n;i++)
{
if (p[i]==1)
{
cout << i;
col++;
}
if (!(col%=8))
cout<<endl;
}
}
}
~CSieve(){free(p);} //释放空间
};
int main()
{
CSieve number(1000);
number.FindPrime();
number.PrintPrime();
return 0;
} 展开
1个回答
展开全部
由于注释在复制时总乱码我就删了
你主要问题是内存分配
分配数组空间应该是p=new int[];中扩号;
小扩号是分配一个并赋值
释放用delete [] p;
malloc才是与free配套的,但不调用构造函数
调试后结果如下:
#include<iostream>
using namespace std;
class CSieve
{
private:
int n; //
int *p; //
public:
CSieve(int nn)
{
n=nn; //这里不+1,分配时再+1
p=NULL;
}
void FindPrime() //
{
if (!p)
{
int i=0,j=0;
p=new int[n+1];
for (i=2; i < n; i++)
p[i] = 1;
for (i=2; i < n; i++)
{
if (p[i] == 1)
{
for (j=i*i; j <= n; j += i)
p[j] = 0;
}
}
}
}
void PrintPrime() //
{
int i,col=0;
if (p)
{
for (i=2;i<n;i++)
{
if (p[i]==1)
{
cout << i<<endl;
col++;
}
if (!(col%=8))
cout<<endl;
}
}
}
~CSieve()
{
delete [] p;
}//
};
int main()
{
CSieve number(1000);
number.FindPrime();
number.PrintPrime();
return 0;
}
你主要问题是内存分配
分配数组空间应该是p=new int[];中扩号;
小扩号是分配一个并赋值
释放用delete [] p;
malloc才是与free配套的,但不调用构造函数
调试后结果如下:
#include<iostream>
using namespace std;
class CSieve
{
private:
int n; //
int *p; //
public:
CSieve(int nn)
{
n=nn; //这里不+1,分配时再+1
p=NULL;
}
void FindPrime() //
{
if (!p)
{
int i=0,j=0;
p=new int[n+1];
for (i=2; i < n; i++)
p[i] = 1;
for (i=2; i < n; i++)
{
if (p[i] == 1)
{
for (j=i*i; j <= n; j += i)
p[j] = 0;
}
}
}
}
void PrintPrime() //
{
int i,col=0;
if (p)
{
for (i=2;i<n;i++)
{
if (p[i]==1)
{
cout << i<<endl;
col++;
}
if (!(col%=8))
cout<<endl;
}
}
}
~CSieve()
{
delete [] p;
}//
};
int main()
{
CSieve number(1000);
number.FindPrime();
number.PrintPrime();
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询