程序未正确加载数组

Program not loading array correctly

本文关键字:加载 数组 程序      更新时间:2023-10-16

手头的问题:编写一个函数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;
}
}

问题是它没有以"startNum"开始,也没有以"endNum"结束。它实际上从0变为arraysize。它还计算4作为素数。我在这里错过了什么?

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

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

此外,由于我们从0开始,您需要在"arraysize"中添加+1,以便在"userarray"中包含"endNum">

尝试更改来自:

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

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

在打印函数中,您甚至无法识别您的数组。您只需开始将数字循环到您的数组大小即可。如果你把数组从函数参数中去掉,它仍然可以工作,那么你为什么要把它包括在内呢?for循环只是忽略数组中的任何值,并从2开始任意循环。

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

顺便说一句,这是怎么编译的?您可以使用dynamc变量来初始化数组大小。这不起作用,当我试图运行您的代码以查看输出时,我遇到了错误。尝试使用std::vector<int>。当您使用for循环来填充向量时,您将这些值用作索引,这是完全错误的。这是您应该从零循环到数组大小的时候,因为它是数组中的地址。您还包括不必要的头,如ctimecmath,并且在代码中无故包含if(true)

#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;
}
}

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

更改

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

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

此外,还可以向primetableinarray函数添加一个返回值。

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<=endNum;i++)userarray[i]=startNum++;

    如果比较"i<=endNum",这是错误的i=startNum和arraysize=arraysize+1。

    正确的方法是:

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