程序无法正确加载数组

时间:2017-11-08 02:46:14

标签: c++

手头的问题:编写一个函数primeTableInRange来生成一个表,以显示从startNum到endNum范围内的每个数字是否为素数。当数字不是素数时,我们只会显示'*'。当数字是素数时,我们将显示数字。

我的代码:

#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>


using namespace std;

int primetableinarray(int userarray[], int arraysize);

int main()
{
int startNum, endNum;
cout<< "Enter your first number in the range" << endl;
cin>>startNum;
cout<< "Enter your last number in the range" << endl;
cin>>endNum;

int arraysize = endNum - startNum;
int userarray[arraysize];
for (int i=startNum;i<=endNum;i++)
userarray[i]= startNum++;
primetableinarray(userarray, arraysize);
return 0;
}

int primetableinarray(int userarray[], int arraysize)
{

for (int i=2;i<arraysize;i++)
{
bool prime=true;
for (int r=2;r*r<i;r++)
{
    if (i % r ==0)
    {
        prime=false;
        break;
    }
}
if(prime) cout << i << endl;

else
    if(true) cout<< "*" << endl;
}
}

问题是它没有从&#34; startNum&#34;开始。并且不会以&#34; endNum&#34;结束。它实际上从0到数组化。它还计算4作为素数。我在这里缺少什么?

7 个答案:

答案 0 :(得分:1)

小心!在您的情况下,数组始终从0开始并以arraysize结束。你不能有任意索引。您可以执行以下操作:

int arraysize = endNum - startNum + 1;
int userarray[arraysize];
for (int i=0;i<arraysize;i++)
   userarray[i]= startNum+i;

此外,由于我们从0开始,你需要在'arrayize'中添加+1以在'useraray'中加入'endNum'

答案 1 :(得分:0)

尝试改变这一点 从:

for (int r=2;r*r<i;r++)

for (int r=2;r<i;r++)

答案 2 :(得分:0)

#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>


using namespace std;

int primetableinarray(int userarray[], int arraysize);

int main()
{
int startNum, endNum;
cout<< "Enter your first number in the range" << endl;
cin>>startNum;
cout<< "Enter your last number in the range" << endl;
cin>>endNum;

int arraysize = endNum - startNum  + 1;
int userarray[arraysize];
for (int i=startNum;i<endNum;i++)
userarray[i]= startNum++;
primetableinarray(userarray, arraysize);
return 0;
}

int primetableinarray(int userarray[], int arraysize)
{

for (int i=2;i<=arraysize;i++)
{
bool prime=true;
for (int r=2;r<i;r++)
{
    if (i % r ==0)
    {
        prime=false;
        break;
    }
}
if(prime) cout << i << endl;

else
    if(true) cout<< "*" << endl;
}
}

答案 3 :(得分:0)

您的打印功能无处可识别您的阵列。您只需开始将数字循环到您的数组大小。如果你从函数参数中取出数组它仍然可以工作,那你为什么要包括它呢?你的for循环只是忽略你的数组中的任何值,并从2任意开始循环。

至于为什么4被计算为素数,这是因为当你的第二个循环开始时它看到2 * 2 = 4,因此不小于4,这是你正在测试的数字。这导致它跳过循环并且从不将prime设置为false。将第二个for循环中的条件设为&lt; =否则任何没有其他因子的完美正方形都将被标记为素数,例如25。

另外在旁注,这怎么编译?您使用dynaimc变量来启动数组大小。这不起作用,当我试图运行你的代码看到输出我有错误。尝试使用std::vector<int>。当您使用for循环填充向量时,您使用值作为索引,这是完全错误的。这是你应该从零循环到你的数组大小,因为它是数组中的地址。您还会添加ctimecmath等不必要的标头,并且代码中的if(true)无理由。

答案 4 :(得分:0)

数组(int userarray[arraysize];)的声明是非法的,需要在编译时知道数组边界。这甚至不应该编译,或者它产生一个零大小的数组 之后,您随机访问未分配的内存,即UB

答案 5 :(得分:0)

更改

int arraysize = endNum - startNum + 1;
int userarray[arraysize];

int userarray[1];
int arraysize = endNum - startNum;
userarray[arraysize];

另外,在primetableinarray函数中添加一个返回值。

答案 6 :(得分:0)

Here is the correct program .

#include <iostream>
using namespace std;
void  primetableinarray(int low, int high) ;
int main()
{
    int low, high, i, flag;
    cout<< "Enter low numbers  ";
    cin>> low;
    cout<< "Enter high numbers  ";
    cin>>high;
    
    cout<< "Prime numbers between " << low << "and are: " << high <<endl;;
    primetableinarray(low, high);    
    return 0;
}

void  primetableinarray(int low, int high) {

    int i, flag;
    while (low <= high)
    {
        flag = 0;

        for(i = 2; i <= low/2; ++i)
        {
            if(low % i == 0)
            {
                flag = 1;
                break;
            }
        }

        if (flag == 0)
            cout<< low <<endl;
        else 
		    cout<< "*" <<endl;
		    
        ++low;
    }

}

Output :
	
Enter low numbers  1                                                                                                                                 
Enter high numbers  10                                                                                                                               
Prime numbers between 1and are: 10                                                                                                                   
1                                                                                                                                                    
2                                                                                                                                                    
3                                                                                                                                                    
*                                                                                                                                                    
5                                                                                                                                                    
*                                                                                                                                                    
7                                                                                                                                                    
*                                                                                                                                                    
*                                                                                                                                                    
*

您的代码中存在一些问题:

  1. int arraysize = endNum - startNum; int userarray [arraysize];

    如何编译,这将是编译错误。你可以动态分配内存并使用它。

  2. for(int i = startNum; i&lt; = endNum; i ++) userarray [i] = startNum ++;

    如果您要比较“i&lt; = endNum”,这是错误的i = startNum和arraysize = arraysize +1。

    正确的方法是:

    for(int i = 0; i&lt; = endNum; i ++) userarray [i] = startNum ++;