Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 06.06.2012
Сообщений: 19

Заполнить массив рядом натуральных чисел

06.06.2012, 19:22. Показов 2170. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста, с массивами всё плохо(

Заполнить массив рядом натуральных чисел, расположив их раскручивающейся спиралью против часовой стрелки
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.06.2012, 19:22
Ответы с готовыми решениями:

Заполнить матрицу множеством натуральных чисел по спирали против часовой стрелки
заполнить матрицу NxN множество натуральных чисел по спирали против часовой стрелке по VBA

Заполнить массив рядом натуральных чисел
Заполнить массив рядом натуральных чисел, расположив их раскручивающейся спиралью против часовой стрелки. 5 4 3 2 1 ...

Заполнить массив в шахматном порядке нулями и рядом натуральных чисел
Заполнить массив А(4*7) следующим образом: 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 реально ли это...

11
0 / 0 / 0
Регистрация: 06.06.2012
Сообщений: 19
10.06.2012, 18:24  [ТС]
--up--
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
11.06.2012, 20:55
Цитата Сообщение от xXxhp Посмотреть сообщение
--up--
Цитата Сообщение от https://www.cyberforum.ru/announcement.php?a=3
2.13 Если на ваш вопрос долгое время нет ответа, уточните его, приведите дополнительные сведения, которые могут помочь участникам форума решить вашу проблему.

2.14 Чтобы "поднять" тему в разделе и поиске по форуму, используйте осмысленные сообщения, например "Тема/проблема/задача актуальна". Если вы чего-то достигли в решении проблемы на этот момент, сообщите об этом.
Массив двумерный?
Квадратный?
1
0 / 0 / 0
Регистрация: 06.06.2012
Сообщений: 19
11.06.2012, 22:50  [ТС]
Цитата Сообщение от Апострофф Посмотреть сообщение
Массив двумерный?
Квадратный?
Прошу прощения что упустил из виду данные правила, массив скорее всего двумерный
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.06.2012, 00:32
Хотел рекурсию, но вышло это:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Option Explicit
'option base 1
 
Sub Spiral()
Dim Y%, X%, Sy%, Sx%, Mx%, My%, C%, Modif%
'размерность
My = Application.InputBox(prompt:="Введите размерность массива по оси Y (>=1): ", Type:=1)
Mx = Application.InputBox(prompt:="Введите размерность массива по оси X (>=1): ", Type:=1)
'dim Mass%(My,Mx)
Sx = Mx 'дистанция
Sy = My - 1
Modif = 1 'модификатор направления движения
Y = 1: X = 0 'стартовая позиция
Do
    Call WriteLine(Y, X, 0, Modif, Sy, Sx, C) 'горизонталь
    Sx = Sx - 1
    If Sy <> 0 Then
        Call WriteLine(Y, X, Modif, 0, Sy, Sx, C) 'вертикаль
        Sy = Sy - 1
    End If
    Modif = Modif * -1 'меняем направление
Loop Until C = Mx * My
End Sub
 
Private Sub WriteLine(Y%, X%, ShiftY%, ShiftX%, ByVal Sy%, ByVal Sx%, C%)
Do
    C = C + 1
    Y = Y + ShiftY: X = X + ShiftX 'передвигаемся
    Cells(Y, X) = C ': Mass(y,x)=c
    Sy = Sy - Abs(ShiftY): Sx = Sx - Abs(ShiftX) 'уменьшаем дистанцию
Loop Until (Sy = 0 And Abs(ShiftY) <> 0) Or (Sx = 0 And Abs(ShiftX) <> 0)
End Sub
Можно использовать не-квадратную матрицу.

Чтобы выводить не на лист, а в массив раскомментируйте строки №№ 2,9,29.
1
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
17.06.2012, 16:23
Обалденно закручивает, а просили-то раскрутить:
Цитата Сообщение от xXxhp Посмотреть сообщение
раскручивающейся спиралью
Хотя, конечно, путь указан... пусть теперь хоть конём ходят!
Миниатюры
Заполнить массив рядом натуральных чисел  
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.06.2012, 17:05
Цитата Сообщение от xXxhp Посмотреть сообщение
раскручивающейся спиралью против часовой стрелки
Sasha_Smirnov, я логично предположил, что слово "раскручиваться" может быть применено только в контексте ...от центра. А значит "против часовой стрелки" - это и есть мой пример.
Ну если не так, то сейчас переделаю:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Option Explicit
'option base 1
 
Sub Spiral()
Dim Y%, X%, Sy%, Sx%, Mx%, My%, C%, Modif%
'размерность
My = Application.InputBox(prompt:="Введите размерность массива по оси Y (>=1): ", Type:=1)
Mx = Application.InputBox(prompt:="Введите размерность массива по оси X (>=1): ", Type:=1)
'dim Mass%(My,Mx)
Sx = Mx - 1 'дистанция
Sy = My
Modif = 1 'модификатор направления движения
Y = 0: X = 1 'стартовая позиция
Do
    Call WriteLine(Y, X, Modif, 0, Sy, Sx, C) 'вертикаль
    Sy = Sy - 1
    If Sx <> 0 Then
        Call WriteLine(Y, X, 0, Modif, Sy, Sx, C) 'горизонталь
        Sx = Sx - 1
    End If
    Modif = Modif * -1 'меняем направление
Loop Until C = Mx * My
End Sub
 
Private Sub WriteLine(Y%, X%, ShiftY%, ShiftX%, ByVal Sy%, ByVal Sx%, C%)
Do
    C = C + 1
    Y = Y + ShiftY: X = X + ShiftX 'передвигаемся
    Cells(Y, X) = C ': Mass(y,x)=c
    Sy = Sy - Abs(ShiftY): Sx = Sx - Abs(ShiftX) 'уменьшаем дистанцию
Loop Until (Sy = 0 And Abs(ShiftY) <> 0) Or (Sx = 0 And Abs(ShiftX) <> 0)
End Sub
(закручивающаяся против часовой стрелки).
1
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
17.06.2012, 21:42
вариант:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub t()
  Dim n%, m%, nn%, i%, j%, di%, dj%, a%()
  n = InputBox("n=")
  m = InputBox("m=")
  Cells.Clear
  ReDim a(1 To n, 1 To m)
  nn = n * m: i = 1: j = 1: di = 0: dj = 1
  Do While nn
    a(i, j) = nn
    i = i + di: j = j + dj
    If i > n Or i < 1 Or j > m Or j < 1 Then GoTo povorot
    If a(i, j) Then GoTo povorot
    nn = nn - 1
    GoTo nxValue
povorot:
    If nn = 1 Then Exit Do
    i = i - di: j = j - dj
    If di = 0 Then di = dj: dj = 0 Else dj = -di: di = 0
nxValue:
  Loop
  [a1].Resize(n, m).Value = a
End Sub
Добавлено через 4 часа 11 минут
спирали-то у нас с Diskretor'ом разные получились.
но я так и не понял - какой вариант "правильный"?
в смысле - с т.зр. автора темы.
2
0 / 0 / 0
Регистрация: 06.06.2012
Сообщений: 19
17.06.2012, 23:19  [ТС]
Спс за проделанную работу ребят, вариант ikki подошёл мне более, т.к. именно получается, что раскручивается от центра. А вариант Diskretor’а, как он сам и указал, закручивается против часовой
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.06.2012, 23:37
Там вообще 2 варианта.
Sasha_Smirnov, значит я был изначально прав. ТС = пост №№ 5, 8.

Алгоритм проверки отсутствия хода, как ikki, делать было неитересно (это как в игре червячек напоминает , чтобы себя не съесть.
Да и проверка условием состояния модификатора движения, чтоб его повернуть, для меня сильно банально.
Вообщем у ikki классика - для препода подойдет.
А у меня - как всегда.
1
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
18.06.2012, 00:48

Не по теме:

Цитата Сообщение от Diskretor Посмотреть сообщение
у ikki классика - для препода подойдет.
мне тут недавно внушение делали - я впитал, дааа!



Добавлено через 53 минуты
если уж честно

предложенный мной алгоритм настолько неоптимален, что оказывается примерно в 3,5 раза хуже, чем другой алгоритм.
в чем фишка?
первый алгоритм писался и отлаживался минут 10, второй - более получаса.
вот и думай

кстати, имхо: второй - даже более "классика"

что и как тестировали
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Option Explicit
Const testCount = 1000
Dim iTest%
 
Sub t1()
  Dim n%, m%, nn&, i%, j%, di%, dj%, a%(), t
  n = 100 'InputBox("n=")
  m = 100 'InputBox("m=")
  Cells.Clear
  t = Timer
  For iTest = 1 To testCount
    ReDim a(1 To n, 1 To m)
    nn = n * m: i = 1: j = 1: di = 0: dj = 1
    Do While nn
      a(i, j) = nn
      i = i + di: j = j + dj
      If i > n Or i < 1 Or j > m Or j < 1 Then GoTo povorot
      If a(i, j) Then GoTo povorot
      nn = nn - 1
      GoTo nxValue
povorot:
      If nn = 1 Then Exit Do
      i = i - di: j = j - dj
      If di = 0 Then di = dj: dj = 0 Else dj = -di: di = 0
nxValue:
    Loop
  Next
  Debug.Print Timer - t
  [a1].Resize(n, m).Value = a
End Sub
 
Sub t2()
  Dim n%, m%, nn&, a%(), vec As Byte
  Dim jLeft%, jRight%, v%, iTop%, iBottom%, t
  n = 100 'InputBox("n=")
  m = 100 'InputBox("m=")
  Cells.Clear
  t = Timer
  For iTest = 1 To testCount
    ReDim a(1 To n, 1 To m)
    nn = n * m: vec = 1
    jLeft = 1: jRight = m: iTop = 1: iBottom = n
    Do While nn
      Select Case vec
        Case 1
          For v = jLeft To jRight: a(iTop, v) = nn: nn = nn - 1: Next
          iTop = iTop + 1
        Case 2
          For v = iTop To iBottom: a(v, jRight) = nn: nn = nn - 1: Next
          jRight = jRight - 1
        Case 3
          For v = jRight To jLeft Step -1: a(iBottom, v) = nn: nn = nn - 1: Next
          iBottom = iBottom - 1
        Case 4
          For v = iBottom To iTop Step -1: a(v, jLeft) = nn: nn = nn - 1: Next
          jLeft = jLeft + 1
      End Select
      vec = IIf(vec = 4, 1, vec + 1)
    Loop
  Next
  Debug.Print Timer - t
  [a1].Resize(n, m).Value = a
End Sub
 
Sub spirTest()
  Call t1
  Call t2
End Sub


что получили
Visual Basic
1
2
3
4
5
6
7
8
9
10
 2,015625 
 0,5927734 
 2,014648 
 0,5927734 
 2,015625 
 0,578125 
 2,016602 
 0,5947266 
 2,015625 
 0,578125
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
18.06.2012, 02:49
Вот и посоревновались
Visual Basic
1
2
3
4
5
Sub spirTest()
  Call t1
  Call t2
  Call t3 'Diskretor
End Sub
Dubug:
0,9008789
0,2446289
0,453125

Мой результат - средний
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.06.2012, 02:49
Помогаю со студенческими работами здесь

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

Заполнить матрицу рядом натуральных чисел от 1 до 48
вывести матрицу и заполнить ее рядом натуральных чисел от 1 до 48.

Заполнить массив рядом чисел от 0 до 9, вывести его на экран
дан массив на 10 элементов (задания делать с помощью циклов). - Заполнить его рядом чисел от 0 до 9, вывести его на экран. - Заполнить...

Заполнить массив квадратами натуральных чисел в заданном диапазоне
Напишите программу, которая заполняет массив квадратами натуральных чисел от 1 до N . Входные данные Входная строка содержит размер...

Заполнение блока памяти рядом натуральных чисел
Составить процедуру (тип NEAR) заполнения блока памяти из N слов рядом натуральных чисел. Если число делится на 4 то вместо него заносится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru