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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2017, 21:47   #1
Mr_Nobody
 
Регистрация: 03.07.2015
Сообщений: 6
По умолчанию Удалить из символьного массива все вхождения цифр и арифметических знаков

Доброго времени суток! Помогите, пожалуйста, с заданием

Задание: Задан символьный массив S(n), n≤700. Разработать программу, которая изымает из этого массива все повторные вхождения цифр и арифметических знаков. Вывести результат на консоль.
Mr_Nobody вне форума Ответить с цитированием
Старый 09.04.2017, 06:44   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Под какую ОС? Где твоё решение? Показывай свой код..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 09.04.2017, 09:42   #3
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

И, за компанию, название компилятора, каким образом изымать (просто не выводить на экран или сначала преобразовать строку).
FPaul вне форума Ответить с цитированием
Старый 09.04.2017, 11:58   #4
Mr_Nobody
 
Регистрация: 03.07.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Под какую ОС? Где твоё решение? Показывай свой код..
Исходя из задания, можно предположить что строка объявлена и заранее известно ее длина:
Код:
.model small
.stack 100h
.data
arr     dw 'd','f','+','t','1','4','h','`','@','0','*','.','9','k'
l=13
Я так понимаю, что есть два способа решения:
1. Удалить ненужные элементы, сместив оставшиеся
2. Переписать массив, с нужными элементами
...но как это сделать, я не особо представляю)

Цитата:
Сообщение от FPaul Посмотреть сообщение
И, за компанию, название компилятора, каким образом изымать (просто не выводить на экран или сначала преобразовать строку).
Комипиляторы: masm32, TASM.
Вывести нужно начальный и конечный результат.
Mr_Nobody вне форума Ответить с цитированием
Старый 09.04.2017, 14:29   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Mr_Nobody Посмотреть сообщение
которая изымает из этого массива все повторные вхождения цифр и арифметических знаков.
Так-как в ASCII-таблице коды цифр идут подряд, то их можно вытащить за один проход. Со-знаками уже такой фокус не пройдёт (в последовательности есть две дырки /см.рис.ниже/), и их нужно искать каждый в отдельности. А это ещё 4 прохода. Итого, изъять всё данные из строки можно за 5 проходов (если искать каждый символ отдельно, то за 2). ИМХО..
Изображения
Тип файла: gif ascii.gif (11.8 Кб, 74 просмотров)
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 09.04.2017 в 14:34.
R71MT вне форума Ответить с цитированием
Старый 09.04.2017, 19:18   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Вот тебе решение на Фасм'е. Под Тасм переделаешь сам..
Массив заполняется случайным образом. Длина массива вычисляется тоже рандомно, в диапазоне 16..699, в следствии чего при каждом запуске программы данные и результат будут разные. Организовано в один проход..

Фильтруется только первая половина (127 символов) ASCII-таблицы, а это все символы, кроме кирилицы и псевдографики. Чтоб не расходовать память, найденные элементы помещается в тот-же массив, перезаписывая его с головы.

Код:
;fasm-code /*.COM-file/
;--------------------------
org   100h
push  start
retn

mess0   db  13,10,10,'ARRAY...'
        db  13,10,'------------',13,10,'$'
mess1   db  13,10,10,'FOUND...'
        db  13,10,'------------',13,10,'$'

array   db  700 dup(0)          ; место под массив (и результат)
len     dw  0                   ; переменная с длиной массива

start:
;// получаем длину массива "от фонаря"
        in    ax,40h            ; АХ = рандом
        mov   bx,700            ; делитель
        xor   dx,dx             ;
        div   bx                ;
        cmp   dx,16             ; проверка остатка на минимум
        jb    start             ; повторить, если меньше
        mov   [len],dx          ; длина массива в диапазоне 16..699

;// заполняем массив случайным образом
        mov   di,array          ; приёмник
@@:     xor   cx,cx             ; задержка..
        loop  $                 ; ^^^
        in    ax,40h            ; берём рандом
        imul  ax,9E35h          ; разделить на полином
        and   al,7Fh            ; оставим только первую половину ASCII-кодов
        cmp   al,13             ; уберём возврат каретки,
        je    @b                ; ^^^
        cmp   al,10             ; ..и перевод строки.
        je    @b                ; ^^^
        stosb                   ; сохранить символ в ES:DI !
        dec   dx                ;
        jnz   @b                ; промотать вернюю метку(@@) DX-раз..

;// выводим получившийся массив на экран
        mov   ah,9              ; мессага
        mov   dx,mess0          ;
        int   21h               ;
        mov   cx,[len]          ; СХ = длина массива
        mov   si,array          ; SI = источник
@@:     lodsb                   ;
        int   29h               ;
        loop  @b                ;

        mov   ah,9              ; мессага
        mov   dx,mess1          ;
        int   21h               ;

;// поиск заданных символов в массиве
;// после чтения, источник больше не нужен.
;// найденные будем собирать туда-же (в источник) - начиная с головы.
        mov   cx,[len]          ;
        mov   si,array          ; источник
        mov   di,si             ;    ..он-же приёмник
        xor   dx,dx             ; сбросим счётчик найденных
@@:     lodsb                   ; читаем массив
        mov   bl,al             ; запомним символ в BL (для фильтра чисел)
        cmp   al,'*'            ; фильтр знаков..
        jz    @save             ; сохранить, если равно
        cmp   al,'/'            ;
        jz    @save             ;
        cmp   al,'+'            ;
        jz    @save             ;
        cmp   al,'-'            ;
        jz    @save             ;
        sub   bl,30h            ; проверка на число
        cmp   bl,9              ;
        ja    @next             ; пропустить, если больше
@save:  inc   dx                ; иначе: счётчик +1
        stosb                   ; запись символа в буфер!
@next:  loop  @b                ; промотать СХ-раз..

;// вывод найденных на экран
        mov   cx,dx             ; кол-во найденных
        mov   si,array          ; источник
@@:     lodsb                   ;
        int   29h               ;
        loop  @b                ;

        mov   ah,8              ; выход в DOS по клавише!
        int   21h               ;
        int   20h               ;
Изображения
Тип файла: gif found.gif (11.3 Кб, 72 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 09.04.2017, 23:26   #7
Mr_Nobody
 
Регистрация: 03.07.2015
Сообщений: 6
По умолчанию

Немного погуглив, узнал про анонимные метки и что делают отдельные прерывания, также до этого я думал что команды lods и stos что-то, куда-то пересылают, а теперь знаю что, куда и откуда. Как минимум смогу объяснить данную программу.

Очень Вам благодарен! Отдельное спасибо за комментарии.
Mr_Nobody вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить из записи числа все вхождения последней цифры Анатолий666 Общие вопросы C/C++ 1 16.09.2015 18:31
Необходимо найти самое длинное слово и удалить все его вхождения Julia1 Помощь студентам 3 30.06.2014 22:40
Из символьного массива исключить все элементы, содержащие символ 'A' Ebon Помощь студентам 1 11.06.2012 01:19
Из текста удалить все вхождения некоторого наперед заданного символа и символ, стоящий в тексте перед ним LittleStudent Помощь студентам 1 15.04.2011 00:46
Удалить из строкового значения все вхождения заданного символа. Delphi Saka Помощь студентам 10 08.03.2010 01:22