Консультация № 151634
24.11.2008, 13:48
0.00 руб.
0 2 2
плиз, помогите перевести на С/С++!

Приложение:
Program Domino_trought_kombinations_with_comebacks;
uses crt;

Type Kostyashka= record {этот тип определяет костяшку, где a, b-числа на сторонах}
a,b:0..6;
end;

Domin_Arr=array[1..10] of Kostyashka; {этот тип определяет массив костяшек}

{Возвращает 0 если костяшку х нельзя подставить к z,
1-если можно без поворота х, 2-если с поворотом}
Function yes(z,x:Kostyashka):byte;
begin
if x.a=z.b then yes:=1 else
if x.b=z.b then yes:=2 else yes:=0;
end;

{выполняет поворот костяшки q}
Procedure reverse(var q:kostyashka);
var k:0..6;
begin
k:=q.a; q.a:=q.b; q.b:=k;
end;

{Раздел описания глобальных переменных:
b - исходный массив костяшек, rer - промежуточный, а result - массив хранения результата.
Busy - массив хранения индексов занятых в исходном массиве костяшек}
var n,i,max:byte;
b,rer,result:Domin_Arr;
busy:array[1..10] of boolean;

{Сердце программы процедура построения цепочки.
Параметры j-номер подставляемой костяшки,
K – номер вложения и элемента массива rer}
Procedure Built(j,k:byte);
var v:byte; {обязательно локальная переменная цикла}
begin
if keypressed then halt;
busy[j]:=true; {Добавляем в конец массива rer костяшку b[s] (rer - стек)}
rer[k]:=b[j]; {запоминаем ее номер в исходном массиве}
For v:=1 to n do {цикл перебора}
if not busy[v] then {если костяшка с номером v не занята}
if yes(rer[k],b[v])=1 then built(v,k+1) {если подходит, то подставляем ее в качестве следущей}
else
if yes(rer[k],b[v])=2 then
begin reverse(b[v]); built(v,k+1);end;
busy[j]:=false; {забываем}
if k>max then begin max:=k; result:=rer; end; {если цепочка максимальная относительно имеющейся}
end;

{основная программа}
begin
readln(n);
for i:=1 to n do
readln(b[i].a,b[i].b);
for i:=1 to n do
begin
built(i,1); {подставляем каждую костяшку в качестве первой и строим от нее цепочку}
reverse(b[i]);
built(i,1);
end;
For i:=1 to max do {вывод результата}
write(result[i].a:4,':',result[i].b);
readln;
end.

Обсуждение

Неизвестный
24.11.2008, 16:41
общий
это ответ
Здравствуйте, Neyaa!

Вот код написанный на языке С++. Переведен с паскаля дословно

Желаю успеха!

Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//этот тип определяет костяшку, где a, b-числа на сторонах
typedef struct Kostyashka {
int a;
int b;
};

//этот тип определяет массив костяшек
typedef Kostyashka Domin_Arr[11];

//Возвращает 0 если костяшку х нельзя подставить к z,
// 1-если можно без поворота х, 2-если с поворотом
unsigned char yes(Kostyashka z, Kostyashka x)
{
if( x.a == z.b )
return 1;
else
if( x.b == z.b ) return 2;
else
return 0;
}


//выполняет поворот костяшки q
void reverse(Kostyashka& q)
{
int k;
k = q.a;
q.a = q.b;
q.b = k;
}

//Раздел описания глобальных переменных:
//b - исходный массив костяшек, rer - промежуточный, а result - массив хранения результата.
//Busy - массив хранения индексов занятых в исходном массиве костяшек
static unsigned char n,i,max;
static Domin_Arr b,rer,result;
static bool busy[11];


//Сердце программы процедура построения цепочки.
//Параметры j-номер подставляемой костяшки,
// K – номер вложения и элемента массива rer}
void Built(unsigned char j, unsigned char k)
{
unsigned char v; //обязательно локальная переменная цикла}


// нет смысла это использовать
// if keypressed then halt;

busy[j] = true; //{Добавляем в конец массива rer костяшку b[s] (rer - стек)}
rer[k] = b[j]; //{запоминаем ее номер в исходном массиве}
for( v = 1; v <= n; ++v) //{цикл перебора}
{
if( ! busy[v] ) //{если костяшка с номером v не занята}
{
if( yes(rer[k],b[v]) == 1 )
Built(v,k+1); //{если подходит, то подставляем ее в качестве следущей}
else
if( yes(rer[k],b[v]) == 2 )
{
reverse(b[v]);
Built(v,k+1);
}
}
}
busy[j] = false; //{забываем}
if( k > max )
{
max = k;
memcpy(result,rer,sizeof(rer));
} //{если цепочка максимальная относительно имеющейся}
}

//{основная программа}
int main(void )
{
scanf("%d",&n);

for( i = 1; i <= n; ++i)
{
scanf("%d",&(b[i].a));
scanf("%d",&(b[i].b));
}

for( i = 1; i <= n; ++i)
{
Built(i,1); //{подставляем каждую костяшку в качестве первой и строим от нее цепочку}
reverse(b[i]);
Built(i,1);
}

for( i = 1; i <= max; ++i)
{
printf(" %d : %d ",result[i].a,result[i].b);
}

//{вывод результата}
}
Неизвестный
24.11.2008, 16:52
общий
это ответ
Здравствуйте, Neyaa!
Я перевела Вашу программу, она компилируется (в VS 2003, в другой среде может быть разница в хидерах (библиотеках в include)), саму работу программы не проверяла. Синтаксис С++ можете посмотреть сами, но уточню некоторые моменты.
[b]Цикл:[/b]
[i]Pascal:[/i] for i:=1 to n do begin тело_цикла end;
[i]C++:[/i] for (i=0; i<n; i++) {тело_цикла} - массивы в си по умолчанию нумеруются с 0
[b]Объявление типа:[/b]
[i]Pascal:[/i] type Domin_Arr=array[1..10] of Kostyashka;
[i]C++:[/i] typedef Domin_Arr Kostyashka [10];
[b]Подключение библиотек:[/b]
[i]Pascal:[/i] uses имя_библиотеки;
[i]C++:[/i] #include "имя_библиотеки.h" или #include <имя_библиотеки[.h]> (для стандартных библиотек)
[b]Описание функции (процедуры):[/b]
[i]Pascal:[/i] function Имя_функции (список_параметров): тип; или procedure Имя_процедуры (список_параметров);
[i]C++:[/i] тип Имя_функции (список_параметров) - аналог процедуры - функция типа void
[b]Возвращаемый параметр:[/b]
[i]Pascal:[/i] var имя: тип
[i]C++:[/i] тип &имя
[b]Функции реакции пользователя:[/b]
[i]Pascal:[/i] readkey, keypressed
[i]C++:[/i] getch(), kbhit() соответсвенно
[b]Функции ввода данных:[/b]
[i]Pascal:[/i] read[ln] -- write[ln]
[i]C++:[/i] cin, scanf -- cout, printf
В С++ [b]основная программа - функция[/b] с зарезервированным именем [b]main[/b], как правило, типа int, но может быть и void. Аналогом типа record можно считать тип struct.
Более подробно о синтаксисе читайте тут или здесь.
Удачи!


Приложение:
#include <conio.h>
#include <iostream>
using namespace std;

struct Kostyashka { //этот тип определяет костяшку, где a, b-числа на сторонах
int a;
int b;
};

typedef Kostyashka Domin_Arr [10]; //этот тип определяет массив костяшек

/*Раздел описания глобальных переменных:
b - исходный массив костяшек, rer - промежуточный, а result - массив хранения результата.
Busy - массив хранения индексов занятых в исходном массиве костяшек*/
int n, i, _max; //В си есть такая функция, поэтому _max
Domin_Arr b, rer, result;
bool busy [10];


/*Возвращает 0 если костяшку х нельзя подставить к z,
1-если можно без поворота х, 2-если с поворотом*/
int yes (Kostyashka z, Kostyashka x)
{
if (x.a==z.b) return 1;
else
if (x.b==z.b) return 2;
else return 0;
}

//выполняет поворот костяшки q
void reverse (Kostyashka &q)
{
int k;
k = q.a; q.a = q.b; q.b = k;
}


/*Сердце программы процедура построения цепочки.
Параметры j-номер подставляемой костяшки,
K – номер вложения и элемента массива rer*/
void built (int j, int k)
{
int v; //обязательно локальная переменная цикла
if (kbhit()) exit (1); //Аналог keypressed
busy[j] = true; //Добавляем в конец массива rer костяшку b[s] (rer - стек)
rer[k] = b[j]; //запоминаем ее номер в исходном массиве
for (v=0; v<n; v++) //цикл перебора
if (!busy[v]) //если костяшка с номером v не занята
if (yes(rer[k],b[v])==1) built(v,k+1); //если подходит, то подставляем ее в качестве следущей
else
if (yes(rer[k],b[v])==2) {
reverse(b[v]); built(v,k+1); }
busy[j]=false; //забываем
if (k>_max) {
_max=k;
for (i=0; i<n; i++)//если цепочка максимальная относительно имеющейся
result[i]=rer[i]; //нельзя просто так присваивать массив, надо поэлементно
}
}

//основная программа
int _tmain(int argc, _TCHAR* argv[])
{
cin >> n;
for (i=0; i<n; i++) {
cin >> b[i].a;
cin >> b[i].b;
}
for (i=0; i<n; i++) {
built(i,1); //подставляем каждую костяшку в качестве первой и строим от нее цепочку
reverse(b[i]);
built(i,1);
}
for (i=0; i<n; i++) //вывод результата
printf ("%4i:%i", result[i].a, result[i].b);
_getch ();
return 0;
}


Форма ответа