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

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

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

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

Сообщение Bombucho » 18.06.2016 22:13:22

Здравствуйте товарищи, вроде как написал программу и вроде как она компилируется вообще без ошибок, но данные выводятся не корректно, сколько на всматривался, а найти в чем загвоздка не могу.
(Условие:создать родительский класс квадрат со стороной и найти его периметр и площадь.А его производный класс пирамида с апофемой. вычислить площадь ее поверхности )
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.                   
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

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

Сообщение AlphaBlend » 18.06.2016 22:30:58

а пошагово отладочку не пробовали запустить ?
:shock:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение Bombucho » 18.06.2016 23:20:00

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

Не пробовал, а как это может мне помочь?
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

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

Сообщение AlphaBlend » 18.06.2016 23:40:03

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

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

Сообщение resident » 18.06.2016 23:44:10

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

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

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

Вы должны по идее увидеть логику, куда движется курсор.
С виду я не понял накой вы пишите это:
Код: Выделить всё
   k:=strtoint(Edit1.Text);
....
    Kva:=TKvadrat.Create(k);

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

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

Сообщение AlphaBlend » 18.06.2016 23:56:10

resident :oops: я просто посоветовала пользоваться отладкой потому что сама ей пользуюсь .Отладка много ошибок помогает найти )
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение resident » 19.06.2016 00:10:02

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

А логи не пробовали?
У меня вот вопрос: есть ли функция, которая может писать информацию в отладочный лог?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение AlphaBlend » 19.06.2016 00:16:27

resident ну если только самостоятельно попробовать реализовать . Писать должен сам лазарус , я не знаю - умеет он так делать или нет :roll: Если писать будет программа сама , то ошибка может возникнуть в том моменте , где программа аварийно завершится и запись не успеет сработать, верно же ?
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение Bombucho » 19.06.2016 00:29:56

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 переменных
Вышесказанное может вам показаться бредом, мое ИМХО
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

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

Сообщение AlphaBlend » 19.06.2016 00:38:16

значит у TKvadrat должно быть два конструктора ?
Код: Выделить всё
constructor TKvadrat.Create(st,pl,pe:integer); overload;
constructor TKvadrat.Create(st:Integer); overload;
......

constructor TKvadrat.Create...
begin
    inherited;
end;
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение resident » 19.06.2016 00:44:10

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; 

И как это понимать?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение AlphaBlend » 19.06.2016 00:48:00

[b]resident[/b ] наверное там надо свой код какой-то писать ?
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение zub » 19.06.2016 00:50:02

LCL прекрасно умеет логи, читаем wiki http://wiki.freepascal.org/LazLogger
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение resident » 19.06.2016 00:51:26

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

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

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

Сообщение AlphaBlend » 19.06.2016 00:53:24

zub :shock: ого
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 248

Рейтинг@Mail.ru
cron