Страница 1 из 1
Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
23.12.2021 10:30:44
nixnixnix
Задача: Найти все уникальные 3-символьные подстроки в строке
Написал программу в ПаскальABC - всё работает.
Преподаватель хочет на FreePascal.
На FreePascal IDE for Win32 1.0.12 программа отказывается работать. Ругается на неправильный тип во 2-ой строке.
Как поправить программу?
- Код: Выделить всё
Program Zadanie2;
type Mnoj=Set Of string[3];
var S: string;
i: integer;
Mn3: Mnoj;
begin
write('String: ');
readln(S);
for i:=1 to length(S)-2 do
Include(Mn3,S[i]+S[i+1]+S[i+2]);
i:=0;
writeln('Substring: ');
foreach S in Mn3 do
begin
Write(S,' ');
i:=i+1;
end;
writeln;
writeln('Sum=',i);
end.
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
23.12.2021 15:02:24
zub
Фрипаскаль не поддерживает множества на стрингах.
Кроме того, в фрипаскале utf8 по умолчанию, поэтому string[3] с русскими буквами дружить не будет (как собственно и utf16 из ПаскальABC не будет дружить с экзотическими кодировками)
Этот подход ты никак не исправишь, только переделывать на других структурах данных. замени множество на TDictionary или TMap или подобное, string[3] замени на просто string или unicodestring, для побуквенной индексации используй utf8 ориентированные варианты функций если будешь делать на string
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
23.12.2021 17:58:54
iskander
Что-то сомнительно насчёт utf8 по умолчанию в fp ide for win32.
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
23.12.2021 18:47:58
SSerge
zub писал(а):замени множество на TDictionary или TMap
Преподаватель скорее всего ждёт использования базовых конструкций языка, а не дополнительных объектных библиотек.
Так что придется имитировать поведение операций с множеством на обычном массиве строк.
Добавлено спустя 24 минуты:- Код: Выделить всё
rogram Zadanie2;
var Mnoj: string;
var S,S1: string;
i: integer;
begin
write('String: ');
readln(S);
Mnoj:='';
for i:=1 to length(S)-2 do
begin
s1:=copy(s,i,3);
writeln(s1);
if (pos(s1,mnoj)<=0) then mnoj+=s1+'|';
end;
i:=0;
writeln('Substring: ',Mnoj);
end.
для разнообразия ))
Добавлено спустя 2 минуты 8 секунд:да, работать будет только на буквах латинского алфавита и цифрах (скорее всего)
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
23.12.2021 20:18:23
zub
iskander
да, смутил номер версии как у лазаруса, подумал что лазарус и наврал))
незнаю как сейчас, раньше там было cp1251. "Проблемы" с utf8 похоже отпадают
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
26.12.2021 10:38:03
Снег Север
На самом деле, если пользоваться лазарем, а не древним FreePascal IDE, то никаких особых проблем с utf8 нет - у всех стандартных строковых функций есть utf8 эквиваленты.
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
26.12.2021 19:10:42
iskander
Очевидно, что проблема топикстартера вовсе не в кодировке строк, а в реализации встроенного типа SET OF TYPE. Емнип, последний известный мне стандарт(Extended Pascal) настаивал, что этот самый TYPE должен быть порядковым(Ordinal), и понятно, что строки порядковым типом не являются.
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
26.12.2021 19:32:16
Снег Север
Про Set Of string во фрипаскале придется забыть, разумеется, и делать на массиве. Или списке.
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
26.12.2021 20:13:42
iskander
Снег Север писал(а):Про Set Of string во фрипаскале придется забыть
И что бы это значило?
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
26.12.2021 20:24:36
SSerge
Снег Север писал(а):Про Set Of string во фрипаскале придется забыть, разумеется, и делать на массиве. Или списке.
В посте от 23.12 сделано без массива и списка. И работает.
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
26.12.2021 22:12:58
Снег Север
iskander писал(а):И что бы это значило?
То, что сеты в нём возможны только на перечислимых типах.
Re: Прошу помощи: Найти все уник 3-симв подстроки в строке
Добавлено:
27.12.2021 12:31:05
iskander
Насчёт перечислимых типов вы конечно погорячились, но многие языки обходятся совсем без встроенного типа SET, что им нисколько не мешает использовать множества как тип данных.