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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2012, 13:19   #1
fratriecz
Пользователь
 
Регистрация: 13.10.2012
Сообщений: 18
По умолчанию pascal abc слить массивы

имеется два массива содержащие упорядоченные последовательности целых чисел.необходимо слить два массива в один.результирующая последовательность должна быть упорядоченна по тому же закону что и исходные
fratriecz вне форума Ответить с цитированием
Старый 14.10.2012, 17:24   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на форуме были готовые примеры решения.

если кратко, то
1-е. путём сравнения элементов в массиве устанавливаете в каком они порядке (возрастающем или убывающем).
2-е. заводите две переменные индексы для каждого массива (пусть это будут I и J).
в цикле сравниваете I-й элемент первого массива с K-м элементов второго массива, в зависимости от того, какой больше-меньше в итоговый массив переносите элемент из нужного массива. Увеличиваете счётчик того массива, откуда взяли элемент.
Не забываете следить за тем, чтобы I было меньше меньше-равно размера массива 1 и K было меньше-равно размера массива 2. Если любой из элементов вышел за пределы размерности, то сравнение элементов массива не проводим, просто переносим оставшиеся элементы в результирующий массив.
примерно так...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.10.2012, 17:48   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
и K было меньше-равно размера массива 2
Вместо K надо J
И как я понимаю эта строка :
Цитата:
результирующая последовательность должна быть упорядоченна по тому же закону что и исходные
Гарантирует что последовательности будут упорядочены по одинаковому закону.
Serge, очень интересно, вот накропал чуть-чуть по Вашему описанию, примерно так ?
Код:
type
        TArr = array [1..100] of Integer;

procedure InitArr (var a : TArr; n : Integer);

var
        i : Integer;

begin
        for i := 1 to n do
                Read (a[i])
end;

procedure SortArr (const a, b : TArr; const n, m : Integer);

var
        f : Boolean;
        i, j, k : Integer;

begin
        if a[1] > a[2] then
                f := TRUE
        else
                f := FALSE;

        j := 1;
        k := 1;
        for i := 1 to n+m do begin
                     if (j <= 2) and (k <= 2) then
                               if (a[j] > b[k]) xor f then begin
                                      Write (b[k]);
                                      Inc (k)
                               end
                               else begin
                                      Write (a[j]);
                                      Inc (j)
                               end
                     else
                               if j <= 2 then begin
                                      Write (a[j]);
                                      Inc (j);
                               end
                               else begin
                                      Write (b[k]);
                                      Inc (k)
                               end;

        end
end;

var
        a, b : TArr;
        n, m : Integer;
begin
        Read (n, m);
        InitArr (a, n);
        InitArr (b, m);

        SortArr (a, b, n, m)

end.
Без "слива" в массив, просто выводим

Последний раз редактировалось Poma][a; 15.10.2012 в 07:27.
Poma][a вне форума Ответить с цитированием
Старый 15.10.2012, 14:44   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
                   if (j <= 2) and (k <= 2) then
...
                    else
                               if j <= 2 then begin
ну что Вы, коллега?!!
При чём здесь 2 ?

разумеется, должно быть:
Код:
              if (j <= n) and (k <= m) then ...
              else
                 if ( j <= n ) then ...
а в остальном Вы идею уловили абсолютно точно!


p.s. Мне очень понравилась ваша идея с xor f!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.10.2012, 15:07   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
ну что Вы, коллега?!!
эх, будем надеяться будущий коллега

Да-да мой косяк. Просто впечатлила Ваша идея, и решил попробовать только на a[1], a[2], b[1], b[2]. Потом lдоделал до полноценного массива, и забыл исправить...

P.S. Методом про и ошибок, наконец-то вышел на xor
P.P.S. Увы, Серж, система не позволяет поставить свой скромный +, увы... Огромное спасибо за идею и замечания! и плюсик

Последний раз редактировалось Poma][a; 15.10.2012 в 22:03.
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal ABC. массивы lyulka Помощь студентам 1 20.12.2012 13:54
МАССИВЫ PASCAL ABC Sofiaa Помощь студентам 0 25.05.2011 02:14
Pascal abc. массивы philadelpia Помощь студентам 1 11.05.2011 09:29
PASCAL ABC. массивы XIMAGAN Помощь студентам 8 09.06.2010 07:21
Pascal ABC, массивы Russia Помощь студентам 8 23.05.2009 12:23