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

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

    По умолчанию

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

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

    По умолчанию

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

  7. #6
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,053
    Спасибо Благодарностей отдано 
    218
    Спасибо Благодарностей получено 
    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. Будем во время исполнения цикла хранить информацию о том, был предыдущий символ пробелом или нет. Тогда, встретив пробел, мы можем обратиться к запомненной ранее информации и принять верное решение.

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

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

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

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

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Если это первый пробел - то его нужно оставит
    а как же

    Цитата Сообщение от Dr.Potapov Посмотреть сообщение
    есть в буфере buff строка вида "123__456____789" (с произвольным количеством пробелов между любыми символами)
    Последний раз редактировалось shurik-ua; 22.02.2018 в 04:57.

  9. #8
    Veteran Аватар для Bedazzle
    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,485
    Спасибо Благодарностей отдано 
    219
    Спасибо Благодарностей получено 
    149
    Поблагодарили
    115 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  10. #9
    Guru Аватар для Vladimir_S
    Регистрация
    12.12.2011
    Адрес
    г. Иркутск
    Сообщений
    2,507
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    21
    Поблагодарили
    19 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Dr.Potapov, Если перевести на человеческий. Некий флаг сброшен в ноль. Встретился зрак пробела который переносится в буфер, а флаг устанавливается в 1. Адрес строки и адрес буфера увеличивается. Если опять читается код пробела, но флаг в 1, то увеличивается только адрес строки. Встретился код не пробела - флаг в 0 и снова здорово. Пока не будет прочитан указатель конца строки.
    Последний раз редактировалось Vladimir_S; 22.02.2018 в 09:04.

  11. #10
    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

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

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

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

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

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

Похожие темы

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

Ваши права

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