На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Извлечение квадратного корня , чтоб юзер не вводил его вручную
    Всем доброго времени суток,

    Интересует такая вещь:

    По заданию нужно написать такую программу - Юзер вводит периметр и площадь (допустим P=100, а S=625) и по ним чертится прямоугольник,а так же выводятся длина стороны "а" и длина стороны "b". Человек написал код, но для построения черчения графика и вывода значений сторон, юзер ещё должен вручную извлечь квадратный корень из площади.
    Как бы можно было модернизировать код так,чтоб после введения периметра и площади, программа автоматически извлекала квадратный корень, а затем уж тогда чертила прямоугольник и выводила длины сторон.

    ExpandedWrap disabled
      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
    Сообщение отредактировано: Oxidous -
        Корень квадратный в целых числах можно поискать в цикле или
        таком
        ExpandedWrap disabled
            for ax:=1 to bx do
            if ax*ax>=bx then
              break;

        или по Итерационной формуле Герона
        или вычитая в цикле из подкоренного числа нечётные числа - их количество в момент получения 0 или отрицательного числа и есть точный или приближённый корень
        Например, для 16
        16 - 1 - 3 - 5 - 7 = 0
        Четыре вычитаемых - и корень равен 4.
        Сообщение отредактировано: Федосеев Павел -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0234 ]   [ 16 queries used ]   [ Generated: 23.04.24, 07:11 GMT ]