Программа не выводит ответа

Вопросы программирования и использования среды Lazarus.

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

Ответить
Nicmas
незнакомец
Сообщения: 1
Зарегистрирован: 20.02.2022 20:52:19

Программа не выводит ответа

Сообщение Nicmas »

Здравствуйте, задание такое: Найти в предложении все слова, которые являются палиндромами и вывести их, вот код:

Код: Выделить всё

procedure TFmMain.BtPoiskClick(Sender: TObject);
var
  s, t: string;
  i, p: integer;
begin
  LbExp.Caption := '';
  S := EdMean.Text;
  s += ' ';
  repeat
    p := pos(' ', s);
    i := (p - 1) div 2;
    while (i > 0) and (s[i] = s[p-i]) do dec(i);
    if (i = 0) and (p > 1) then t += copy(s, 1, p);
    delete(s, 1, p)
  until p = 0;
  if length(t) > 0 then LbExp.Caption := t
  else ShowMessage('Палиндромы не найдены')
end;
 
end.

программа кампилируется, но при вводе шалаш, казак ответа нет, хотя с цифрами работатет
RRYTY
постоялец
Сообщения: 267
Зарегистрирован: 25.12.2021 09:00:32

Сообщение RRYTY »

Если вводить палиндромы латиницей, то тоже работает.
Намек: с национальными наборами символов нужно работать по-другому. Сравните, например, длину строки "kazak" и "казак".
Последний раз редактировалось RRYTY 22.02.2022 06:58:58, всего редактировалось 1 раз.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

если не играться с настройками тип string имеет кодировку utf8 -> кириллица в нем "суррогатная", буква занимает больше 1 cudeunit`а
простое решение:

Код: Выделить всё

s, t: string;

замени на

Код: Выделить всё

s, t: unicodestring;

unicodestring - utf16, кориллическая буква занимает 1 cudeunit, проблема уйдет на экзотические символы, для лабв хватит
Seenkao
энтузиаст
Сообщения: 578
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

zub, проблем с Length не будет?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

С кириллицей нет. с какимнибудь древне шумерским (или что там есть суррогатное в utf16) будут
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

Странные вы люди. Советуете более сложный способ решения. Я бы посоветовал использовать UTF8Pos, UTF8Lengh и другие UTF8xxxxxxx функции из модуля LazUTF8
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

zoltanleo
насколько данный код станет проще))?
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

zub
Он будет решен в контексте текущей задачи с учётом текущей кодировки без мутных рассуждений о кодовых единицах и суррогатных парах
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Рассуждения не мутные. Адаптация в лоб фрагмента под UTF8* принесет много накладных расходов из-за постоянных прогонов по codepoint`ам, вместо прямой адресации. UTF8* надо делать по другом. имхо.

но дело житейское))
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

zub
Андрюх, чел лабу делает. Оккама плачет ;)
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Зря копья ломаете, чел лабу давно сделал.
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

iskander
Во, народ тоже за стандартные методы :)
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Честно говоря, мне попадался гораздо более забавный вариант решения подобной задачи.
Ответить