Автор: Пользователь скрыл имя, 07 Декабря 2011 в 02:53, лабораторная работа
Задание: Дан текст – непустая последовательность не длиннее ста символов. Признаком конца ввода является точка, в сам текст точка не входит. Проверить, удовлетворяет ли текст заданному условию: за каждой цифрой текста идет строчная латинская буква. Если условие выполнено, преобразовать текст по одному правилу: заменить каждую прописную русскую букву симметричной ей в алфавите (А ↔ Я, Б ↔ Ю, ...), в противном случае – по другому правилу: в каждой группе следующих подряд одинаковых литер оставить только одну из них (использовать строковые команды с префиксами повторения). Преобразованный текст напечатать.
Министерство образования Республики Беларусь
Учреждение образования
Брестский
государственный технический
Кафедра
ИИТ
Лабораторная
работа № 2
Тема: «Язык
ассемблера. Обработка символьных данных»
Выполнил:
студент 4 курса
факультета ЭИС
группы АС-27
Якубчик Н.И.
Проверил:
Дёмин
В.В.
Брест 2011
Вариант 9.
Задание: Дан текст – непустая последовательность не длиннее ста символов. Признаком конца ввода является точка, в сам текст точка не входит. Проверить, удовлетворяет ли текст заданному условию: за каждой цифрой текста идет строчная латинская буква. Если условие выполнено, преобразовать текст по одному правилу: заменить каждую прописную русскую букву симметричной ей в алфавите (А ↔ Я, Б ↔ Ю, ...), в противном случае – по другому правилу: в каждой группе следующих подряд одинаковых литер оставить только одну из них (использовать строковые команды с префиксами повторения). Преобразованный текст напечатать.
Если введенная последовательность символов не является текстом, преобразовывать ее не нужно, а следует напечатать соответствующее сообщение.
Ввод
текста, проверка условия, обработка
текста и печать результата
должны выполняться последовательно,
отдельными частями программы.
Код программы:
#include "stdafx.h"
#include <iostream>
using namespace
std;
const int
len_str = 100;
bool is_a_text (char my_string[])
{
__asm
{
mov ebx, dword ptr [my_string]
mov al, byte ptr [ebx]
mov ah, 0
start_cycle: ;Проверка в цикле, нет ли в строке
cmp al, 0 ;символов с кодами 1-31, 33-46, 47,
je string_more_max ;58-64, 91-96, 123-127, 176-223,
cmp al, 46 ;240-255
je end_of_string
cmp al, 32
je is_a_char
cmp al, 48
jb not_a_string
cmp al, 58
jb is_a_char
cmp al, 65
jb not_a_string
cmp al, 91
jb is_a_char
cmp al, 97
jb not_a_string
cmp al, 123
jb is_a_char
cmp al, 128
jb not_a_string
cmp al, 176
jb is_a_char
cmp al, 224
jb not_a_string
cmp al, 242
jb is_a_char
jmp not_a_string
is_a_char: ;переход к следующему символу
cmp ah, 99
je string_more_max
inc ebx
inc ah
mov al, byte ptr [ebx]
jmp start_cycle
string_more_max: ;
mov byte ptr[ebx], 46 ;заканчивается не точкой
mov byte ptr[ebx+1], 0
end_of_string: ;Возврат логического значения
mov al, 1 ;в точку вызова функции
jmp end_my_proc
not_a_string:
mov al, 0
end_my_proc:
}
}
bool proverka(char my_string[])
{
__asm
{
mov ebx, dword ptr [my_string] ;посимвольная проверка
mov ah, byte ptr [ebx]
mov al, 1
start_cycle:
cmp ah, 46 ;не конец строки?
je end_my_proverka
cmp ah, 48 ;не цифра?
jb not_a_digit
cmp ah, 57
ja not_a_digit
mov ah, byte ptr [ebx+1] ;следующий символ - не
cmp ah, 96 ;строчная латинская буква?
jb condition_false
cmp ah, 123
ja condition_false
not_a_digit: ;переход к следующему символу
inc ebx
mov ah, byte ptr [ebx]
jmp start_cycle
condition_false: ;если условие хоть раз нарушается -
mov al, 0 ;возврат в точку вызова "Ложь"
end_my_proverka: ;иначе - возврат "Истина"
}
}
void first_rule(char my_string[])
{
__asm
{
mov ebx, dword ptr [my_string]
mov al, byte ptr [ebx]
start_cycle:
cmp al, 46 ;конец строки - на выход
je end_first_rule
cmp al, 128 ;симметричная замена РУССКИХ ПРОПИСНЫХ букв
jb next_char
cmp al, 159
ja next_char
cmp al, 145
jb another_method
mov ah,159
sub ah, al
mov al, 128
add al, ah
mov byte ptr [ebx], al
jmp next_char
another_method:
mov ah, al
sub ah, 128
mov al, 159
sub al, ah
mov byte ptr [ebx], al
next_char: ;переход к следующему символу
inc ebx
mov al, byte ptr [ebx]
jmp start_cycle
end_first_rule:
}
}
void second_rule(char my_string[])
{
__asm
{
mov ebx, dword ptr [my_string]
mov al, byte ptr [ebx]
mov edx, 0
start_counting_cycle:
cmp al, 0 ;конец строки - на выход
je end_counting
inc edx
inc ebx
mov al, byte ptr [ebx]
jmp start_counting_cycle
end_counting: ;счёт количества символов
mov ebx, dword ptr [my_string] ;в строке
mov al, byte ptr [ebx]
start_cycle:
cmp al, 46 ;конец строки - на выход
je end_second_rule
mov ah, byte ptr [ebx+1]
xor ah, al
je obrabotka
inc ebx
dec edx
mov al, byte ptr [ebx]
jmp start_cycle
obrabotka: ;если группа символов -
mov ecx, edx ;сдвиг строки влево с
cld ;
lea di, byte ptr [ebx] ;группы
lea si, byte ptr [ebx+1]
rep movsb ;если сдвигали -
dec edx ;проверяем по-новой, иначе -
jmp start_cycle ;переход на следующий символ
end_second_rule:
}
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"Input string:\n";
char my_string [len_str+1] ;
cin>>my_string;
if(!is_a_text(my_string)
{
cout<<"\nThis is not a text\n";
cin.get();
return 0;
}
cout<<"Veryfying: after any
number comes little latin symbol: "<<endl;
//Если
строка соотвествует условию
- преобразование по первому
//иначе
- по второму
if (proverka(my_string))
{
cout<<"true\
first_rule(my_
}
else
{
cout<<"false\
second_rule(my_
}
cout<<my_string<<"\
cin.get();
cin.get();
return 0;
}
Тестирование
программы:
Запустим программу и введём строку, содержащую символы, не соответствующие тексту:
Запустим программу и введём строку, соответствующую условию и позволяющую наглядно преобразовать себя по первому правилу
Информация о работе Язык ассемблера. Обработка символьных данных