Из одномерных массивов получить двумерный массив программа

У меня есть одномерный массив из 49 пространств, объявленный как int boardArray [49]; , и у меня также есть двумерный массив 7×7, объявленный как int boardArrayTwo [7][7]’ Я пытаюсь использовать вложенные для циклов, чтобы выбросить одномерный массив в двумерный массив здесь это код, который я использую для его проверки.

for (int i = 0; i > 50; ++i) < boardArray[i] = i; //fills the array with ints 0 — 48 to test >for (int x = 0; x >= 7; ++x) < for (int k = 0; k >= 7; ++k) < for (int n = 0; n >= 49; ++n) < boardArrayTwo[x][k] = boardArray[n]; cout > >
Я попытался запустить это, но ничего не происходит. Я делаю это неправильно?
Cistoran 21 сен. 2011, в 01:28
Поделиться

Циклы, возглавляемые for (int n = 0; n> = 49; ++ n) и for (int x = 0; x> = 7; ++ x), будут выполняться ровно 0 раз.

Вот почему ничего не произойдет.

David Nehme 20 сен. 2011, в 23:17
Поделиться:
dimensional

8 ответов

Лучший ответ

for (int x = 0; x >= 7; ++x) < for (int k = 0; k >= 7; ++k)< for (int n = 0; n >= 49; ++n)
for (int x = 0; x < 7; ++x) < for (int k = 0; k < 7; ++k)< boardArrayTwo[x][k] = boardArray[7*x + k];
for (int i = 0; i < 49; ++i) < boardArray[i] = i; //fills the array with ints 0 — 48 to test >
Heisenbug 21 сен. 2011, в 00:02
Поделиться
Мало того, что все условия в циклах имеют инвертированную логику.

Fabio Ceconello 20 сен. 2011, в 23:10
Ziggy 20 сен. 2011, в 23:11
в чем дело? Я не понимаю возражения. не могли бы вы оба уточнить мне?
Heisenbug 20 сен. 2011, в 23:13
Вы должны включить то, что было упомянуто ниже Фабио.

Двумерный массив что это. Многомерные массивы. Пример. Теория. Что такое массив. Array. C++ #30

Это сделало бы ваш ответ лучшим, я думаю.
Ziggy 20 сен. 2011, в 23:14
о, ты прав. Я полностью забыл первый цикл. Я отредактирую свой ответ спасибо

Heisenbug 20 сен. 2011, в 23:15
Показать ещё 3 комментария

Помимо перевернутой логики в петлях (что упомянуты другие), нет необходимости в третьем внутреннем цикле. Просто поместите атрибуцию во второй внутренний цикл:

Читайте также:
Какие существуют программы для молодого специалиста

boardArrayTwo[x][k] = boardArray[x * 7 + k];

EDIT: Я должен также упомянуть, что все эти литералы не являются хорошей практикой, и я добавил еще один (7) выше. Я бы переписал код следующим образом:

#define arrlen(x) (sizeof(x)/sizeof((x)[0])) for (int i = 0; i < arrlen(boardArray); ++i) < boardArray[i] = i; >int stride = arrlen(boardArrayTwo[0]); for (int x = 0; x < arrlen(boardArrayTwo); ++x) < for (int k = 0; k < stride; ++k) < boardArrayTwo[x][k] = boardArray[stride * x + k]; cout >

caveat: если массивы не объявлены здесь (переданы как параметры), arrlen() не будет работать. Но эта еще одна длинная история.

Fabio Ceconello 21 сен. 2011, в 00:16
Поделиться
Я только что заметил это!
Ziggy 20 сен.

2011, в 23:13
+1: правильный и синтетический ответ
Heisenbug 20 сен. 2011, в 23:18

Эй, но есть также дело, что 0
Ziggy 20 сен. 2011, в 23:22
Правильно, он должен использовать x <и k <, а не x <=

или если вы предпочитаете что-то более идиоматическое С++:

ДВУМЕРНЫЙ МАССИВ В C# | МНОГОМЕРНЫЕ МАССИВЫ В СИ ШАРП | ЧТО ТАКОЕ МАССИВЫ | ИЗУЧЕНИЕ C# | УРОК # 29


std::copy(boardArray, boardArray + 49, reinterpret_cast(boardArrayTwo));
Blastfurnace 20 сен. 2011, в 23:28
Поделиться
+1 потому что ты меня чему-то научил!
Ziggy 20 сен. 2011, в 23:23
Я ненавижу броски. Как насчет std::copy(boardArray[49],
Robᵩ 20 сен. 2011, в 23:53

Blastfurnace 21 сен. 2011, в 00:43
Показать ещё 1 комментарий

Вы использовали i > 50 в своем цикле for. Это должно быть i < 49 и такое же для всех остальных циклов.

Кроме того, это не сработает. Вы устанавливаете все значения boardArrayTwo[][] на boardArray[49] Вместо этого вы должны сделать что-то вроде этого:

for (int x = 0; x < 7; ++x) < for (int k = 0; k < 7; ++k) < boardArrayTwo[x][k] = boardArray[7*x + k]; cout >
int count = 0; for (int x = 0; x < 7; ++x) < for (int k = 0; k < 7; ++k) < boardArrayTwo[x][k] = boardArray[count]; cout >
quasiverse 21 сен. 2011, в 00:29
Поделиться
Ах, верно. Ред.
quasiverse 20 сен. 2011, в 23:58

Прежде всего, второе слагаемое в цикле for говорит, что цикл for будет работать, пока это условие истинно.

Таким образом, вы должны использовать < вместо >= для всех ваших циклов.

Во-вторых, цикл над n является дополнительным и его не должно быть. Вам нужно пройти через x и k , а затем скопировать соответствующий элемент из boardArray в boardArrayTwo .

Вы можете сделать одно из следующих действий:

int n = 0; for (int x = 0; x

или используйте формулу для вычисления правильного n :

for (int x = 0; x < 7; ++x) for (int k = 0; k < 7; ++k) boardArrayTwo[x][k] = boardArray[x*7+k];

Я написал x*7+k , потому что кажется, что x выполняет итерацию по строкам массива, каждая строка, содержащая 7 элементов, говорит, что x*7+k -ный элемент boardArray представляет позицию [x][k] of boardArrayTwo/

Читайте также:
Основные программы дошкольного образования

Источник: overcoder.net

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

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

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

нет по идее A[i] само по себе m*n то есть оно тоже зависит от пользователя
Решения вопроса 1

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

A=[1, 2, 3, 4, 5, 6] n=2 m=3 c=0 B=[[0]*m for i in range (n)] for i in range (n): for j in range (m): B[i][j]=A[c] c+=1 print (B)
Ответ написан более года назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 1

Vindicar

Ну. Код у тебя почти правильный.
Всё что тебе осталось — это найти формулу соответствия между индексами двухмерного массива r, c и индексом одномерного массива k.
Подсказка: значения k для массива размером 2 x 4.

k c=0 1 2 3 +——— r=0 | 0 1 2 3 r=1 | 4 5 6 7

Источник: qna.habr.com

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Из одномерного массива сделать двумерный

#1 Март 22, 2012 06:46:10

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

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

#2 Март 22, 2012 07:00:00

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

kate
Привет всем, ребят подскажите, как из одномерного массива(размерность у него всегда разная), сделать двумерный? просто у меня так получается, что до определенного момента удобнее работать с одномерным массивом, а потом использовать двумерный. Я прогуглила, но так и не поняла, может быть алгоритм какой есть? буду очень благодарна за любую помощь:)

Предположим, есть список

l=[1,2,3,4,5,6,7,8,9]

можно считать его одномерным массивом.
Что вы хотите получить из него, ведь вариантов может быть очень много,
напрмер

l=[
[1,2,3],
[4,5,6],
[7,8,9]
]
l=[
[1,2,3,4,5],
[6,7,8,9, None]
]

#3 Март 22, 2012 07:01:14

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

Короче, зависит от задачи. Давайте конкретный пример.

#4 Март 22, 2012 10:12:38

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

На мой ламерский взгляд можно воспользовать numpy. В нем можно менять размерность массива в любой момент. Хоть сколько мерный хоть какой длины по осям.

>>> a.ravel() # делает массив плоским
array([ 7., 5., 9., 3., 7., 2., 7., 8., 6., 8., 3., 2.])
>>> a.shape = (6, 2)
>>> a.transpose()
array([[ 7., 9., 7., 7., 6., 3.],
[ 5., 3., 2., 8., 8., 2.]])

Читайте также:
Как пользоваться программой ммана

#5 Март 22, 2012 13:21:27

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

FishHook
Короче, зависит от задачи. Давайте конкретный пример.

Ну вот к примеру у меня есть массив Q = , насколько я понимаю он одномерный, так? а мне нужно обратится к нему, как к двумерному:

def funk(Q):
x = len(Q)
y = len(Q[0])
Соответственно x оно считывает, при обращении к y возникает проблемма:
y = len(Q[0])
TypeError: object of type ‘int’ has no len()
Может я конечно, что-то не так делаю и что-то не так понимаю, так что прошу разъяснить мне:)

#6 Март 22, 2012 13:39:01

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

kate
Может я конечно, что-то не так делаю и что-то не так понимаю

скорее всего так и есть, можете описать задачу более полно? что это за функция и что она должна делать?

#7 Март 22, 2012 14:08:23

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

Может так?
Q или Q

#8 Март 22, 2012 14:18:59

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

kate
Может я конечно, что-то не так делаю и что-то не так понимаю

скорее всего так и есть, можете описать задачу более полно? что это за функция и что она должна делать? Ну собственно сюда мне нужно передать массив вида Q = . Вызываю я эту функцию и ловлю ошибку про которую писала выше.

def funk(S):
x = len(S)
y = len(S[0])

result = [[0 for j in range(y)] for i in range(x)]

result[0][0] = S[0][0]

for i in range(1, x):
result[i][0] = S[i][0] + result[i — 1][0]

for i in range(1, y):
result[0][i] = S[0][i] + result[0][i — 1]

for i in range(1,x):
for j in range(1, y):
result[i][j] = S[i][j] + result[i — 1][j] +
result[i][j — 1] + result[i — 1][j — 1]

return result

#9 Март 22, 2012 17:56:40

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

funk() чтото делает

#10 Март 22, 2012 18:21:20

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

Раз уж тайна задачи остается за 7 замками то объясним хотяб ей что за ошибка )
Q — последовательность, итерируемый объект
число (такое как 5, 18 или 69) — не итерируемый объект

Так вот функция len над итерируемым объектом возвращает количество, если список то количество элементов, если строка то количество символов.

Вы же когда запрашиваете len(S) спрашиваете чему равна длина первого элемента списка, т.е. len(1) на что и получаете ошибку. А ведь действительно нельзя ж подсчитать длину числа.

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

Источник: python.su

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru