![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
|||
|
|||
|
Сорри торопился
Код:
класс TRam
type
TRam = class(TObject)
private
// поля
FRam: Array of TSegment; // динамический массив
FCount: integer; // приватное поле, количество сегментов
public
// конструкторы и деструкторы
constructor Create (ACount: integer); // инициализация
destructor Destroy; override;
// методы
procedure SetCount (ACount: integer); // установка количества элементов
procedure Reset; // обнуление данных
function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string;
end;Уважаемые форумчане я наверное вас уже замучал. Вот что ответил мне преподаватель. Из всех классов правильно описан только класс TPage. Класс TSegment в принципе имеет неправильное описание, т.к. по заданию у вас сегменты реализуются как контейнеры страниц на основе ДИНАМИЧЕСКОЙ, АДРЕСНОЙ реализации, а не на основе массива! Кроме того, не объявлены методы добавления и удаления. Аналогично, в классе TRam нет методов добавления в список, удаления из списка и поиска сегмента. вот еще раз всё классы: Код:
класс TSegment type TSegment = class(TObject) private // поля FPages: Array of TPage; // массив function GetCount: integer; function GetPage (Index: integer): TPage; public // конструкторы и деструкторы constructor Create (ACount: integer); virtual; // инициализация destructor Destroy; override; // уничтожение // свойства property Count: integer read GetCount; property Pages[Index: integer]: TPage read GetPage; // методы procedure ClearAll; end; Код:
класс TRam
type
TRam = class(TObject)
private
// поля
FRam: Array of TSegment; // динамический массив
FCount: integer; // приватное поле, количество сегментов
public
// конструкторы и деструкторы
constructor Create (ACount: integer); // инициализация
destructor Destroy; override;
// методы
procedure SetCount (ACount: integer); // установка количества элементов
procedure Reset; // обнуление данных
function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string;
end;Последний раз редактировалось M.A.D.M.A.N., 23.11.2013 в 20:02. |
|
#17
|
|||
|
|||
|
Описал класс TRam вот так:
Код:
класс TRam
type
TRam = class(TObject)
private
// поля
FRam: Array of TSegment; // динамический массив
FCount: integer; // приватное поле, количество сегментов
public
// конструкторы и деструкторы
constructor Create (ACount: integer); // инициализация
destructor Destroy; override;
// методы
procedure SetCount (ACount: integer); // установка количества элементов
procedure AddSegment () // добавление элементов в список
procedure DeleteSegment () // удаление элементов из списка
procedure Search () // поиск сегмента
procedure Reset; // обнуление данных
function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string;
end;Код:
procedure AddSegment () // добавление элементов в список procedure DeleteSegment () // удаление элементов из списка procedure Search () // поиск сегмента |
|
#18
|
|||
|
|||
|
Форумчане преподаватель принял классы и я сделал реализацию (программную), подскажите пожалуйста по классу TRam вот весь код:
Код:
unit MeineClasse;
interface
uses
SysUnits;
type
TPage = class(TObject)
private
FNumber: integer;
FPriznak: Boolean;
public
Constructor Create (const Number: integer; Priznak: boolean);
function GetNumber: integer;
procedure SetNumber (const Value: integer);
function GetPriznak: boolean;
procedure SetPriznak (const Value: boolean);
end;
TElement=class(TObject)
private
FMemory: TPage;
FNext: TElement;
public
constructor Create (const Memory: TPage);
destructor Destroy; override;
function GetNext: TElement;
procedure SetNext (const Value: TElement);
function GetMemory: TPage;
end;
TSegment = class(TObject)
private
FFirst: TPage;
FNum: integer;
public
constructor Create (const Num: integer);
destructor Destroy; override;
function GetFirst: TSegment;
function GetNum: integer;
procedure SetNum (const Value: integer);
procedure AddTPage (const Page: TPage);
procedure DelFirst: TPage;
procedure ClearAll;
end;
TRam = class(TObject)
private
FRam: Array of TSegment;
FCount: integer;
public
constructor Create (ACount: integer);
destructor Destroy; override;
procedure SetCount (ACount: integer);
function AddSegment (const Segment: TSegment): integer;
function DelSegment (TSegment: integer): integer;
function BinarySearch (const Values: array of TSegment; const Item: integer;
out FoundIndex: Integer): Boolean;
Procedure SaveFile (const FileName: string);
Procedure LoadFile (const FileName: string);
function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string;
procedure Reset;
end;
implementation
//******************TPage************************************************
constructor TPage.Create (const Number: integer; Priznak: boolean);
begin
inherited Create; // при создании сразу инициализируем поля объекта
FNumber := Number;
FPriznak:= Boolean;
end;
function TPage.GetNumber: integer;
begin
Result := FPriznak;
end;
function TPage.GetPriznak: boolean;
begin
Result := FPriznak;
end;
procedure TPage.SetNumber (const Value: integer);
begin
FName := Value;
end;
procedure TPage.SetPriznak (const Value: boolean);
begin
FPriznak := Value;
end;
//*****************TElement**********************************************
constructor TElement.Create (const Memory: TPage);
begin
inherited Create;
FNext := nil;
FMemory := Page;
end;
destructor TElement.Destroy;
begin
FPage.Free;
Inherited Destroy;
end;
function TElement.GetNext: TElement;
begin;
Result := FNext;
end;
function TElement.GetMemory: TPage;
begin
Result := FPage;
end;
procedure TElement.SetNext (const Value: TElement);
begin
FNext := Value;
end;
//*************TSegment**************************************************
constructor TSegment.Create (const Num: integer);
begin
inherited Create;
FFirst := TPage;
FNum := nil;
end;
destructor TSegment.Destroy;
begin
Clear;
Inherited Destroy;
end;
procedure AddTPage (const Page: TPage);
var
New: TElement;
begin
New := TElement.Create(Page); // Создаём новый элемент, присваиваем его переменной New
New.SetNext(FFirst); // Ссылка на следующий элемент = голова стека
FFirst := New; // Голова стека = новый элемент
end;
procedure TSegment.ClearAll;
var
Temp: TElement;
begin
while Assigned(FFirst) do // Пока голова стека не nul, то
begin
Temp := FFirst; // Временный элемент = голова стека
FFirst := FFirst.GetNext; // Голова стека = следующий элемент
Temp.Free; // Уничтожаем временный элемент (цикл проходит по стеку и при каждой итерации удаляет элемент)
end;
FFirst := nil;
end;
function TSegment.GetFirst: TSegment;
begin
Result := FFirst;
end;
function TSegment.GetNum: integer;
begin
Result := FNum;
end;
procedure TSegment.DelFirst: TPage;
var
Temp: TElement;
begin
Result:=nil;
if not Assigned(FFirst) then Exit; // Если голова стека = nul, то выходим из процедуры
Temp := FFirst; // Временный элемент = голова стека
FFirst := FFirst.GetNext; // Голова стека = следующий элемент
Result := Temp;
Temp.Free;
end;
procedure TSegment.SetNum (const Value: integer);
begin
FNum := Value;
end;
//*****************TRam*************************************************
function TRam.AddSegment (const Segment: TSegment): integer;
var
i, j: integer;
begin
…….
function TRam.BinarySearch (const Values: array of TSegment; const Item: integer; out FoundIndex: Integer): boolean;
var
L, H: Integer;
mid, Index, Count : Integer;
begin
Index := Low(Values);
Count := Length(Values);
if (Index < Low(Values)) or ((Index > High(Values)) and (Count > 0))
or (Index + Count - 1 > High(Values)) or (Count < 0)
or (Index + Count < 0) then
raise Exception.Create('Argument out of range');
Result := False;
if Count = 0 then
begin
FoundIndex := Index;
Exit;
end;
L := Index;
H := Index + Count - 1;
while L <= H do
begin
mid := L + (H - L) shr 1;
if Values[mid] < Item then
L := mid + 1
else
begin
H := mid - 1;
if Values[mid] = Item then
Result := True;
end;
end;
FoundIndex := L;
end;
function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string;
var
registry: TRegistry;
begin
// если WinNT, открываем другой ключ
If ((GetVersion and $80000000)=0) and (Key_Open=WinVers) then
Key_Open := `SOFTWARE\Microsoft\Windows NT\CurrentVersion`;
Registry := TRegistry.Create;
Try
Registry.RootKey := Root_Key;
Registry.OpenKey (Key_Open, False);
Result := Registry.ReadString (Key_Read);
Finally
Registry.Free;
end;
// если ничего не найдено, выводим «невозможно определить»
If Result <> EmptyStr then Result := Key_read+`: `+Result else Result := Key_read+`: невозможно определить`;
end;
function TRam.DelSegment (TSegment: integer): integer;
….
constructor TRam.Create (ACount: integer);
begin
P := nil;
count :=0;
SetCount (ACount);
end;
procedure TRam.SetCount (ACount: integer);
var
np : PArray;
begin
if count = ACount then
exit;
(память не была выделена)
If p = nil then
begin
(новое кол-во элементов в массиве равно 0)
If ACount <= 0 then
begin
count := 0;
end;
(новое кол-во элементов в массиве больше 0)
else
begin
(выделение памяти)
GetMem (p, ACount * sizeof(integer));
(обнуление данных)
fillchar (p^, ACount * sizeof(integer),0);
count := ACount;
end;
end;
else
begin
(новое кол-во элементов в массиве равно 0)
If Acount <=0 then
begin
(освобождение памяти)
FreeMem (p, count * sizeof(integer));
count := 0;
end;
else
begin
(выделение памяти)
GetMem (np, ACount * sizeof(integer));
(требуется увеличить кол-во элементов)
If ACount > count then
begin
(перемещение старых данных в новое место)
move (p^, np^, count * sizeof(integer));
(обнуление новых элементов массива)
fillchar (np^[count], (ACount-count) * sizeof(integer), 0);
end
else
begin
(перемещение старых данных на новое место)
move (p^, np^, count * sizeof(integer));
(обнуление новых элементов массива)
fillchar (np^[count], (ACount-count) * sizeof(integer), 0);
end
else
begin
(перемещение части старых данных на новое место)
move (p^, np^, ACount * sizeof(integer));
end;
(освобождение старо памяти)
FreeMem (p, count * sizeof(integer));
p := np;
count := ACount;
end;
end;
end;
procedure TRam.Reset;
begin
fillchar (p^, count * sizeof(integer), 0);
end;
destructor TRam.Destroy;
begin
SetCount(0);
end;
procedure TRam.LoadFile (const FileName: string);
……..
procedure TRam.SaveFile (const FileName: string);
var
f: TextFile;
i: integer;
Element: TElement;
begin
AssignFile(f, FileName);
Rewrite (f);
for i := 0 to GetCount -1 do // цикл прохода по структуре и сохранения элементов в файл
begin
Writeln(f,FRam[i].GetNum);
Element := FRam[i].GetFirst;
While Assigned(Element) do
begin
Writeln(f,………)
Element := Element.GetNext;
end;
Writeln(f);
end;
CloseFile(f);
end;
end. Последний раз редактировалось Deman1986, 24.12.2013 в 22:22. |
|
#19
|
|||
|
|||
|
форумчане компилятор ругается на реализацию класса TElement вот код программы.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
type
TPage = class(TObject)
private
FNumber: integer;
FPriznak: Boolean;
public
Constructor Create (const Number: integer; Priznak: boolean);
function GetNumber: integer;
procedure SetNumber (const Value: integer);
function GetPriznak: boolean;
procedure SetPriznak (const Value: boolean);
end;
TElement=class(TObject)
private
FMemory: TPage;
FNext: TElement;
public
constructor Create (const Memory: TPage);
destructor Destroy; override;
function GetNext: TElement;
procedure SetNext (const Value: TElement);
function GetMemory: TPage;
end;
TSegment = class(TObject)
private
FFirst: TPage;
FNum: integer;
public
constructor Create (const Num: integer);
destructor Destroy; override;
function GetFirst: TSegment;
function GetNum: integer;
procedure SetNum (const Value: integer);
procedure AddTPage (const Page: TPage);
function DelFirst: TPage;
procedure ClearAll;
end;
TRam = class(TObject)
private
FRam: Array of TSegment;
FCount: integer;
public
constructor Create (ACount: integer);
destructor Destroy; override;
procedure SetCount (ACount: integer);
function AddSegment (const Segment: TSegment): integer;
function DelSegment (TSegment: integer): integer;
function BinarySearch (const Values: array of TSegment; const Item: integer;
out FoundIndex: Integer): Boolean;
Procedure SaveFile (const FileName: string);
Procedure LoadFile (const FileName: string);
procedure Reset;
end;
implementation
{$R *.dfm}
//******************TPage************************************************
constructor TPage.Create (const Number: integer; Priznak: boolean);
begin
inherited Create; // при создании сразу инициализируем поля объекта
FNumber := Number;
FPriznak:= true;
end;
function TPage.GetNumber: integer;
begin
Result := FNumber;
end;
function TPage.GetPriznak: boolean;
begin
Result := FPriznak;
end;
procedure TPage.SetNumber (const Value: integer);
begin
FNumber := Value;
end;
procedure TPage.SetPriznak (const Value: boolean);
begin
FPriznak := Value;
end;
//*****************TElement**********************************************
constructor TElement.Create (const Memory: TPage);
begin
inherited Create;
FNext := nil;
FMemory := Page;
end;
destructor TElement.Destroy;
begin
FPage.Free;
Inherited Destroy;
end;
function TElement.GetNext: TElement;
begin;
Result := FNext;
end;
function TElement.GetMemory: TPage;
begin
Result := FPage;
end;
procedure TElement.SetNext (const Value: TElement);
begin
FNext := Value;
end;Код:
FMemory := Page; Код:
FPage.Free; Код:
Result := FPage; Последний раз редактировалось Deman1986, 16.01.2014 в 15:29. |
|
#20
|
||||
|
||||
|
Цитата:
|
|
#21
|
|||
|
|||
|
Спасибо за ответ, вот я тоже задался этим вопросом, где её лучше объявить, как глобальную переменную или же как локальную в конструкторе.
|
|
#22
|
||||
|
||||
|
Цитата:
Есть подозрение что у тебя в конструкторе должно быть не "Memory", а "Page". И соответственно поле должно быть не "FMemory", а "FPage". Ну или всё наоборот - ты разработчик - тебе видней что как называть. Для меня "Element" однозначно не ассоциируется ни с "Memory" ни с "Page". |
|
#23
|
|||
|
|||
|
пробывал и так и так компилятор выводит "Undeclared identifier:"
вот смотрите у меня класс Код:
TElement=class(TObject) private FMemory: TPage; FNext: TElement; public constructor Create (const Memory: TPage); destructor Destroy; override; function GetNext: TElement; procedure SetNext (const Value: TElement); function GetMemory: TPage; end; но почему то, компилятор не не ругается на первый класс там всё нормально. Код:
type TPage = class(TObject) private FNumber: integer; FPriznak: Boolean; public Constructor Create (const Number: integer; Priznak: boolean); function GetNumber: integer; procedure SetNumber (const Value: integer); function GetPriznak: boolean; procedure SetPriznak (const Value: boolean); end; |
|
#24
|
||||
|
||||
|
Цитата:
Цитата:
|
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Deman1986 (19.01.2014)
| ||
|
#25
|
|||
|
|||
|
Спасибо большое заменил всё как вы написали.
можно еще спросить в реализации кода класса TSegment: Код:
//*************TSegment**************************************************
constructor TSegment.Create (const Num: integer);
begin
inherited Create;
FNum := Num;
FFirst := nil;
end;
destructor TSegment.Destroy;
begin
Inherited Destroy;
end;
procedure AddTPage (const Page: TPage);
var
New: TElement;
begin
New := TElement.Create(Page);
New.SetNext (FFirst);
FFirst := New;
end;
procedure TSegment.ClearAll;
var
Temp: TElement;
begin
while Assigned(FFirst) do
begin
Temp := FFirst;
FFirst := FFirst.GetNext;
Temp.Free;
end;
FFirst := nil;
end;
function TSegment.GetFirst: TSegment;
begin
Result := FFirst; // во тут компилятор выдаёт ошибку "Несовместимость типов" TElement и TPage.
end;
function TSegment.GetNum: integer;
begin
Result := FNum;
end;
function TSegment.Delete: TPage;
var
Temp: TElement;
begin
Result:=nil;
if not Assigned(FFirst) then Exit;
Temp := FFirst;
FFirst := FFirst.GetNext;
Result := Temp;
Temp.Free;
end;
procedure TSegment.SetNum (const Value: integer);
begin
FNum := Value;
end;Последний раз редактировалось M.A.D.M.A.N., 06.02.2014 в 22:12. |
|
#26
|
||||
|
||||
|
Цитата:
|
|
#27
|
|||
|
|||
|
да Вы правильно подметили не TElement, а TSegment, сорри это я ошибся.
не могу ни как исправить ошибку по классу TSegment у меня в поле Код:
FFirst := nil; Код:
FFirst: TPage; Последний раз редактировалось M.A.D.M.A.N., 06.02.2014 в 22:12. |
|
#28
|
|||
|
|||
|
пожалуйста подскажите. Спасибо.
|
|
#29
|
|||
|
|||
|
форумчане извините за надоедливость. Преподаватель ответил следующее: Поле FFirst используется для адресации первого объекта-страницы, поэтому метод GetFirst должен возвращать адрес этого объекта и иметь тип TPage.
Не получается у меня прописать поле FFirst. Может кто подскажет. Спасибо. Разработал последний класс. Тоже есть ошибки. Код:
function TRam.AddSegment (const Segment: TSegment): integer;
var
i, j: integer;
begin
if GetCount =0 then
begin
Rise;
FRam[0]:= TSegment.Create(Segment);
Result:=0;
Exit;
end;
for i:=0 to GetCount -1 do
if FRam[i].GetNum= Segment then
begin
Result:=i;
Exit;
end;
if Segment > FRam[GetCount-1].GetNum then
begin
Rise;
FRam[GetCount-1]:=TSegment.Create(Segment);
Result:=GetCount-1;
Exit;
end;
for i:= 0 to GetCount -1 do
if FRam[i].GetNum > Segment then
begin
for j:= GetCount-1 downto i+1 do
FRam[j]:=FRam[j-1];
FRam[i]:= TSegment.Create(Segment);
Result:=i;
Exit;
end;
Result:=-1;
end;
procedure TRam.Reset;
var
i: integer;
begin
for i:=0 to GetCount -1 do
FRam[i].Free;
SetLength(FRam,0);
end;
constructor TRam.Create (ACount: integer);
begin
inherited Create;
SetLength(FRam,ACount);
FCount:=0;
end;
function TRam.DelSegment (TSegment: integer): integer;
var
i,j: integer;
temp: TSegment;
begin
Result:=0;
for i:=0 to GetCount-1 do
if FRam[i].GetNum = TSegment then
begin
temp:= FRam[i];
for j:=i to GetCount -2 do
FRam[j]:= FRam[j+1];
Dec(FCount);
if FCount< Length(FRam) div 2 then
SetLength(FRam,FCount);
temp.Free;
Result:= TSegment;
Exit;
end;
end;
destructor TRam.Destroy;
begin
SetLength(FRam,0);
inherited Destroy;
end;
procedure TRam.Rise;
Inc(FCount);
if GetCount > Length(FRam) then
begin
if Length(FRam) <= 0 then SetLength(FRam,FCount)
else SetLength(FRam,(FRam)*2);
end;
end;
procedure TRam.SetCount (ACount: integer);
begin
FCount:=ACount;
end;
procedure TRam.LoadFile (const FileName: string);
var
f: TextFile;
s,st,st2,st3,name: string;
i,cop,j,g: integer;
Shelf: TSegment;
Page: TPage;
flag: Boolean;
begin
AssignFile(f,FileName);
Reset(f);
while not Eof(f) do
begin
Readln(f,s);
if s = ''then Continue;
i:= AddSegment(StrToint(s));
if i < 0 then Continue;
Shelf:= FRam[i];
while not Eof(f) do
begin
name:='';
flag:=false;
st3:='';
cop:=0;
Readln(f,s);
if s =''then Break;
for j:= 1 to Length(s) do
begin
st:= copy(s,j,1);
if st <> '*' then name:=name + st else begin flag:=true; break; end;
end;
if flag = true then begin // flag = True-
for g:= j+1 to Length(s) do
begin
st2:=copy(s,g,1);
st3:=st3+st2;
end; flag:=false end;
cop:=strtoint(st3);
Page:=TPage.Create(name,cop);
Shelf.AddTPage(Page);
end;
end;
CloseFile(f);
end;
procedure TRam.SaveFile (const FileName: string);
var
f: TextFile;
i: integer;
Element: TElement;
begin
AssignFile(f, FileName);
Rewrite (f);
for i := 0 to GetCount -1 do
begin
Writeln(f,FRam[i].GetNum);
Element := FRam[i].GetFirst;
While Assigned(Element) do
begin
Writeln(f,GetMemory.GetNumber, '*',Element.GetMemory.GetPriznak);
Element := Element.GetNext;
end;
Writeln(f);
end;
CloseFile(f);
end.Последний раз редактировалось Deman1986, 25.02.2014 в 10:54. |
|
#30
|
|||
|
|||
|
ни как не могу решить проблему с массивом подскажите пожалуйста кто чем может.
Код:
function TRam.AddSegment (const Segment: TSegment): integer;
var
i, j: integer;
begin
if GetCount =0 then // создание сегментов
begin
FRam[0]:= TSegment.Create(0);
Result:=0;
Exit;
end;
for i:=0 to GetCount -1 do
if FRam[i].GetNum= 0 then
begin
Result:=i;
Exit;
end;
if 1 > FRam[GetCount-1].GetNum then
begin
FRam[GetCount-1]:=TSegment.Create(1);
Result:=GetCount-1;
Exit;
end;
for i:= 0 to GetCount -1 do
if FRam[i].GetNum > 1 then
begin
for j:= GetCount-1 downto i+1 do
FRam[j]:=FRam[j-1];
FRam[i]:= TSegment.Create(1);
Result:=i;
Exit;
end;
Result:=-1;
end; |