Консультация № 183618
14.06.2011, 14:39
53.02 руб.
0 5 1
Здравствуйте, уважаемые эксперты! Прошу вас помочь в написании программы:
Ввести произвольную символьную строку из слов, разделенных пробелами. Удалить из строки все большие (заглавные) буквы, сформировав из них отдельную строку и файл. Результат вывести на экран.

Задача для TASM, model small.
Прошу как можно подробнее расписать комментарии к программе. Заранее благодарен.

Обсуждение

давно
Посетитель
7438
7205
15.06.2011, 00:06
общий
сформировав из них отдельную строку и файл. Результат вывести на экран.
1) Из них, из чего? Из удаленных заглавных или из оставшихся прописных.
2) Что выводить на экран и в файл? Удаленные заглавные, оставшиеся прописные? Или может и те, и те?
3) Как задаем имя файла? В теле программы или вводим?
4) Английские/русские буковки?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
16.06.2011, 13:03
общий
это ответ
Здравствуйте, oktan!
Не дождавшись от Вас ответа в мини-форуме, предлагаю следующую программу:
1) Удаляем заглавные, получаем две строки: исходную, без заглавных, и строку из одних заглавных
2) Выводим на экран обе строки (для наглядности)
3) Имя файла задаем в теле, как uppers.txt, и выводим туда строку из заглавных букв
4) Учитывает только Английские заглавные, все остальные считаем "остальными"
5) В случае отсутствия букв любого типа (типа все заглавные или ни одной заглавной), выводится соответствующее сообщение

[code h=207];Ввести произвольную символьную строку из слов, разделенных пробелами.
;Удалить из строки все большие (заглавные) буквы, сформировав из них
;отдельную строку и файл. Результат вывести на экран.

.model small
.stack 100h
.code
main proc
mov ax, @data ;настроим сегменты данных
mov ds, ax
mov es, ax

lea dx, sIn ;строка приглашения 'Enter string:'
mov ah, 9
int 21h

lea dx, buf ;введем строку
mov ah, 0ah
int 21h

lea si, string ;адрес строки
lea di, uppers ;адрес, куда запишем заглавные буквы
mov bx, si ;по старому адресу будем писать все остальные символы
MainLoop: ;цикл по строке
lodsb ;читаем очередной
cmp al, 0dh ;конец строки?
je PrintResult ;на вывод результата
cmp al, 41h ;'A'
jb SaveOther ;другие сохраним по адресу [bx]
cmp al, 5ah ;'Z'
ja SaveOther ;другие сохраним по адресу [bx]
stosb ;заглавные сохраняем по адресу [di]
jmp MainLoop ;на следующий символ
SaveOther: ;остальные
mov [bx], al ;сохраняем
inc bx ;инкремент адреса
jmp MainLoop ;на следующий символ

PrintResult: ;вывод результата
push di ;сохраним адрес конца в буфере заглавных букв

;di - адрес конца выводимого буфера (заглавных букв)
lea dx, sUpOut ;адрес строки 'Upper-case letters:'
lea bp, uppers ;адрес начала выводимой строки заглавных букв
call OutMessage ;выводим данные

mov di, bx ;di - адрес конца выводимого буфера (остальных букв)
lea dx, sDownOut ;адрес строки 'Other letters:'
lea bp, string ;адрес начала выводимой строки остальных букв
call OutMessage ;выводим данные

pop di ;восстановим адрес конца в буфере заглавных букв
call OutFile ;выведем заглавные буквы в файл

PressAny:
lea dx, sAny ;выведем 'Press any key'
mov ah, 9
int 21h

mov ah, 0 ; ждем нажатие на клавишу
int 16h

mov ax,4c00h ; конец работы
int 21h
main endp

OutMessage proc ;вывод строки с заголовком
mov ah, 9 ;вывод заголовка, адрес в dx
int 21h

mov si, bp ;адреса начала строки
mov cx, di ;адрес конца
sub cx, si ;длина строки
mov ah, 2 ;функция вывода символа из dl
jcxz NoMessage ;пустая строка?
OutLoop:
lodsb ;символ
mov dl, al ;для вывода
int 21h ;выводим
loop OutLoop ;по всем cx символам
ret
NoMessage: ;сообщение 'Not found'
lea si, sNotFound ;начало строки
mov cx, len_sNotFound;длина
jmp OutLoop ;на вывод
OutMessage endp

OutFile proc ;вывод строки в файл
lea dx, sName ;имя файла 'uppers.txt'
xor cx, cx ;без атрибутов
mov ah, 3ch ;создаем
int 21h
jc CreateError ;ошибка создания?
mov bx, ax ;описатель файла

lea dx, uppers ;адрес строки заглавных букв
mov cx, di ;адрес конца
sub cx, dx ;длина
jcxz NoUp ;есть заглавные?
Write:
mov ah, 40h ;выводим
int 21h
jc WriteError ;ошибка записи

mov ah, 3eh ;закрываем файл
int 21h
ret

NoUp: ;сообщение 'Not found'
lea dx, sNotFound ;начало строки
mov cx, len_sNotFound;длина
jmp Write ;на вывод

WriteError: ;ошибка записи
mov ah, 3eh ;файл закрываем
int 21h
lea dx, sWriteErr ;сообщение об ошибке
jmp PrintError
CreateError: ;ошибка создания
lea dx, sCreateErr ;сообщение об ошибке
PrintError:
mov ah, 9 ;выводим сообщение
int 21h
ret
OutFile endp

.data

;строки сообщений
sIn db 0dh,0ah,'Enter string: $'
sUpOut db 0dh,0ah,'Upper-case letters: $'
sDownOut db 0dh,0ah,'Other letters: $'
sAny db 0dh,0ah,'Press any key$'

sName db 'uppers.txt',0 ;имя файла
sCreateErr db 0dh,0ah,'File create error!$'
sWriteErr db 0dh,0ah,'File write error!$'
sNotFound db 'Not found' ;сообщение о ненахождении
len_sNotFound equ $-sNotFound ;длина сообщения

buf label byte ; буфер для приема строки с клавиатуры (по ф-и 0ah)
max db 128 ; максимальная длина строки
len db 0 ; реальная длина введенной строки
string db 128 dup (?) ; сама строка

uppers db 128 dup (?) ;сюда запишем заглавные буквы

end main
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.06.2011, 01:37
общий
Адресаты:
1) Из заглавных.
2) Заглавные.
3) В теле программы.
4) Английские.
давно
Посетитель
7438
7205
20.06.2011, 09:20
общий
Здравствуйте.
Долго не отвечаете... Видать, не сильно надо...
Я, вроде как, так и сделал... Только на экран вывел обе строки...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
22.06.2011, 03:46
общий
Адресаты:
Здравствуйте. В последнее время занят был, поэтому не отвечал. Спасибо за программу. Всё сделали в лучшем виде
Форма ответа