Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.187.103] |
|
Сообщ.
#1
,
|
|
|
Всем доброго времени суток,
Интересует такая вещь: По заданию нужно написать такую программу - Юзер вводит периметр и площадь (допустим P=100, а S=625) и по ним чертится прямоугольник,а так же выводятся длина стороны "а" и длина стороны "b". Человек написал код, но для построения черчения графика и вывода значений сторон, юзер ещё должен вручную извлечь квадратный корень из площади. Как бы можно было модернизировать код так,чтоб после введения периметра и площади, программа автоматически извлекала квадратный корень, а затем уж тогда чертила прямоугольник и выводила длины сторон. org 100h ;Вводим периметр mov dx, offset msg mov ah, 9 int 21h call scan_num mov perimetr, cx call clear_screen ; vvodim plosiad priamougolnika mov dx, offset msg1 mov ah, 9 int 21h call scan_num mov plosiad, cx call clear_screen ; scitaem dlini storon priamougolnika xor ax, ax mov ax, perimetr mov bl,2 ; div bl mov delenie, ax xor ax, ax xor bx, bx mov ax, delenie mov bx, delenie mul bx mov x_v_kvadrate, ax xor ax, ax xor bx, bx mov ax, plosiad mov bx, 4 mul bx mov plosiadx4, ax xor ax, ax xor bx, bx mov bx, x_v_kvadrate mov ax, plosiadx4 sub bx, ax mov vicitanie, bx ; vivodim cislo, u kotorogo nado izvlec koren mov dx, offset msg2 mov ah, 9 int 21h mov AX, vicitanie call vivod mov dx, offset msg3 mov ah, 9 int 21h call scan_num mov koren, cx call clear_screen ; scitaem dlinu storoni a xor ax, ax xor bx, bx mov ax, delenie mov bx, koren sub ax, bx xor bx, bx mov bx, 2 div bx mov 1storona, ax ; scitaem dlinu storoni b xor ax, ax xor bx, bx mov ax, delenie mov bx, koren add ax, bx xor bx, bx mov bx, 2 div bx mov 2storona, ax ; vivodim na ekran dlinu storoni a mov dx, offset msg4 mov ah, 9 int 21h mov AX, 1storona call vivod ; vivodim na ekran dlinu storoni b mov dx, offset msg5 mov ah, 9 int 21h mov AX, 2storona call vivod mov ah, 0 int 16h xor cx, cx mov cx, 10 mov xkoordinata,cx xor dx, dx mov dx, 10 mov ykoordinata,dx ; video rezim mov al, 12h mov ah, 0 int 10h mov al, 1111b mov cx, xkoordinata mov dx, ykoordinata mov bx, 2storona add bx, xkoordinata add 2storona, bx ; certim verhniuiu liniu vl: mov ah, 0ch int 10h inc cx cmp cx,2storona JNAE vl mov cx, xkoordinata mov dx, ykoordinata mov bx, ykoordinata add bx, 1storona mov 1storona, bx ; certim levuiu storonu kl: mov ah,0ch int 10h inc dx cmp dx,1storona JNAE kl mov bx, cx add bx, 2kstorona sub bx, 1storona ; certim nizniuiu liniu apl: mov ah,0ch int 10h inc cx cmp cx,2storona JNAE apl mov bx, ykoordinata mov 1storona, bx ; certim pravuiu liniu dsl: mov ah,0ch int 10h dec dx cmp dx,1storona JNB dsl scan_num PROC NEAR mov ah, 2 mov dl, ':' int 21h xor di, di vvod: mov ah, 8 int 21h cmp al, 13 je vihod cmp al, '9' ja vvod cmp al, '0' jb vvod mov ah, 2 mov dl, al int 21h sub al, '0' xor ah, ah mov cx, ax mov ax, di mov bx, 10 mul bx add ax, cx mov di, ax jmp vvod vihod: mov cx, di RET scan_num ENDP clear_screen PROC NEAR push ax push ds push bx push cx push di mov ax, 40h mov ds, ax mov ah, 06h mov al, 0 mov bh, 07 mov ch, 0 mov cl, 0 mov di, 84h mov dh, [di] mov di, 4Ah mov dl, [di] dec dl int 10h mov bh, 0 mov dl, 0 mov dh, 0 mov ah, 02 int 10h pop di pop cx pop bx pop ds pop ax RET clear_screen ENDP vivod proc xor cx, cx mov bx, 10 oi2: xor dx,dx div bx push dx inc cx test ax, ax jnz oi2 mov ah, 02h oi3: pop dx add dl, '0' int 21h loop oi3 ret vivod endp ;-------------------------- perimetr dw 0 plosiad dw 0 delenie dw 0 x_v_kvadrate dw 0 plosiadx4 dw 0 vicitanie dw 0 koren dw 0 1storona dw 0 2storona dw 0 xkoordinata dw 0 ykoordinata dw 0 msg db "Введите периметр прямоугольника:$" msg1 db "Введите площадь прямоугольника:$" msg2 db "Извлеките квадратный корень этого числа и введите его: $" msg3 db ":$ " msg4 db "длина стороны a:$ " msg5 db "длина стороны b:$ " end |
Сообщ.
#3
,
|
|
|
Корень квадратный в целых числах можно поискать в цикле или
таком for ax:=1 to bx do if ax*ax>=bx then break; или по Итерационной формуле Герона или вычитая в цикле из подкоренного числа нечётные числа - их количество в момент получения 0 или отрицательного числа и есть точный или приближённый корень Например, для 16 16 - 1 - 3 - 5 - 7 = 0 Четыре вычитаемых - и корень равен 4. |