Компилирует без ошибок,но...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Bombucho
новенький
Сообщения: 37
Зарегистрирован: 18.06.2016 21:02:38

Компилирует без ошибок,но...

Сообщение Bombucho »

Здравствуйте товарищи, вроде как написал программу и вроде как она компилируется вообще без ошибок, но данные выводятся не корректно, сколько на всматривался, а найти в чем загвоздка не могу.
(Условие:создать родительский класс квадрат со стороной и найти его периметр и площадь.А его производный класс пирамида с апофемой. вычислить площадь ее поверхности )
Unit1

Код: Выделить всё


unit Unit1;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,Unit2,Unit3;
type
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Label2Click(Sender: TObject);
    procedure Label3Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  Kva:TKvadrat;
  Pyr:TPyramida;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.Label2Click(Sender: TObject);
begin

end;

procedure TForm1.Label3Click(Sender: TObject);
begin

end;

procedure TForm1.Edit1Change(Sender: TObject);
begin

end;

procedure TForm1.Button1Click(Sender: TObject);
var
k,a:integer;
begin
   k:=strtoint(Edit1.Text);
   a:=strtoint(Edit2.Text);
    Kva:=TKvadrat.Create(k);
    Pyr:=TPyramida.Create(a);
    showmessage('Ok');
    label3.Caption:=Pyr.info;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit1.clear;
  Edit2.clear;
  Label3.Caption:='';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Kva.free;
  Pyr.free;
  close
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
end;
end.
                           

Unit2

Код: Выделить всё

unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

type
  TKvadrat=class(TObject)
private
  FStorona: integer;
  FPloshad:integer;
  FPerimetr:integer;
  procedure Get_Storona(st:integer);

public
  constructor Create(st:integer);
  function info:string;
  function perimetr (st,pe:integer):integer;
  function ploshad (st,pl:integer):integer;
  property Storona :integer read FStorona write Get_Storona;
  end;
implementation
      constructor TKvadrat.Create(st:integer);
begin
    FStorona:=st;
    inherited Create;
end;

      function TKvadrat.info:string;
      begin
          result:='Квадрат со стороной:'+intTostr(FStorona)+'см'+'  '+'имеет периметр:'+intTostr(FPerimetr)+'см'
          +'  '+#13#10+'и площадь:'+intTostr(FPloshad)+'см,';
      end;
        procedure TKvadrat.Get_Storona(st:integer);
    begin
    if (st>0)  and  (st<>0)  then  FStorona:=st
    else
    FStorona:=2;
    FStorona:=st;
    end;
     function TKvadrat.perimetr(st,pe:integer):integer;
     begin

     pe:= 4*st;
            FPerimetr:=pe;
     result:= FPerimetr;
     end;
        function TKvadrat.ploshad(st,pl:integer):integer;
     begin
            pl:= st*st;
            FPloshad:=pl;
     result:=Fploshad;
     end;


end.                         

Unit3

Код: Выделить всё

unit Unit3;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,Unit2;
     type
       TPyramida=class(TKvadrat)
         private
         FApofema: integer;
         FPyramida: real;
         procedure Get_Apofema(ap:integer);
         public
         function info:string;overload;
         constructor Create(ap:integer);
         function pyramida (pe,pl,ap:integer; py:real):real;
end;
implementation
   constructor TPyramida.Create(ap:integer);
    begin
     inherited Create(ap);
     FApofema:= ap;
   end;
 function TPyramida.info:string;
 begin
 result:= inherited info+'  '+'а пирамида с апофемой:'+ intTostr(FApofema)+'см'+
 '  '+'и с основанием аналогичного квадрата имеет площадь:'+floatTostr(FPyramida)+'см.';
 end;
   procedure TPyramida.Get_Apofema(ap:integer);
      begin
      if (ap>0)  and  (ap<>0)  then  FApofema:=ap
      else
      FApofema:=4;
      FApofema:=ap;
      ap:=4;
      end;
     function TPyramida.pyramida (pe,pl,ap:integer; py:real):real;
     begin
         py:=((1/2)*ap*pe)+pl;
         FPyramida:=py;
         result:=Fpyramida;
     end;
end.                   
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

а пошагово отладочку не пробовали запустить ?
:shock:
Bombucho
новенький
Сообщения: 37
Зарегистрирован: 18.06.2016 21:02:38

Сообщение Bombucho »

AlphaBlend писал(а):а пошагово отладочку не пробовали запустить ?
:shock:

Не пробовал, а как это может мне помочь?
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

можно смотреть , какие данные и в какие переменные записываются например. Для меня Ваш код сложен , я еще простенькие пишу коды , но пошаговая отладочка очень помогает ^_^
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

AlphaBlend писал(а):а пошагово отладочку не пробовали запустить ?

Вот и вы пошли по моим стопам. Еще расскажите ему, что человек произошел от обезьяны и т.д. :mrgreen:
з.ы. Кто-то (вроде Лекс?) писал, что даже завидует тем, кто не знает, что такое отладка.

Bombucho писал(а):а как это может мне помочь?

Вы должны по идее увидеть логику, куда движется курсор.
С виду я не понял накой вы пишите это:

Код: Выделить всё

   k:=strtoint(Edit1.Text);
 ....
    Kva:=TKvadrat.Create(k);

Эти две переменные я не вижу, что дальше где-то используются. Хотя отладка всех рассудит.
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

resident :oops: я просто посоветовала пользоваться отладкой потому что сама ей пользуюсь .Отладка много ошибок помогает найти )
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

AlphaBlend писал(а):пошаговая отладочка

А логи не пробовали?
У меня вот вопрос: есть ли функция, которая может писать информацию в отладочный лог?
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

resident ну если только самостоятельно попробовать реализовать . Писать должен сам лазарус , я не знаю - умеет он так делать или нет :roll: Если писать будет программа сама , то ошибка может возникнуть в том моменте , где программа аварийно завершится и запись не успеет сработать, верно же ?
Bombucho
новенький
Сообщения: 37
Зарегистрирован: 18.06.2016 21:02:38

Сообщение Bombucho »

resident писал(а):
AlphaBlend писал(а):а пошагово отладочку не пробовали запустить ?

Вот и вы пошли по моим стопам. Еще расскажите ему, что человек произошел от обезьяны и т.д. :mrgreen:
з.ы. Кто-то (вроде Лекс?) писал, что даже завидует тем, кто не знает, что такое отладка.

Bombucho писал(а):а как это может мне помочь?

Вы должны по идее увидеть логику, куда движется курсор.
С виду я не понял накой вы пишите это:

Код: Выделить всё

   k:=strtoint(Edit1.Text);
 ....
    Kva:=TKvadrat.Create(k);

Эти две переменные я не вижу, что дальше где-то используются. Хотя отладка всех рассудит.


k это переменная которую мы вводим непосредственно в Эдит, в классе TKvadrat мы объявили, что

Код: Выделить всё

   constructor TKvadrat.Create(st:integer);
begin
    FStorona:=st;
    inherited Create;
end;                         


То есть как я понимаю st=k
Я пытался напистаь код вот так

Код: Выделить всё

   constructor TKvadrat.Create(st,pl,pe:integer);
begin
    FStorona:=st;
    FPerimetr:=pe;
    FPloshad:=pl; 
 inherited Create;
end;                         


Но компилятор выбивает ошибку мол
в Юните1 у тебя в TKvadrat.Create(st:integer), одна переменная, а в TKvadrat.Create(st,pl,pe:integer) целых 3 переменных
Вышесказанное может вам показаться бредом, мое ИМХО
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

значит у TKvadrat должно быть два конструктора ?

Код: Выделить всё

constructor TKvadrat.Create(st,pl,pe:integer); overload;
constructor TKvadrat.Create(st:Integer); overload;
......

constructor TKvadrat.Create...
begin
    inherited;
end;
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

AlphaBlend писал(а):Писать должен сам лазарус , я не знаю - умеет он так делать или нет

По-любому умеет, только не знаю где она.
Вот такую (Application.Log) методом тупого просмотра нашел, только в лог она не пишет. Вот такой код для проверки придумал:

Код: Выделить всё

procedure TForm1.FormCreate(Sender: TObject);
var
  i: TEventType;
begin
  for i in TEventTypes do Application.Log(i, 'Test');
end;

Если пройти дальше по исходному коду (Application.Log), то будет интересная пустышка:

Код: Выделить всё

procedure TCustomApplication.DoLog(EventType: TEventType; const Msg: String);
begin
  // Do nothing, override in descendants
end; 

И как это понимать?
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

[b]resident[/b ] наверное там надо свой код какой-то писать ?
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

LCL прекрасно умеет логи, читаем wiki http://wiki.freepascal.org/LazLogger
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Bombucho писал(а):k это переменная которую мы вводим непосредственно в Эдит, в классе TKvadrat мы объявили, что

Да это понятно. Непонятно вапще зачем это всё, ведь кроме самого создания Kva, квадрат больше нигде не используется. Ну это я уже по второму кругу.
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

zub :shock: ого
Ответить