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

User Tag List

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

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

  1. #1

    Регистрация
    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

    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    365
    Поблагодарили
    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

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

    По умолчанию

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

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

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

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

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

  5. #4

    Регистрация
    25.12.2017
    Адрес
    г. Москва
    Сообщений
    652
    Спасибо Благодарностей отдано 
    124
    Спасибо Благодарностей получено 
    160
    Поблагодарили
    95 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  6. #5

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

    По умолчанию

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

  7. #6

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    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

    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    365
    Поблагодарили
    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

    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,691
    Спасибо Благодарностей отдано 
    302
    Спасибо Благодарностей получено 
    223
    Поблагодарили
    159 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  10. #9

    Регистрация
    12.12.2011
    Адрес
    г. Иркутск
    Сообщений
    2,509
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    22
    Поблагодарили
    20 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  11. #10

    Регистрация
    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 
Просмотров:	333 
Размер:	2.1 Кб 
ID:	64317

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

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

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

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

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

Похожие темы

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

Ваши права

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