Важная информация

User Tag List

Страница 1 из 4 1234 ПоследняяПоследняя
Показано с 1 по 10 из 34

Тема: Учусь программировать (need help)

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Member Аватар для Dr.Potapov
    Регистрация
    31.10.2006
    Адрес
    г. Воронеж
    Сообщений
    75
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Учусь программировать (need help)

    Решил тут освоить асм для z80. Не пинайте сильно, если вдруг мои вопросы покажутся слишком *****кодием )

    Помогите разобраться, есть в буфере buff строка вида "123__456____789" (с произвольным количеством пробелов между любыми символами) заканчивающаяся на #0d,#0a. Строка в buff никогда не начинается с пробела и не заканчивается пробелом (это я осилил). Необходимо привести ее к виду "123_456_789" (с одним пробелом между группами цифр).

    Код который я написал
    Код:
    		ld hl,buff
    		ld bc,buff
    charloop
    		ld a,(hl)
    		ld (bc),a
    		cp #20
    		jr z,skipmoveright
    		inc bc
    skipmoveright 				
    		inc hl
    		ld a,(bc)
    		cp #0a
    		jr z,clearline
    		jr charloop
    clearline
    сжирает и пробелы.

    Вижу где, понимаю, что как то надо хоть один пробел оставить, но не пойму куда inc bc:inc hl воткнуть правильно. Помогите, а?
    Последний раз редактировалось Dr.Potapov; 22.02.2018 в 00:52.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    		ld hl,buff
    		ld bc,buff
                    ld e,0
    charloop
    		ld a,(hl)
    		cp #0a
    		jr z,clearline
                    inc hl                
                    cp #20
                    jr z, charloop        ; ignoring all spaces in input buf
                    inc e
                    ld d,a
                    ld a,e
                    cp #03                ; if there 3 digits in a row then add space
                    jr nz, m1
                    ld e,0
                    ld a,d
                    ld (bc),a
                    inc bc
                    ld d,#20               
    m1
                    ld a,d
                    ld (bc),a
                    inc bc           
                    jr charloop
    clearline
    Последний раз редактировалось shurik-ua; 22.02.2018 в 00:35.

  4. #3
    Member Аватар для Dr.Potapov
    Регистрация
    31.10.2006
    Адрес
    г. Воронеж
    Сообщений
    75
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо, но ваш вообще не работает )
    Нажмите на изображение для увеличения. 

Название:	2018-02-22_00-38-16.png 
Просмотров:	302 
Размер:	929 байт 
ID:	64314

    Мой код работает так:
    Нажмите на изображение для увеличения. 

Название:	2018-02-22_00-45-37.png 
Просмотров:	265 
Размер:	1.6 Кб 
ID:	64315

    Посплю, может приснится )

  5. #4
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dr.Potapov Посмотреть сообщение
    но ваш вообще не работает )
    я там пару ошибок допустил - щас поправил )

  6. #5
    Member Аватар для Dr.Potapov
    Регистрация
    31.10.2006
    Адрес
    г. Воронеж
    Сообщений
    75
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от shurik-ua Посмотреть сообщение
    я там пару ошибок допустил - щас поправил )
    Не во всех вариантах работает.
    Нажмите на изображение для увеличения. 

Название:	2018-02-22_09-05-51.png 
Просмотров:	310 
Размер:	2.1 Кб 
ID:	64317

    Вообще задачка интересная оказалась ) Спасибо большое сообществу, что с воодушевлением откликнулись )

  7. #6
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dr.Potapov Посмотреть сообщение
    Не во всех вариантах работает
    вроде во всех )

  8. #7
    Master Аватар для IgorR76
    Регистрация
    25.12.2017
    Адрес
    г. Москва
    Сообщений
    651
    Спасибо Благодарностей отдано 
    122
    Спасибо Благодарностей получено 
    156
    Поблагодарили
    94 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Дам образный совет.
    Попробуйте нарисовать на бумажке алгоритм смещения символов влево. Чтоб наглядно было видно, какой указатель когда увеличивается. Не думайте языком ассемблера, а попробуйте стать процессором и выполнить свой алгоритм сами, проследить по стрелкам, что и куда. И когда оно заработает у Вас, то на ассемблер Вы это легко перепишете.

  9. #8
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,058
    Спасибо Благодарностей отдано 
    220
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dr.Potapov Посмотреть сообщение
    Необходимо привести ее к виду "123_456_789" (с одним пробелом между группами цифр).
    Вот мой вариант.
    Код:
    		ld hl,buff
    		ld bc,buff
                    ld e,0 ;0 - после не-пробела, 1 - после пробела
    charloop
    		ld a,(hl)
    		inc hl
    		ld (bc),a
    		cp #0a
    		jr z,endtext
    		cp #20
    		jr z,foundspace
    ; сюда попадаем при не-пробеле
    		xor a
    		ld e,a
    		jr nonskip
    foundspace
    		ld a,e
    		or a
    		jr nz,charloop ;съедаем второй и последующие пробелы
    		inc e ;при первом пробеле запоминаем, что был пробел, но не съедаем его
    nonskip
    		inc bc
    		jr charloop
    endtext
    Цитата Сообщение от Dr.Potapov Посмотреть сообщение
    Вижу где, понимаю, что как то надо хоть один пробел оставить, но не пойму куда inc bc:inc hl воткнуть правильно. Помогите, а?
    При решении этой и подобных задач обработки текста нужно думать в терминах конечных автоматов и регулярных выражений. Это касается как ассемблера, так и других языков программирования. Ход мыслей следующий.

    Шаг рассуждения 1. Если в исходной строке встретился пробел, то это может быть первый пробел, а может быть и не первый. Если это первый пробел - то его нужно оставить, а если не первый - съесть.

    Шаг рассуждения 2. Будем во время исполнения цикла хранить информацию о том, был предыдущий символ пробелом или нет. Тогда, встретив пробел, мы можем обратиться к запомненной ранее информации и принять верное решение.

    Аналогичным образом можно расширить рассмотрение для отработки пробелов в начале и конце строки (которые надо съесть все).

    - - - Добавлено - - -

    Преимущества подхода конечных автоматов - это то, что любая обработка текста, которая может быть описана регулярными выражениями, может производиться за один проход вперед по строке без необходимости заглядываний вперед или откатов назад. Единственное, что требуется - это хранить переменную состояния (как правило, одну). Таким образом, можно очень большой класс задач обработки текста решать единообразно и эффективно.

  10. #9
    Member Аватар для Dr.Potapov
    Регистрация
    31.10.2006
    Адрес
    г. Воронеж
    Сообщений
    75
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Преимущества подхода конечных автоматов - это то, что любая обработка текста, которая может быть описана регулярными выражениями, может производиться за один проход вперед по строке без необходимости заглядываний вперед или откатов назад. Единственное, что требуется - это хранить переменную состояния (как правило, одну). Таким образом, можно очень большой класс задач обработки текста решать единообразно и эффективно.
    Все, врубился ) Состояние поиска в Е мне мозги вправило )) Я то это состояние вчера в полуночной горячке пытался где то в параллельном мире сохранить ))) Спасибо большое!
    Нажмите на изображение для увеличения. 

Название:	2018-02-22_09-14-13.png 
Просмотров:	222 
Размер:	3.0 Кб 
ID:	64318

  11. #10
    Member Аватар для makbar
    Регистрация
    04.06.2016
    Адрес
    г. Ярославль
    Сообщений
    100
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    регулярных выражений. Это касается как ассемблера
    как интересно, никогда не видел для ассемблера такой библиотеки.
    Разработчик КНГМД для Специалиста и Ориона128, автор SPDOS (журнал "Радио" 12/1992, 1-2/1993). Манускрипт, датированный 1993-94гг: Отладка контроллера SPDOS SPDOS v4.3

Страница 1 из 4 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Трудно ли программировать спрайтовые движки?
    от Romanich в разделе Программирование
    Ответов: 29
    Последнее: 22.12.2006, 08:20

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •