#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
/* Написать программу которая заполняет массив 10 элементов диапазон значений
случайных чисел 20, и в массиве не должно быть одинаковых значений!*/
void main()
{
setlocale(LC_ALL, "ru");
srand(time(NULL));
int const macciv = 10;
int arr[macciv]{};
int end = 0;
int j = 0;
for (int i = 0; i < macciv; i++)
{
arr[i] = rand() % 20;
}
while (true)
{
if (j == end)
{
end++;
}
else
{
if (arr[j] != arr[end])
{
end++;
if (end == 9)
{
end = 0;
j++;
}
}
else
{
arr[end] = rand() % 20;
j = 0;
end = 1;
}
}
if (j == 9)
{
break;
}
}
for (int k = 0; k < macciv; k++)
{
cout << arr[k] << endl;
}
}
我写了一个程序来解决用不重复数字填充数组的问题,因为我只知道条件,循环,静态数组,rand,继续和中断函数,仅此而已,我最近刚刚开始学习C++,在编译时它说它完成了代码-1073741819的工作,我不明白问题是什么,循环很长,但它不应该是无休止的,因为迟早它会创建我需要的数组? ..错误表明对不存在或已删除元素的内存访问,但是当计算机访问这个元素时以及为什么访问它以及它是什么类型的元素,因为据我了解,循环只是不断地重写当找到匹配项时,数组是相同的,程序不会到达带有输出的循环。
我对C++了解不多。我对这段代码做了一些修改,很可能错误在于 if (j == end) 的检查,end 的值增加了,但 j 没有更新,结果,数组索引丢失了,这抛出错误。您可以稍微简化代码并摆脱如此多的 if 构造,比方说,重写重复检查。例如:
您的代码无法编译,但原则上很清楚您想要什么 - 添加新代码时,请检查现有元素。这可以更简单地完成:
虽然这不是最有效的方法...
从 20 个数字中随机选择 10 个元素 - Fisher-Yates 洗牌: