Задания на программирование.




Практически все задания на программирование содержат требование "ввести строку символов". Для ввода строки используйте процедуру Readstring. Предварительно в сегменте данных зарезервируйте место под максимально возможную длину строки. Перед вызовом процедуры это значение должно быть указано в регистре СХ (передаваемый в процедуру параметр). Вводимая строка может быть короче. Помните, что количество введенных символов после вызова процедуры возвращает регистр АХ.

Задание 1.

Вариант 1. Введите строку символов. Замените в ней все 'A' на 'AAA'. Исходную и результирующую строки вывести на экран.

Вариант 2. Введите массив ASCII – кодов. Замените входящие в массив заглавные латинские буквы на строчные.

Вариант 3. Напишите программу, которая заполняет строку с нулевым окончанием последовательностью случайных символов в диапазоне от "А" до "Z". Замените центральный символ строки первым. Конечный и промежуточный результаты работы отобразить на экране.

Вариант 4. Заполните два массива ASCII – кодов одинаковой длины. Сформируйте третий массив, состоящий из попарно совпадающих элементов заданных массивов. Результаты работы выведите на экран.

 

Вариант 5. Ввести строку, состоящую из одного слово, проверить будет ли оно читаться одинаково справа налево и слева направо (т.е. является ли оно палиндромом). Исходную строку и ответ вывести на экран.

Вариант 6. Ввести строку символов, содержащую несколько точек. Выделить подстроку между первой и второй точкой. Отобразить исходную и выделенную строку на экране.

Вариант 7. Ввести строку символов, длиной до 20 байт. Ввести слово, размером до 10 байт. Содержит ли данная строка символов это слово? Результаты работы выведите на экран.

Вариант 8. Введите строку символов, состоящую из слов, разделенных пробелом. Подсчитайте количество слов. Строку и количество вывести на экран.

Вариант 9. Введите массив ASCII – кодов. Сформируйте по его содержимому массив ASCII –кодов в обратной последовательности. Подсчитайте количество символов "А", "В" и "С" в заданном массиве кодов. Результаты работы выведите на экран.

Вариант 10. Ввести строку символов. Группы символов в ней, разделенные пробелом, считаются словами. Определить сколько слов содержат хотя бы одну букву "В"? Исходную строку и количество слов с буквой "В" вывести на экран.

Вариант 11. Ввести строку символов. Определить является ли данная строка правильным скобочным выражением (т.е. количество открывающих скобок равно количеству закрывающих)? Рассматривать только круглые скобки. Отсутствие скобок также трактуется как правильное скобочное выражение.

Вариант 12. Ввести строку, содержащую часть символов в скобках. Удалить эту часть символьной строки вместе со скобками. Исходную и результирующую строку отобразить на экране.

Вариант 13. Ввести строку символов, среди которых есть одна открывающая и одна закрывающая скобка. Вывести на экран все символы, расположенные внутри этих скобок.

Вариант 14. Ввести строку символов. Группы символов в ней, разделенные пробелом, считаются словами. Определить сколько слов начинаются на одну и ту же букву (букву задать). Исходную строку и количество слов вывести на экран.

 

Вариант 15. Ввести строку символов, состоящую из отдельных слов, разделенных пробелами. В результирующей строке вставить вместо пробела запятую и пробел. Вывести на экран исходную и результирующую строки.

Вариант 16. В строке обменять местами самое длинное и самое короткое слово.

Вариант 17. Дан текст, состоящий из 6 слов по 8 символов, разделенных пробелом. Переставить слова в тексте так, чтобы каждое следующее слово начиналось с той буквы, на которую закончилось предыдущее. Первое слово оставить на месте.

Вариант 18. Дана последовательность латинских букв длиной 18 симво­лов. Расставить их по алфавиту.

Вариант 19. Дан текст 30 символов. Сжать текст, оставив между словами по одному пробелу.

Вариант 20. Дан текст 20 символов. Определить количество повторений сочетаний "ОР" в тексте и заменить его символом "!".

Вариант 21. Дан текст 35 символов. Определить количество слов, содержа­щих более 3-х символов. Слова разделяются одним пробелом.

Вариант 22. Дан текст 8 слов по 6 символов. В словах с четным номером изменить порядок букв на обратный.

Вариант 23. Построить последовательность из n (n<=30) символов сле­дующего вида: АББВВВГГГГДДДДДЕЕЕЕЕЕ...

Вариант 24. Построить последовательность из 40 символов по заданной таблице, содержащей символ и количество его повторений. Например:

А - 3 раза

Б - 5 раз АААБББББСССССС

C - 6 раз

Вариант 25. Дан текст 32 символа, состоящий из слов, разделенных од­ним пробелом. Определить количество слов и количество букв в каждом слове.

Вариант 26. Дан текст 34 символа, состоящий из слов, разделенных од­ним пробелом. Определить количество слов, в которых буква Е встречается более чем 2 раза.

Вариант 27. Дана последовательность 37 символов. Определить частоту повторения каждого символа.

Задание 2.

1. Удалить из строки самое длинное слово. (Слова разделяются пробелами)

2. Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой)

3. Удалить из строки последнее слово (слова разделяются пробелами, запятой)

4. Удалить из строки слово с максимальным количеством букв «а»

5. Переставить во всех словах буквы в обратном порядке.

6. Удалить лишние пробелы из строки

7. Переставить в словах, длиной больше 3 символов, буквы в обратном порядке.

8. Удалить удвоенные буквы в словах.

9. Удалить слова с удвоенными буквами.

10. Переставить первое и последнее слово в строке.

11. Заменить в строке все буквы «а» на «b»

12. Удалить из строки буквы «b»

13. Заменить во всех слова, содержащих только цифры, цифры на пробел

14. Удалить все слова, содержащие только цифры.

15. удалить слова-палиндромы

16. Удалить слова, длиной больше 5 символов.

17. Удалить слова с повторяющимися буквами.

18. Удалить из строки слова, содержащие больше 2 букв «а»

19. Обменять самое длинное и самое короткое слова.

20. Обменять слова с максимальным и минимальным количеством букв «а»

21. Удалить слова, содержащие цифры.

22. Удалить слова, длиной меньше 4 символов

23. Удалить из строки слова, содержащие буквы «а».

24. Удалить слова, начинающиеся и заканчивающиеся на букву «а»

25. Заменить в каждом слове первую букву на заглавную

26. Вставить перед каждым числом (числа – слова, состоящие только из цифр) ноль.

27. Заменить в словах, длиной больше 4 символов, все буквы на одну букву «b»

Таблица. Команды строковых примитивов.

Команда Описание Операнды
MOVS · MOVSB · MOVSW · MOWSD Перемещает строки данных. Копирует байт, слово, двойное слово из одного участка памяти в другой. Перемещает (копирует) байт с шагом инкрем.1 для SI и DI Перемещает (копирует) слово с шагом инкр. 2 для SI и DI Перемещает (копирует) двойное слово с шагом инкремента 4 для SI и DI (только для CPU i386+)   MOVS [DI], [SI] MOVSB без/опер. MOVSW без/опер. MOVSD без/опер.
CMPS · CMPSB · CMPSW · CMPSD Сравнивает строки данных. Сравнивает в памяти байты, слова, двойные слова. Сравнивает байты с шагом инкремента 1 для SI и DI Сравнивает слова с шагом инкремента 2 для SI и DI Сравнивает двойные слова с шагом инкремента 4 для SI и DI (только для CPU i386+)   СMPS [SI], [DI]   · без операндов
SCAS · SCASB · SCASW · SCASD Сканирует строки данных. Сравнивает регистры AL, AX или EAX с содержимым памяти, изменяя регистр флагов. Сканирует байт из AL с шагом инкремента 1 для DI Сканирует слово из AX с шагом инкремента 2 для DI Сканирует двойное слово из EAX с шагом инкремента 4 для DI (только для CPU i386+) SCAS [DI], AL SCAS [DI], AX SCAS [DI], EAX   · без операндов
STOS · STOSB · STOSW · STOSD Сохраняет строку данных: сохраняет содержимое регистров AL, AX или EAX в памяти. Сохраняет байт из AL с шагом инкремента 1 для DI Сохраняет слово из AX с шагом инкремента 2 для DI Сохраняет двойное слово из EAX с шагом инкремента 4 для DI (только для CPU i386+) STOS [DI], AL STOS [DI], AX STOS [DI], EAX   · без операндов
LODS · LODSB · LODSW · LODSD Загружает аккумулятор из строки. Загружает байт, слово или двойное слово в AL, AX или EAX из памяти. Загружает байт в AL с шагом инкремента 1 для SI Загружает слово в AX с шагом инкремента 2 для SI Загружает двойное слово в EAX с шагом инкремента 4 для SI (только для CPU i386+) LODS AL, [SI] LODS AX, [SI] LODS EAX, [SI]   · без операндов

 


Команды обработки строк

Строковые команды используются для быстрой и эффективной работы с таблицами чисел или со строками символов. Как известно, нельзя с помощью одной команды MOV переписать данные из одной переменной в другую Строковые команды позволяют это и многое другое.

Существуют общие правила, верные для всех строковых команд:

· Строковые команды применяют для работы индексные регистры: SI (для адресации таблицы-источника — в нем хранится смещение элемента таблицы относительно начала сегмента) и DI (для адресации таблицы-приемника).

· Предполагается, что таблица-источник находится в сегменте данных, то есть адресуется DS, а таблица-приемник — в дополнительном сегменте, то есть адресуется ES. Если мы хотим, чтобы и источник, и приемник находились в одном и том же сегменте, например, необходимо установить ES равным DS.

Как это сделать? Например так:

PUSH ds

POP es

· В результате работы строковой команды, кроме основного действия с элементами таблиц, автоматически меняются индексные регистры так, чтобы указывать на следующий элемент таблицы.

· Направление обработки строк зависит от значения флага направления DF. Если DF=0, то слева направо, в противном случае — справа налево.

· Строковые команды не имеют явных операндов, они подразумеваются, то есть являются неявными.

Теперь рассмотрим строковые команды по группам:

1) MOVSB, MOVSW, MOVSDпересылка байта (или слова, или двойного слова) из строки источника в строку-приемник (строки адресуются индексными регистрами):

DS:[SI] ES:[DI]

Задание

Переписать информацию из одной таблицы слов в другую.

..........

tabl1 dw 1,-3,9,15,2,8

tabl2 dw 8 dup (?)

..........

mov cx,8

lea si,tabl1

lea di,tabl2

push ds

pop es

met:

MOVSW; здесь нет наращивания индексных регистров явно,

; это делается по MOVSW автоматически

loop met

................

 

2) LODSB, LODSW, LODSD — загрузка из строки-источника байта в регистр AL (или слова в регистр AX, или двойного слова в регистр EAX).

Строка-источник адресуется DS:[SI]:

 

DS:[SI] AL

AX

EAX

Задание

Переписать из таблицы байтов 2-ий элемент в регистр al.

...........

tabl db 10,20,30,40,50

...........

lea si,tabl

add si,2

LODSB; в AL окажется число 30

...........

3) STOSB, STOSW, STOSDзапись байта из регистра AL (или слова из регистра AX, или двойного слова из регистра EAX) в строку-приемник.

Строка адресуется ES:[DI]:

AL ES:[DI]

AX

EAX

Задание

Записать в таблицу число 50 на место 0-ого элемента.

..............

tabl dw 5 dup (?)

..............

lea di,tabl

push ds

pop es

mov al,50

stosw; в таблицу на место 0 элемента запишется число 50

............

4) CMPSB, CMPSW, CMPSD — сравнение текущих элементов строки источника и строки приемника. Устанавливаются флаги ZF, SF, CF в зависимости от результата сравнения.

Строки адресуются:

DS:[SI]? ES:[DI]

5) SCASB, SCASW, SCASD — сканирование, то есть сравнение в строке-приемнике текущего элемента с байтом, находящимся в регистре AL (или словом, находящимся в регистре AX, или двойным словом из EAX). Устанавливаются флаги ZF, SF, CF по результату сравнения.

Строка адресуется: ES:[DI].

AL? ES:[DI]

AX? ES:[DI]

EAX? ES:[DI]

6) REP, REPE(REPZ), REPNE(REPNZ)префиксы повторения строковых команд.

REP строковая_команда

REPZ(E) строковая_команда

REPNZ(E) строковая_команда

Префикс REP приводит к тому, что строковая команда, следующая за ним, будет выполняться определенное число раз (указывается в регистре CX). Значение в CX после каждого выполнения строковой команды уменьшается на 1.

REPZ(E) — повторять, пока 0, т.е. ZF=1,

REPNZ(E) — повторять, пока не 0, т.е. ZF=0

Эти префиксы повторений указывают, что команды будут повторяться, пока не изменится флаг ZF, например, после операций CMPSB(W) или SCASB(W), либо, если ZF не изменится, то пока CX не будет равен 0

Задания

1) Необходимо переписать байты из одной таблицы в другую, используя префикс повторения.

.MODEL SMALL

.DATA

TABL DB 1,2,3,4,5,6,7,8,9,10

TABL1 DB 10 DUP (?)

.CODE

.STARTUP

PUSH DS

POP ES; сегмент данных и дополнительный сегмент совпадают

LEA SI,TABL

LEA DI,TABL1

MOV CX,10

REP MOVSB; после выполнения всех команд MOVSB CX станет

;равным 0

.EXIT 0

END

2) Необходимо определить, существует ли в таблице некоторое число.

.MODEL SMALL

.DATA

TABL DB 10 DUP (?)

chislo db?

.CODE

.STARTUP

; ввод элементов в таблицу TABL

; ввод числа, которое необходимо найти в таблице

PUSH DS

POP ES; сегмент данных и дополнительный сегмент теперь

;совпадают

LEA dI,TABL

MOV CX,10

mov al,chislo

REPne scasb; происходит выход из цикла раньше, если число

; найдено

JZ MET; тогда флаг ZF равен 1

; вывод сообщения "число НЕ НАЙДЕНО"

jmp en

MET:; вывод сообщения "число НАЙДЕНО"

EN:

.EXIT 0

END

3) Определить номер первого справа символа “\” в строке символов (например, это может быть путь к файлу).

.model small

.data

stroka db 'a:\pr\a.txt'

str_len equ $-stroka

nomer dw?

.code

.startup

push ds

pop es

std

lea di,stroka

mov cx,str_len

add di,cx

dec di; возвращаемся на 1 позицию обратно к последнему

; символу строки

mov al,'\'

repne scasb

jnz no

mov nomer,cx; cx изменяется по REPNE

jmp konec

no:; вывод сообщения 'не найдено'

mov ah,2

mov dl,’N’

int 21h

konec:

.exit 0

end

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: