Читайте также:
|
|
Uses crt;
const n=5; {5 строк}
m=10; {по 10 чисел}
type mytype = array [1..n, 1..m] of integer;
var a: mytype;
i,j,k: integer;
procedure work(var a:mytype; i,j:integer);
external;
Begin
Randomize;
clrscr;
{Заполнение матрицы}
for i:=1 to n do begin
for j:=1 to m do begin
k:=random (20);
a[i,j]:= k;
write (a[i,j]:4);
end;
writeln;
end;
writeln;
work (a, n, m);
writeln;
{Вывод матрицы}
for i:=1 to n do begin
for j:=1 to m do begin
write (a[i,j]:4);
end;
writeln;
end;
readkey;
End.
.286
public work
data segment public
matr dw?;Адресс матрицы
numcol dw?;Кол-во столбцов
numrow dw?;Кол-во строк
matrlen dw?;Длина матрицы в байтах
posmax dw?;Номер обрабатываемой строки
posmaxr dw Кол-во столбцов
mov numcol, ax; сохранить в переменной
mov bx,[bp+6];Кол-во строк
mov numrow, bx; записать в перемнную
mul bx;Умножить кол-во строк на кол-во столбцов
mov matrlen,ax; получим длину матрицы в байтах
mov si,[bp+8];Адрес начала матрицы
mov matr, si; запишем в переменную
mov posmax, 0;Максимум - первый элемент
mov dx, [si];Тут будет храниться максимум
mov cx, matrlen;Длина матрицы (кол-во чисел, а не байт)
xor bx, bx;Начало матрицы
cycl101: mov ax, bx[si];Взять число
cmp ax, dx;Сравнить с максимумом
jle nomemo;Если больше, то...
mov dx, ax; запомнить новый максимум
mov posmax, bx; и его позицию
nomemo: add bx, 2;Перейти к след. числу
loop cycl101
;Теперь в DX максимум, а в maxpos его смещение от начала матрицы
;Преобразование смещения в номер строки
xor dx,dx;Очистка DX (для деления д.б. пусто)
mov ax,posmax;Смещение
shr ax, 1;Разделить на 2 (в integer 2 байта)
div numcol;Делим на кол-во столбцов
;в АХ получим номер строки
;в DX получим номер столбца (не нужен)
mov posmaxr, ax;Запомним номер строки
;Теперь знаем номер нужной строки
;Нужно найти среднее арифметическое строки
xor dx,dx;Накопитель
mov si, matr;Начало матрицы
mov ax, numcol;Кол-во столбцов
shl ax, 1;Умножаем на 2, получаем длину строки в байтах
mov bx, posmaxr;Берем номер строки
mul bx;Умножаем на длину строки,
; получаем смещение строки от начала матрицы
add si, ax;Добавляем смещение к адресу матрицы
xor bx, bx;Начинаем с первого числа строки
mov cx, numcol;Количество чисел в строке
cycl201: mov ax, bx[si];Берем число
add dx, ax;Добавляем в накопитель
add bx, 2;Переходим к след. числу
loop cycl201
;Теперь DX содержит сумму все чисел строки с максимумом
;Запишем среднее арифметическое на место максимума
mov ax, dx;Сумму пишем в AX (для деления)
xor dx, dx;Очищаем DX (для деления)
mov bx, numcol;Кол-во чисел в строке
div bx;Получаем ср. арифм.
mov bx, posmax;Смещение до максимума от начала матрицы
mov si, matr;Начало матрицы
mov bx[si], ax;Пишем ср. арифм. по адресу+смещение
popa
pop bp
ret 10
work endp
code ends
end
Дан массив из 40 символов, содержащий слова, разделенные одним пробелом. Найти самое длинное симметричное слово.
{$L laba4.obj}
program laba4;
uses crt;
type text=array[1..256]of char;
var enter:string; {массив символов, вводимых с клавы}
out:text; {массив выводимых слов}
i,word:integer;
dlina1,dlina2:integer; {длины первоначального и выводимого массивов}
kol:integer; {кол-во нужных слов}
{------------------------------}
procedure slova(var word:integer;
var enter:string;
var out:text;
dlina1:integer;
var dlina2:integer;
var kol:integer);
external;
{------------------------------}
BEGIN
clrscr;
writeln('Вводите текст: ');
readln(enter);
dlina1:=length(enter);
slova(word,enter,out,dlina1,dlina2,kol);
writeln('Кол-во слов в тексте: ',word);
if kol=0 then writeln('Таких слов в тексте нет.')
else
begin
writeln('Найденные слова: ');
for i:=1 to dlina2 do
write(out[i]);
writeln;
write('Количество слов: ',kol);
end;
readkey;
Writeln(' (c) & (p) Dzhambula-44 Eagle Soft Production 2001');
END.
.286;использование инструкций 286 процессора
public slova
data segment byte public
assume ds:data
kol dw 0;число слов, читаемых в обе стороны
slov dw 0;число всех слов текста
data ends
code segment byte public
assume cs:code
slova proc near
push bp
mov bp,sp
pusha;сохраняем регистры в стек
;------проверка текста и подсчет слов
lds si,[bp+18];адрес введенного текста
mov cx,[bp+12];длина введенного текста
cmp cx,0;проверяем, были ли символы в массиве ENTER
je exit;если символов нет, то выход из программы
xor bx,bx;обнулили для длины текущего слова
xor dx,dx;обнулили для длины массива OUT
inc si;встаем на первый символ в строке
cycl1: mov al,[si]
cmp al,' '
je met11;если пробел
cmp al,','
je met11;если запятая
cmp al,'.'
je met11;если точка
jmp met1;если буква, то идем на подсчет букв и переадресацию
met11: inc slov;подсчитали слово
;------проверяем, можно ли читать слово в обе стороны
push cx;сохранили сх для нового цикла
mov cx,bx;кол-во букв в слове
cmp cx,1;если слово из 1 буквы, то оно читается в обе стороны
je metb;его сразу отправляем в OUT
shr cx,1;проверяем одну половину слова с другой
push si;сохранили si
mov di,si
sub di,bx;встали на начало слова
dec si;встали на конец слова
cycl2: mov al,[si];сравнение букв с начала и с конца слова
cmp al,[di]
jne met2;если какая-либо буква не совпала, то выход
dec si;иначе переадресация на 1 букву назад с конца
inc di;и на 1 букву вперед с начала слова
loop cycl2
jmp meta
exit: jmp met4;на выход из программы - вместо дальней метки met4
meta: pop si;встали на следующую букву после слова
metb: inc kol;подсчитали слово, читаемое в обе стороны
;------записываем слово в массив OUT
lds di,[bp+14];в di - адрес массива слов OUT
add di,dx;добавили смещение до следующего слова
mov cx,bx;кол-во букв в слове
push si
dec si;встали на последнюю букву слова
cycl3: mov al,[si]
mov [di],al;записываем слово в массив OUT
dec si
inc di
inc dx;счетчик символов в массиве OUT
loop cycl3
mov al,' ';переслали пробел
mov [di],al
inc dx;для пробела
met2: pop si
pop cx;вспомнили сх для внешнего цикла
xor bx,bx;обнулили для следующего слова
jmp met3;на переадресацию
met1: inc bx;счетчик букв
met3: inc si
mov al,[si]
loop cycl1
;------проверяем последний символ,если он - не признак конца слова, то
;------нужно подсчитать последнее слово и проверить его на признак
mov al,[si]
cmp al,' '
je met4
inc slov;считаем слово
;------проверка на совпадение
mov cx,bx;длина последнего слова
cmp cx,1
je metc
shr cx,1;счетчик цикла - нужно проверить половину букв слова
push si
mov di,si
sub di,bx;встали на начало слова
dec si
cmp cx,0;чтобы не зациклился цикл4
jne cycl4
inc cx;если слово из 1 буквы, то cycl4 выполнится 1 раз
cycl4: mov al,[si]
cmp al,[di]
jne met5;если какая-либо буква не совпала, то выход
dec si
inc di
loop cycl4
metc: inc kol;подсчитали слово, читаемое в обе стороны
lds di,[bp+14]
add di,dx;добавили смещение до следующего слова
pop si
mov cx,bx
push si
dec si
cycl5: mov al,[si]
mov [di],al;записываем слово в массив OUT
dec si
inc di
inc dx;счетчик символов в массиве OUT
loop cycl5
mov al,' '
mov [di],al
inc dx;для пробела
met5: pop si
;--------------отправляем в паскаль
met4: lds si,[bp+22]
mov bx,slov
mov [si],bx;отправили общее кол-во слов
lds si,[bp+4]
mov bx,kol
mov [si],bx;отправили кол-во слов, читаемых в обе стороны
lds si,[bp+8]
mov [si],dx;отправили кол-во символов массива OUT
;-----------------------------------
popa
pop bp
ret
slova endp
code ends
end
Дата добавления: 2015-08-02; просмотров: 170 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Определить средн. арифм. положительных чисел, лежащих после минимального значения в массиве B[1..N]. Числа до минимального рассортировать по возрастанию. | | | О понятии философии |