0 / 0 / 0
Регистрация: 05.03.2018
Сообщений: 12
MASM

Произвести слияние массивов А и В, чтобы массив С был упорядочен по возрастанию

01.04.2018, 19:43. Показов 1427. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создать 2 массива: А[0..N-1], отсортированный по возрастанию и В[1..M], отсортированный по убыванию. Произвести слияние массивов А и В в массив С[0..N- 1+M] таким образом, чтобы массив С был упорядочен по возрастанию. Слияние производить в соответствии с упорядоченностью А и В, но сортировку не делать.

Я для своего удобства сделал её на Си, но мне нужно перевести это на Ассемблер с чем у меня возникают проблемы. Без сортировки сделать не получается.


C
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
#include <stdio.h>
#include <conio.h>
#include <iostream> 
 
int main()
{
    setlocale(LC_ALL, "RUSSIAN");
    const int n = 10, m = 5;
    int a[n], b[m], c[n + m],  i, j, k;
    
    printf("Введите %d элементов массива 'a' по возрастанию: ", n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
 
    printf("Введите %d элементов массива 'b' по убыванию: ", m);
    for (i = 0; i < m; i++)
        scanf("%d", &b[i]);
 
    i = k = 0;
    j = m - 1;
    while (i != n && j != -1)
    {
        if (a[i] <= b[j])
        {
            c[k] = a[i];
            i++;
        }
        else
        {
            c[k] = b[j];
            j--;
        }
        k++;
    }
 
    while (i <= n)
    {
        c[k] = a[i];
        i++;
        k++;
    }
 
    while (j >= 0)
    {
        c[k] = b[j];
        j--;
        k++;
    }
 
 
 
    printf("\nМассив c: ");
    for (i = 0; i < n + m; i++)
        printf("%d ", c[i]);
 
    _getch();
    return 0;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2018, 19:43
Ответы с готовыми решениями:

Переставить строки матрицы таким образом, чтобы первый столбец был упорядочен по возрастанию
При помощи случайных чисел ввести матрицу размером 8x10. Переставить строки матрицы таким образом, чтобы первый столбец был упорядочен по...

сделайте пожалуйсто чтобы исходный массив был упорядочен не повозврастанию!вот программа
Program zhenya13; const n=3; var v:array of integer; i,j,tmp:integer; begin random; for i:=1 to n do v:=random(100);...

Сформировать массив, который упорядочен по возрастанию и представляет операцию разности с элементами массивов
Даны два целочисленных одномерных массива. Сформировать третий одномерный массив на основе данных, который упорядочен по возрастанию и...

3
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8591 / 4437 / 1658
Регистрация: 01.02.2015
Сообщений: 13,763
Записей в блоге: 9
01.04.2018, 21:33
А про какой ассемблер речь и какую ОС?
0
0 / 0 / 0
Регистрация: 05.03.2018
Сообщений: 12
02.04.2018, 00:26  [ТС]
MASM или TASM для Windows
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8591 / 4437 / 1658
Регистрация: 01.02.2015
Сообщений: 13,763
Записей в блоге: 9
03.04.2018, 20:13
 Комментарий модератора 
Darth_Eredin, дублирование тем запрещено правилами форума.


Добавлено через 2 часа 23 минуты
Для двух упорядоченных по возрастанию массивов A и B:
Assembler
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
.686
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        arrA            dd      10, 51, 87, 93, 98, 123, 160, 168, 176, 251, 271, 295, 297, 298, 315, 325
        LenA            dd      ($-arrA)/4
        arrB            dd      6, 53, 82, 83, 93, 113, 167, 168, 179, 181
        LenB            dd      ($-arrB)/4
        aszMsgArrayA    db      0Dh, 0Ah, 'Array A:', 0Dh, 0Ah, 0
        aszMsgArrayB    db      0Dh, 0Ah, 'Array B:', 0Dh, 0Ah, 0
        aszMsgResult    db      0Dh, 0Ah, 'Result C:', 0Dh, 0Ah, 0
        aszInteger      db      '%4d', 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
        arrC            dd      1024 dup(?)
        LenC            dd      ?
 
.code
 
ShowArray       proc    lpArray:DWORD, uiAmount:DWORD
        pushad
 
        mov     ecx,    [uiAmount]
        mov     esi,    [lpArray]
        @@ForI:
                push    ecx
                lodsd
                invoke  wsprintf, ADDR Buffer, ADDR aszInteger, eax
                invoke  StrLen, ADDR Buffer
                mov     [BufLen],       eax
                invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                        BufLen, ADDR BufLen, NULL
                pop     ecx
        loop    @@ForI
 
        popad
        ret
ShowArray       endp
 
main    proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
 
        ;вывод исходных данных
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgArrayA,\
                LENGTHOF aszMsgArrayA - 1, ADDR BufLen, NULL
        invoke  ShowArray,      ADDR arrA, [LenA]
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgArrayB,\
                LENGTHOF aszMsgArrayB - 1, ADDR BufLen, NULL
        invoke  ShowArray,      ADDR arrB, [LenB]
 
        ;
        mov     eax,    [LenA]
        add     eax,    [LenB]
        mov     [LenC], eax
 
        ;слияние массивов, пока присутствуют элементы в обоих
        lea     esi,    [arrA]
        lea     ebx,    [arrB]
        lea     edi,    [arrC]
        mov     ecx,    [LenA]
        mov     edx,    [LenB]
        jmp     @@TestIndxs
        @@whileIJ:
 
                mov     eax,    [esi]
                cmp     eax,    [ebx]
                cmovg   eax,    [ebx]
                mov     ebp,    0
                stosd
                mov     eax,    1
                cmovg   eax,    ebp
                lea     esi,    [esi+4*eax]
                sub     ecx,    eax
                xor     eax,    1
                lea     ebx,    [ebx+4*eax]
                sub     edx,    eax
        @@TestIndxs:
                mov     eax,    0
                cmp     ecx,    1
                adc     eax,    eax
                cmp     edx,    1
                adc     eax,    eax
                cmp     eax,    0
        je      @@whileIJ
        @@breakIJ:
 
        @@AddArrA:
        jecxz   @@AddArrB
        rep     movsd
 
        @@AddArrB:
        mov     ecx,    edx
        mov     esi,    ebx
        jecxz   @@StopMerge
        rep     movsd
 
        @@StopMerge:
        ;вывод результата
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
        invoke  ShowArray,      ADDR arrC, [LenC]
 
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
main    endp
 
end     main
И лёгким движением руки добавив 3 строки превращаем его в слияние неубывающего массива A и невозрастающего массива B в неубывающий массив C
Assembler
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
.686
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        arrA            dd      10, 51, 87, 93, 98, 123, 160, 168, 176, 251, 271, 295, 297, 298, 315, 325
        LenA            dd      ($-arrA)/4
        arrB            dd      181, 179, 168, 167, 113, 93, 83, 82, 53, 6
        LenB            dd      ($-arrB)/4
        aszMsgArrayA    db      0Dh, 0Ah, 'Array A:', 0Dh, 0Ah, 0
        aszMsgArrayB    db      0Dh, 0Ah, 'Array B:', 0Dh, 0Ah, 0
        aszMsgResult    db      0Dh, 0Ah, 'Result C:', 0Dh, 0Ah, 0
        aszInteger      db      '%4d', 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
        arrC            dd      1024 dup(?)
        LenC            dd      ?
 
.code
 
ShowArray       proc    lpArray:DWORD, uiAmount:DWORD
        pushad
 
        mov     ecx,    [uiAmount]
        mov     esi,    [lpArray]
        @@ForI:
                push    ecx
                lodsd
                invoke  wsprintf, ADDR Buffer, ADDR aszInteger, eax
                invoke  StrLen, ADDR Buffer
                mov     [BufLen],       eax
                invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                        BufLen, ADDR BufLen, NULL
                pop     ecx
        loop    @@ForI
 
        popad
        ret
ShowArray       endp
 
main    proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
 
        ;вывод исходных данных
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgArrayA,\
                LENGTHOF aszMsgArrayA - 1, ADDR BufLen, NULL
        invoke  ShowArray,      ADDR arrA, [LenA]
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgArrayB,\
                LENGTHOF aszMsgArrayB - 1, ADDR BufLen, NULL
        invoke  ShowArray,      ADDR arrB, [LenB]
 
        ;
        mov     eax,    [LenA]
        add     eax,    [LenB]
        mov     [LenC], eax
 
        ;слияние массивов, пока присутствуют элементы в обоих
        lea     esi,    [arrA]
        lea     ebx,    [arrB]
        lea     edi,    [arrC]
        mov     ecx,    [LenA]
        mov     edx,    [LenB]
        lea     ebx,    [ebx+4*edx-4]
        jmp     @@TestIndxs
        @@whileIJ:
 
                mov     eax,    [esi]
                cmp     eax,    [ebx]
                cmovg   eax,    [ebx]
                mov     ebp,    0
                stosd
                mov     eax,    1
                cmovg   eax,    ebp
                lea     esi,    [esi+4*eax]
                sub     ecx,    eax
                xor     eax,    1
                neg     eax
                lea     ebx,    [ebx+4*eax]
                neg     eax
                sub     edx,    eax
        @@TestIndxs:
                mov     eax,    0
                cmp     ecx,    1
                adc     eax,    eax
                cmp     edx,    1
                adc     eax,    eax
                cmp     eax,    0
        je      @@whileIJ
        @@breakIJ:
 
        @@AddArrA:
        jecxz   @@AddArrB
        rep     movsd
 
        @@AddArrB:
        mov     ecx,    edx
        mov     esi,    ebx
        jecxz   @@StopMerge
        rep     movsd
 
        @@StopMerge:
        ;вывод результата
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
        invoke  ShowArray,      ADDR arrC, [LenC]
 
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
main    endp
 
end     main
Добавлено через 1 минуту
Интересно - можно эффективнее?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.04.2018, 20:13
Помогаю со студенческими работами здесь

Массив L[N] – упорядочен по возрастанию, массив Y[N]- упорядочен по убыванию. Сформировать массив Z из элементов массива
Массив L – упорядочен по возрастанию, массив Y- упорядочен по убыванию. Сформировать массив Z из элементов массива L и Y, упорядочив их по...

Разработать слияние 2 массивов и отсортировать по возрастанию массив С
Возникла проблема при создании. Даны два массива. А из n элементов отсортирован по возростанию.В из m елем , отсортирован по убыванию....

Удалить из массива минимальное количество элементов, чтобы массив стал упорядочен по возрастанию
Всем добрый день Задача Дан массив чисел, необходимо удалить из данного массива минимальное количество элементов, чтобы массив стал...

Провести слияние двух массивов по возрастанию, создавая третий массив
Провести слияние двух массивов по возрастанию, создавая третий массив. Помогите пожалуйста:(

Переписать все элементы из этих массивов в массив С так, чтобы массив С был упорядоченным
Даны два упорядоченных целочисленных массива: А, содержащий n1 элементов и В из n2 элементов. Переписать все элементы из этих массивов в ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Интеграция Hangfire с RabbitMQ в проектах C#.NET
stackOverflow 18.04.2025
Разработка современных . NET-приложений часто требует выполнения задач "за кулисами". Это может быть отправка email-уведомлений, генерация отчётов, обработка загруженных файлов или синхронизация. . .
Построение эффективных запросов в микросервисной архитектуре: Стратегии и практики
ArchitectMsa 18.04.2025
Микросервисная архитектура принесла с собой много преимуществ — возможность независимого масштабирования сервисов, технологическую гибкость и четкое разграничение ответственности. Но как часто бывает. . .
Префабы в Unity: Использование, хранение, управление
GameUnited 18.04.2025
Префабы — один из краеугольных элементов разработки игр в Unity, представляющий собой шаблоны объектов, которые можно многократно использовать в различных сценах. Они позволяют создавать составные. . .
RabbitMQ как шина данных в интеграционных решениях на C# (с MassTransit)
stackOverflow 18.04.2025
Современный бизнес опирается на множество специализированных программных систем, каждая из которых заточена под решение конкретных задач. CRM управляет отношениями с клиентами, ERP контролирует. . .
Типы в TypeScript
run.dev 18.04.2025
TypeScript представляет собой мощное расширение JavaScript, которое добавляет статическую типизацию в этот динамический язык. В JavaScript, где переменная может свободно менять тип в процессе. . .
Погружение в Kafka: Концепции и примеры на C# с ASP.NET Core
stackOverflow 18.04.2025
Apache Kafka изменила подход к обработке данных в распределенных системах. Эта платформа потоковой передачи данных выходит далеко за рамки обычной шины сообщений, предлагая мощные возможности,. . .
Коммуникация в реальном времени с SignalR в C# на примере создания чата
UnmanagedCoder 17.04.2025
Современный веб стремительно эволюционирует от статичных страниц к динамичным приложениям, где пользователи ожидают мгновенной реакции на свои действия. Представим, что вы отправляете сообщение. . .
Реализация CQRS с MediatR на C# .NET
stackOverflow 17.04.2025
Современная разработка программного обеспечения постоянно ищет пути повышения эффективности организации кода. Архитектурные паттерны появляются, эволюционируют, и те, что проявляют свою. . .
Verilog и интеллектуальная собственность - "глазами" обученной LM модели.
Hrethgir 17.04.2025
В сети встречаются участники, заявляющие что код на Verilog ни о чём не говорит. Но вот патентная практика на самом деле показывает обратное ими утверждаемому. То-есть код на Verilog включают в. . .
Свап-файл дополнительно к разделу (если вдруг не хватает или не создан)
jigi33 17.04.2025
ПОДКЛЮЧЕНИЕ ДОПОЛНИТЕЛЬНОГО SWAP ПРОСТРАНСТВА, Т. О. , РАСШИРЕНИЕ ЕГО РАЗМЕРА В Linux можно использовать как раздел подкачки (swap), так и файл подкачки (swap-файл). Чтобы создать swap-файл вместо. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru