OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 15:41

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Как работать со строками в КП.
СообщениеДобавлено: Пятница, 29 Ноябрь, 2013 19:09 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
В ББ нашёл модуль strings.odc но в нём отсутствуют функции копирования и объединения строк.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Пятница, 29 Ноябрь, 2013 21:03 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Стандартной либы для манипуляций со строками по большому счету нет. Все делается в основном руками.
Однако конкатенация строк вшита в язык "+".
$ подсказывает компилятору, что данный массив является строкой. (читай репорт)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Суббота, 30 Ноябрь, 2013 07:50 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
В Компонентном Паскале есть конкатенация и лексикографическое сравнение строк. Читайте сообщение о языке. И вообще, прежде чем задавать подобные вопросы, сперва ищите ответы в документации, оно полезнее будет.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Воскресенье, 18 Июнь, 2023 17:03 
Аватара пользователя

Зарегистрирован: Понедельник, 20 Март, 2023 12:22
Сообщения: 22
(*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 МоиПример.
МоиПример.Делать


Последний раз редактировалось sadkouski Воскресенье, 18 Июнь, 2023 20:01, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Воскресенье, 18 Июнь, 2023 18:23 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1167
off-by-one. массив начинается с нуля. соответственно, LEN(c$) — индекс символа, следующего за последним.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Воскресенье, 18 Июнь, 2023 22:36 
Аватара пользователя

Зарегистрирован: Понедельник, 20 Март, 2023 12:22
Сообщения: 22
arisu писал(а):
off-by-one. массив начинается с нуля. соответственно, LEN(c$) — индекс символа, следующего за последним.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Воскресенье, 18 Июнь, 2023 22:47 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1167
не забудьте ещё, что если строка может быть пустой — то бишь, нулевой длины — на это надо отдельно проверять. страшного ничего не случится, просто трап, но зачем нам лишние трапы? ;-)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Вторник, 20 Июнь, 2023 23:01 
Аватара пользователя

Зарегистрирован: Понедельник, 20 Март, 2023 12:22
Сообщения: 22
Спасибо за подсказку в будущее.Я ещё не дорос до понимания, но буду помнить.


[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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Среда, 21 Июнь, 2023 08:22 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1167
sadkouski писал(а):
Спасибо за подсказку в будущее.Я ещё не дорос до понимания, но буду помнить.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Среда, 21 Июнь, 2023 08:32 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Среда, 21 Июнь, 2023 08:38 
Аватара пользователя

Зарегистрирован: Понедельник, 20 Март, 2023 12:22
Сообщения: 22
arisu писал(а):
sadkouski писал(а):
Спасибо за подсказку в будущее.Я ещё не дорос до понимания, но буду помнить.

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

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Четверг, 22 Июнь, 2023 01:10 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
Цитата:
FOR i := 0 TO 4 DO
s[0] := '#'; s[1] := "g"; s[2] := 'j'; s[3] :='m'; s[4] := '@'; END;

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Четверг, 22 Июнь, 2023 09:05 
Аватара пользователя

Зарегистрирован: Понедельник, 20 Март, 2023 12:22
Сообщения: 22
в РЖ выводит
#gjm@
что я и ожидал для этого варианта решения


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Пятница, 23 Июнь, 2023 00:41 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
Т.е. просто без цикла пять присваиваний не подходят ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работать со строками в КП.
СообщениеДобавлено: Пятница, 23 Июнь, 2023 20:57 
Аватара пользователя

Зарегистрирован: Понедельник, 20 Март, 2023 12:22
Сообщения: 22
Спасибо Вам за настойчивость ! Сообразил


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB