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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2016, 21:29   #1
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию В тексте определить количество чисел, у которых три одинаковых цифры в числе

Пожалуйста, помогите решить следующую задачу (TASM):
"В тексте определить количество чисел, у которых три одинаковых цифры в числе (например, 36533)".

Только начинаю изучать ассемблер, поэтому подскажите в какую сторону копать.
Я думаю сделать так:
1) Раз это текст, то пусть числа вводятся с клавиатуры через пробел. И надо сделать цикл по выделению каждого слова (числа), ориентируясь на пробел как на признак конца слова. Чтобы работать с каждым словом, то бишь числом, отдельно.
2) Цикл, где считается количество вхождений каждого символа (то есть цифры) в слово. Если счетчик строго равен трем, то вывести это слово на экран.

Проблема в том, что видел задачи, где надо найти кол-во вхождений одного заданного символа. Но не нашел примеров как у меня.

Была также мысль преобразовать строку в массив целых чисел. И там уже сравнивать, используя mod и div. Или так делать не стоит?

Заранее благодарен! ))
Zaresh вне форума Ответить с цитированием
Старый 25.02.2016, 06:47   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Алгоритм придумал вроде правильный, осталось только реализовать его.
Показывай свои попытки...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 26.02.2016, 14:18   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Как я понял, даже попыток нет...
На FASM'е это дело можно организовать так. Мутновато.., но вроде работает.
Для корректного отображения - строку заканчивай пробелом:

Код:
org  100h
jmp  start

hello   db  13,10,'String: $'
bye     db  13,10,'Result: $'
string  db  80,0,80 dup(' ')     ;' входной буфер для dos(0Ah)
buff    db  20 dup('$')          ;' выходной буфер (место под каждое слово)
                                 ;' макс.длина слова: 20 символов
start:
;' Сохраняем строку юзера ========================================
   mov   ah,9               ;
   mov   dx,hello           ;
   int   21h                ;
   mov   ah,0Ah             ;
   mov   dx,string          ;
   int   21h                ;
   mov   ah,9               ;
   mov   dx,bye             ;
   int   21h                ;

;' Копируем очередное слово из строки в буфер ====================
   xor   ch,ch              ;' СН = текущая позиция в строке
   mov   cl,[string+1]      ;' CL = длина введённой строки
   mov   si,string+2        ;' указатель на начало строки
startCopy:                  ;
   mov   di,buff            ;' адрес приёмного буфера
   xor   bx,bx              ;' ВХ = 0 (это будет длина слова)
copy:                       ;
   lodsb                    ;' берём символы из SI,
   cmp   al,' '             ;'    ..пока не встретиться пробел
   je    stopCopy           ;
   stosb                    ;' запись их в DI.
   inc   bx                 ;' длина слова +1
   inc   ch                 ;' позиция в строке +1
   jmp   copy               ;' сл.символ...

;' Встретился пробел. Поиск триады в слове =======================
stopCopy:                   ;' в ВХ лежит длина слова
   push  si cx              ;' запомним текущую позицию в строке
   mov   si,buff            ;' SI = плавающий символ в слове
   mov   dx,bx              ;' СX/DX = длина слова
find3:                      ;
   mov   cx,bx              ;
   inc   cx                 ;' захватим последний символ
   xor   ah,ah              ;' AH будет флагом совпадений
   mov   di,buff            ;' где искать
   mov   al,byte[si]        ;' что искать
@@:                         ;' <----------------<<---------------+
   repne scasb              ;' ищем до совпадения!               |
   or    cl,cl              ;' все символы слова проверили?      |
   jz    test3              ;' да:  тест на 3                    |
   inc   ah                 ;' нет: флаг +1                      |
   jmp   @b                 ;' продолжаем поиск совпадений -->---+
test3:                      ;
   cmp   ah,3               ;' проверка флага на 3
   jz    stopFind           ;' прыг если равно
   inc   si                 ;' иначе: ищем сл.символ слова
   dec   dx                 ;' уменьшить длину слова
   jnz   find3              ;' конец слова? нет: искать дальше..
   jmp   clearBuff          ;' иначе: нет триады. Очистить буфер!

;' Есть 3 совпадения! Выводим результат ===========================
stopFind:
   mov   ah,9               ;' выводим слово из буфера
   mov   dx,buff            ;
   int   21h                ;
   mov   al,' '             ;' ..и вставляем пробел/разделитель
   int   29h                ;
clearBuff:                  ;' забиваем буфер баксами
   mov   al,'$'             ;
   mov   cx,20              ;
   mov   di,buff            ;
   rep   stosb              ;

;' Читаем следующее слово... ======================================
nextWord:                   ;
   pop   cx si              ;' восстанавливаем позицию в строке юзера
   cmp   ch,cl              ;' всю строку проверили?
   ja    exit               ;' да - на выход!
   jmp   startCopy          ;' иначе: берём сл.слово строки в буфер

exit:                       ;
   xor   ax,ax              ;
   int   16h                ;
   int   20h                ;' выход в DOS...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 26.02.2016, 16:24   #4
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

Попытки есть ))) Потихоньку решаю, просто показать пока особо нечего. За ваш код большое спасибо!
Zaresh вне форума Ответить с цитированием
Старый 26.02.2016, 16:45   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Ясно.., а для спасибо есть "весы"
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 28.02.2016, 19:20   #6
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

отзыв добавил ))

R71MT, разъясните, пожалуйста, следующие строки вашего кода:
1) метка stopCopy - строка push si cx - в счетчик-регистр cx мы кладем значение из si, чтобы освободить si для buff, я правильно понимаю?
Чтобы затем восстановить обратно: pop cx si
но зачем тогда в метке find3 писать mov cx,bx, меняя значение cx на другое?

2) строка string db 80,0,80 dup - первые 80 - это максимальное количество символов. А ноль и вторая цифра "80" для чего?

Надо еще вывести количество этих чисел. Можно ли используя регистр bh это сделать? Например, так:

в метке start пишу "xor bh,bh"
в метке stopFind его увеличиваю на единицу "inc bh"
в метке exit вывожу значение:
mov ah,9
mov dx, bh / только так нельзя, как-то надо вывести это число на экран
int 21h

Последний раз редактировалось Zaresh; 28.02.2016 в 20:59.
Zaresh вне форума Ответить с цитированием
Старый 28.02.2016, 21:39   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

1. ..почти так, только:

Код:
push   si  cx        ; сохраняем в стеке указатель и счётчик внешнего цикла
; что равносильно..
push   si
push   cx
;.... далее, соответственно..
pop    cx  si        ; восстанавливаем их
2. Так оформляется буфер для функции 0Ah:

Код:
80 - макс.длина строки
0  - кол-во реально введённых символов
80 - место под строку
3. Какой регистр можно использовать для подсчета количества найденных чисел?
Здесь ещё не использовался BP - можешь его заюзать, ..или стек, или переменную.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 28.02.2016, 21:57   #8
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

К сожалению, не выходит... Внес изменения в код, как я выше писал. Но после ввода строки он выводит абракадабру. Правильно ли, что я увеличиваю регистр bp в процедуре stopFind? И, наверно, вывод значения через dx тоже неправильный?
Zaresh вне форума Ответить с цитированием
Старый 28.02.2016, 22:17   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Zaresh Посмотреть сообщение
Надо еще вывести количество этих чисел.
А чё сразу не сказал? Держал вопрос "на засыпку" ?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 28.02.2016, 22:26   #10
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

Так в первом сообщении же написал, где задание ). Просто анализировал ваш код и только потом дошло, что мне еще количество надо будет вывести. Решил сам доработать, да не выходит. Помогите, пожалуйста, еще раз ))

Через стек не вышло. мне надо брать значение счетчика в конце программы, а до него надо выводить из стека pop si, cx. То есть, получается, заталкиватьсчетчик туда нельзя
Zaresh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal ABC. Даны три массивы. Определить общее количество элементов массивов, значение которых лежат в интервале (подпрограмма) MarsLoveMoon Паскаль, Turbo Pascal, PascalABC.NET 6 24.04.2014 19:28
Сколько n-значных чисел можно образовать из двух цифр 5 и 9, в которых три одинаковые цифры не стоят рядом Thunder Dragon Паскаль, Turbo Pascal, PascalABC.NET 7 26.03.2012 20:05
определить количество четных чисел и количество нечетных чисел массива, которые вводятся в МЕМО, вывести в поле компонента Edit. Pyxy Помощь студентам 2 21.03.2012 23:24
Pascal.Определить к-количество трехзначных натуральных чисел,сумма цифр которых n (n=13). naty7773 Помощь студентам 2 11.01.2012 16:43
Задана последовательность чисел в формате:сначала количество цифр в числе, потом - цифры числа. Подсчитать количество. Arn1 Помощь студентам 4 03.10.2011 20:03