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/ |