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