Как из одномерного массива сделать двумерный

от admin

Как преобразовать одномерный массив в дву-мерный

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

Если имели ввиду то, что вы изначально сами должны задавать и размер ряда, и кол-во рядов, то имеет место следующее решение:

Miron's user avatar

Я решил следующим образом.

Если поменять lengthX или lengthY то код все еще будет работать даже если он выйдет за размер массива.

0xdb's user avatar

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как преобразовать одномерный массив в двумерный?

ну скорее пользователем задается только количество столбцов. Если в исходном массиве 10 элементов, а пользователь задал 3 строки по 4 столбца, то элементов не хватает. Что делать тогда?

А вообще гугли numpy reshape

1.если так перебирать то создаться массив больший по размеру чем нужно
чтобы подряд добавлят элементы из массива, можно исползоват счётчик.
2. b[i][j]=. это присвоение значения элементу в уже созданном массиве. А его пока нет. Можно создат массив заранее с нужной размерностю и заполнит нулями но делать это нужно через цикл или генератор списков (вложенных списков) а не простым умножением элементов
x=[[0]*n]*m так как это будут ссылки на объект т.е. при изменении одного вложенного массива будет менятся и второй

Запись одномерного массива в двухмерный [закрыто]

Допустим, у меня есть массив символов, которые я ввел в консоль. Как я могу записать их в двумерный массив следующим образом:

Или лучше использовать списки?

Что ты пытаешься сделать? — pad

Я пытаюсь заполнить матрицу 5 * 5 массивом символов, которые я ввел с консоли. Это сейчас. В конце концов, я должен реализовать «двойную транспозицию» — метод шифрования. — Igor S

Итак, вы начнете программировать на f# или c# в зависимости от ответов? — L.B

Нет, я пробовал оба. И у меня было 4 одинаковых столбца или целая матрица из одних и тех же символов и т. д. — Igor S

Почему этот вопрос забыт? — J D

2 ответы

Предполагая, что у вас есть входные данные в одномерном массиве длиной 25:

Вы можете создать двумерный массив, который хранит данные в сетке 5×5, используя Array2D.init функция:

Функция инициализирует массив, используя указанный размер (первые два параметра), и вызывает предоставленную функцию для заполнения значения для каждого элемента массива. Доступ к элементу по индексу j*5 + i , вы получите структуру, которую хотели в своем образце.

РЕДАКТИРОВАТЬ Вы не можете добавить строку в массив (массив имеет фиксированный размер), но вы можете легко создать массив большего размера и скопировать туда данные:

можно ли добавить строку [0, *] к этому вновь созданному массиву? — Игорь С

@sega Смотрите обновленный ответ. — Томаш Петричек

Если вы знаете размер 2D-массива перед вводом чисел/символов, просто используйте правильные циклы для ввода в нужных местах. Если нет, и вам нужно переписать из массива в 2D-массив («Таблица»), используйте цикл

Это будет проходить через каждый символ в массиве и помещать их в нужные места в 2D-массиве.

Научный форум dxdy

Помогите ,плиз .Написал прогу на Си с использыванием одномерних массивов , преподаватель потребовал переписать прогу с использованием двухмерных массивов.Приведите,пожалуйста пример, как переводится двухмерный массив в одномерный.
Буду очень благодарен,т.к. я попробывал сам это сделать и прога перестала компилироваться.
Вот прога ,которую надо переписать ,изменив одномерные массивы на двумерные:
#include <windows.h>

Читать:
Что такое сущность в базе данных

const int size = 8; // размер доски

int table[size*size]; // соственно сама доска

int point[2] = <0,1>, // точка, куда должен попасть конь
knightPos[2] = <4,2>, // начальная позиция коня
moves = 0; // сколько шагов нужно

void initTable(int* table, int size, int p[2]); // сначала таблица «не хожена», кроме точки
void movesKnight(int* table, int size); // сделать ходы из всех «хоженных» точек
int checkPass(int* table, int size, int kP[2]); // проверить, если путь пройден

int main()
<
initTable(table, size, point);
do
<
movesKnight(table, size);
>
while(checkPass(table, size, knightPos) == -1);

printf(«\nresult = %d», moves);
return 0;
>

void initTable(int* table, int size, int p[2])
<
int i, j;
for(i = 0; i < size; i++)
<
for(j = 0; j < size; j++)
<
table[i*size + j] = -1;
>
>
table[p[0]*size + p[1]] = 0;
>

int checkPass(int* table, int size, int kP[2])// проверяем,если путь пройден .
<
return table[kP[0]*size + kP[1]];
>

Странный какой-то преподаватель . нас учат, наоборот, все в одномерных массивах хранить, так как они быстрее работают . Ну аккуратно заменяем

int table[size*size]
на
int table[size][size],

int* table
на
int** table

и все надписи вида table[i*size + j]
на table[i][j] (ну или table[j][j], сообразите там).

об ошибках докладываем — я ведь не знаю, какой у вас там компилятор.

Поддерживаю. Странный какой-то преподаватель … И задание странное.

Дело в том, что в С в принципе нет двумерных массивов . « int table[size][size] » — это не двумерный массив, а массив массивов, что не одно и тоже. В частности, каждый из элементов table нужно проинициализировать , либо при помощи malloc() , либо отведя большой массив ( size * size ) и разместив в нём.

Я не большой знаток Си, но рискну не согласиться. Это одно и то же. Когда я объявляю int table[size][size], то память выделяется под весь массив массивов статически (ну или в стеке, если это локальная переменная). Проверил в Borland C++ и в MSVC 6.0 — работает. Единственно, что — size должно быть константным выражением, т.е. const int не проходит, нужно #define size <Нужный_размер>.

Что касается исходного вопроса Dmytro Sheludchenko — то тут нужно подумать, как передавать массив. Просто int *table, как в исходной программе, не пройдёт, т.к. теряется информация о структуре (массив передаётся как одномерный). int **table — это вообще будет ошибкой, т.к. это указатель на массив указателей на массивы типа int, а у нас массив массивов — это, действительно, разные вещи.

Самый простой вариант — когда таблица table не передаётся в функции (initTable, movesKnight), а просто в функциях используется глобальная переменная table.
Может ещё сделать что-то типа typedef int[size] row; и передавать в функции row *table.

А теперь верно?
#include <windows.h>
#include <stdio.h>

int main()
<
initTable(table, size, point);
do
<
movesKnight(table, size);
>
while(checkPass(table, size, knightPos) == -1);

printf(«\nresult = %d», moves);
return 0;
>

void initTable(int** table, int size, int p[2])
<
int i, j;
for(i = 0; i < size; i++)
<
for(j = 0; j < size; j++)
<
table[i][j] = -1;
>
>
table[p[0]][p[1]] = 0;
>

Нет. У Вас компилятора нету, что ли? Не компилируется же
int table[size][size]; — expected constant expression (надо #define Size 8, и разделить Size и size)

initTable(table, size, point); — int ** ‘ differs in levels of indirection from ‘int [8][8]’ (то, о чём я писал в предыдущем сообщении:

Ну и как результат — Unhandled exception.

Добавлено спустя 4 минуты 24 секунды:

Самый простой вариант — это избавиться от параметров table и size в функциях initTable, movesKnight и checkPass вообще (использовать глобальную переменную table, и #define size 8 — тогда не понадобится разделять size и Size).

Похожие статьи