OberonCore
https://forum.oberoncore.ru/

Как работать со строками в КП.
https://forum.oberoncore.ru/viewtopic.php?f=35&t=4648
Страница 1 из 1

Автор:  Jordan [ Пятница, 29 Ноябрь, 2013 19:09 ]
Заголовок сообщения:  Как работать со строками в КП.

В ББ нашёл модуль strings.odc но в нём отсутствуют функции копирования и объединения строк.

Есть ли в ББ стандартный способ по работе со строками?

И ещё вопрос почему в записи, нельзя объявить ARRAY OF CHAR? На форуме нашёл упоминание о таком LEN(S$), для чего знак $?

Автор:  ilovb [ Пятница, 29 Ноябрь, 2013 21:03 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

Стандартной либы для манипуляций со строками по большому счету нет. Все делается в основном руками.
Однако конкатенация строк вшита в язык "+".
$ подсказывает компилятору, что данный массив является строкой. (читай репорт)

Автор:  Иван Кузьмицкий [ Суббота, 30 Ноябрь, 2013 07:50 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

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

В каркасе BlackBox некоторые компоненты имеют абстракции для работы со строками, см. модули Strings или Dates, например. Есть также дополнительные средства.

Можно юзать TextModels.Model в качестве динамической строки, у меня некоторые компоненты построены как раз на этом.

Если чего-то не хватает лично вам, создаёте удобную абстракцию и используете.

Автор:  sadkouski [ Воскресенье, 18 Июнь, 2023 17:03 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

(*String7. Дана непустая строка. Вывести коды ее первого и последнего символа.*)
MODULE МоиПример;
IMPORT L := StdLog, In, Math;
PROCEDURE Делать*;
VAR n : INTEGER;
c : ARRAY 1024 OF CHAR;
BEGIN
c := "AelHUTнпгTB";
L.Int(ORD(c[0]));
L.Int(ORD(c[10]));(*считаем вручную номер последнего символа*)
L.Int(LEN(c$)); (* длинна строки *)
L.Int(ORD(c[LEN(c$)]));(* номер последнего символа с помощью процедуры НЕ СЧИТАЕТ*)
END Делать;
END МоиПример.
МоиПример.Делать

Автор:  arisu [ Воскресенье, 18 Июнь, 2023 18:23 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

off-by-one. массив начинается с нуля. соответственно, LEN(c$) — индекс символа, следующего за последним.

Автор:  sadkouski [ Воскресенье, 18 Июнь, 2023 22:36 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

arisu писал(а):
off-by-one. массив начинается с нуля. соответственно, LEN(c$) — индекс символа, следующего за последним.

L.Int(ORD(c[LEN(c$)-1])); Спасибо !

Автор:  arisu [ Воскресенье, 18 Июнь, 2023 22:47 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

не забудьте ещё, что если строка может быть пустой — то бишь, нулевой длины — на это надо отдельно проверять. страшного ничего не случится, просто трап, но зачем нам лишние трапы? ;-)

самая дешёвая проверка на пустую строку — это `IF s # '' THEN … END`. (там две одинарных кавычки, между ними ничего.) это действительно очень дёшево: компилятор распознаёт такой код, и специально этот случай оптимизирует.

Автор:  sadkouski [ Вторник, 20 Июнь, 2023 23:01 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

Спасибо за подсказку в будущее.Я ещё не дорос до понимания, но буду помнить.


[quote="Иван Кузьмицкий"]Хотелось бы уточнить - строк как таковых нет. Есть массивы, иногда интерпретируемые как цепочки литер (если есть $).
/quote]


Этим вариантом мне получается создать массив из символов
MODULE Cp10String8;
IMPORT L := StdLog, In;
PROCEDURE Do*;
VAR n, i : INTEGER;
s : ARRAY 10 OF CHAR;
c : CHAR;
BEGIN
L.Clear;
FOR i := 0 TO 4 DO
s[0] := '#'; s[1] := "g"; s[2] := 'j'; s[3] :='m'; s[4] := '@'; END;
FOR i := 0 TO 4 DO L.Char(s[i]); END;L.Ln;
END Do;
END Cp10String8.
Cp10String8.Do

Этим вариантом мне не получается создать массив из символов
MODULE Cp10String8;
IMPORT L := StdLog, In;

PROCEDURE Do*;
VAR i,n : INTEGER;
s : ARRAY 20 OF CHAR;
c : CHAR;
BEGIN
In.Open; In.Char(c); L.Clear;
FOR i := 0 TO 4 DO In.Char(s[i]); END;L.Ln;
FOR i := 0 TO 4 DO L.Char(s[i]);END;L.Ln;
END Do;
END Cp10String8.
Cp10String8.Do @ j y # w

Автор:  arisu [ Среда, 21 Июнь, 2023 08:22 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

sadkouski писал(а):
Спасибо за подсказку в будущее.Я ещё не дорос до понимания, но буду помнить.

я вот что имел в виду:
Код:
s := '';
ch := s[LEN(s$) - 1]; — упс

у пустой строки длина нулевая — там же нет символов. и получается `s[-1]`. вот на этм месте программа кончится с авариным остановом. поэтому случай «пустая строка» надо обрабатывать отдельно. и вообще первым делом после написания кода думать, как его можно поломать. ;-) это я как пример мышления скорее: у всякого кода желательно определять область применимости, и что-нибудь с этим делать. чем раньше привычка такая образуется — тем лучше. ;-)

Автор:  arisu [ Среда, 21 Июнь, 2023 08:32 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

sadkouski писал(а):
Этим вариантом мне не получается создать массив из символов
что значит «не получается»? вы когда описываете проблему, действуйте по примерно такому алгоритму: «я делаю вот это и это, ожидал получить вот такой вот результат, а получил вот такой.» потому что «не получается» — очень широкое понятие. чем меньше вы заставляете других догадываться — тем более точной и полезной будет помощь.

Автор:  sadkouski [ Среда, 21 Июнь, 2023 08:38 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

arisu писал(а):
sadkouski писал(а):
Спасибо за подсказку в будущее.Я ещё не дорос до понимания, но буду помнить.

я вот что имел в виду:
Код:
s := '';
ch := s[LEN(s$) - 1]; — упс

у пустой строки длина нулевая — там же нет символов. и получается `s[-1]`. вот на этм месте программа кончится с авариным остановом. поэтому случай «пустая строка» надо обрабатывать отдельно. и вообще первым делом после написания кода думать, как его можно поломать. ;-) это я как пример мышления скорее: у всякого кода желательно определять область применимости, и что-нибудь с этим делать. чем раньше привычка такая образуется — тем лучше. ;-)


Спасибо !
С массивом символов я нашёл такой выход.Надо увеличить итерацию с учётом пропусков . или во входном потоке писать символы без пропусков.Не знаю правильные ли это решения
Дополняю - на выходе получал массив меньшей длинны , нежели ожидал

Автор:  Artyemov [ Четверг, 22 Июнь, 2023 01:10 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

Цитата:
FOR i := 0 TO 4 DO
s[0] := '#'; s[1] := "g"; s[2] := 'j'; s[3] :='m'; s[4] := '@'; END;

Вы точно хотите 5 раз подряд одни и те же значения присваивать элементам массива с 0-го по 4-й?

Автор:  sadkouski [ Четверг, 22 Июнь, 2023 09:05 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

в РЖ выводит
#gjm@
что я и ожидал для этого варианта решения

Автор:  Artyemov [ Пятница, 23 Июнь, 2023 00:41 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

Т.е. просто без цикла пять присваиваний не подходят ;-)

Автор:  sadkouski [ Пятница, 23 Июнь, 2023 20:57 ]
Заголовок сообщения:  Re: Как работать со строками в КП.

Спасибо Вам за настойчивость ! Сообразил

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/