Важная информация
Показано с 1 по 4 из 4

Тема: Литерная величина. Задача по Qbasic

  1. #1 Литерная величина. Задача по Qbasic 
    Новичок Аватар для Eldiyar Rysaliev
    Регистрация
    16.12.2015
    Сообщений
    4
    Сказал(а) спасибо
    2
    Поблагодарили 0 раз(а) в 0 сообщениях
    Помогитее плиииз, заранее спасибо.
    Перепишите литерную величину X$, так, чтобы порядок символов в ней был обратным. Например: класс-ссалк
    Ответить с цитированием  
     

  2. #2  
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    Должно работать несколько быстрее классического варианта (через MID$)
    Basic Code:
    1. DIM ST AS STRING, PT AS INTEGER, SEC AS INTEGER
    2. DIM TEMP AS INTEGER, I AS INTEGER
    3. DIM STRINGPTR AS INTEGER, STRINGLENGTH AS INTEGER
    4.  
    5. CLS
    6. ST = "TEMP STRING"
    7.  
    8. SEC = VARSEG(ST)
    9. PT = VARPTR(ST)
    10. DEF SEG = SEC
    11. STRINGLENGTH = PEEK(PT)
    12. STRINGPTR = PEEK(PT + 3) * 256 + PEEK(PT + 2)
    13.  
    14. FOR I = STRINGPTR TO STRINGPTR + STRINGLENGTH - 1
    15.   PRINT CHR$(PEEK(I));
    16. NEXT
    17. PRINT
    18.  
    19. FOR I = 0 TO STRINGLENGTH \ 2
    20.   TEMP = PEEK(STRINGPTR + STRINGLENGTH - I - 1)
    21.   POKE STRINGPTR + STRINGLENGTH - I - 1, PEEK(STRINGPTR + I)
    22.   POKE STRINGPTR + I, TEMP
    23. NEXT I
    24. PRINT ST

    P.S. Всегда мечтал это сделать.
    Ответить с цитированием  
     

  3. Пользователь сказал cпасибо:

    Free Admin (17.04.2016)

  4. #3  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,878
    Сказал(а) спасибо
    1,829
    Поблагодарили 957 раз(а) в 816 сообщениях
    Записей в блоге
    1
    Good.Morning, STRINGPTR можно получить через SADD(переменная).
    Длина строки больше 256 проверялась? Честно сказать не помню уже что там как, но
    пропущенный второй байт строкового заголовка смущает совсем немного так...
    Под DOS-ом не бывает каких-то случайностей, да и не помню ограничения на 256.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  5. Пользователь сказал cпасибо:

    Good.Morning (17.04.2016)

  6. #4  
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    Я настаивать на нижеперечисленном не буду, ибо в памяти DOS не бум-бум, но ИМХО:
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    STRINGPTR можно получить через SADD(переменная)
    А stringlength можно получить через len(переменная), я хотел максимально избавиться
    от "умных" операторов STRING-а.
    (Помнил, что есть такой SADD, но не помнил/не знал, для чего он нужен)

    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    второй байт строкового заголовка смущает совсем немного так
    Гм... это много объясняет =). Собственно говоря, ничего сложного не должно составить
    дописать его обработку.

    Это оказалось чуть сложнее, чем я думал. Теперь, надеюсь, правильно (без костылей не обошлось):
    Basic Code:
    1. DIM ST AS STRING, PT AS INTEGER, SEC AS INTEGER
    2. DIM TEMP AS INTEGER, I AS LONG
    3. DIM STRINGPTR AS LONG, STRINGLENGTH AS LONG
    4. DIM STRINGPTRPTR AS INTEGER, STRINGLENGTHPTR AS INTEGER
    5. CLS
    6. ST = "0123456789ABCDEF"  '16
    7. ST = ST + ST  '32
    8. ST = ST + ST  '64
    9. ST = ST + ST  '128
    10. ST = ST + ST  '256
    11. ST = ST + ST  '512
    12.  
    13. SEC = VARSEG(ST)
    14. PT = VARPTR(ST)
    15. DEF SEG = SEC
    16. STRINGPTRPTR = VARPTR(STRINGPTR)
    17. STRINGLENGTHPTR = VARPTR(STRINGLENGTH)
    18.  
    19. POKE STRINGLENGTHPTR, PEEK(PT)
    20. POKE STRINGLENGTHPTR + 1, PEEK(PT + 1)
    21.  
    22. POKE STRINGPTRPTR, PEEK(PT + 2)
    23. POKE STRINGPTRPTR + 1, PEEK(PT + 3)
    24.  
    25. FOR I = STRINGPTR TO STRINGPTR + STRINGLENGTH - 1
    26.   PRINT CHR$(PEEK(I));
    27. NEXT
    28. PRINT
    29.  
    30. FOR I = 0 TO STRINGLENGTH \ 2
    31.   TEMP = PEEK(STRINGPTR + STRINGLENGTH - I - 1)
    32.   POKE STRINGPTR + STRINGLENGTH - I - 1, PEEK(STRINGPTR + I)
    33.   POKE STRINGPTR + I, TEMP
    34. NEXT I
    35. PRINT ST
    36. PRINT STRINGLENGTH

    Посчитал символы на экране - не врет, действительно 512.
    Ответить с цитированием  
     

  7. Пользователь сказал cпасибо:

    >Quiet Snow< (17.04.2016)

Информация о теме
Пользователи, просматривающие эту тему

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

Похожие темы

  1. Задача по QBasic
    от Петя в разделе QBasic
    Ответов: 5
    Последнее сообщение: 28.12.2014, 02:34
  2. Помогите пожалуйста "Задача в QBasic
    от RomanSamsonov в разделе QBasic
    Ответов: 29
    Последнее сообщение: 04.06.2014, 04:09
  3. Задача по QBasic
    от Sanet в разделе QBasic
    Ответов: 2
    Последнее сообщение: 16.01.2014, 19:18
  4. задача каши на QBasic
    от foxiroot в разделе QBasic
    Ответов: 0
    Последнее сообщение: 28.12.2011, 00:38
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •