Читайте также:
|
|
{$L 08.obj}
program pas08;
Uses crt;
type mystr = string[40];
var a: mystr;
procedure work(var a:mystr);
external;
Begin
clrscr;
writeln ('enter string:');
{readln (a);}
a:='aaa bbb aaa aa bbb b aaaa c a aa b c aa ';
writeln (a);
work (a);
readkey;
End.
.286
public work
data segment public
maxlen dw?;длина строки
i dw 1;индекс у слова
count db 0;сч-к одинак. слов
eti dw?;индекс у эталона
etword db 40 dup (' ');слово-эталон
etbegin dw?;начало сэталона
etend dw?;конец эталона
etlen dw?;длина эталона
nwword db 40 dup (' ');;анали-е слово (а-слово)
nwbegin dw?;начало а-слова
nwend dw?;конец а-слова
nwlen dw?;длина а-слова
data ends
;==========================================
code segment byte public
assume cs:code,ds:data
work proc near
push bp
mov bp,sp
pusha
mov si,[bp+4];Загружаем адрес предл-я
lea di,etWord;Указатель на слово-эталон
mov bx,1;Указатель на первый символ
mov etbegin,bx;Сначала эталон начинается с
; 1го символа
xor cx,cx
mov cl,byte ptr [si];Количество символов в строке
mov maxlen, cx;Запоминаем в переменной
mov eti,1;Индекс в а-слове
cycl1:;берем первое слово или ищем след. уникальное слово
mov ah,byte ptr bx[si];загружаем символ
cmp ah,' ';Если это не пробел
jne chain2;переходим к следующему символу
jmp far2;Развязка с длинной
chain2: jmp nothng1; больше 255 байт
;Теперь есть слово в etWord
far2: mov etend, bx;Запонимаем конец эталона
mov dx, bx
sub dx, etbegin;Вычисляем длину эталона
mov etlen, dx; и запоминаем ее
call out_et;Выводим эталон на экран
mov count, 1;Нашли одно слово:)
push bx;Сохраняем индекс строки
;берем след. слово
lea di, nwWord;Указатель на а-слово
mov i, 1;Индекс в А-слове
inc bx;Продолжаем просматривать исх. строку
mov nwbegin, bx;Запоминаем началоо а-слова
cycl2: mov ah, byte ptr bx[si];Взяли символ
cmp ah, ' ';Если не пробел
jne nothng2; то берем след. символ
;Тепрь а-слово в nwWord
mov nwend, bx;Запоминаем конец слова
mov dx, bx;Вычисляем
sub dx, nwbegin; длину а-слова
mov nwlen, dx; и запоминаем ее
call cmp_w;Сравниваем эталон и а-слово
cmp ax, 00;Если не равны
je neq; то ничего не делаем
;слова равны
inc count;Увеличиваем счетчик
call removew;Удаляем а-слово из предложения
mov bx, nwbegin;Снова возвращаемся к
dec bx; концу предыд. слова (на пробел)
neq:
;взять след. слово
mov i,1;Сбрасываем индекс в а-слове
inc bx;переходим на 1ый символ след. слова
mov nwbegin, bx;Запоминаем начало а-слова
cmp bx, maxlen;Достигли конца строки?
jle cycl2; - нет продолжить анализ
jmp out2;Дошли до конца предложения
nothng2:;сюда приходим если текущий анализируемый символ - не пробел
push bx;Сохраняем индекс строки
mov bx, i;Берем индекс а-слова
mov byte ptr bx[di], ah;Пишем в а-слово символ
pop bx;Восстанавливем индекс строки
inc bx;Переход к след. символу строки
inc i;Увелич-м индекс в а-слове
cmp bx, maxlen;А может достигли коца строки?
jle cycl2; - нет - продолжить анализ
out2:;теперь уже прошли по всему предложению,
;удалили слова совпадающие с Эталоном,
;подсчитали кол-во совпадений.
call out_num;Выводим кол-во совпадений
pop bx;Восстанавливаем глобольный
; индекс по строке
;тепрь надо искать след. эталон
mov etbegin,bx;Начало эталона сейчас на пробеле
inc etbegin;Переставляем на след. символ
mov eti,1;Начало записи нового эталона
;Индекс эталона на первый символ
lea di, etword;Указатель на эталон
;call strout;Вывести обработанную строку
jmp met1;перейти к след. символу исх. строки
nothng1:
push bx;сохранить глобальный индекс строки
mov bx, eti;Взять индекс в эталоне
mov byte ptr bx[di], ah;Записать текущий символ в эталон
pop bx;Восстановить глобальный индекс
inc eti;Указатель на след. символ в эталоне
met1: inc bx;Указатель след. элемент в строке
cmp bx, maxlen;А может конец строки?
jle chain1; - нет прыжок по условию
jmp far01; за 255 байт
chain1: jmp cycl1
far01:;Сюда приходим когда кончилась исходная строка
;Т.е. проанализированы все уникальный слова в строке.
popa
pop bp
ret 6
work endp
;==========================================
;==========================================
;Сравнение двух слов
cmp_w proc near
;в АХ - 01, если слова равны
; - 00, если не равны
;сравниваем слова
push si
push di
mov ax, etlen;Длина первого слова
mov dx, nwlen;Длина второго слова
cmp dx, ax;Длины равны?
jne noneq;Нет - слова не равны
mov ax, 0;Признак - слова не равны
cld;Потоковая обработка - вперед
lea si,etword;Адрес первого слова
lea di,nwword;Адрес второго слова
inc si;Пропустить кол-во букв
inc di;Пропустить кол-во букв
mov cx,etlen;Кол-во символо для сравнения
REPE CMPSB;Сравнивать побайтно пока
;есть совпадения
je equal
;слова не равны
noneq: mov ax, 00;Признак - слова не равны
jmp fin;Выход из процедуры
;слова равны
equal: mov ax, 01;Признак - слова равны
fin:
pop di
pop si
ret
cmp_w endp
;==========================================
;Вывод слова-эталона
out_et proc near
pusha
lea di, etword;Адрес слова
mov bx,01;Указатель на первый символ
mov ah,06;Функция вывода символа
mov cx,etlen;Длина слова
vivod1: mov dl,byte ptr bx[di];Взять символ
int 21h;Вывести его на экран
inc bx;Перейти к
loop vivod1; след. символу
mov dl, ' ';Вывести символ
int 21h; "пробел"
popa
ret
out_et endp
;=================================================
;Удалить слово из строки
removew proc near
pusha
mov si, [bp+4];Адресс строки
mov ax, nwbegin;Начало слова
add si, ax; в регистр
mov cx, maxlen;Длина строки
sub cx, nwbegin; минус начало слова = кол-во
; символов до конца строки
mov bx, nwlen;Длина удаляемого слова
inc bx; вместе с пробелом
sub maxlen, bx;Сразу уменьшаем длину строки
cycl3: mov ah, byte ptr bx[si];Взять символ за словом
mov byte ptr [si], ah;Заменить символ слова
inc si;Перейти к след. удаляемому символу
loop cycl3
popa
ret
removew endp
;==========================================
;Вывод числа в диапозоне от 0 до 9
out_num proc near
pusha
mov ah, 06;Функция вывод символа
mov dl, count;Число типа byte
add dl, 30h; переводим в Char
int 21h; и выводим его на экран
mov dl, 10;Выводим символ
int 21h; "конец строки"
mov dl, 13;Выводим символ
int 21h; "возрат коретки"
popa
ret
out_num endp
;==========================================
;==========================================
;Вывод строки
strout proc near
pusha
mov ah, 06h;Функция вывод символа
mov si, [bp+4];Адрес строки
mov cx, maxlen;Кол-во символов для вывода
mov bx, 1;Индекс первой буквы
cycl4: mov dl, byte ptr bx[si];взять символ
int 21h;Вывести его на экран
inc bx;Перейти к
loop cycl4; след символу
mov dl, 10;Вывести символ
int 21h;"конец строки"
mov dl, 13;Вывсети символ
int 21h;"возврат коретки"
popa
ret
strout endp
;========================================
code ends
end
Дана матрица 8 х 10 целых чисел. Найти и напечатать седловое число и его индекс. (Седловым числом называется элемент матрицы, минимальный в строке и одновременно максимальный в столбце).
{$L dwum.obj}
program dwumer;
uses crt;
const m=8; n=10;
Type mas=array[1..m,1..n] of integer;
masx=array[1..n] of integer;
Var c:mas;
i,j,kol:integer;
x:masx;
Procedure sedlo(n,m:integer; var c:mas;var x:masx; var kol:integer);
external;
BEGIN
randomize;
textcolor(15);
clrscr;
for i:=1 to m do
begin
for j:=1 to n do
begin
c[i,j]:=-3+random(100);
write(c[i,j]:3);
end;
writeln;
end;
writeln;
sedlo(n,m,c,x,kol);
writeln;
writeln('Количество сёдел: ',kol);
j:=1;
for i:=1 to kol do
begin
write('Седло ',i,': ',x[j],' ',x[j+1]);
inc(j,2);
writeln;
end;
readkey;
END.
.286
public sedlo
dseg segment
min dw?;минимум в строке
max dw?;максимум в столбце
ind1 dw?;номер строки с минимумом
ind2 dw?;номер строки с максимумом в этом столбце
ind3 dw?;номер столбца с минимумом для вывода в паскаль
kol dw?;кол-во сёдел
dseg ends
code segment byte public
assume cs:code, ds:dseg;
sedlo proc near
push bp
mov bp,sp
pusha
;------------------------------------------------------------
lds si,[bp+12];адрес матрицы
lds di,[bp+8];адрес массива индексов для сёдел
mov min,32000;минимум
xor dx,dx;счетчик столбцов в строке
xor bx,bx;счетчик строк
mov cx,[bp+16];число строк в матрице
main: push cx
mov cx,[bp+18];число столбцов в строке
inc bx
cycl1: inc dx;счетчик чисел в строке
mov ax,[si];в ах - число из строки
cmp ax,min;сравниваем с минимумом
jge met1;если не меньше мин. то на переадресацию
mov min,ax;иначе запоминаем минимум
mov ind1,bx;и номер строки с ним
mov ind3,dx
met1: add si,2;переадресация на след. элемент строки
loop cycl1
push si
push bx
mov bx,ind3;номер столбца с минимумом в строке
dec bx
shl bx,1;смещение до столбца от начала матрицы
lds si,[bp+12];начало матрицы
add si,bx;встали на начало столбца с минимумом
mov max,-32000;максимум
mov bx,[bp+18];число столбцов в строке
shl bx,1;смещение до след. элемента в столбце
push cx;для следующего цикла loop
mov cx,[bp+16];число столбцов
push dx;для индексов в столбце
xor dx,dx
cycl2: inc dx
mov ax,[si];число из столбца
cmp ax,max;сравниваем с максимумом
jle met2;если меньше максимума - на переадресацию
mov max,ax
mov ind2,dx
met2: add si,bx;встаем на след. в столбце элемент
loop cycl2
mov ax,ind1
cmp ax,ind2;сравниваем строку с минимумом и максимумом
jne exit;если не седло
inc kol;иначе считаем кол-во сёдел
mov [di],ax;отправили номер строки с седлом
mov ax,ind3
mov [di+2],ax;отправили номер столбца с седлом
add di,4
exit: pop dx
pop cx
pop bx
pop si
xor dx,dx;обнулили счетчик столбцов в след. строке
pop cx
loop main
;----------------------------------------------------------
lds si,[bp+4]
mov bx,kol
mov [si],bx
;----------------------------------------------------------
popa
pop bp
ret
sedlo endp
code ends
END
Дата добавления: 2015-08-02; просмотров: 97 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
В массиве Z[1..N] определить сумму нечетных чисел от последнего нулевого значения до Z[N] и среднее арифм. четных до последнего нуля. | | | В массиве A[1..15] определить минимальное значение. Все числа, лежащие за минимальным записать в новый массив В и определить в нем среднее арифметическое положительных чисел. |