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

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

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

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

Сообщение nixnixnix » 23.12.2021 10:30:44

Задача: Найти все уникальные 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.
nixnixnix
незнакомец
 
Сообщения: 1
Зарегистрирован: 23.12.2021 10:17:26

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

Сообщение zub » 23.12.2021 15:02:24

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

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

Сообщение iskander » 23.12.2021 17:58:54

Что-то сомнительно насчёт utf8 по умолчанию в fp ide for win32.
iskander
постоялец
 
Сообщения: 462
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение SSerge » 23.12.2021 18:47:58

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 секунд:
да, работать будет только на буквах латинского алфавита и цифрах (скорее всего)
SSerge
энтузиаст
 
Сообщения: 935
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение zub » 23.12.2021 20:18:23

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

незнаю как сейчас, раньше там было cp1251. "Проблемы" с utf8 похоже отпадают
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Снег Север » 26.12.2021 10:38:03

На самом деле, если пользоваться лазарем, а не древним FreePascal IDE, то никаких особых проблем с utf8 нет - у всех стандартных строковых функций есть utf8 эквиваленты.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2844
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение iskander » 26.12.2021 19:10:42

Очевидно, что проблема топикстартера вовсе не в кодировке строк, а в реализации встроенного типа SET OF TYPE. Емнип, последний известный мне стандарт(Extended Pascal) настаивал, что этот самый TYPE должен быть порядковым(Ordinal), и понятно, что строки порядковым типом не являются.
iskander
постоялец
 
Сообщения: 462
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Снег Север » 26.12.2021 19:32:16

Про Set Of string во фрипаскале придется забыть, разумеется, и делать на массиве. Или списке.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2844
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение iskander » 26.12.2021 20:13:42

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

И что бы это значило?
iskander
постоялец
 
Сообщения: 462
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение SSerge » 26.12.2021 20:24:36

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

В посте от 23.12 сделано без массива и списка. И работает. :)
SSerge
энтузиаст
 
Сообщения: 935
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение Снег Север » 26.12.2021 22:12:58

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

То, что сеты в нём возможны только на перечислимых типах.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2844
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение iskander » 27.12.2021 12:31:05

Насчёт перечислимых типов вы конечно погорячились, но многие языки обходятся совсем без встроенного типа SET, что им нисколько не мешает использовать множества как тип данных.
iskander
постоялец
 
Сообщения: 462
Зарегистрирован: 08.01.2012 18:43:34


Вернуться в Обучение Free Pascal

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

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

Рейтинг@Mail.ru