Прошу помощи: Найти все уник 3-симв подстроки в строке

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
nixnixnix
незнакомец
Сообщения: 1
Зарегистрирован: 23.12.2021 09:17:26

Прошу помощи: Найти все уник 3-симв подстроки в строке

Сообщение 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.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Фрипаскаль не поддерживает множества на стрингах.
Кроме того, в фрипаскале utf8 по умолчанию, поэтому string[3] с русскими буквами дружить не будет (как собственно и utf16 из ПаскальABC не будет дружить с экзотическими кодировками)
Этот подход ты никак не исправишь, только переделывать на других структурах данных. замени множество на TDictionary или TMap или подобное, string[3] замени на просто string или unicodestring, для побуквенной индексации используй utf8 ориентированные варианты функций если будешь делать на string
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Что-то сомнительно насчёт utf8 по умолчанию в fp ide for win32.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение 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 секунд:
да, работать будет только на буквах латинского алфавита и цифрах (скорее всего)
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

iskander
да, смутил номер версии как у лазаруса, подумал что лазарус и наврал))

незнаю как сейчас, раньше там было cp1251. "Проблемы" с utf8 похоже отпадают
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

На самом деле, если пользоваться лазарем, а не древним FreePascal IDE, то никаких особых проблем с utf8 нет - у всех стандартных строковых функций есть utf8 эквиваленты.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Очевидно, что проблема топикстартера вовсе не в кодировке строк, а в реализации встроенного типа SET OF TYPE. Емнип, последний известный мне стандарт(Extended Pascal) настаивал, что этот самый TYPE должен быть порядковым(Ordinal), и понятно, что строки порядковым типом не являются.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Про Set Of string во фрипаскале придется забыть, разумеется, и делать на массиве. Или списке.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Снег Север писал(а):Про Set Of string во фрипаскале придется забыть

И что бы это значило?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Снег Север писал(а):Про Set Of string во фрипаскале придется забыть, разумеется, и делать на массиве. Или списке.

В посте от 23.12 сделано без массива и списка. И работает. :)
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

iskander писал(а):И что бы это значило?

То, что сеты в нём возможны только на перечислимых типах.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Насчёт перечислимых типов вы конечно погорячились, но многие языки обходятся совсем без встроенного типа SET, что им нисколько не мешает использовать множества как тип данных.
Ответить