создайте массив, в котором число, которое я вставляю, удаляется и заменяется 0 в конце массива с помощью указателей

#c

Вопрос:

Я делаю это в форме матрицы 3х4

Кроме того, я не уверен, как использовать указатель, так как число, которое я хочу изменить и заменить, является arr[3][4] , а не обычным arr[5]

 using namespace std;
#include <iomanip>
int main(){
    int i;
    int j;
    int *change;
    int number; // not sure how to use the pointer to reference a [3][4] array //

    int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; 
    
    
    for (int i = 0; i < 3; i  ) // not sure if there is a way where i dont have to write every number and just have it go from 1 to 12 //
        
        {     
        for (int j = 0; j < 4; j  )
        {
            cout << setw(8)<<arr[i][j] << ' '; // to make it look organized and aligned//
        }
        cout <<endl;
    }
    cout << "number" << ' ';
    cin >> number; // i woud insert the number here//
    cout << arr[3][4]; 

    return 0;
}
 

и должно выглядеть так (скажем, я выбрал 6)

 1   2  3  4
5   7  8  9
10 11 12  0
 

Комментарии:

1. cout << arr[3][4]; Здесь вы получаете доступ к массиву за пределами его границ. Поведение программы не определено.

Ответ №1:

Операция, которую вы хотите выполнить, естественна для одномерных диапазонов, а не для многомерных. Существуют стандартные алгоритмы для достижения вашей цели с помощью одномерного диапазона.

С помощью представлений диапазона довольно просто получить одномерное представление элементов:

 // flat view of the array
auto flat_arr = arr | std::ranges::views::join;
// move elements to overwrite the removed elements
auto remaining = std::ranges::remove(flat_arr, number);
// fill the ramaining space with zeroes
std::ranges::fill(remaining, 0);
 

Без использования диапазонов вы могли бы добиться того же самого, определив пользовательский итератор. В качестве альтернативы вы можете использовать одномерный массив и преобразовать двумерные индексы с помощью небольшой математики. Пример:

 constexpr std::size_t rows = 3, cols = 4;
int arr[rows*cols] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

// move elements to overwrite the removed elements
auto last_it = std::remove(std::begin(arr), std::end(arr), number);
// fill the ramaining space with zeroes
std::fill(last_it, std::end(arr), 0);

for (std::size_t i = 0; i < rows; i  )
{     
    for (std::size_t j = 0; j < cols; j  )
    {
        std::cout
            << std::setw(8)
            // transform 2D to 1D
            << arr[i * cols   j]
            << ' '
        ;
    }
    std::cout << 'n';
}