Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2018, 18:55   #1
сергей_ком
Пользователь
 
Регистрация: 20.12.2018
Сообщений: 10
По умолчанию помогите решить задачу сортировка одномерных массивов в ВБА

помогите с задачей. Элементы вещественных массивов А и Б расположены по возрастанию. создать из них массив С, в котором числа упорядочены так же. я что-то пытался, что-то подсказали но итоге полученое не правильно работает. уже не знаю, что не так помогите.
Sub z4()
Dim a(), b(), c, d, e() As Integer
c = CInt(InputBox("введите количество элементов массива А"))
d = CInt(InputBox("введите количество элементов массива B"))
i = 1
ReDim a(1 To c)
For i = 1 To c
a(i) = CInt(InputBox("введите элементы массива А"))
Next i
ReDim b(1 To d)
For i = 1 To d
b(i) = CInt(InputBox("введите элементы массива В"))
Next i
ReDim e(1 To c + d)
For i = 1 To c
e(i) = a(i)
Next i
For j = 1 To d
e(i) = b(j)
Next j
For i = 1 To sizeArr - 1
If e(i) > e(i + 1) Then e(i) = e(i + 1): e(i + 1) = e(i)
Next i
s = ""
For i = 1 To c + d
s = s + CStr(e(i)) + " "
Next i
MsgBox s
End Sub
сергей_ком вне форума Ответить с цитированием
Старый 20.12.2018, 19:26   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

1. Согласно заданию данные упорядоченные по возрастанию, но в коде это никак не контролируется
2. При передаче значений из второго массива в объединенный, надо і инкриминировать
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 20.12.2018, 19:36   #3
сергей_ком
Пользователь
 
Регистрация: 20.12.2018
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
1. Согласно заданию данные упорядоченные по возрастанию, но в коде это никак не контролируется
2. При передаче значений из второго массива в объединенный, надо і инкриминировать
1. Это подразумевается
2. а поподробнее?
сергей_ком вне форума Ответить с цитированием
Старый 20.12.2018, 20:40   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,318
По умолчанию

1. Используй тэг [code] (ранее это был символ #) для правильного форматирования кода. Форматированный код легче читать. Смотри строку кнопок выше окна редактирования.

2. Обрати внимание на этот цикл
Код:
For j = 1 To d
   e(i) = b(j) ' элемент e(i) примет значение элемента b(d) и ... ??
Next j
Понятно, что ты пытаешься "приклеить" второй массив, но в таком случае надо бы
Код:
For j = 1 To d
e(i+j) = b(j)
Next j
Использование переменной цикла после цикла не правильно.
Существуют циклы, например в Си, когда переменная цикла описывается в теле цикла и после его (цикла) завершения, переменная не определена.
Лучше:
Код:
For j = 1 To d
e(c+j) = b(j)
Next j
3. Перед объединением массива сравнивай текущий элемент одного массива с текущим элементом второго и в новый массив отправляй меньший. Последовательно проверяй элементы массивов таким образом с тем, что бы новый массив так же был отсортирован по возрастанию. При этом может быть ситуация, когда несколько элементов одного массива будут меньше элемента второго.
Поскольку массивы неравной длинны, то оставшиеся элементы более длинного массива просто копируй в "хвост".
Если я правильно понял задачу
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 20.12.2018, 20:47   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,574
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
надо і инкриминировать
Может, не надо - i ведь очень законопослушное Я бы, пожалуй, ограничился инкрементом
digitalis вне форума Ответить с цитированием
Старый 21.12.2018, 15:11   #6
сергей_ком
Пользователь
 
Регистрация: 20.12.2018
Сообщений: 10
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
1. Используй тэг [code] (ранее это был символ #) для правильного форматирования кода. Форматированный код легче читать. Смотри строку кнопок выше окна редактирования.

2. Обрати внимание на этот цикл
Код:
For j = 1 To d
   e(i) = b(j) ' элемент e(i) примет значение элемента b(d) и ... ??
Next j
Понятно, что ты пытаешься "приклеить" второй массив, но в таком случае надо бы
Код:
For j = 1 To d
e(i+j) = b(j)
Next j
Использование переменной цикла после цикла не правильно.
Существуют циклы, например в Си, когда переменная цикла описывается в теле цикла и после его (цикла) завершения, переменная не определена.
Лучше:
Код:
For j = 1 To d
e(c+j) = b(j)
Next j
3. Перед объединением массива сравнивай текущий элемент одного массива с текущим элементом второго и в новый массив отправляй меньший. Последовательно проверяй элементы массивов таким образом с тем, что бы новый массив так же был отсортирован по возрастанию. При этом может быть ситуация, когда несколько элементов одного массива будут меньше элемента второго.
Поскольку массивы неравной длинны, то оставшиеся элементы более длинного массива просто копируй в "хвост".
Если я правильно понял задачу
Спасибо. Всё работает кроме сортировки, т.е. полученный массив e не отсортирован. Не подскажете, где я в сортировке напортачил?
сергей_ком вне форума Ответить с цитированием
Старый 21.12.2018, 20:06   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,318
По умолчанию

Цитата:
Не подскажете, где я в сортировке напортачил?
А вы и не должны сортировать массив e(). Он должен получиться в отсортированном виде после слияния массивов по определённому алгоритму.
Например такому:
1. Задаём начальные значения переменным, которые будут индексами массива: i, j, k - для a(), b() и e() соответственно
2. В цикле While ... (условие цикла надо задать)
3. Если a(i) < b(j): e(k) = a(i), i = i + 1
4. Иначе e(k) = b(j), j = j + 1
5. k = k + 1
6. Переход в голову цикла
7. Остаток массива (a() или b() - надо понять какого) перенести в массив e().

При этом надо понимать, что возможна ситуация, когда все элементы одного массива окажутся между двумя соседними элементами второго.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 21.12.2018, 20:16   #8
сергей_ком
Пользователь
 
Регистрация: 20.12.2018
Сообщений: 10
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
А вы и не должны сортировать массив e(). Он должен получиться в отсортированном виде после слияния массивов по определённому алгоритму.
Например такому:
1. Задаём начальные значения переменным, которые будут индексами массива: i, j, k - для a(), b() и e() соответственно
2. В цикле While ... (условие цикла надо задать)
3. Если a(i) < b(j): e(k) = a(i), i = i + 1
4. Иначе e(k) = b(j), j = j + 1
5. k = k + 1
6. Переход в голову цикла
7. Остаток массива (a() или b() - надо понять какого) перенести в массив e().

При этом надо понимать, что возможна ситуация, когда все элементы одного массива окажутся между двумя соседними элементами второго.
понял как-то не очень. куда всё это впихнуть? 7 пункт вообще не очень. переход в голову это next i/j/k? или что-то другое
сергей_ком вне форума Ответить с цитированием
Старый 21.12.2018, 22:42   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,318
По умолчанию

Хорошо, вот код на Паскале, который поясняет предложенный алгоритм.
Возможно, что это не самое оптимальное решение, но ...

Думаю что перевести на VB будет легко.
Вложения
Тип файла: txt massiv.txt (1.9 Кб, 122 просмотров)
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 22.12.2018, 16:38   #10
сергей_ком
Пользователь
 
Регистрация: 20.12.2018
Сообщений: 10
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Хорошо, вот код на Паскале, который поясняет предложенный алгоритм.
Возможно, что это не самое оптимальное решение, но ...

Думаю что перевести на VB будет легко.
ясно что ничего не ясно. Можно всё-таки обычную сортировку к объединённому массиву впихнуть? подскажите желательно с этой сортировкой. а то с вашим методом я вообще запутался.
сергей_ком вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачу, используя циклы (без массивов) Mas0n_ Общие вопросы C/C++ 4 26.10.2016 22:29
Задачи на обработку одномерных массивов (помогите решить все на паскале ) Жаннулька Помощь студентам 9 21.01.2014 10:50
Сортировка одномерных массивов palemupro Помощь студентам 4 01.12.2011 00:03
Решить в Паскале с использованием одномерных массивов Юююлия Помощь студентам 2 19.10.2011 19:06