1

Тема: Переклад з Pascal на С++

Усім доброго часу доби!
Попросили перевести з Паскалю на C++ наступну програму(вона має дописувати мінімальну к-сть символів в кінець стрічки аби та стала паліндромом, якщо це потрібно) :

var s:array[1..2000] of char;
    tn,i,j,n:integer;
    chetn,flag:boolean;
begin
i:=0;
flag := false;
writeln('Введите строку');
repeat
i:=i+1;
read(s[i]);
until s[i]=#13;       
n:=i-1;
for i:=n div 2 + 1 to n do    
  begin
  for j:=1 to n-i do
    if s[i+j]<>s[i-j] then break;
  if (i=n-1) and (s[i+j]<>s[i-j]) then
    begin
    flag := true;
    break;
    end;
  if (j=n-i) and (s[i+j]=s[i-j]) then break;
  end;
if(flag=true)then
begin 
i:=n;
flag:=false;
end;
tn:=i;
for i:=(n+1) div 2 + 1 to n do       
  begin
  for j:=1 to n-i+1 do
    if s[i-j]<>s[i+j-1] then break;
  if (i=n) and (s[i-j]<>s[i+j-1]) then
    begin
    flag:=true;
    break;
    end;
  if (j=n-i+1) and (s[i-j]=s[i+j-1]) then break;   
  end;
  if(flag=true)then i:=n+1;
if 2*i-n-2<2*tn-n-1 then                    
  begin
  chetn:=true;
  tn:=i
  end else chetn:=false;
if chetn=false then                          
  begin
  writeln(2*tn-n-1);
  for i:=1 to 2*tn-n-1 do
    s[n+i]:=s[2*tn-n-i];
  n:=2*tn-1;
  end;
if chetn=true then
  begin
  writeln(2*tn-n-2);
  for i:=1 to 2*tn-n-2 do
    s[n+i]:=s[2*tn-n-1-i];
  n:=2*tn-2;
  end;
for i:=1 to n do write(s[i]);
writeln;
readln;
end.

Доречі Паскальний код працює чудово!) Можливо, комусь пригодиться.
Мій варіант перекладу наступний:

#include <iostream>
#include <string> 

using namespace std;



int main()
{
    string str; 
    bool flag; 

    cout << "Enter string : ";
    cin >> str;

    int length = str.length(); 
    int i, j, tn;

    
    for (i = (length-1) / 2 + 1; i < length; i++)
    {
        for (j = 0; j < length - i-1; j++)
        {
            if (str[i + j-1] != str[i - j-1])
                break;
        }
        if (i == length - 2 && (str[i + j-1] != str[i - j-1]))
        {
            i = length-1;
            break;
        }
        if (j == length - i-1 && (str[i + j-1] == str[i - j-1]))
            break;
    }
    tn = i;

    for (i = (length) / 2 + 1; i < length; i++)
    {
        for (j = 0; j < length - i-1; j++)
            if (str[i - j - 1] != str[i + j - 2])
                break;

        if (i == length && (str[i - j-1] != str[i + j - 2]))
        {
            i = length;
            break;
        }
        if (j == length - i + 1 && (str[i + j-1] == str[i - j-2]))
            break;
    }

    
    if ((2 * i - length -2) < (2 * tn - length-1))
    {
        flag = true;
        tn = i;
    }
    else flag = false;

    
    if (flag == false)
    {
        for (i = 0; i < 2 * tn - length; i++)
            str.push_back(str[2 * tn - length - i-1]);            
    }
    
    if (flag == true)
    {
        for (i = 0; i < 2 * tn - length - 1; i++)
            str.push_back(str[2 * tn - length - i- 2]);
    }
    
    cout << "Result : " << str << endl;

    return 0;
}

Так от, мій код(той що на C++) не працює належним чином.
Мабуть, я десь помилився в індексації або що.
Шукаю помилку сам вже десь 4ту годину і голова пухне, бо не розумію де проблема.

Можливо хтось щось помітить - буду дуже вдячний за допомогу.

2

Re: Переклад з Pascal на С++

Код з невірними індексами закоментовано. В деяких випадках паліндром будується неоптимально, хоча не факт що в коді паскаля він оптимально будується, ліньки розбиратись.

#include <iostream>
#include <string> 
         
using namespace std;
int main()
{
  string str;
  bool flag;

  cout << "Enter string : ";
  cin >> str;

  size_t length = str.length();
  size_t i, j, tn;

//for (i = (length-1) / 2 + 1; i < length; i++)
  for (i = (length-1) / 2; i < length; i++)
  {
      for (j = 0; j < length - i-1; j++)
      {
          if (str[i + j-1] != str[i - j-1])
              break;
      }
      if (i == length - 2 && (str[i + j-1] != str[i - j-1]))
      {
          i = length-1;
          break;
      }
      if (j == length - i-1 && (str[i + j-1] == str[i - j-1]))
          break;
  }
  tn = i;

  for (i = (length) / 2 + 1; i < length; i++)
  {
      for (j = 0; j < length - i-1; j++)
          if (str[i - j - 1] != str[i + j - 2])
              break;

      if (i == length && (str[i - j-1] != str[i + j - 2]))
      {
          i = length;
          break;
      }
      if (j == length - i + 1 && (str[i + j-1] == str[i - j-2]))
          break;
  }


  if ((2 * i - length -2) < (2 * tn - length-1))
  {
      flag = true;
      tn = i;
  }
  else flag = false;


  if (flag == false)
  {
//    for (i = 0; i < 2 * tn - length; i++)
      for (i = 0; i < 2 * tn - length + 1; i++)
//        str.push_back(str[2 * tn - length - i-1]);
          str.push_back(str[2 * tn - length - i]);
  }

  if (flag == true)
  {
      for (i = 0; i < 2 * tn - length - 1; i++)
          str.push_back(str[2 * tn - length - i- 2]);
  }

  cout << "Result : " << str << endl;

  return 0;
}
Подякували: #Sparta1

3

Re: Переклад з Pascal на С++

Нащо себе мучити?
http://www.garret.ru/pascal.html

Подякували: #Sparta, leofun01, ostap34PHP3

4

Re: Переклад з Pascal на С++

Наразі дякую, панове, дійду до ПК спробую ;)

5

Re: Переклад з Pascal на С++

А найголовніше - а нащо воно взагалі потрібно, перекладати? Напишіть новий код, він майже гарантовано буде оптимальнішим за це імперативне жахіття.
Ну і не знаю вже вкотре пишу: не пишіть "не працює", "видає помилку", "працює неналежним чином". Описуйте конкретно, що у вас відбувається: якщо помилка - яка саме, в якому рядку. Якщо виводить щось не те - пишіть конкретно, що саме ви вводили і що виводить, а що ви очікували. Звісно, іншим людям зовсім не важко повторити ваші дії і отримати певний результат, але:
- результат може залежати від конкретного компілятора і налаштувань комп'ютера, і тоді поради інших людей не допоможуть вам;
- результат може бути коректним, але ви чомусь неправильно його зрозуміли;
- проблема може виникати із досить специфічним вводом, який ви знайшли, а інші можуть так просто і не знайти;
- зрештою, якщо вам ліньки розписувати, що саме у вас відбулося - чому іншим людям не буде ліньки повторювати те, що ви вже зробили, але лінькуєтеся розписати для них, а тим більше відповідати вам?

Подякували: #Sparta1