Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Проверьте перевод (http://forum.oszone.net/showthread.php?t=205940)

BrdNLSrg 01-05-2011 14:55 1668450

Проверьте перевод
 
Пожалуйста проверти перевод и исправте мои ошибки, превожу программу с Паскаля на Си.

Код:

Program alg_greedy;
Uses Crt{*, Graph*};
Type Graph  = Array[1..100,1..100] Of Integer;
    List  = Array[1..100] Of Integer;
Const Bukwy : Array[1..16] Of String = ('AA','AB','AC','AD','BB','BA','BC','BD','CC','CA','CB','CD','','','','');
Var  g      : Graph;    {matriza Grapha}
    newclr : List;    {mnogestvo zakrashenyx vershin Grapha}
    ver_g  : List;    {mnogestvo vershin Grapha}
    n, temp: Integer;  {kolichestvo vershin Grapha}
    i, j, k: Integer;
    otvet  : Integer;
    flag  : Boolean;
{**********************************************}
Procedure greedy(Var ver_g:List; Var newclr:List);
Label 1;
Var found:Boolean;
    v, w :Integer;      {v - vershiny ver_g, w - versiny newclr}
    ch_v, ch_w:Integer; {chetchik v, chetchik w}
begin
  for i:=1 to n do
    newclr[i]:=0;
  ch_v:=1;
  v:=ver_g[ch_v];
  while (v<>0) do
    begin
      found:=false;
      ch_w:=1;
      w:=newclr[ch_w];
      while(w<>0) do
        begin
          if (g[v,w] = 1) then
            begin
              found:=true;
              ch_w := n;
            end;
          ch_w:=ch_w+1;
          w:=newclr[ch_w];
        end;
      if (found = false) then
        for ch_w:=1 to n do
          if (newclr[ch_w]=0) then
            begin
              newclr[ch_w]:=v;
              goto 1;
            end;
    1:ch_v:=ch_v+1;
      v:=ver_g[ch_v];
    end;
  for i:=1 to n do
    if (newclr[i]<>0) then
      for j:=1 to n do
        if (newclr[i] = ver_g[j]) then
          for k:=j to n do
            ver_g[k]:=ver_g[k+1];
End;
{**********************************************}
Begin
  ClrScr;
  Writeln('');
  Writeln('');
  Writeln('');
  Writeln('    Osnovnaj programma');
  Write('    Vvedite kolichestvo vershin Grapha -> ');
  Read(n);

  g[1,6] := 1;
  g[1,10] := 1;
  g[2,5] := 1;
  g[2,7] := 1;
  g[2,8] := 1;
  g[2,10] := 1;
  g[2,11] := 1;
  g[2,12] := 1;
  g[3,7] := 1;
  g[3,8] := 1;
  g[3,9] := 1;
  g[3,12] := 1;
  g[4,8] := 1;
  g[4,12] := 1;
  g[5,2] := 1;
  g[5,11] := 1;
  g[6,1] := 1;
  g[6,10] := 1;
  g[7,2] := 1;
  g[7,3] := 1;
  g[7,9] := 1;
  g[7,10] := 1;
  g[7,12] := 1;
  g[8,2] := 1;
  g[8,3] := 1;
  g[8,4] := 1;
  g[8,10] := 1;
  g[8,12] := 1;
  g[9,3] := 1;
  g[9,7] := 1;
  g[10,1] := 1;
  g[10,2] := 1;
  g[10,6] := 1;
  g[10,7] := 1;
  g[10,8] := 1;
  g[11,2] := 1;
  g[11,5] := 1;
  g[12,2] := 1;
  g[12,3] := 1;
  g[12,4] := 1;
  g[12,7] := 1;
  g[12,8] := 1;
 
 
  For i:=1 To n Do
  For j:=1 To n Do
    If (g[i,j] = 1) Then
      g[j,i] := 1;

  Write('    Ispolzuem greedy  !!!  1 or 0  !!! -> ');
  Read(otvet);
  If (otvet = 1) Then
    For i:=1 To n Do
      ver_g[i] := i
  Else
    Begin
      Writeln('');
      Writeln('    No greedy !!!');
      For i:=1 To n Do
        Begin
          g[i,n+2] := i;
          For j:=1 To n Do
            If (g[i,j] = 1) Then
              g[i,n+1] := g[i,n+1] + 1;
        End;

      flag := true;
      i := 1;
      While (flag) Do
        Begin
          flag := false;
          For j:=n Downto (i+1) Do
            If (g[j-1,n+1] < g[j,n+1]) Then
              Begin
                temp      := g[j-1,n+1];
                g[j-1,n+1] := g[j,n+1];
                g[j,n+1]  := temp;

                temp      := g[j-1,n+2];
                g[j-1,n+2] := g[j,n+2];
                g[j,n+2]  := temp;
                flag := true;
              End;
          i := i + 1;
        End;

      For i:=1 To n Do
        ver_g[i] := g[i,n+2];
    End;

  Writeln('');
  While (ver_g[1] <> 0) Do
    Begin
      Write('    newclr = ');
      greedy(ver_g,newclr);
      For i:=1 To n Do
        If (newclr[i] <> 0) Then
          Write(' ',Bukwy[newclr[i]]:2);
      Writeln('');
      Write('    ver_g  = ');
      For i:=1 To n Do
        If (ver_g[i] <> 0) Then
          Write(' ',Bukwy[ver_g[i]]:2);
      Writeln('');
      Writeln('');
      Readkey;
    End;
  Writeln('    ** Enter **');
  Readkey;
End.

а вот мой код на си.

Код:

#include <conio.h>
#include <iostream.h>
#include <stdio.h>
int g[11][11];  // {matriza Grapha}
int newclr[100];  //  {mnogestvo zakrashenyx vershin Grapha}
const char *Bukwy[]={"AA","AB","AC","AD","BB","BA","BC","BD","CC","CA","CB","CD"};
int ver_g[100];  //  {mnogestvo vershin Grapha}
int n,temp;                //        {kolichestvo vershin Grapha}
int i,j,k;
int otvet;
bool flag;
void greedy(int        ver_g[], int newclr[])

    int i;
        bool found;
        int v, w;        //      {v - vershiny ver_g, w - versiny newclr}
        int ch_v, ch_w;// {chetchik v, chetchik w}

  for (i=0;i<n;i++)
    newclr[i]=0;
  ch_v=1;
  v=ver_g[ch_v];
  while (v!=0)
    {
      found=false;
      ch_w=1;
      w=newclr[ch_w];
      while(w!=0)
        {
          if (g[v][w] == 1)
            {
              found=true;
              ch_w = n;
            }
          ch_w=ch_w+1;
          w=newclr[ch_w];
        }
      if (found == false)
        for (ch_w=0; ch_w<n;ch_w++)
          if (newclr[ch_w]==0)
            {
              newclr[ch_w]=v;
              break;
              //goto 1;
            }
    //1:
      ch_v=ch_v+1;
      v=ver_g[ch_v];
    }
  for (i=0;i<n;i++)
    if (newclr[i]!=0)
      for (j=0;j<n;j++)
        if (newclr[i] == ver_g[j])
          for (k=j;k<n;k++)
            ver_g[k]=ver_g[k+1];
}

//{**********************************************}

void main()
{
  cout<<" "<<endl;
  cout<<" "<<endl;
  cout<<" "<<endl;
  cout<<("    Osnovnaj programma")<<endl;
  cout<<("    Vvedite kolichestvo vershin Grapha -> ");
  cin>>n;

  g[0][5] = 1;
  g[0][3] = 1;
  g[1][4] = 1;
  g[1][6] = 1;
  g[1][7] = 1;
  g[1][9] = 1;
  g[1][10] = 1;
  g[1][11] = 1;
  g[2][6] = 1;
  g[2][7] = 1;
  g[2][8] = 1;
  g[2][11] = 1;
  g[3][7] = 1;
  g[3][11] = 1;
  g[4][1] = 1;
  g[4][10] = 1;
  g[5][0] = 1;
  g[5][9] = 1;
  g[6][1] = 1;
  g[6][2] = 1;
  g[6][8] = 1;
  g[6][9] = 1;
  g[6][11] = 1;
  g[7][1] = 1;
  g[7][2] = 1;
  g[7][3] = 1;
  g[7][9] = 1;
  g[7][11] = 1;
  g[8][2] = 1;
  g[8][6] = 1;
  g[9][0] = 1;
  g[9][1] = 1;
  g[9][5] = 1;
  g[9][6] = 1;
  g[9][7] = 1;
  g[10][1] = 1;
  g[10][4] = 1;
  g[11][1] = 1;
  g[11][2] = 1;
  g[11][3] = 1;
  g[11][6] = 1;
  g[11][7] = 1;

  for (i=0;i<n;i++)
  for (j=0;j<n;j++)
    if (g[i][j] == 1)
      g[j][i] = 1;

  cout<<("    Ispolzuem greedy  !!!  1 or 0  !!! -> ");
  cin>>(otvet);
  if (otvet == 1)
    for (i=0;i<n;i++)
      ver_g[i] = i;
  else
    {
      cout<<""<<endl;
      cout<<("    No greedy !!!")<<endl;
      for (i=0; i<n;i++)
        {
          g[i][n+2] = i;
          for (j=0; j<n; j++)
            if (g[i][j] == 1)
              g[i][n+1] = g[i][n+1] + 1;
        }

      flag = true;
      i = 1;
      while (flag)
        {
          flag = false;
                  //for j:=n Downto (i+1) Do
          for (j=n; j>(i+1); --j)
            if (g[j-1][n+1] < g[j][n+1])
              {
                temp      = g[j-1][n+1];
                g[j-1][n+1] = g[j][n+1];
                g[j][n+1]  = temp;

                temp      = g[j-1][n+2];
                g[j-1][n+2] = g[j][n+2];
                g[j][n+2]  = temp;
                flag = true;
              }

          i = i + 1;
        }

      for (i=0; i<n; i++)
        ver_g[i] = g[i][n+2];
    }

  cout<<" "<<endl;
  while (ver_g[1] != 0)
    {
      cout<<"    newclr = ";
      greedy(ver_g,newclr);
      for (i=0;i<n;i++)
        if (newclr[i] != 0)
          cout<<" "<<Bukwy[newclr[i]];
      cout<<" "<<endl;
      cout<<"    ver_g  = ";
      for (i=0;i<n;i++)
        if (ver_g[i] != 0)
          cout<<" "<<Bukwy[ver_g[i]];
      cout<<""<<endl;
      cout<<""<<endl;
    }

  cout<<"    ** Enter **";
  getch();
 
}



Время: 01:17.

Время: 01:17.
© OSzone.net 2001-