Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [pascal] слово перевертышь


Автор: xF1x 13.5.2008, 21:43
Всем доброго времени суток! ПОМОГИТЕ решить школьную задачу! ТОЛЬКО ЧТО начали изучать строковый тип и символьный! и только что начали изучать операторы сложения, сравнения копирования,длину строки,удаление,замена,подстрока,числа и строки! вообщем это у нас новая тема! Прошу как можно проще! вот такая задача! Проверить, является ли введеное слово полиндромом(перевертышем) например казак как ни читай оно и будет казак, или шалаш вообщем это слова перевертыши! ЗА РАНЕЕ БЛАГОДАРЕН!

Автор: THandle 13.5.2008, 22:28
http://forum.vingrad.ru/faq/topic-202745.html

Добавлено через 26 секунд
Совсем чуть чуть переделать под Паскаль там...

Автор: xF1x 13.5.2008, 22:30
Что то там вообще не понятно! нельзя ли сделать попроще и в одном коде а не в нескольких собирать!

Автор: neic 13.5.2008, 23:38
xF1x
Чего не понятного-то?

Код

Program polinom;
uses crt;
var text: string;

function IsPalindrome(s : string) : boolean;
var
    i, j : integer;
begin
  i := 1;
  j := length(s);
    ispalindrome := false;
    repeat
        if s[i] <> s[j] then exit;
        i:=i+1;
        j:=j-1;
    until i > j;
    ispalindrome := true;
end;

begin
write('Vvedite text');
read(text);

    if IsPalindrome(text) then
        write('True')
    else
        write('False');
readkey
end.

Автор: xF1x 14.5.2008, 09:14
В не можешь пояснить следующие строчки а то я вроде такого еще не изучал!
function IsPalindrome
ispalindrome := false;
    repeat

Автор: Rodman 14.5.2008, 10:08
function IsPalindrome - объявление функции IsPalindrome
ispalindrome := false; - фукция возвращает значение через свое имя... т.е. мы присваеваем имени функции значение, а уже функция его далее пепередает
repeat  - цикл с постусловием... удобен если хотябы раз необходимо в цикл зайти!

Автор: THandle 14.5.2008, 10:25
Код

program polindrome;

function IsPalindrome(const s : string) : boolean;
var
  i, j : integer;
begin
  i := 1;
  j := length(s);
  IsPalindrome := false;
  repeat
    if s[i] <> s[j] then
      exit;
    inc(i);
    dec(j)
    until i > j;
  IsPalindrome := true;
end;

var
  s : string;
begin
  write('Enter string: ');
  readln(s);
  if IsPalindrome(s) then
    writeln('Word ' + s + ' - palindrome')
  else
    writeln('Word ' + s + ' - not palindrome');
  readln;
end.



Поясняю:


Код

function IsPalindrome(const s : string) : boolean;


Функция которая будет проверять является ли слово полиндромом или нет.

Теперь, что происходит внутри этой функции:

Код

  i := 1;
  j := length(s);


Присваиваем переменной i единицу, а переменной j - длину переданной в функцию строки.

Код

  IsPalindrome := false;


Присваиваем результату функции false, то есть слово палиндромом не является.

Теперь запускаем цикл:

Код

  repeat
    if s[i] <> s[j] then
      exit;
    inc(i);
    dec(j)
  until i > j;


Идем в нем от начала строки до середины и от конца строки тоже до середины.

Например, возьмем слово топот, которое является палиндромом.
В самом начале переменные i, j равны единице и пяти соответственно.


Теперь смотрим что происходит во время цикла:

1. сравниваются буквы топот.
Они одинаковы поэтому мы не выходим из функции возвращая результат о том, что слово не палиндром, а идем дальше:
i = 1.
j = 5.


2. На этом шаге сикла проверяем буквы: топот.
Они тоже равны. Идем дальше.
i = 2.
j = 4.


3. На этом шаге сравниваем букву топот  ней же самой. Идем дальше.
i = 3.
j = 3.


4. Условием выхода из цикла является:
Код

until i > j;


Посмотрим же чему у нас равны переменные i и j:
i = 4.
j = 2.

Все. Цикл завершен, слово палиндром.
Спокойно присваиваем результату значение true:

Код


IsPalindrome := true;


Если бы в функцию поступило слово, в котором какието противоположные буквы не равны, то мы просто вышли бы из цикла и строчка

Код


IsPalindrome := true;


просто не выполнилась бы, а значит функция вернула бы false что соответствует слову-непалиндрому.

Автор: xF1x 14.5.2008, 10:25
Слушай! а нельзя никак по другому сделать? мы счетчик делали i:=i+1 просто мы такого еще не изучали, попроще нельзя?

Автор: THandle 14.5.2008, 10:33
Возьмем например слово  папа, которое палиндромом не является:

1. перед выполнением цикла переменным i, j присваиваются следующие значения:
i = 1.
j = 4.

2. Запускаем цикл, сравниваем буквы: папа.
Они не равны, выходим из функции.
Результат выполнения функции - false.



Далее следует стандартная паскалевская программка, с вводом строки smile

Код

var
  s : string;
begin
  write('Enter string: ');
  readln(s);
  if IsPalindrome(s) then
    writeln('Word ' + s + ' - palindrome')
  else
    writeln('Word ' + s + ' - not palindrome');
  readln;
end.



Ну давай уж все объясню, раз начал smile

Код


var
  s : string;


Объявляем переменную s, в которую и будем вводить слово которое будем проверять на палиндромность.
Код


  write('Enter string: ');
  readln(s);


Вводим слово с клавиатуры.

Код

  if IsPalindrome(s) then
    writeln('Word ' + s + ' - palindrome')


Если слово - палиндром то пишем это, иначе сообщаем об обратном:

Код

  else
    writeln('Word ' + s + ' - not palindrome');


И последнее:

Код


readln;


Ждем ввода чего-то с клавиатуры и нажатия клавиши Enter.
Выходим из программы.

Добавлено через 1 минуту и 38 секунд
xF1x, что конкретно не изучали? какие строки не понятны?

Можно и по-другому сделать, но это самый хороший вариант, по моему. Да и самый понятный должен быть.

Автор: ama_kid 14.5.2008, 10:36
Цитата(xF1x @  14.5.2008,  10:25 Найти цитируемый пост)
попроще нельзя? 
можно примерно так:
Код
function IsPalindrome(const s:string):boolean;
var
 i:integer;
 n:integer;
begin
 IsPalindrome:=true;
 n:=Length(s);
 for i:=1 to (n div 2) do
  if s[i] <> s[n-i+1] then
   begin
    IsPalindrome:=false;
    exit;
   end;
end;

Автор: xF1x 14.5.2008, 10:41
Не понятно что такое  + s + ? а паскаль разве уже знает что IsPalindrome это палиндром!? ты же не задавал его в переменных

Автор: THandle 14.5.2008, 10:43
ama_kid, лично я считаю этот вариант более непонятным smile 

Что такое div? Может человек тоже не знает, если не знает циклов repeat.

Код

s[n-i+1]


Что это за "подозрительные" вычисления, которые куда сложнее прокрутить в голове нежели мой вариант.

В общем у всех вариантов конечно своих недостатков хватает. smile

Добавлено через 1 минуту и 13 секунд
Цитата(xF1x @  14.5.2008,  11:41 Найти цитируемый пост)
Не понятно что такое  + s + ? а паскаль разве уже знает что IsPalindrome это палиндром!? ты же не задавал его в переменных 

Это результат выполненения функции.

Автор: xF1x 14.5.2008, 10:51
Вообщем объясняю! мы делали через цикл.потом  через if then.ничего не делили и слово function  у нас не было, repeat тоже не было ,был цикл i:=i+1! нельзя сделать с использованием этой информации?

Автор: THandle 14.5.2008, 11:01
Код

program Project1;

var
  s : string;
  i : integer;
  b : boolean;
begin
  write('Enter string: ');
  readln(s);
  b := true;
  for i := 0 to length(s) do
    if s[i + 1] <> s[length(s) - i] then
      begin
        b := false;
        Break;
      end;
  if b then
    writeln('Word ' + s + ' - palindrome')
  else
    writeln('Word ' + s + ' - not palindrome');
  readln;
end.


Добавлено через 34 секунды
Так пойдет?

Автор: xF1x 14.5.2008, 11:05
вот так как надо!!а что такое break?

Автор: THandle 14.5.2008, 11:07
Цитата(xF1x @  14.5.2008,  12:05 Найти цитируемый пост)
вот так как надо!!а что такое break? 

Моментальный выход  из цикла, чтобы лишний раз дальше не гнать.

Можно и так сделать:

Код

program Project1;

var
  s : string;
  i : integer;
  b : boolean;
begin
  write('Enter string: ');
  readln(s);
  b := true;
  for i := 0 to length(s) do
    if s[i + 1] <> s[length(s) - i] then
      b := false;
  if b then
    writeln('Word ' + s + ' - palindrome')
  else
    writeln('Word ' + s + ' - not palindrome');
  readln;
end.


Но так программа будет дольше работать smile 

Автор: ama_kid 14.5.2008, 11:13
Цитата(THandle @  14.5.2008,  11:07 Найти цитируемый пост)
Можно и так сделать:
Рекомендую только проверить, что будет с программой при i=length(s)...

Автор: THandle 14.5.2008, 11:17
Цитата(ama_kid @  14.5.2008,  12:13 Найти цитируемый пост)
Рекомендую проверить, что будет с программой при i=length(s)...

Да, согласен, ошибочка будет. smile  Упустил. В таком случае надо просто добавить проверку на длину строки равную нулю...

Автор: ama_kid 14.5.2008, 11:19
Цитата(THandle @  14.5.2008,  11:17 Найти цитируемый пост)
В таком случае надо просто добавить проверку на длину строки равную нулю... 
нет, надо просто цикл пустить не с нуля, а с 1, ибо нулевой символ строки хранит информацию о длине и его вообще не стоит трогать...
Код
  for i := 1 to length(s) do
    if s[i] <> s[length(s) - i+1] then
      b := false;


Автор: THandle 14.5.2008, 11:24
Цитата(ama_kid @  14.5.2008,  12:19 Найти цитируемый пост)
нет, надо просто цикл пустить не с нуля, а с 1, ибо нулевой символ строки хранит информацию о длине и его вообще не стоит трогать...


Насчет этого в курсе.

Ну пусть финальный вариант будет таким:

Код

program Project1;

var
  s : string;
  i : integer;
  b : boolean;
begin
  write('Enter string: ');
  readln(s);
  b := true;
  for i := 1 to length(s) do
    if s[i] <> s[length(s) - i+1] then
      b := false;
  if b then
    writeln('Word ' + s + ' - palindrome')
  else
    writeln('Word ' + s + ' - not palindrome');
  readln;
end.


 smile 

Автор: xF1x 14.5.2008, 19:41
Спасибо огромное! ВСЕ ПОНЯТНО! НЕ пойму я что такое +  s  + никак подругому нельзя? а то ваще не пойму что это!

Автор: THandle 14.5.2008, 20:12
xF1x, это мы выводим какой то текст, в нашем случае "word", после него введенный с клавиатуры текст, а далее текст о том является ли слово палиндромом или нет. Это просто информация.

Автор: xF1x 14.5.2008, 20:18
все понятно, значит и без него! можно! ПАРНИ СПАСИБО ОГРОМНОЕ ВЫРУЧИЛИ!

Автор: THandle 14.5.2008, 20:26
xF1x, пометь тему как решенную smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)