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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2013, 13:30   #1
Akika
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 36
По умолчанию Объединение массивов VBA

Доброго времени суток!
Задача: Даны две последовательности a1<=a2<=...<=an и b1<=b2<=...<=bm. Образовать из них новую последовательность чисел так, чтобы она тоже была неубывающей. Дополнительный массив не использовать.

Создала два массива, отсортировала:
Цитата:
'заполнение и сортировка массива a
For i = 1 To n
a(i) = Int(Rnd * 50 - Rnd * 25)
Cells(i, 1) = a(i)
Next i
For i = 1 To n
For j = 1 To n - i
If a(j) > a(j + 1) Then
y = a(j)
a(j) = a(j + 1)
a(j + 1) = y
End If
Next j
Next i
For i = 1 To n
Cells(i, 1) = a(i)
Next i
Цитата:
'заполнение и сортировка массива b
For f = 1 To m
b(f) = Int(Rnd * 50 - Rnd * 25)
Cells(f, 2) = b(f)
Next f
For f = 1 To n
For h = 1 To n - f
If b(h) > b(h + 1) Then
y = b(h)
b(h) = b(h + 1)
b(h + 1) = y
End If
Next h
Next f
For f = 1 To m
Cells(f, 2) = b(f)
Next f
Подскажите, каким образом организовать объединение? На сколько я поняла, нужно ReDim переобъявиить массив (например а) и поэлементно в цикле включить в него другой массив. Или есть возможность просто объединить массивы и отсортировать конечный?

Заранее благодарю!
Akika вне форума Ответить с цитированием
Старый 03.06.2013, 14:52   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Переобъявлять массив не нужно:

Код:
Dim A%(1 To n), B%(1 To m)
If n > m Then
  For I = 1 To m
    A(I) = A(I) + B(I)
  Next I
  'сортировка массива A (можно пузырьком)
Else
  For I = 1 To n
    B(I) = A(I) + B(I)
  Next I
  'сортировка массива B (можно пузырьком)
End If
т.е. результат будет в большем массиве.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 03.06.2013, 15:36   #3
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Я задачу понял так.
Результитрующий массив А
Код:
 Dim n As Integer
    n = 10
    m = 14
    Dim A%()
    Dim B%()
    ReDim A(1 To n)
    ReDim B(1 To m)
    'заполнение и сортировка массива a
    For i = 1 To n
        A(i) = Int(Rnd * 50 - Rnd * 25)
        Cells(i, 1) = A(i)
    Next i
    For i = 1 To n
        For j = 1 To n - i
            If A(j) > A(j + 1) Then
                y = A(j)
                A(j) = A(j + 1)
                A(j + 1) = y
            End If
        Next j
    Next i
    For i = 1 To n
        Cells(i, 1) = A(i)
    Next i


    For f = 1 To m
        B(f) = Int(Rnd * 50 - Rnd * 25)
        Cells(f, 2) = B(f)
    Next f
    For f = 1 To m
        For h = 1 To m - f
            If B(h) > B(h + 1) Then
                y = B(h)
                B(h) = B(h + 1)
                B(h + 1) = y
            End If
        Next h
    Next f
    For f = 1 To m
        Cells(f, 2) = B(f)
    Next f

    ReDim Preserve A(1 To n + m)

    For i = 1 To m
        A(i + n) = B(i)
    Next i

    For f = 1 To n + m
        For h = 1 To n + m - f
            If A(h) > A(h + 1) Then
                y = A(h)
                A(h) = A(h + 1)
                A(h + 1) = y
            End If
        Next h
    Next f
    For f = 1 To n + m
        Cells(f, 3) = A(f)
    Next f
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 03.06.2013, 19:37   #4
Akika
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 36
По умолчанию

doober, DiemonStar, благодарю!
Все работает, единственное не могу понять в чем проблема. При выводе результирующего массива между положительными и отрицательными значениями выводиться большой промежуток пустых ячеек.
Вот конечный результат кода:
Код:
Private Sub CommandButton1_Click()
Cells.ClearContents
n = InputBox("Âââåäèòå ðàçìåðíîñòü ìàññèâà a", "Çàïîëíåíèå", "5")
m = InputBox("Âââåäèòå ðàçìåðíîñòü ìàññèâà b", "Çàïîëíåíèå", "7")

ReDim a(n)
ReDim b(m)
'
For i = 1 To n
    a(i) = Int(Rnd * 50 - Rnd * 25)
    Cells(i, 1) = a(i)
Next i
For i = 1 To n
    For j = 1 To n - i
    If a(j) > a(j + 1) Then
            y = a(j)
            a(j) = a(j + 1)
            a(j + 1) = y
    End If
    Next j
Next i
For i = 1 To n
    Cells(i, 1) = a(i)
Next i

For f = 1 To m
    b(f) = Int(Rnd * 50 - Rnd * 25)
    Cells(f, 2) = b(f)
Next f
For f = 1 To m
    For h = 1 To m - f
    If b(h) > b(h + 1) Then
            y = b(h)
            b(h) = b(h + 1)
            b(h + 1) = y
    End If
    Next h
Next f
For f = 1 To m
    Cells(f, 2) = b(f)
Next f

'
ReDim Preserve a(n + m)

    For i = 1 To n
        a(i + n) = b(i)
    Next i

    For f = 1 To n + m
        For h = 1 To n + m - f
            If a(h) > a(h + 1) Then
                y = a(h)
                a(h) = a(h + 1)
                a(h + 1) = y
            End If
        Next h
    Next f
    
    For f = 1 To n + m
        Cells(f, 3) = a(f)
    Next f 
End Sub
Akika вне форума Ответить с цитированием
Старый 03.06.2013, 22:04   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Переменные вас не учили объявлять.
Вы текст к тексту сложили и получили 57.
И попутали m и n.
Выделил все красным
Код:
Private Sub CommandButton1_Click()
Cells.ClearContents

Dim n As Integer, m As Integer
n = InputBox("Aaaaaeoa ?acia?iinou ianneaa a", "Caiieiaiea", "5")
m = InputBox("Aaaaaeoa ?acia?iinou ianneaa b", "Caiieiaiea", "7")

ReDim a(n)
ReDim b(m)
'
For i = 1 To n
    a(i) = Int(Rnd * 50 - Rnd * 25)
    Cells(i, 1) = a(i)
Next i
For i = 1 To n
    For j = 1 To n - i
    If a(j) > a(j + 1) Then
            y = a(j)
            a(j) = a(j + 1)
            a(j + 1) = y
    End If
    Next j
Next i
For i = 1 To n
    Cells(i, 1) = a(i)
Next i

For f = 1 To m
    b(f) = Int(Rnd * 50 - Rnd * 25)
    Cells(f, 2) = b(f)
Next f
For f = 1 To m
    For h = 1 To m - f
    If b(h) > b(h + 1) Then
            y = b(h)
            b(h) = b(h + 1)
            b(h + 1) = y
    End If
    Next h
Next f
For f = 1 To m
    Cells(f, 2) = b(f)
Next f

'
ReDim Preserve a(n + m)

    For i = 1 To m
        a(i + n) = b(i)
    Next i

    For f = 1 To n + m
        For h = 1 To n + m - f
            If a(h) > a(h + 1) Then
                y = a(h)
                a(h) = a(h + 1)
                a(h + 1) = y
            End If
        Next h
    Next f
    
    For f = 1 To n + m
        Cells(f, 3) = a(f)
    Next f
End Sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 03.06.2013, 22:21   #6
Akika
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 36
По умолчанию

Спасибо огромное, doober!
Невнимательность меня погубит -___- Хотя переменные были объявлены - глобально правда... Так что добавила приставку Int к InputBox и все заработало)))
Спасибо еще раз, выручили!
Akika вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
объединение массивов -=Andriushka=- Общие вопросы C/C++ 1 02.11.2011 22:11
объединение массивов любаша Паскаль, Turbo Pascal, PascalABC.NET 4 02.10.2010 11:23
Объединение массивов MilenaR Помощь студентам 10 30.03.2010 13:18
Объединение нескольких массивов по порядку. nec117 Общие вопросы C/C++ 4 16.05.2009 17:32
Объединение, пересечение, слияние массивов -=Domestos=- Помощь студентам 6 25.12.2006 21:06