1

Тема: [Merge] Обєднати впорядковані масиви мовою Pascal

Рятуйте панове

Задано два упорядкованих за неспаданням елементів масиви цілих чисел A(n)  ,n<=300   і  B(m) ,m<=200  . Розробити програму, яка створює з цих масивів один упорядкований за незростанням масив C(k), k=n+m. НА Delphi 10

2

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

І від чого ж вас рятувати?

3

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

Від набуття фаху програміста цим жебраком. Бо якщо ми не напишемо код, то він сам його напише і стане програмістом  :D

Подякували: /KIT\1

4

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

danil.fl написав:

Задано два упорядкованих за неспаданням елементів масиви цілих чисел ...

Розробити програму, яка створює з цих масивів один упорядкований за незростанням масив ...

Ось простий приклад:

0 0 1 2 4 6 6 6 7 8 9 9
0 1 2 2 3 5 7 7 8 8 8

0 0 _ 1 _ 2 _ _ _ 4 _ 6 6 6 7 _ _ 8 _ _ _ 9 9
_ _ 0 _ 1 _ 2 2 3 _ 5 _ _ _ _ 7 7 _ 8 8 8 _ _

0 0 0 1 1 2 2 2 3 4 5 6 6 6 7 7 7 8 8 8 8 9 9

9 9 8 8 8 8 7 7 7 6 6 6 5 4 3 2 2 2 1 1 0 0 0

Merge & Reverse.

Програма, яка з двох однаково упорядкованих масивів повертає об'єднаний упорядкований масив:

program MergeExample;
type
    TArray = array of Integer;
    TOrder = function(
        const a: Integer;
        const b: Integer
    ): Boolean;

function Ordered(
    const a: TArray; const n: Integer;
    const IsOrdered: TOrder
): Boolean;
var i: Integer;
begin
    Ordered := True;
    i := 1;
    while Ordered and (i < n) do
    begin
        if not IsOrdered(a[i-1], a[i]) then
            Ordered := False;
        i := i + 1;
    end;
end;

function Merge(
    const a: TArray; const aLen: Integer;
    const b: TArray; const bLen: Integer;
    const IsOrdered: TOrder
): TArray;
var ai, bi, ci, cLen: Integer;
begin
    ai := 0;
    bi := 0;
    ci := 0;
    cLen := aLen + bLen;
    Setlength(Merge, cLen);
    while (ai < aLen) and (bi < bLen) do
    begin
        if IsOrdered(a[ai], b[bi]) then
        begin
            Merge[ci] := a[ai];
            ai := ai + 1;
        end
        else
        begin
            Merge[ci] := b[bi];
            bi := bi + 1;
        end;
        ci := ci + 1;
    end;
    while (ai < aLen) do
    begin
        Merge[ci] := a[ai];
        ai := ai + 1;
        ci := ci + 1;
    end;
    while (bi < bLen) do
    begin
        Merge[ci] := b[bi];
        bi := bi + 1;
        ci := ci + 1;
    end;
end;

function Asc(
    const a: Integer;
    const b: Integer
): Boolean;
begin
    Asc := (a <= b);
end;

function Desc(
    const a: Integer;
    const b: Integer
): Boolean;
begin
    Desc := (a >= b);
end;

procedure PrintArray(
    const a: TArray; const n: Integer
);
var i: Integer;
begin
    for i := 0 to n - 1 do
        write(a[i], ', ');
    writeln();
end;

const n = 12; m = 11;
    a: array[0 .. n - 1] of Integer = (0, 0, 1, 2, 4, 6, 6, 6, 7, 8, 9, 9);
    b: array[0 .. m - 1] of Integer = (0, 1, 2, 2, 3, 5, 7, 7, 8, 8, 8);
{
    a: array[0 .. n - 1] of Integer = (9, 7, 6, 5, 4, 3, 3, 2, 2, 2, 1, 0);
    b: array[0 .. m - 1] of Integer = (9, 7, 6, 5, 5, 5, 4, 1, 1, 1, 0);
}
var c: TArray;
    aAsc, bAsc, aDesc, bDesc: Boolean;
begin
    PrintArray(a, n);
    PrintArray(b, m);
    aAsc := Ordered(a, n, @Asc);
    bAsc := Ordered(b, m, @Asc);
    aDesc := Ordered(a, n, @Desc);
    bDesc := Ordered(b, m, @Desc);
    if not aAsc and not aDesc then
    begin
        writeln('Array a is not ordered.');
        Exit();
    end;
    if not bAsc and not bDesc then
    begin
        writeln('Array b is not ordered.');
        Exit();
    end;
    if (aAsc and bDesc) or (aDesc and bAsc) then
    begin
        writeln('Arrays a and b has different orders.');
        Exit();
    end;
    if not aDesc and not bDesc then c := Merge(a, n, b, m, @Asc) else
    if not aAsc  and not bAsc  then c := Merge(a, n, b, m, @Desc);
    PrintArray(c, n + m);
end.

В даному прикладі порядок масиву-результату такий самий як в масивів-параметрів.
Якщо розберете (зрозумієте) цей приклад, то не буде проблемою вирішити початкову задачу.

danil.fl написав:

НА Delphi 10

То вже занадто.

офтоп

Як же я заїбався з тим паскалем, добре що він здох, шкода що освітяни дають його дітям в школах.

Подякували: ch0r_t, /KIT\2

5

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

leofun01, ви відповідаєте за тих, кого приручили.
Ну і Pascal/Delphi - усе ще непоганий вибір для першої мови. Звісно, з усвідомленням, що це саме перша навчальна мова.

Подякували: Chemist-i1

6

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

koala написав:

Ну і Pascal/Delphi - усе ще непоганий вибір для першої мови. Звісно, з усвідомленням, що це саме перша навчальна мова.

Відразу після всіх тих що у використанні зараз.

7

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

koala написав:

ви відповідаєте

  1. Це не готове рішення. Це майже готове рішення, над яким ще треба посидіти, щоб отримати той результат, який треба автору теми.

  2. Реалізація цього алгоритму (merge) саме в Pascal дуже погано ґуґлиться. Я не знайшов прикладу достатньо хорошого, щоб на нього можна було посилати користувачів.

  3. Дуже ймовірно, що danil.fl зіткнеться з проблемою синтакcної несумісності, якщо намагатиметься запускати цей код на Delphi 10.

Подякували: ch0r_t, koala2

8

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

tchort написав:
koala написав:

Ну і Pascal/Delphi - усе ще непоганий вибір для першої мови. Звісно, з усвідомленням, що це саме перша навчальна мова.

Відразу після всіх тих що у використанні зараз.

Ага. З динамічною типізацією і прихованими класами. Дуже зручно - для першої мови.

9

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

Go, C++, Rust, Nim, Java, Scala...

10 Востаннє редагувалося Droid 77 (09.07.2021 11:38:43)

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

Assembler забули вказати, це мабуть буде вічна мова :)

P. S.
danil.fl, в даній задачі треба скласти два масиви, отриманий масив відсортувати за спаданням.

11

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

C++ і Rust - величезні підбірки складних "так не можна" (тільки Rust про це повідомляє, а C++ намагається все одно зробити).
Java, Scala - там класи навіть неприховані. Вчити ООП до алгоритмів?
Nim/Python - боюся, хоч воно і дуже привабливе, але все одно на першу мову не тягне. З практики бачу, що запам'ятати, що (a in b) - це цикл по b новачкам досить складно. Надмірні скорочення теж псують навчання.
Хіба що Go лишається.

Подякували: leofun01, ch0r_t2

12

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

Droid 77 написав:

отриманий масив відсортувати за спаданням.

Тут відомо, що початкові масиви вже відсортовані, тому задача сортувати щось тут навіть не стоїть.
Достатньо { записати | вивести } масив в зворотньому порядку.

13

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

tchort написав:
koala написав:

Ну і Pascal/Delphi - усе ще непоганий вибір для першої мови. Звісно, з усвідомленням, що це саме перша навчальна мова.

Відразу після всіх тих що у використанні зараз.

Синтаксис паскаля все ще використовується у інших мовах програмування https://uk.wikipedia.org/wiki/Structured_text https://www.automation.siemens.com/sce- … 709-en.pdf

14

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

Перепрошую, Delphi все ще тримає останню позицію в індексі TIOBE, а це значно крутіше, ніж ваша екзотика.

Подякували: leofun011

15 Востаннє редагувалося cheappi386 (13.07.2021 12:01:23)

Re: [Merge] Обєднати впорядковані масиви мовою Pascal

Так я мав на увазі розробку нового а не підтримку легасі