Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2012, 11:51   #1
sss-777
Пользователь
 
Регистрация: 13.05.2010
Сообщений: 20
По умолчанию Вывод чисел в программе факториала

Программа считает факториал до 1000, создает файл с результатом подсчета и выдает результат на экран.

Она работает, ошибок синтаксиса нет. Но я не могу понять как исправить вывод числа после завершения операции факториала. Выводит в Ascii символах. Нужно в обычном формате чисел, в привычном десятичном формате. Как быть? Плиз хелп...

В архиве все файлы (bat, exe, asm, obj)
Компилятор Tasm
Вложения
Тип файла: rar KURSAA.rar (4.4 Кб, 9 просмотров)
sss-777 вне форума Ответить с цитированием
Старый 17.06.2012, 16:36   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Очевидно, нужно сделать форматное преобразование, т.е. преобразовать числа в текст.
s-andriano вне форума Ответить с цитированием
Старый 17.06.2012, 16:42   #3
sss-777
Пользователь
 
Регистрация: 13.05.2010
Сообщений: 20
По умолчанию

мдааа, не думал что вам так это тяжко..
sss-777 вне форума Ответить с цитированием
Старый 17.06.2012, 16:42   #4
sss-777
Пользователь
 
Регистрация: 13.05.2010
Сообщений: 20
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Очевидно, нужно сделать форматное преобразование, т.е. преобразовать числа в текст.
Знать бы как....
sss-777 вне форума Ответить с цитированием
Старый 17.06.2012, 16:44   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А Вы напишите словами, что делаете.
s-andriano вне форума Ответить с цитированием
Старый 17.06.2012, 16:57   #6
sss-777
Пользователь
 
Регистрация: 13.05.2010
Сообщений: 20
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
А Вы напишите словами, что делаете.
Как нибудь добавить в строку вывода код преобразования. Вобще не знаю как сделать в десятичном формате...
sss-777 вне форума Ответить с цитированием
Старый 17.06.2012, 17:16   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Как Вы получаете то "число" которое нужно вывести?
В каком формате оно хранится в Вашей программе?
s-andriano вне форума Ответить с цитированием
Старый 17.06.2012, 17:40   #8
sss-777
Пользователь
 
Регистрация: 13.05.2010
Сообщений: 20
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Как Вы получаете то "число" которое нужно вывести?
В каком формате оно хранится в Вашей программе?
Проще запустите exe файл из архива
sss-777 вне форума Ответить с цитированием
Старый 17.06.2012, 19:13   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Я этого принципиально никогда не делаю.
Если это Ваше обязательное условие, я - пас.
s-andriano вне форума Ответить с цитированием
Старый 17.06.2012, 19:23   #10
sss-777
Пользователь
 
Регистрация: 13.05.2010
Сообщений: 20
По умолчанию

Цитата:
Сообщение от sss-777 Посмотреть сообщение
Проще запустите exe файл из архива
Я не ставлю условий, а прошу помощи. Можете открыть asm файл Вот код:

Код:
msgEnter    db 'Enter a number (1..1000): $'
msgEnterName    db 13,10,'Output file: $'
msgTooBig   db 13,10,'The number is too big!$'
msgExit     db 13,10,'Press any key to exit...$'
msgCreateError  db 13,10,"Can't create file!$"
szFileName  db 254 dup(0)   ; сюда будет помещено имя файла при вводе
.code
.286
start:
    mov ax,@data
    mov ds,ax
 
    mov ax,3    ; устанавливаем текстовый режим
    int 10h
 
    mov ah,9    ; просим ввести число
    mov dx,offset msgEnter
    int 21h
 
; ввод числа
    xor si,si       ; здесь будем накапливать введенное число
    mov bx,10
@@input:
    xor ax,ax       ; чтение символа с клавиатуры
    int 16h     ; Выход: AX - код клавиши
 
    mov ah,2        ; AH=2 - вывод символа на экран (см.ниже)
    ; проверяем нажатую клавишу
    cmp al,13       ; [Enter]
    jz  @@end_of_input
 
    cmp al,'0'        ; должна быть цифра
    jb  @@not_a_digit
    cmp al,'9'
    jbe @@digit
@@not_a_digit:
    mov dl,7        ; Beep! - сигнал при ошибке
    int 21h
    jmp @@input
@@digit:
    mov dl,al       ; выводим цифру
    int 21h
 
    ; si = si*10 + al
    and ax,0Fh      ; символ -> число с одновременным обнулением AH
    stosw           ; сохраняем очередную цифру в буфере для
большого числа
    xchg    si,ax
    mul bx      ; DX:AX = AX*10
    add si,ax
 
    cmp si,1000     ; проверяем на максимально допустимое число
    jbe @@input
 
    mov dx,offset msgTooBig ; слишком большое число
    jmp @@last_msg
 
@@end_of_input:
    mov [huge_num],1    ; первое слово длинного числа содержит кол-во"цифр"
    mov [huge_num+2],si ; последующие слова - собственно"цифры", начиная с младшей
    mov [dwNumber],si
 
; Вычисление двойного факториала
; while( (dwNumber-=2) > 0 ) huge_mul( huge_num, dwNumber )
@@calc:
    sub [dwNumber],2
    jle @@calc_end
    mov bx,[dwNumber]
    mov si,offset huge_num
    call    huge_mul
    jmp @@calc
 
@@calc_end:
; Преобразуем число в строку
    mov si,offset huge_num
    mov di,offset sNumber
    call    huge2str
    mov cx,offset sNumber
    sub di,cx
    inc di      ; длина строкового представления

    mov ah,0Ah          ; ввод строки с клавиатуры
    mov dx,offset bufFileName   ; смещение буфера
    int 21h
 
; преобразуем имя файла в ASCIIZ строку (с конечным нулем)
    xor bh,bh
    mov bl,[lenFileName]
    mov [szFileName][bx],0
 
; выводим число на экран
    mov ah,40h
    mov bx,1
    mov dx,offset sNumber-2 ; переход на новую строку + число
    lea cx,[di+2]       ; длина числа + 2 байта
    int 21h
 
; создаем файл и выводим в него число
    mov ah,3Ch          ; создаем файл
    mov dx,offset szFileName    ; DS:DX - адрес имени файла
    xor cx,cx           ; атрибуты
    int 21h
    jnc @@create_ok
 
  
@@create_ok:
    mov bx,ax       ; описатель (handle) файла
    mov ah,40h      ; функция записи в файл
    mov dx,offset sNumber ; адрес буфера
    mov cx,di       ; кол-во байт для записи
    int 21h
 
    mov ah,3Eh      ; закрываем файл
    int 21h
 

;-------------------------------------------------
; Преобразование длинного числа в строку
; Каждая "цифра" длинного числа, кроме старшей,
; представляется 4-мя обычными цифрами.
; Вход:
;   SI - адрес длинного числа
;   DI - адрес строки
; Выход:
;   DI - указывает на последний символ строки
;-------------------------------------------------
huge2str    PROC
    lodsw           ; длина длинного числа в "цифрах"
    dec ax
    push    ax
 
    shl ax,1        ; теперь длина в байтах
    add si,ax       ; SI - адрес старшей "цифры"
    mov bx,10       ; преобразуем в 10-тичную систему
 
    ; старшую "цифру" преобразуем в строку без дополнения нулями
    std
    lodsw
    xor cx,cx       ; обнуляем счетчик цифр
@@1:
    xor dx,dx       ; будем делить DX:AX на BX
    div bx      ; DX = последняя цифра
    push    dx      ; мы получаем цифры в обратном порядке
    inc cx      ; счетчик цифр
    test    ax,ax       ; повторяем, пока частное в AX != 0
    jnz @@1
 
    cld

huge2str    ENDP
    end start
sss-777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисления факториала больших чисел (с++) maksat-15 Помощь студентам 7 09.06.2012 08:39
вывод полинома в программе (была каноническая стала линейная) Студент13 Паскаль, Turbo Pascal, PascalABC.NET 0 29.04.2011 22:26
Вывод капчи в программе! DKENT Работа с сетью в Delphi 8 21.10.2010 09:13
Вывод баннеров в программе termit56 Помощь студентам 6 11.03.2010 14:29
Ассемблер - вывод факториала Voortex Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 07.12.2008 12:29