Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите перевеcти c делфи на С++ 
:(
    Опции темы
Гость_Lena
Дата 1.5.2005, 19:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











программа на делфи:

Procedure InitLin (Var T: Array of integer; M:integer);
begin
Setlenght(T,M);
For M:=High(T) downto 0 do T[M]:=MaxInt
end;

Function Hesh (M,K:cardinal;d:extended=0.618033988748948482):cardinal;
begin
Hesh:=Trunc(M*Frac(K*d))
end;

Function VstLin (Var T: Array of integer; Const K: integer):integer;
Var j,i:integer;
begin
Result:=-1;
i:=Hesh(Lenght(T),K);
j:=i;
Repeat if T[j]:=MaxInt then begin T[j]:=K; Exit end;
if T[j]=K then begin Result:=j; Exit end;
Dec(j);
if j<0 then j:=j+Lenght(T)
Until j:=i;
Result:=MaxInt;
end;

Procedure TForm.Button1Click(Senger:TObject);
Var i,j,K:integer; T: Array of integer; s,s1:string;
begin
s1:=";s:=";
Memo1.Clear;
InitLin(T,40);
RandSeed:=Round(Pi*5E8);
For j:=1to 100 do
begin K:=Random(40);
i:=VstLin(T,K);
if i=MaxInt then begin Memo1.Lines.Add('Переполнение');
Break end;
if i>=0 then begin if s='' then
begin Memo1.Lines.Add(s1); s1:='';s:='Повтор' end; s:=s+IntToStr(K)+'' end
Else bgin if s1=" then begin if s<>" then Memo1.Lines.Add(s); s:='';
s1"='Вставленны:' end; s1:=s1+IntToStr(k)+''
end;
end;
s:=s+s1;
Memo1.Lines.Add(s);
T:=Nil;
end;


  Вверх
tigger
Дата 5.5.2005, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: 2
Всего: 4



Попробуй так:

файл Unit1.cpp

Код


#include <vcl.h>
#include <values.h>
#include <math.h>
#pragma hdrstop

#include "Unit1.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;


InitLin (int* T, int M)
{
for(register int i = M -1; i >= 0; i--) T[i] = MAXINT;
}


__int32 Hesh(__int32 M, __int32 K, double d = 0.618033988748948482)
{
double integer, fraction, integer1;

fraction = modf((K*d), &integer);
fraction = modf((M*fraction),&integer1);
__int32 out = integer1;
return out;
}


int VstLin(int *T, const int K, int M)
{
int i,j;
i = Hesh(M,K);
j = i;
    do
    {
        if (T[j] == MaxInt) {T[j] = K; return -1; exit(0);}
    if (T[j] == K) {return j; exit(0);}
    j--;
    if (j < 0) j += M;

    } while(j == i);
        
return MaxInt;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int* T;
int K, i;
AnsiString s1 = "";
AnsiString s = "";

Memo1->Clear();
T = new int[40];
InitLin(T,40);
RandSeed = floor(M_PI*5E8);

for (register int j = 1; j <= 100; j++)
{
K = random(40);
i = VstLin(T,K,40);
if (i==MaxInt)
{
Memo1->Lines->Add("Переполнение");
break;
}

if (i >= 0)
        {
                if (s == "")
                        {
                        Memo1->Lines->Add(s1);
                        s1 = "";
                        s = "Повтор";
                        }
                        s = s + IntToStr(K) + ' ';
        }else {
        if (s1 == "")
                 {
                 if (s != "") Memo1->Lines->Add(s); s = "";
                 s1 = "Вставлено:";
                }
               s1 = s1+IntToStr(K)+' ';
            }

}

s = s+s1;
Memo1->Lines->Add(s);
T = NULL;
}



все должно получиться!!!
smile


--------------------
user posted image
PM MAIL   Вверх
label
Дата 7.5.2005, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.5.2005

Репутация: нет
Всего: нет



Спасибочки тебе ГроМАдНОе!!!!!!
Она и вправду идет!!!!
Слушай ,а как перевезти вот эту процедурку!!! это в случае строк-ключей.
Мне вообще-то нужно будет эту процедурку вставить вместо Hesh, но тогда МAXINT (обозначаю свободные позиции таблицы) нужно будет заменить на что то другое !! а на что??
Код

Function HeshSt(M: cardinal; Count s: string):cardinal;
 Var sg:string[4];q,k:integer; X:cardinal;
A: cardinal Absolute sg;
begin X:=0; k:=1;
  Repeat sg:=Copy(s,k,4);
  q:=A and 255;
if q=4 then sg[0]:=s[k+3]
Else A:=A shl (8*(3-q));
X:=(X shl) xor A; k:=k+4
Until q<4; Result:=Trunc(M*Frac(X*0.6180339887498948482))
end;


PM MAIL   Вверх
label
Дата 9.5.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.5.2005

Репутация: нет
Всего: нет



tigger пожалуйста!!!

PM MAIL   Вверх
tigger
Дата 9.5.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: 2
Всего: 4



Я про тебя не забыл, но сам понимаешь праздник....


--------------------
user posted image
PM MAIL   Вверх
label
Дата 9.5.2005, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.5.2005

Репутация: нет
Всего: нет



Ясненько.... smile

tigger,Вообще-то я девушка... smile

PM MAIL   Вверх
tigger
Дата 10.5.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: 2
Всего: 4



Oops! Приятная неожиданность, случайно не Лена?

А вот и сам код:
попробуй должно получиться вроде бы протестировал,
вставь этот код в Unit1.cpp

Код

//---------------------------------------------
#include <Math.hpp>
int* ch = new int[4];

unsigned __int32 Get_A_4(AnsiString str)
{
int kk;
int k;

switch (str.Length())
{
case 4:{kk = 3;k = 0;break;}
case 3:{kk = 3;k = 0;break;}
case 2:{kk = 2;k = 1;break;}
case 1:{kk = 1;k = 2;break;}
case 0:{kk = 0;k = 3;break;}
}

for (register int i = kk; i>0; i--)
{
 ch[k] = str.operator [](i);
 k++;
}
ch[3] = str.Length();
unsigned __int32 S = (ch[0]* Power(256,3)) + (ch[1] * Power(256,2)) + (ch[2] * 256) + ch[3];
return S;
}

unsigned __int32 Get_A(char *str)
{
int* ch;
int k = 0;
ch = new int[4];
for (register int i = 3; i>=0; i--)
{
 ch[k] = str[i];
 k++;
}
unsigned __int32 S = (ch[0]* Power(256,3)) + (ch[1] * Power(256,2)) + (ch[2] * 256) + ch[3];
return S;
}

unsigned __int32 HeshSt(__int32 M, AnsiString s)
{
AnsiString sg;
int q,k;
unsigned __int32 X;
unsigned __int32 A;
double integer, fraction, integer1;

X = 0;
k = 1;
int z =MaxInt;
do
{
sg = s.SubString(k,4);
A = Get_A_4(sg);
q = A & 255;
    if (q==4)
        {
        for (register int h = 4; h >=2; h--) sg.operator [](h) = sg.operator [](h-1);
        sg.operator [](1) = s.operator [](k+3);
        A = Get_A(sg.c_str());
        }
        else A = A << (8*(3-q));
    X = (X << 2) ^ A;
    k += 4;
} while(q >= 4);

fraction = modf((X*0.6180339887498948482), &integer);
fraction = modf((M*fraction),&integer1);
unsigned __int32 out = integer1;
return out;

}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
unsigned __int32 ddd = HeshSt(123456789,"asdfghjkLLLLfgjkl");
}
//---------------------------------------------------------------------------



насчет MaxInt:
при инициализации InitLin у тебя массив Т должен состоять из строк наверное а не из чисел
если так то задай их строками которые наверняка никогда не получатся в ходе работы проги
например "-1-1-1-1-1" это и будет признак пустой строки.

Если что-то не так поправь. Если не секрет поподробнее опиши что делает программа?

Пока пиши...



--------------------
user posted image
PM MAIL   Вверх
label
Дата 10.5.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.5.2005

Репутация: нет
Всего: нет



smile случайно Лена!
Программа т.е. лаба на тему информационный поиск.
Построение хеш-таблицы с ключами -строками и линейным опробованием позиций при поиске.
Добавлено @ 16:30
tigger, СПАСИБО БОЛЬШОЕ ЗА ПОМОЩЬ!!!!!!! smile
PM MAIL   Вверх
label
Дата 10.5.2005, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.5.2005

Репутация: нет
Всего: нет



tigger, а что делает вторая кнопка?
Код


void __fastcall TForm1::Button2Click(TObject *Sender)
{
unsigned __int32 ddd = HeshSt(123456789,"asdfghjkLLLLfgjkl");
}


PM MAIL   Вверх
tigger
Дата 11.5.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: 2
Всего: 4



Да это я просто вставил ее для тестирования функции можешь ее убрать.


--------------------
user posted image
PM MAIL   Вверх
label
Дата 11.5.2005, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.5.2005

Репутация: нет
Всего: нет



tigger, ты представляешь...у меня препод вообще!!!!
ему теперь нужно чтобы таблица заполнялась на 80% ....а потом посторить ГРАФИК!!!! кошмар! ...лучше сдохнуть щас!!! smile
PM MAIL   Вверх
tigger
Дата 11.5.2005, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: 2
Всего: 4



Он тебя доканать решил,
напиши поподробней чего ему надо. smile
Да и что за ВУЗ то?


--------------------
user posted image
PM MAIL   Вверх
label
Дата 11.5.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.5.2005

Репутация: нет
Всего: нет



Если бы я тока поняла ,что ему нужно!!! Я его с первого раза плохо понимаю...ну все же нужно увеличить размер таблицы, т.е. 40 ...а гораздо больше . потом сказал нужно замолнить таблицу на 80% ..значит в функцию VstLin поставить еще один параметр счетчик,наверное так...
Код


int VstLin(int *T, const int K, int M,int  *l)
{
int i,j;  int p=*l;
i = Hesh(M,K);
j = i;
    do
    {
        if (T[j] == MaxInt) {T[j] = K; p++; return -1; exit(0);}
    if (T[j] == K) {return j; exit(0);}
    j--;
    if (j < 0) j += M;

    } while(j == i);
    *l=p;
return MaxInt;
}


и потом в кнопочке втавить цикл , типа если l меньше 80% от заполнение таблице то долже выполнять, что есть в кнопке...
потом в кнопочку поставить функцию
Код

int Vs(int *T, const int K, int M)
{
int i,j;
i = Hesh(M,K);
j = i;
    do
    {
        if (T[j] == MaxInt) {K=K; return -1; exit(0);}
    if (T[j] == K) {return j; exit(0);}
    j--;
    if (j < 0) j += M;

    } while(j == i);
return MaxInt;
}


...но копмилятор выдает ошибку, и зачем эта функия я так и не поняла...!!!

и короче это все для того что построить графики : длина и время зависят от коэфицента заполнения таблицы a=n/M, М-размер таблицы , n- текущее число записей в поисковой структуре.
График неуспешного поиска, нелинейный рост длины поиска при увеличении коэфицента я знаю как выглядет, но это не совсем радует!!
P.S. учусь в МЭИ
PM MAIL   Вверх
tigger
Дата 12.5.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: 2
Всего: 4



Привет, как успехи?!?
Ошибка в функции Vs:
переменная К задана как const следовательно ее значение изменить нельзя, а у тебя K = K недопустимо так делать
и вообще в чем смысл этого присваивания? И где именно в проге идет вызов VS, в той же кнопке1.

Насчет счетчика передай его по ссылке... твой вариант я не смог запустить:
Код

int VstLin(int *T, const int K, int M, int &l)
{
int i,j;
i = Hesh(M,K);
j = i;
    do
    {
        if (T[j] == MaxInt) {T[j] = K; l++; return -1; exit(0);}
    if (T[j] == K) {return j; exit(0);}
    j--;
    if (j < 0) j += M;
        } while(j == i);

return MaxInt;
}


Пиши... smile



--------------------
user posted image
PM MAIL   Вверх
label
Дата 14.5.2005, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.5.2005

Репутация: нет
Всего: нет



Приветик! smile
Я тут подумала и решила , что мне нужна процедура неуспешного поиска элемента в хеше.
А потом я буду искать этот элемент при заполнении таблицы с 10% до 80%...а на основе потом данных я и построю график.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.