Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Министерство образования и науки
Донецкий национальный технический университет
Кафедра Компьютерной инженерии
Отчет
по лабораторной работе №4
на тему: Обработка двумерных массивов и организация ввода с клавиатуры
Выполнил:
Проверил:
Донецк 2013
1. Задание
В целочисленной матрице найти столбец с наибольшим количеством нулевых элементов.
2. Блок-схема
Процедура work:
3. Листинг программы
;Условие.
;В целочисленной матрице найти столбец с наибольшим
; количеством нулевых элементов
sseg segment stack 'stack'
db 64 dup (?)
sseg ends
;
data segment
blockinput label byte
maxlen db 7
actlen db?
string db 7 dup (?)
x dw 30 dup (?)
n dw?
m dw?
s db ' ','$'
const10 dw 10,100,1000,10000
msg1 db ' Неправильный формат числа!!! Повторите ввод. ',13,10,'$'
msg2 db 'Введите количество строк [2..5]:','$'
msg3 db 'Введите количество столбцов [2..6]:','$'
msg4 db 'Вводите элементы ',13,10,'$'
msg5 db 'Исходная матрица:',13,10,'$'
msg6 db 13,10,'$'
msg7 db 13,10,'наибольшее количество нулей() содержит столбец $'
msg8 db ' ','$'
max dw 0
imax dw?
data ends
;
code segment
start proc far
assume ss:sseg,ds:data,cs:code
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
povtor: lea dx,msg6
call writestring;13,10,'$'
;Введите количество строк [2..5]:
lea dx,msg2;
call writestring
call inputnumber;ввод числа элементов
cmp ax,2
jl povt1;Количество элементов меньше двух
cmp ax,5
jle povt2;Количество элементов больше 5
povt1: lea dx,msg1;Неправильный формат числа!!!
call writestring
jmp povtor;Повторить ввод
povt2: mov n,ax
povt3: lea dx, msg3
call writestring
call inputnumber
cmp ax, 2
jl povt3
cmp ax,6
jg povt3
mov m,ax
lea dx,msg6
call writestring
lea dx,msg4
call writestring;Вводите элементы
;-----Подготовка и цикл ввода элементов
;-----массива.
mov ax,n
mul m
mov cx,ax
mov si,0
vvod: call inputnumber
mov x[si],ax
inc si
inc si
loop vvod
; Вывод исходного массива
lea dx,msg5;Исходный массив
call writestring
mov cx,n
mov si,0
vyvod1: push cx
mov cx,m
mov bx,0
vyvod: mov ax,x[si+bx]
call printnumber;Вывод элемента массива
inc si
inc si
lea dx,msg8;Вывод пробелов между
call writestring;элементами
loop vyvod
pop cx
add bx,m
add bx,m
lea dx, msg6
call writestring
loop vyvod1
; Обработка массива
call work
; Вывод результатов
mov ax,max
add ax,30h
mov msg7[30],al
lea dx,msg7
call writestring
mov ax,imax
shr ax,1
inc ax
call printnumber
ret
start endp
;Процедура вводит число с клавиатуры и
;возвращает его в регистре AX
inputnumber proc near
;Сохранение используемых регистров
push bx
push dx
push si
push di
m_beg: mov ah,0ah;Ввод стоки, содержащей число
lea dx,blockinput;
int 21h
cmp actlen,0; Если длина введенной строки равна 0,
je m_beg; то повторить ввод
mov al,actlen; Вычисляем смещение
mov ah,0; последнего символа
mov si,ax; в
dec si; строке.
mov di,0;В DI смещение поля const10
mov bx,0; В ВХ формируется введенное число
mov al,string[si];В АL последний символ,
cmp al,'0'; он должен быть
jb m_err; цифрой.
cmp al,'9'; Иначе пеерход на
ja m_err; обработку ошибки ввода.
sub al,30h;От кода символа вычитаем 30h и получаем
cbw; в АХ младшую цифру.
add bx,ax
dec si; Переход к предпоследнему символу строки
cp: cmp si,0; Если SI<0, то просмотр строки
jl m_end; завершен.
mov al,string[si]; Является ли следующий
cmp al,'0'; символ
jb m_test_sign; цифрой?
cmp al,'9';
ja m_err
sub al,30h;От кода символа вычитаем 30h и получаем
cbw; в АХ младшую цифру.
imul const10[di]
jo m_err; При переполнении переходим
add bx,ax; к обработке ошибки.
jo m_err; Это означает, что введено число,
dec si; которое не помещается в поле слова.
inc di;Переход к следующей константе 100,1000,10000.
inc di
jmp cp
m_test_sign:; Проверка знака.
cmp al,'-'; Перед первой цифрой
jne m_t1; допускаются символы
neg bx; '+','-'или пробел.
jmp m_end; Иначе число введено
m_t1: cmp al,'+'; не верно.
je m_end;
cmp al,' ';
je m_end;
m_err: lea dx,msg1; Сообщение об ошибке
call writestring; и переход на
jmp m_beg; повторный ввод.
m_end: mov ax,bx
lea dx,msg6
call writestring
pop di
pop si
pop dx
pop bx
ret
inputnumber endp
;
printnumber proc near
push ax
push bx
push cx
push dx
push si
;Обнуление строки S для вывода числа
mov cx,7
mov si,0
met: mov s[si],' '
inc si
loop met
mov si,6;Смещение позиции 7-го символа
mov bx,10; Основание десятичной сист. счисл.
;Определяем знак числа
mov cl,' ';Используем пробел в качестве знака '+'
cmp ax,0
jge met1
mov cl,'-'
neg ax
met1: cwd
idiv bx
add dl,30h;К остатку в DL прибавим 30h и получим
;символ цифры
mov s[si],dl
dec si
cmp ax,0; В АХ частное. Когда АХ=0, то завершаем перевод
jne met1
mov s[si],cl;Заносим знак в строку и
mov ah,09h; выводим ее на экран.
lea dx,s
int 21h
pop si
pop dx
pop cx
pop bx
pop ax
ret
printnumber endp
;Процедура печати строки на экране.
;адрес строки передается в рег. DX
writestring proc near
push ax
mov ah,9h
int 21h
pop ax
ret
writestring endp
;основная процедура
work proc
mov si,0
mov cx,m;
m1: push cx
mov cx,n
mov bx,0
mov dx,0
m2: cmp word ptr x[si+bx],0;
jne m3
inc dx
m3: add bx,m;
add bx,m;
loop m2
pop cx
cmp dx, max
jle m4
mov max,dx;
mov imax, si
; Определение максимума
m4: inc si
inc si
loop m1
ret
work endp
code ends
end start
3. Результаты работы программы
4. Выводы
В процессе выполнения лабораторной работы были усвоены принципы обращения и обработки двумерных массивов, а также способы ввода информации с клавиатуры. Результаты работы программы показывают правильность работы алгоритма.
Учебное издание
Методические указания и задания по вычислительной практике для студентов направления подготовки «Компьютерная инженерия»
Составители: Теплинский Сергей Васильевич
Чередникова Ольга Юрьевна
Дата публикования: 2015-04-10; Прочитано: 232 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!