|
|
Регистрация | << Правила форума >> | 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; |