PDA

Просмотр полной версии : Перевод проги из Pascal в C++!


DesignerMix
28.05.2007, 13:28
Задача:

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

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

{
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.

freddi
28.05.2007, 13:30
в линуксе вроде есть проги который переводят из одного языка в другой, правдо криво)

DesignerMix
29.05.2007, 11:48
в линуксе вроде есть проги который переводят из одного языка в другой, правдо криво)

Я знаю, даже знаю эту прогу P2c называеться, но она настолько криво переводит, что я не могу разобраться, а как известно ошибки всегда труднее исправлять чем писать с нуля.

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

Joker-jar
29.05.2007, 11:55
Если кто-то взялся, отпишите. Чтоб впустую не делать

Joker-jar
29.05.2007, 13:46
Вообще то, что ты дал не работает. Если только так:
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.

VampiRUS
29.05.2007, 13:46
лол, у меня такой же курсач был, из одной книги берут)

Ky3bMu4
29.05.2007, 14:31
Юзай P2c , выкладывай код. Ошибки исправим.

DesignerMix
29.05.2007, 18:44
Вообще то, что ты дал не работает. Если только так:

Когда я компилил, всё работало: в файл выводилось число 3...

лол, у меня такой же курсач был, из одной книги берут)

;)

Юзай P2c , выкладывай код. Ошибки исправим.

Лады!!!

Joker-jar
29.05.2007, 23:12
Вот практически рабочий вариант:
#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;
}

Где-то с указателями бага (ошибка при освобождении), но ответ вроде правильный...

nerezus
30.05.2007, 02:03
# -*- 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
На питоне

nerezus
30.05.2007, 02:08
НА С++:

#include <Python.h>

int main(int argc, char *argv[]) {
Py_Initialize();
PyRun_SimpleString(тут строка с кодом нап питоне);
Py_Finalize();
return 0;
}

nerezus
30.05.2007, 02:09
Код питона в стоку на C++ генерировать так:
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()

DesignerMix
30.05.2007, 11:09
Joker-jar Чувак, ты меня просто спас. 427-164-887 ICQ давай мобилу или WebMoney как договаривались +).

DesignerMix
30.05.2007, 11:11
nerezus У преподов глаза на лоб полезут 8).

Joker-jar
31.05.2007, 19:19
Гы, получил премию. Все-таки иногда полезно несколько языков знать...