Читайте также:
|
|
{$L l08.obj}
uses crt;
const
N = 15;
type
row = array[1..N] of integer;
var
h: row;
i, k: integer;
procedure count6 (var a: row; var zcnt: integer; razm: integer); external;
begin
clrscr;
writeln;
writeln;
write('Исходный массив:');
randomize;
for i:=1 to N do begin
h[i]:= -5 + random(10);
write(' ',h[i]);
end;
count6(h,k,N);
writeln;
writeln('Кол-во нулей между max и min: ',k);
write(' Результат:');
for i:= 1 to N do write(' ',h[i]);
readkey;
end.
public count6
code segment byte public
assume cs: code
.286
count6 proc near
push bp
mov bp,sp
pusha
lds si,[bp+10]; адрес массива
mov cx,[bp+4]; размер массива
mov ax,[si]; принимаем первый элемент за максимум
mov di,si; сохраняем его адрес
; поиск максимума
cycl: cmp ax,[si]; сравниваем максимум с текущим
jge next; если текущий меньше, переходим к следующему
mov ax,[si]; сохраняем максимальный элемент
mov di,si; и его адрес
next: add si,2; продвигаем адрес
loop cycl
; поиск минимума
lds si,[bp+10]
mov cx,[bp+4]
mov ax,[si]
mov bx,si; будем хранить его адрес в bx
cycl2: cmp ax,[si]
jle next2
mov ax,[si]
mov bx,si
next2: add si,2
loop cycl2
xor dx,dx
cmp bx,di; определим, max или min встречается раньше
jle fmin
mov ax,di; меняем адреса местами
mov di,bx
mov bx,ax
fmin: mov cx,di; определим кол-во эл-тов между max и min
sub cx,bx
shr cx,1
dec cx
test cx,cx; проверка на то, что max и min лежат рядом
jz zero; если да, нули считать нет смысла
mov si,bx
add si,2
cycl3: cmp word ptr [si],0; проверка на 0
jnz next3
inc dx; считаем нули
next3: add si,2
loop cycl3
zero: lds si,[bp+6]
mov [si],dx; записываем количество нулей
; займемся сортировкой
lds si,[bp+10]
mov cx,bx
sub cx,si
shr cx,1
sub cx,1
mov bx,cx
cmp cx,0; защитимся от случая, когда нечего сортировать
jle done1
cycl4: push cx
mov cx,bx
lds si,[bp+10]
cycl5: mov ax,[si]
cmp ax,[si+2]
jge next5
mov dx,[si+2]
mov [si+2],ax
mov [si],dx
next5: add si,2
loop cycl5
pop cx
loop cycl4
done1:; далее сортируем конец массива
lds si,[bp+10]
mov ax,di
sub ax,si
shr ax,1
mov cx,[bp+4]
sub cx,ax
sub cx,2
mov bx,cx
cmp cx,0; защитимся от случая, когда сортировка не нужна
jle exit
add di,2
cycl6: push cx
mov cx,bx
mov si,di
cycl7: mov ax,[si]
cmp ax,[si+2]
jge next7
mov dx,[si+2]
mov [si+2],ax
mov [si],dx
next7: add si,2
loop cycl7
pop cx
loop cycl6
exit:
popa
pop bp
ret 10
count6 endp
code ends
end
Дата добавления: 2015-08-02; просмотров: 138 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Создать массив М[ 1 ..N]. Определить минимальное значение среди первых N DIV 2 чисел. Максимальное всего массива заменить в массиве на это минимальное значение. | | | В массиве Z[1..N] определить сумму нечетных чисел от последнего нулевого значения до Z[N] и среднее арифм. четных до последнего нуля. |