Консультация № 136951
15.05.2008, 14:57
50.00 руб.
0 1 1
Ув. эксперты, пожалуйста, напишите программу, вводящую матрицу размером 5*5. Программа должна посчитать сумму чисел каждой строки и столбца. Все числа матрицы должны быть двухзначными и десятичными (от 00 и до 99 ).
Ввод чисел в матрицу должен быть построчным (строка за строкой). Вывод должен содержать эту же матрицу , но в конце каждой строки должна выводиться сумма всех чисел этой строки, а в конце каждого столбца – сумма всех чисел этого столбца.

Обсуждение

давно
Посетитель
7438
7205
15.05.2008, 18:17
общий
это ответ
Здравствуйте, Sbuber!
Программа под TASM в приложении


Приложение:
.model tiny .dataprompt db ‘Enter array:‘,0dh,0ah,‘$‘result db 0dh,0ah,‘Result:‘,0dh,0ah,‘$‘err_mes db 0dh,0ah,‘***** Error *****$‘array db 5*5 dup (0)max db 80len db 0buf db 80 dup (?) .code .startup lea dx,prompt mov ah,9 int 21h ;подсказка lea di,array ;адрес, где сохраним числа mov bl,10 ;константа для преобразования строки в число mov cx,5 ;вводим 5 строкrows_loop: ;цикл по строкам push cx ;сохраним счетчик строк lea dx,max ;адрес буфера для ввода данных с клавиатуры mov ah,0ah int 21h ;вводим всю строку сразу ;анализируем после ввода по Enter lea si,buf ;адрес строки mov cx,5 ;в строке 5 чиселnums_loop: ;цикл по числам в строке mov bh,0 ;здесь будем накапливать значение числа push cx ;сохраним счетчик чисел в строке mov cx,2 ;ждем 2 цифрыnum_loop: ;цикл по 2 цифрам числа lodsb ;читаем очередную символ цифры cmp al,‘ ‘ ;пробел ? jne cmp_0dh ;нет, идем дальше cmp cx,2 ;да, было ли что-то уже введено (ввели только одну цифру!)? je num_loop ;нет, пропускаем пробелыerror: ;по любой ошибке lea dx,err_mes ; выводим сообщение mov ah,9 ; и завершаем работу int 21h ; надо очень аккуратно вводить числа... jmp finish cmp_0dh: ;продолжаем анализ cmp al,0dh ;встретили конец строки - мало ввели чисел! je error ; ошибка! cmp al,‘0‘ ;проверим на корректность символов... jb error ;должны быть цифры! cmp al,‘9‘ ja error sub al,‘0‘ ;символ превращаем в число xchg al,bh ;поменяем местами было предыдущее значение числа и новый разряд mul bl ;умножим то, что было, на 10 add bh,al ;и добавим к номому разряду, результат в bh cmp bh,99 ;проверим на величину > 99 ja error ;ошибка! loop num_loop ;циклим по цифрам числа cmp byte ptr [si],‘ ‘ ;длина числа - ровно 2 цифры! je num_next ;если за числом пробел, то все ок cmp byte ptr [si],0dh ;или конец строки... jne error ;все остальное (число из > 2 цифр) - ошибка!num_next: ;очередное число сконвертировано mov [di],bh ;сохраним его inc di pop cx ;восстановим счетчик чисел loop nums_loop ;циклим по числам строки mov dl,0dh ;После обработки очередной строки mov ah,2 ;перейдем на следующую строку int 21h mov dl,0ah mov ah,2 int 21h pop cx ;восстановим счетчик строк loop rows_loop ;на запрос очередной строки lea dx,result ;выводим на экран строку ‘Result‘ mov ah,9 int 21h ;Массив сформирован;сейчас будем выводить и одновременно считать суммы строк lea si,array ;адрес массива mov cx,5 ;число строкr_loop: ;чикл по строкам push cx ;сохраним число строк mov cx,5 ;число колонок в строке xor bx,bx ;эдесь будем накапливать сумму в строке lea di,buf ;буфер для формирования выводимой строкиc_loop: ;цикл по колонкам mov al,‘ ‘ ;нарисуем пробел чтобы выровнять с суммой в колонке (которая может быть >= 100 - 3 знака!) stosb lodsb ;очередное число mov ah,0 ;сделаем из байта слово add bx,ax ;сложим с суммой aam ;"хитрая" команда, с ее помощью сделаем из байта десятичные десятки и единицы xchg al,ah ;только надо поменять местами add ax,3030h ;превратим числа в символы stosw ;сохраним mov al,‘ ‘ ;отделим пробелом stosb loop c_loop ;на следующее число в строке mov ax,bx ;найденная сумма call form_sum_str ;преобразуем в строку цифр mov ax,0a0dh ;переход на следующую строку на экране stosw mov al,‘$‘ ;конец строки для ф-и 9 stosb lea dx,buf ;адрес нашего буфера mov ah,9 int 21h ;выводим на экран pop cx ;восстанавливаем счетчик строк loop r_loop ;на вывод следующей строки;посчитаем и выведем суммы в колонках lea di,buf ;адрес массива xor si,si ;индекс для адресации колонки строке mov cx,5 ;число колонокcols_loop: ;цикл по колонкам xor ax,ax ;нам важно, чтобы ah=0 для работы со словами mov bx,ax ;база для адресации очередной строки mov dx,ax ;здесь будем накапливать сумму в колонке push cx ;сохраним счетчик колонок mov cx,5 ;число строкcol_sum: ;по всем строкам для выбранной колонки mov al,array[bx+si] ;получаем очередное значение add dx,ax ;складываем add bx,5 ;база следующей строки loop col_sum ;на следующую строку mov ax,dx ;найденная сумма call form_sum_str ;преобразуем в строку mov al,‘ ‘ ;отделим пробелом stosb inc si ;индекс следующей колонки pop cx ;восстановим счетчик колонок loop cols_loop ;на следующую колонку mov ax,0a0dh ;переход на следующую строку на экране stosw mov al,‘$‘ ;конец строки stosb lea dx,buf ;выведем mov ah,9 int 21hfinish: mov ah,0 ;ждем нажатия на клавишу int 16h mov ax,4c00h ;выход в ДОС int 21hform_sum_str proc ;преобразование числа в AX в строку из трех десятичных цифр mov bl,10 div bl ;сначала отделим еденицы, от десятков+сотен or ah,30h ;единицы - остаток от деления на 10 mov [di+2],ah ;запишем на место для единиц aam ;оставшиеся две цифры получим, как выше xchg al,ah add ax,3030h stosw inc di ;обойдем символ единиц retform_sum_str endp end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа