Перевод проги из Pascal в C++!

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DesignerMix, 28 May 2007.

  1. DesignerMix

    DesignerMix Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    35
    Likes Received:
    11
    Reputations:
    5
    Задача:

    Прямоугольный садовый участок шириной N и длиной M метров разбит на квадраты со стороной 1 метр. На этом участке вскопаны грядки. Грядкой называется совокупность квадратов, удовлетворяющая таким условиям:
    • из любого квадрата этой грядки можно попасть в любой другой квадрат этой же грядки, последовательно переходя по грядке из квадрата в квадрат через их общую сторону;
    • никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам квадратов (касание грядок углами квадратов допускается).
    Подсчитайте количество грядок на садовом участке.
    Ограничения: 1 <= N, M <= 200, время 1 с.
    Ввод из файла beds.in. В первой строке находятся числа N и M через пробел, далее идут N строк по M символов. Символ # обозначает территорию грядки, точка соответствует незанятой территории. Других символов в исходном файле нет.
    Вывод в файл beds.out. Вывести одно число - количество грядок на садовом участке.
    Примеры
    Ввод 1
    5 10
    ##......#.
    .#..#...#.
    .###....#.
    ..##....#.
    ........#.
    Вывод 1
    3

    Код проги на Pascal:

    Code:
    {
    Written by Fyodor Menshikov 26.01.2004
    14:46-14:55
    }
    {$R+,Q+}
    var
       c:array[0..201,0..201]of char;
    type
       arr=array[1..40000]of byte;
    var
       first,last:word;
       ii,jj:^arr;
    
       procedure put(i,j:integer);
       begin
          if c[i,j]='#' then begin
             inc(last);
             ii^[last]:=i;
             jj^[last]:=j;
             c[i,j]:='.';
          end;
       end;
    
       procedure get(var i,j:integer);
       begin
          i:=ii^[first];
          j:=jj^[first];
          inc(first);
       end;
    
       procedure paint(i,j:integer);
       begin
          first:=1;
          last:=0;
          put(i,j);
          while first<=last do begin
             get(i,j);
             put(i+1,j);
             put(i-1,j);
             put(i,j+1);
             put(i,j-1);
          end;
       end;
    
    var
       n,m,i,j,count:integer;
    begin
       new(ii);
       new(jj);
       assign(input,'beds.in');
       reset(input);
       assign(output,'beds.out');
       rewrite(output);
       readln(n,m);
       for i:=0 to n+1 do
          for j:=0 to m+1 do
             c[i,j]:='.';
       for i:=1 to n do begin
          for j:=1 to m do
             read(c[i,j]);
          readln;
       end;
       count:=0;
       for i:=1 to n do
          for j:=1 to m do
             if c[i,j]='#' then begin
                paint(i,j);
                inc(count);
             end;
       writeln(count);
    end.
    Нужно просто перевести этот код в C++ (плачу 100 рублей), а если переведёте и объясните что зачем, коментами, то 200 рублей. Деньги буду через терминал кидать, так что либо на мобилу, либо на WebMoney.
     
  2. freddi

    freddi Elder - Старейшина

    Joined:
    5 Jul 2006
    Messages:
    399
    Likes Received:
    243
    Reputations:
    145
    в линуксе вроде есть проги который переводят из одного языка в другой, правдо криво)
     
  3. DesignerMix

    DesignerMix Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    35
    Likes Received:
    11
    Reputations:
    5
    Я знаю, даже знаю эту прогу P2c называеться, но она настолько криво переводит, что я не могу разобраться, а как известно ошибки всегда труднее исправлять чем писать с нуля.

    А вообще это задание по курсовому, и времени особо нет!! Ну помогите!
     
  4. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Если кто-то взялся, отпишите. Чтоб впустую не делать
     
  5. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Вообще то, что ты дал не работает. Если только так:
    Code:
    program p1;
    
    type
      arr=array[1..40000] of byte;
    
    var
      n,m,i,j,count:integer;
      c:array[0..201,0..201] of char;
      first,last:word;
      ii,jj:^arr;
      input,output: text;
    
    procedure put(i,j:integer);
       begin
          if c[i,j]='#' then begin
             inc(last);
             ii^[last]:=i;
             jj^[last]:=j;
             c[i,j]:='.';
          end;
       end;
    
       procedure get(var i,j:integer);
       begin
          i:=ii^[first];
          j:=jj^[first];
          inc(first);
       end;
    
       procedure paint(i,j:integer);
       begin
          first:=1;
          last:=0;
          put(i,j);
          while first<=last do begin
             get(i,j);
             put(i+1,j);
             put(i-1,j);
             put(i,j+1);
             put(i,j-1);
          end;
       end;
    
    begin
       new(ii);
       new(jj);
       assign(input,'c:\beds.in');
       assign(output,'c:\beds.out');
       reset(input);
       rewrite(output);
       readln(input,n,m);
       for i:=0 to n+1 do
          for j:=0 to m+1 do
             c[i,j]:='.';
       for i:=1 to n do begin
          for j:=1 to m do
             read(input,c[i,j]);
          readln(input);
       end;
       count:=0;
       for i:=1 to n do
          for j:=1 to m do
             if c[i,j]='#' then begin
                paint(i,j);
                inc(count);
             end;
       write(output,count);
       close(input);
       close(output);
    end.
     
  6. VampiRUS

    VampiRUS Elder - Старейшина

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    лол, у меня такой же курсач был, из одной книги берут)
     
  7. Ky3bMu4

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    Юзай P2c , выкладывай код. Ошибки исправим.
     
  8. DesignerMix

    DesignerMix Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    35
    Likes Received:
    11
    Reputations:
    5
    Когда я компилил, всё работало: в файл выводилось число 3...

    ;)

    Лады!!!
     
  9. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Вот практически рабочий вариант:
    Code:
    #include <fstream.h>
    
    char c[202][202];
    
    typedef arr, byte[40000];
    
    unsigned short first,last;
    
    int n,m,i,j,coun;
    
    arr *ii, *jj;
    
    void put(int i, int j)
    {
      if (c[i][j] == '#')
        {
          last++;
          ii[last] = i;
          jj[last] = j;
          c[i][j] = '.';
        }
    }
    
    void get(int *i, int *j)
    {
      *i = ii[first];
      *j = jj[first];
      first++;
    }
    
    void paint(int i, int j)
    {
      first = 1;
      last = 0;
      put(i,j);
      while (first<=last)
        {
          get(&i,&j);
          put(i+1,j);
          put(i-1,j);
          put(i,j+1);
          put(i,j-1);
        }
    }
    
    void main()
    {
      ii = new arr;
      jj = new arr;
      ifstream input("beds.in");
      ofstream output("beds.out");
      input >> n;
      input >> m;
      for (i = 0; i <= n+1; i++)
        for (j = 0; j <= m+1; j++)
          c[i][j] = '.';
      for (i = 1; i <= n; i++)
        {
          for (j = 1; j <= m; j++)
            input >> c[i][j];
        }
      coun = 0;
      for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
          if (c[i][j] == '#')
            {
              paint(i,j);
              coun++;
            }
    /*  delete[] ii;
      delete[] jj;  */
      output << coun;
    }
    
    Где-то с указателями бага (ошибка при освобождении), но ответ вроде правильный...
     
  10. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Code:
    # -*- coding: cp1251 -*-
    from UserString import MutableString
    
    lines = [
        "1100111110",
        "0011100010",
        "0010000111",
        "0010110010",
        "0010000010",
        "0011111110"
        ]
    
    lines.insert(0, MutableString("0"*len(lines[0])))
    lines.append(MutableString("0"*len(lines[0])))
    
    for i in range(len(lines)):
        lines[i] = MutableString("0" + lines[i] + "0")
        
    def convert1To2():
        done = False
        while not done:
            done = True
            for i in range(len(lines)):
                for j in range(len(lines[i])):
                    if lines[i][j] == '1' and \
                           (lines[i+1][j] == '2' or \
                            lines[i-1][j] == '2' or \
                            lines[i][j+1] == '2' or \
                            lines[i][j-1] == '2'):
                        lines[i][j] = '2'
                        done = False
    
    amount = 0
    
    for i in range(len(lines)):
        for j in range(len(lines[i])):
            if lines[i][j] == '1':
                lines[i][j] = '2'
                amount += 1
                convert1To2()
    
    print "Итого: ", amount
    
    На питоне
     
    #10 nerezus, 30 May 2007
    Last edited: 30 May 2007
  11. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    НА С++:

    Code:
    #include <Python.h>
    
    int main(int argc, char *argv[]) {
        Py_Initialize();
        PyRun_SimpleString(тут строка с кодом нап питоне);
        Py_Finalize();
        return 0;
    }
     
  12. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Код питона в стоку на C++ генерировать так:
    Code:
    s = ''
    for i in open('code.py').readlines():
        l = repr(i)[1:-1]
        l = l.replace('"', '\\"')
        s += ('"' + l + '"\n    ')
    	
    code = 'char code[] = %s;\n' % s
    fh = open('code.c', 'w')
    fh.write(code)
    fh.close()
     
  13. DesignerMix

    DesignerMix Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    35
    Likes Received:
    11
    Reputations:
    5
    Joker-jar Чувак, ты меня просто спас. 427-164-887 ICQ давай мобилу или WebMoney как договаривались +).
     
  14. DesignerMix

    DesignerMix Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    35
    Likes Received:
    11
    Reputations:
    5
    nerezus У преподов глаза на лоб полезут 8).
     
  15. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Гы, получил премию. Все-таки иногда полезно несколько языков знать...