0 / 0 / 0
Регистрация: 28.05.2017
Сообщений: 5
1

Все отрицательные элементы массива А необходимо поставить в начало массива, а положительные в конец

28.05.2017, 17:11. Показов 2034. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Нужна небольшая помощь с массивами в Assembler. Задача в следующем: Все отрицательные элементы массива А необходимо поставить в начало массива, а положительные в конец.
Я написал следующее, но она работает не совсем так, как нужно.
Pascal
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
program Buten;
uses crt;
const N=5;
var A:array[1..N] of shortint;
i,x: integer;
begin
Randomize;
for i:=1 to N do
A[i]:=-100+Random(200);
writeln('Massiv A:');
writeln;
read;
asm
LEA SI,A
mov CX,N
mov BX,4
mov x,0
@1: CMP x,BX
       JGE @2
       xor AX,AX
       mov AX,[SI+x]
       CMP AX,0
       JGE @3
       JMP @4
@3: mov DX,[SI+BX]
      mov [SI+x],DX
      mov [SI+BX],AX
      dec BX
      JMP @1
@4: inc x
      loop @1
@2: NOP
end;
writeln('Massiv A IZM:');
for i:=1 to N do
write(A[i],' ');
writeln;
readln;
end.
Программа работает, но выводит те же самые элементы, помогите разобраться.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2017, 17:11
Ответы с готовыми решениями:

Все отрицательные элементы массива необходимо поставить в начало массива
По заданию: перенести отрицательные элементы в начало, а порядок расположения чисел после меняться...

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

Перенести в начало массива все положительные элементы
Доброго времени суток. Нужно перенести в начало массива все положительные элементы Мой код: ...

В массиве все положительные элементы массива просуммировать, а отрицательные элементы удвоить
Добрый день, постановка задачи такая: Дан массив А(20). Все положительные элементы массива...

8
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
28.05.2017, 17:14 2
А какой алгоритм?
0
0 / 0 / 0
Регистрация: 28.05.2017
Сообщений: 5
28.05.2017, 17:31  [ТС] 3
начинаю с первого элемента, если он отрицательный то оставляю, если положительный делаю перестановку с последним, опять проверяю его если он опять положительный делаю перестановку с предпоследним и так по кругу, пока пока адреса не сойдутся
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
28.05.2017, 18:11 4
Знаете, можно модификацией сортировки пузырьком. Сравнивать соседние элементы логическими операциями и потом по значению знакового бита принимать решение о перестановке.
Как идея?

Два числа A и B - соседи массива. Таблица истинности для знаковых бит. Если результат равен 1 - требуется перестановка.
Код
A B | R
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
Получаем целевую функцию R=(/A)*B
И в терминах ассемблера
Assembler
1
2
3
4
5
    mov ax, [di]
    mov dx, [di-1]
    not ax
    and ax, dx
    js ОбменСоседей
0
0 / 0 / 0
Регистрация: 28.05.2017
Сообщений: 5
28.05.2017, 18:11  [ТС] 5
ФедосеевПавел, начинаю с первого элемента, если он отрицательный то оставляю, если положительный делаю перестановку с последним, опять проверяю его если он опять положительный делаю перестановку с предпоследним и так по кругу, пока пока адреса не сойдутся
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
28.05.2017, 19:16 6
Это я понял. Попробуйте сортировку пузырьком, с более сложной, чем просто (A[i]>A[i-1]). Целевую функцию я показал.

Добавлено через 15 минут
-------------------------
Посмотрел на вашу программу - а как вы узнаёте, что массив в точности равен исходному?
Ведь исходный совсем не выводится на экран.

Добавлено через 12 минут
Вот программа для проверки идеи.
Pascal
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
program test;
 
const
  N = 5;
type
  TArray = array[1..N] of integer;
 
  procedure BubbleSort(var A: TArray; N: integer);
  var
    i, j: integer;
    x: integer;
    R: integer;
  begin
    for i := 1 to N - 1 do
    begin
      j := N;
      while (j > i) do
      begin
        R := ((not (A[j - 1])) and (A[j]));
        if R<0 then
        begin
          x := A[j];
          A[j] := A[j - 1];
          A[j - 1] := x;
        end;
        Dec(j);
      end;
    end;
  end;
 
var
  i: integer;
  A: TArray;
begin
  randomize;
  writeln('Massiv A:');
  for i := 1 to N do
  begin
    A[i] := -100 + Random(200);
    Write(A[i]: 4);
  end;
  writeln;
 
  BubbleSort(A, N);
 
  writeln('Massiv A IZM:');
  for i := 1 to N do
    Write(A[i]: 4);
  writeln;
  //readln;
end.
Добавлено через 37 секунд
Остаётся лишь реализовать сортировку на ассемблере

Добавлено через 32 минуты
На Pascal оставил для понимания сортировки. Формулу весовой функции и её вывод приводил ранее.
Pascal
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
program test;
 
const
  N = 5;
type
  TArray = array[1..N] of integer;
 
  procedure BubbleSort(var A: TArray; N: integer);
  var
    i, j: integer;
    x: integer;
    R: integer;
  begin
    for i := 1 to N - 1 do
    begin
      j := N;
      while (j > i) do
      begin
        R := ((not (A[j - 1])) and (A[j]));
        if {(A[j - 1] > A[j])}R < 0 then
        begin
          x := A[j];
          A[j] := A[j - 1];
          A[j - 1] := x;
        end;
        Dec(j);
      end;
    end;
  end;
 
var
  i: integer;
  A: TArray;
begin
  randomize;
  writeln('Massiv A:');
  for i := 1 to N do
  begin
    A[i] := -100 + Random(200);
    Write(A[i]: 4);
  end;
  writeln;
 
  asm
    LEA BX,A
    MOV CX,N
    DEC CX
    MOV SI,0          {for i:=1 to N-1 do}
  @@ForI:
    MOV DI,N          {  j:=N}
    DEC DI
    SHL DI,1
  @@ForJ:             {  repeat}
    MOV AX,[BX+DI-2]  {    R := ((not (A[j - 1])) and (A[j]));}
    NOT AX
    AND AX,[BX+DI]
    JNS @@NextJ       {    if R<0 then}
    XCHG AX,[BX+DI]   {      temp:=A[j]}
    XCHG AX,[BX+DI-2] {      A[j]:=A[j-1]}
    XCHG AX,[BX+DI]   {      A[j-1]:=A[j]}
  @@NextJ:
    SUB DI,2          {    dec(j)}
    CMP DI,SI         {  until j<=i;}
    JA @@ForJ
    ADD SI,2          {  end; for i равноценно inc(i)}
    LOOP @@ForI
  end;
 
  writeln('Massiv A IZM:');
  for i := 1 to N do
    Write(A[i]: 4);
  writeln;
end.
1
0 / 0 / 0
Регистрация: 28.05.2017
Сообщений: 5
28.05.2017, 22:46  [ТС] 7
ФедосеевПавел, спасибо
0
0 / 0 / 0
Регистрация: 28.05.2017
Сообщений: 5
30.05.2017, 20:11  [ТС] 8
ФедосеевПавел, Обычный паскаль работает, но с ассемблером нет, просто выводит тоже самое без перестановки
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
31.05.2017, 10:51 9
Скомпилировал исходник из сообщения #6.
Результат нескольких прогонов на скриншоте.
Миниатюры
Все отрицательные элементы массива А необходимо поставить в начало массива, а положительные в конец  
0
31.05.2017, 10:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2017, 10:51
Помогаю со студенческими работами здесь

Все положительные элементы массива поставить в обратном порядке, не нарушая расположения остальных
Дан массив например 2 -3 5 -2 3 6 -3 Все положительные числа в массиве поставить в обратном...

Сложить отдельно положительные и отрицательные элементы массива
В массиве С(12) сложить отдельно элементы положительные и отрицательные. Подсчитать количество...

Сортировка массива: в начале - все отрицательные, затем - нулевые, в конце - все положительные ( с сохранением порядка)
Необходимо реализовать сортировку массива, состоящего из введенных ранее значений (всего 10). В...

[Masm] Записать отрицательные элементы массива в его начале, а положительные в конце
Добрый день! Мне нужно записать отрицательные элементы массива в его начале, а положительные в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru