текст в паскале, палиндромы

Ответить
Volnyi
Сообщения: 10
Зарегистрирован: 16 апр 2009, 19:00

задача №3

Исходный текст вводится пользователем с экрана в виде одной или нескольких строк. На экране необходимо сохранить протокол работы: исходный и преобразованный текст. В исходном тексте выделить цветом заданные фрагменты (фразы - которые являются палиндромом). Определить, является ли строка текста палиндромом, т.е. читаемой в прямом и обратном направлении (например, строка «А роза упала на лапу Азора» - палиндром). При проверке строки убрать из нее все знаки препинания.

это наработка

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

program task03;
 uses WinCRT;
   var Str: string;
   function IsPalindrom(instr:string):boolean;
   const trash : set of char = [' ','.',',','!','?'];
   var left:string;
   i,Len:integer;
   ch:char;

   Pal:boolean;
   begin
   Pal := true;
   left:='';
   for i:=1 to Length(instr) do
   begin
   ch := instr[i];
   if ch in trash then else
      begin
      left:=left+Upcase(ch);
      end;
   end;
   Len := Length(left);
   for i:=Len downto 1 do
   begin
   if left[i]<>left[Len-i+1] then
      Pal := false;
   end;
  IsPalindrom := Pal;
  end;

  Begin
  write('Enter string:');read(Str);
  if IsPalindrom(Str) then
  writeln('Eto palindrom')
  else
  writeln('Eto fignya kakaya-to');
  End.
Вопрос 1-й как сделать чтобы прога понимала русский.
Мне посоветовали

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

function UpCaseRus(ch:char):char;
begin
case ch of
 'а':UpCaseRus:='A';
 'б':UpCaseRus:='Б';

...

'я':UpcaseRus:='Я';
end;
end;
Скажите плиз, в какое место кода это вставить.

Вопрос №2 - Нужно чтобы появлялся Конечный результат (то есть я вижу первоначальный текст, а ниже появляется результат) в цвете если палиндром (само предложение) или фраза "нет палиндромов".

Вопрос №3 Нужна возможность ввода 3 -4 или n-го кол-ва строк сразу. и чтобы прога обрабатывала эти строки отдельно (1, 2 ,3 строка... и т.д.).

:confused:
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

&quot писал(а):Вопрос №3....
Это не вопрос, а утверждение :) Придется считывать массив строк, до тех пор пока не будет введена пустая строка.

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

const MaxN=50;
var lines:array[1..MaxN+1] of string;
...
...
n:=0;
writeln('Введите текст. После последней строки повторно нажмите ENTER');
repeat
  inc(n);
  repeat 
    readln(A[n]);
  until (n>1) or (A[n]<>'');  {это чтобы гарантированно ввели хотя бы 1 строку}
until (A[n]='') or (n=MaxN);
dec(n); {dec, чтобы не обрабатывать последню пустую строку}
&quot писал(а):Вопрос 1-й как сделать чтобы прога понимала русский.
Имелось наверное в виду, чтобы была нечувствительна к регистру?
Уточните, какая верчия Pascal используется? Возможно можно воспользоваться стандартной функцией. Если нельзя, то упомянутый код придется вставить перед первым BEGIN-ом
Volnyi
Сообщения: 10
Зарегистрирован: 16 апр 2009, 19:00

Borland pascal for Windows ver. 7.0
Пишу к примеру: Кабак и кабак - результат не палиндром (то бишь не понимает рашин стайл)
Пишу: kabak i kabak - пишет это палиндром.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

В предыдущем посте у меня ошибка: объявил масси lines а использую A.

А еще уточните Вам нужен "жадный" алгоритм или нет?
Например, "kabak i kabak" - это должно быть два палиндрома или один большой?
Volnyi
Сообщения: 10
Зарегистрирован: 16 апр 2009, 19:00

начал понимать кабак и кабак О_о

Но стоило написать: "А роза упала на лапу Азора" - пишет не палиндром

И что добавить нужно, чтобы результат палиндром или нет - для каждой строки выводился?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

n надо объявить в Var
n:integer;

Спрошу по-другому. Если введено несколько строк, то надо проверять на палиндромность просто каждую строку, или надо искать наличие палиндромов внутри каждой строки?
Например так:
вульгарный пример: в окне жопа - Сапоженков
А тут нет палиндромов
электрификация яицакифирткелэ
А вот еще: Лом о смокинги гни, комсомол! Это из советского периода
А тут их два: один нидо а потом другой йогурд
Volnyi
Сообщения: 10
Зарегистрирован: 16 апр 2009, 19:00

В задании написано - определить является ли 'строка текста'... значит пишем например 4 строки. и определяем палиндромна ли СТРОКА.

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

    program task03;
  uses WinCRT;

  const MaxN=50;
  var
  n:integer;
  A:array[1..MaxN+1] of string;
   function IsPalindrom(instr:string):boolean;
   const trash : set of char = [' ','.',',','!','?'];
   var left:string;
   i,Len:integer;
   ch:char;

   Pal:boolean;
   begin
   Pal := true;
   left:='';
   for i:=1 to Length(instr) do
   begin
   ch := instr[i];
   if ch in trash then else
      begin
      left:=left+Upcase(ch);
      end;
   end;
   Len := Length(left);
   for i:=Len downto 1 do
   begin
   if left[i]<>left[Len-i+1] then
      Pal := false;
   end;
  IsPalindrom := Pal;
  end;

  Begin
   n:=0;
writeln('Введите текст. После последней строки повторно нажмите ENTER');
repeat
inc(n);
repeat
readln(A[n]);
until (n>1) or (A[n]<>'');
until (A[n]='') or (n=MaxN);
dec(n);

  if IsPalindrom(A[n])
  then
  writeln('Это палиндром');
  else
  writeln('Это не палиндром');

  End.
Вот что вышло. 1. не обрабатывает Фразы - палиндромы 2. Выводит результат только для последней из фраз. - надо чтобы для каждой.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Ну тогда это просто...

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

program task03;
  uses WinCRT;

const MaxN=50;
  var
  i,n:integer;
  A:array[1..MaxN+1] of string;

function UpCase(ch:char):char;
  const ru:array['а'..'я'] of char='АБВГДЕЖЗИИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
begin
  case ch of
    'а'..'я': UpCase:=ru[ch];
    'ё': UpCase:='Е';
    'Й': UpCase:='И';
    'Ё': UpCase:='Е';
    else UpCase:=System.UpCase(ch);
  end;
end;

function IsPalindrom(instr:string):boolean;
const goodch: set of char = ['А'..'Я','Ё','A'..'Z'];
var
  l,r:integer;
  cl,cr:char;
begin
  l:=0; r:=length(instr)+1;
  repeat
    inc(l); dec(r);
    while (not (UpCase(instr[l]) in goodch)) and (l<r) do inc(l);
    while (not (UpCase(instr[r]) in goodch)) and (l<r) do dec(r);
    cl:=UpCase(instr[l]);
    cr:=UpCase(instr[r]);
    {writeln(l,instr[l],cl,' ',r,instr[r],cr);} {контроль сравнений}
  until (r-l<=1) or (cl<>cr);
  IsPalindrom:=(cl=cr) and ((r=l) or ((cl in goodch) and (cr in goodch)));
end;

Begin
  n:=0;
  writeln('Введите текст. После последней строки повторно нажмите ENTER');
  repeat
    inc(n);
    repeat
      readln(A[n]);
    until (n>1) or (A[n]<>'');
  until (A[n]='') or (n=MaxN);
  dec(n);

  for i:=1 to N do begin
    if IsPalindrom(A[i]) then writeln(A[i],' - Это палиндром') else writeln(A[i],' - Это не палиндром');
  end;
End.
А вот на счет цвета надо думать....
В WinCRT нету ни SetColor, ни SetBkColor, ни TextAttr.
Консольное приложение Вы можете скомпилировать с библиотекой Crt вместо WinCrt?
Volnyi
Сообщения: 10
Зарегистрирован: 16 апр 2009, 19:00

Внимательнее почитал задание.
Исходный текст вводится пользователем с экрана в виде одной или нескольких строк. На экране необходимо сохранить протокол работы: исходный и преобразованный текст. В исходном тексте выделить цветом заданные фрагменты
Это написано в начале перед задачками (общее условие для всех задач по тексту). :rolleyes:
Если сейчас программа выводит строки и показывает какая палиндром а какая нет, думаю без цвета можно обойтись.... :)

Огромное спасибо за помощь! Без вас мало что получилось бы )
Ответить