Страница 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, что им нисколько не мешает использовать множества как тип данных.