gpt4 book ai didi

c++ - 将值插入到标准 C++ 数组的正确索引(升序)中

转载 作者:行者123 更新时间:2023-12-02 10:21:10 26 4
gpt4 key购买 nike

我需要插入两个值 num1 = 50num2 = 80成一个已按升序排序的数组。我不能使用动态数组或列表。也没有结构或类。这是一个类作业,所以我必须遵循指导方针。教授建议我新建一个数组,newarray并从我的原始 numarray 复制值直到我达到一个条件,该条件会提示将数字插入到它们按升序排列的位置。我将循环设置为尽可能多地运行以填满我的 newarray我设置了条件来检查 numarray 中的前一个数字是否小于 num如果下一个值大于 num .数字被插入到正确的位置,但是,插入新值会覆盖原来的值。
我以为
newarray[newindex] = num1;
newarray[newindex+1] = numarray[newindex];
将插入的值写入当前索引,然后写入 numarray[newindex]进入索引之后。

我将在下面附加功能。除了 numarray 之外,所有东西都是自包含在函数中的这只是排序值最多 100。提前致谢。也许离开一段时间会帮助我弄清楚。


void insertArray(int* numarray) {
int num1 = 50;
int num2 = 80;
int counter = 0;
int newarray[103] = {};
for (int newindex = 0; newindex < 103; newindex++) {
if (numarray[newindex] <= num1 && numarray[newindex+1] > num1) {
newarray[newindex] = num1;
newarray[newindex+1] = numarray[newindex];


}
else if (numarray[newindex] <= num2 && numarray[newindex+1] > num2) {
newarray[newindex] = num2;
newarray[newindex+1] = numarray[newindex];


}
else {
newarray[newindex] = numarray[newindex];
}
cout << newarray[newindex] << endl;
}


}



int main() {
int numarray[100] = {};
randomgenerator();
read(numarray);
printArray(numarray);
searchArray(numarray);
Delete(numarray);
sortArray(numarray);

insertArray(numarray);
return 0;
}


更新:

在为你们输入后,我尝试了建议的函数,它成功插入了两个值。它插入 0 而不是 50,它插入 78 而不是 80。我让它插入 50,但我不明白是什么条件导致它插入 78,或者什么是 80。我试着把它写在与 for 循环插入 50 的格式相同,但它不起作用。
void insertArray(int* numarray) {
int num1 = 50;
int num2 = 80;
int index = 0;
int newarray[102] = {};


for (; index < 100 && numarray[index] < num1; ++index) {
newarray[index] = numarray[index];
}

newarray[index++] = num1;

for (; index < 101 && numarray[index - 1] < num2; ++index) {
newarray[index] = numarray[index - 1];
}



if (index == 102) {
newarray[index++] = num2;
}
for (; index < 102; ++index) {
newarray[index] = numarray[index - 2];

}
for (int i = 0; i <= 101; i++) {
cout << newarray[i] << endl;
}
}

最佳答案

在我看来,这种方法总体上是错误的。

新数组应在函数 main 中声明,插入数字后应在该处输出。

该函数不应一次插入两个数字。它应该只插入一个数字,但调用的次数与应该在数组中插入新数字的次数一样多。

当目标数组和源数组是同一个数组时,可能会调用该函数来插入一个值。

因此,我建议采用以下演示程序中显示的以下方法。

#include <iostream>

void insert( const int *a1, size_t n, int *a2, int value )
{
const int *p = a1 + n;
a2 += n;

while ( ( p != a1 ) && ( value < *( p - 1 ) ) ) *a2-- = *--p;

*a2-- = value;

while ( p != a1 ) *a2-- = *--p;
}

int main()
{
int a1[] = { 5, 15, 25, 35, 45, 55, 65, 75, 85, 95 };
const size_t N = sizeof( a1 ) / sizeof( *a1 );
int a2[N + 2];

insert( a1, N, a2, 50 );

for ( size_t i = 0; i < N + 1; i++ )
{
std::cout << a2[i] << ' ';
}

std::cout << '\n';

insert( a2, N + 1, a2, 80 );

for ( size_t i = 0; i < N + 2; i++ )
{
std::cout << a2[i] << ' ';
}

std::cout << '\n';

return 0;
}

程序输出是
5 15 25 35 45 50 55 65 75 85 95 
5 15 25 35 45 50 55 65 75 80 85 95

至于你的代码,例如这个循环
for (int newindex = 0; newindex < 103; newindex++) {
if (numarray[newindex] <= num1 && numarray[newindex+1] > num1) {
//...

调用未定义的行为,因为数组 numarray没有索引为 100、101 和 102 的元素。

此外,通常情况下,源数组中没有大于 num1 的元素也可能发生。或 num2 .

另一种方法是将插入的值放在一个单独的数组中,然后将源数组和插入值的数组组合到目标数组中。

这是一个演示程序。
#include <iostream>

void insert( const int *a1, size_t n1, const int *a2, size_t n2, int *result )
{
const int *p1 = a1;
const int *p2 = a2;

while ( p1 != a1 + n1 && p2 != a2 + n2 )
{
if ( *p2 < *p1 )
{
*result++ = *p2++;
}
else
{
*result++ = *p1++;
}
}

while ( p1 != a1 + n1 ) *result++ = *p1++;
while ( p2 != a2 + n2 ) *result++ = *p2++;
}

int main()
{
int a1[] = { 5, 15, 25, 35, 45, 55, 65, 75, 85, 95 };
const size_t N1 = sizeof( a1 ) / sizeof( *a1 );
int a2[] = { 50, 80 };
const size_t N2 = sizeof( a2 ) / sizeof( *a2 );
int result[N1 + N2];


insert( a1, N1, a2, N2, result );

for ( int item : result )
{
std::cout << item << ' ';
}

std::cout << '\n';

return 0;
}

它的输出是
5 15 25 35 45 50 55 65 75 80 85 95

关于c++ - 将值插入到标准 C++ 数组的正确索引(升序)中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60104803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com