程序未正确加载数组
Program not loading array correctly
手头的问题:编写一个函数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循环来填充向量时,您将这些值用作索引,这是完全错误的。这是您应该从零循环到数组大小的时候,因为它是数组中的地址。您还包括不必要的头,如ctime
和cmath
,并且在代码中无故包含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
*
*
*
您的代码中存在问题:
-
int arraysize=endNum-startNum;int userarray[arraysize];
它是如何编译的,它将是编译错误。您可以动态分配内存并使用它。
-
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++;
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 保存/加载大量短数组到二进制文件
- 加载有空指针的字符数组的打印值
- 如何将字符串加载到BYTE*数组(C++)的元素中
- 如何将统一缓冲区对象数组加载到着色器中?
- 加载字节数组(从内存)到libpng c
- 当将多个TypedArrayContents数组加载到V8数组中时(数组数组)时,最后一个元素将覆盖所有元素
- 从字节数组加载 QImage,而无需知道格式
- 在 qml 中从字节数组加载到图像
- 如何使用 for 循环将元素加载到我的每个数组中,然后将每个数组的总和输出到一个 sum 数组中
- 如何将OpenCV的Mat结构的部分图像矩阵加载到我自己的3x3数组中?
- 尝试将文本文件加载到动态分配的 2D 数组中时出现'Segmentation fault'错误
- 试图打印出/加载2D数组时的分割故障
- 程序未正确加载数组
- 使用 ifstream::operator>> 从 CSV 文件加载数组
- 从文件加载数组
- sse快速加载数组的前半部分
- 从数据库加载数据以在qml中公开
- 如何在c++中从资源文件中加载游标组?
- 在c++中从.txt文件加载数组时遇到问题