Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > перевести небольшой код с Pascal в C++


Автор: SergXP 17.12.2008, 19:44
Здраствуйте. 
Имеется код на Pascal:
Код

type 
link = ^node;
node = record
key: integer;
st: string;
next: link;
end;

var
mas: array[0..9] of link;

function h(key: integer): integer;
begin
h:=key mod 10;
end;

function search(key1: integer; st1: string): link;
var
i: integer;
q, p, s: link;
begin
i:= h(key1);
q:=nil;
p:=mas[i];
while p <> nil do
begin
if p^.key = key1 then
begin
    search:=p;
    exit;    
    end;
q := p;
p := p^.link;
end;
{Если ключ не найден, вставляем новую запись}
new(s);
s^.key:=key1;
s^.st:=st1;
s^.next:=nil;
if q = nil then
mas[i]:=s
else
q^.next:=s;
search:=s;
end;


Попытался его перевести в C++:
Код

typedef
struct node {
  int key;
  string st;                              // В структуре вообще запутался :( 
  node *link;
  //node *next;
}link;


link mas[9];

int h(int key) {
  return key % 10;
}

link search(int key1, string st1) {
  int i;
  link q,p,s;

  i = h(key1);
  q = NULL;       // ругается на эту строку
  p = mas[i];
  while (p != NULL) {  // тоже ругается
    if (*p->key = key1) {
      search = p;
      exit();
    }
    q = p;
    p = *p->link;
   }
   malloc(s);
   *s->key = key;
   *s->st = st1;
   *s->next = NULL;

   if (q == NULL) {
     mas[i] = s;
   } else {
     *q->next = s;
   }
   search = s;
}


Помогите исправить мои ошибки. Спасибо.

Автор: Romikgy 17.12.2008, 22:55
Код

typedef
struct node_ {
  int key;
  string st;                              // В структуре вообще запутался :( 
  node_* next;
} nnode;

typedef node_* link;

link mas[9];

int h(int key) 
{
  return key % 10;
}

link search(int key1, string st1) {
  int i;
  link q,p,s;
  i = h(key1);
  q = NULL;       // ругается на эту строку
  p = mas[i];
  while (p != NULL) {  // тоже ругается
    if (p->key = key1) {
      return p;
      
    }
    q = p;
    p = p->next;
   }
   s=(link)new nnode;
   s->key = key1;
   strcpy(s->st , st1);
   s->next = NULL;
   if (q == NULL) {
     mas[i] = s;
   } else {
     q->next = s;
   }
   return s;
}

Автор: SergXP 17.12.2008, 23:22
Romikgy, ага, спасибо! Тока он ругается на strcpy(s->st , st1); изменил на s->st = st1; откомпилировалась smile 

Автор: NewDima 19.12.2008, 17:42
по-моему в переводе все-равно ошибки
Код

typedef char string[255];
typedef struct node
 {
  int key;
  string st;
  node *next;
 } *link;

link mas[10];

int h(int key) {return key % 10;}
link search(int key1, string st1)
{
int i = h(key1);
link q=(link)0, p=mas[i];
while (p)
 {
 if (p->key==key1) return p;
 q = p;
 p = p->next;
 }
link s = new node;
memcpy((void*)s->st[0], (void*)st1[0], 255);
s->next = (link)0;
if (!q) mas[i] = s; else q->next = s;
}

Автор: mes 19.12.2008, 18:09
а тут помойму чем дословный перевод делать, легче заново написать ..
как понял задача состоит в том чтоб хранить и находить строчки по ключу , тогда так :
Код


#include <map>

typedef  std::map<int, std::string> TMyMap;
TMyMap mymap;

 smile 

 ну вот небольший тестик :
Код


#include <iostream>
#include <map>

typedef  std::map<int, std::string> TMyMap;
TMyMap mymap;

int main ()
{
    mymap [4]  = "string_with_key_4";
    mymap [12]  = "string_with_key_12";
    mymap [456]  = "string_with_key_456";

    for (TMyMap::iterator it = mymap.begin(); it!=mymap.end(); ++it )
    std::cout << "key " << it->first << " string "<< it->second << std::endl;
    std::cout << std::endl;

    std::cout << "key 0 " << mymap[0] << std::endl;
    std::cout << "key 4 " << mymap[4] << std::endl;
    std::cout << "key 7 " << mymap[7] << std::endl;
    std::cout << "key 12 " << mymap[12] << std::endl;
    std::cout << "key 45 " << mymap[45] << std::endl;
    std::cout << "key 456 " << mymap[456] << std::endl;

  getchar ();
  return 0;
}




 smile 



Автор: NewDima 20.12.2008, 09:01
Цитата(mes @ 20.12.2008,  01:09)
а тут помойму чем дословный перевод делать, легче заново написать ..

полностью согласен

Автор: SergXP 14.3.2009, 00:17
Ну вот, опять мне понадобилась Ваша помощь. 
Не буду создавать сто тем с одной проблемой.
Ребят, имеются структуры(думаю стоит почитать мне книги)
Код

TPElSp = ^TElSp;
TElSp = record
  key: byte;
  cnt: cardinal;
  next: TPElSp;
  end;

TPArNode = ^TArNode;
TArNode = record
  value: real;
  kod: TKey;
  left: TPArNode;
  right: TPArNode;
  parent: TPArNode;
  symb: byte;
  end;

TTree = record
  key: byte;
  cnt: cardinal;
  huff: TStr;
  n0: extended;
  deep: boolean;
  st_tree: TPArNode;
  end;

TArTree = array of TTree;

TFileRec = record
  key: byte;
  kod: byte;
  size_kod: byte;
  end;

TGetFile = record
  key: byte;
  kod: string[16];
  size_kod: byte;
  end;

TArFRec = array of TGetFile;



Помогите перевести в C++
У меня получается ерунда, хотя пример покажите на первых дух структурах. 
Только прошу не говорите, что не хочу сам переводить. Я пытался, но пока не получилось.
Переведите хотябы первые две структуры, а дальше сам попробую разобраться. smile

Автор: Anikmar 14.3.2009, 00:46
Код

Паскаль:
TElSp = record
  key: byte;
  cnt: cardinal;
  next: TPElSp;
  end;
TPArNode = ^TArNode;

С++
typedef struct
{
  unsigned char byte;
  long cnt;
  TElSp *next;
} TElSp;
typedef TElSp *TPArNode;

Паскаль:
TArNode = record
  value: real;
  kod: TKey;
  left: TPArNode;
  right: TPArNode;
  parent: TPArNode;
  symb: byte;
  end;

С++
typedef struct
{
  float value;
  TKey kod;            // Тут я не знаю что за тип
  TPArNode left;
  TPArNode right;
  TPArNode parent;
  unsigned char byte;
} TArNode;


Автор: SergXP 14.3.2009, 00:54
Anikmar, ага спасибо.
Только вот Вы пропустили:
Код

TPElSp = ^TElSp; // эту строку
TElSp = record
  key: byte;                    // и что-то с этой строкой напутали наверное, хотя может я ошибаюсь :(
  cnt: cardinal;
  next: TPElSp;
  end;


Тогда как будет правильно?
Код

typedef struct TElSp
{
  unsigned char byte;
  long cnt;
  TElSp *next;
} TElSp;
TElSp *TPElSp;

Автор: Anikmar 14.3.2009, 01:34
Цитата(SergXP @  14.3.2009,  00:54 Найти цитируемый пост)
Тогда как будет правильно?

typedef struct TElSp
{
  unsigned char byte;
  long cnt;
  TElSp *next;
} TElSp;
TElSp *TPElSp;



Правильно так:
Код

typedef struct TElSp
{
  unsigned char byte;
  long cnt;
  TElSp *next;
} TElSp;
typedef TElSp *TPElSp;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)