Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2014, 18:18   #1
Deman1986
Пользователь
 
Регистрация: 08.04.2013
Сообщений: 16
По умолчанию (Delphi 7). Реализация классов.

Форумчане помогите пожалуйста. Столкнулся с проблемой не могу реализовать функцию function TRam.AddSegment (const Segment: TSegment): integer; это учебная задача и она должна быть сделана через массив, у меня возникли затруднения. Помогите пожалуйста. Вот комментарии преподавателя и код программы.
Код:
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: TElement;
	FNum: integer;
	public
	constructor Create (const Num: integer);
	destructor Destroy; override;
	function GetFirst: TElement;
	function GetNum: integer;
	procedure SetNum (const Value: integer);
	procedure AddTPage (const Page: TPage);
	function Delete: TPage;
	procedure ClearAll;
end;

TRam = class(TObject)
private
	FRam: Array of  TSegment;
	FCount: integer;
public
	constructor Create (ACount: integer=0);
	destructor Destroy; override;
  function GetCount: integer;
	procedure SetCount (ACount: integer);
	function AddSegment (const Segment: TSegment): integer;
	function DelSegment (TSegment: integer): integer;
	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;
    FMemory := Memory;
     FNext := nil;
end;
destructor TElement.Destroy;
begin
  FMemory.Free;
    Inherited Destroy;
end;
function TElement.GetNext: TElement;
begin;
  Result := FNext;
end;
function TElement.GetMemory: TPage;
begin
  Result := FMemory;
end;
procedure TElement.SetNext (const Value: TElement);
begin
  FNext := Value;
end;
//*************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: TElement;
begin
  Result := FFirst;
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;

Последний раз редактировалось Deman1986; 01.05.2014 в 18:25.
Deman1986 вне форума Ответить с цитированием
Старый 01.05.2014, 18:22   #2
Deman1986
Пользователь
 
Регистрация: 08.04.2013
Сообщений: 16
По умолчанию

продолжение программы

Последний раз редактировалось Deman1986; 01.05.2014 в 18:39.
Deman1986 вне форума Ответить с цитированием
Старый 01.05.2014, 18:23   #3
Deman1986
Пользователь
 
Регистрация: 08.04.2013
Сообщений: 16
По умолчанию

Код:
//*****************TRam*************************************************
function TRam.AddSegment (const Segment: TSegment): integer;
var
  i: integer;
  t: TSegment;
begin
  setlength(FRam,100); // выделение памяти под массив для 100 элементов
  if GetCount =0 then  // создание сегмента
  begin
  FRam[0]:= TSegment.Create(0);
        Result:=0;
          Exit;
            end;
  begin
         for i:=2 to n do // сравнивается след. с пред., поэтому с 2
         for j:=n downto i do
         if FRam[i-1]>FRam[j] then
           begin
            temp:=FRam[i-1];
              FRam[i-1]:=FRam[j];
                FRam[j]:=temp;
                  end;
         end;
    begin
      for i:=2 to n do
        begin
          s:=FRam[i]; // запомним элемент на случай сдвига
           k:=0;
         {Поиск места элемента в упорядоченной последов-ти}
             for j:=i-1 downto 1 do
              if FRam[j]<=FRam[i]then
                begin
                  k:=j; // можно сдвигаться слева направо, справа налево
                    break; // если элемент найден, больше перебирать не нужно
                      end;
                   {Сдвиг части последовательности}
                for j:=i downto k+1 do
             FRam[j]:=FRam[j-1];
         FRam[k+1]:=s;// поставить элемент на нужное место
          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;
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);
           Result:= TSegment;
              Exit;
                end;
end;
destructor TRam.Destroy;
begin
SetLength(FRam,0);
  inherited Destroy;
end;
function TRam.GetCount: integer;
begin
  Result:= FCount;
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(cop,true); // создали информационный объект
          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;
end.
По смыслу вашей задачи метод должен добавлять новый сегмент с заданным номером ДО или ПОСЛЕ сегмента с заданным номером, поэтому метод должен иметь ДВА входных параметра и выполнять поиск места вставки. Спасибо
Deman1986 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация многопоточности на языке C++ с помощью классов MFC Volt505 Помощь студентам 0 28.04.2014 16:07
Реализация классов в C# AntonMike C# (си шарп) 0 15.01.2014 21:10
Реализация классов. tabl1 Помощь студентам 1 10.05.2012 22:17
Реализация программы, с использованием классов C++. MarksmaN-vip Общие вопросы C/C++ 9 10.06.2011 20:19
Реализация классов. С++ Miito Фриланс 1 21.05.2010 20:04