Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > нахождение сумм, площадей и периметров


Автор: pyxy 7.3.2012, 00:09
Код
unit labka;

interface

type
  TGeomFigure=class (TObject)
        function Plosha: integer; virtual; abstract;
        function Perimetr: integer; virtual; abstract;
        function InputData: boolean; virtual; abstract;
  end;

TSquare=class(TGeomFigure)
        side: integer;
        function Plosha: integer; override;
        function Perimetr: integer; override;
        function InputData: boolean; override;
end;

TTrap=class(TGeomFigure)
        h,side1,side2,side3: integer;
        function Plosha: integer; override;
        function Perimetr: integer; override;
        function InputData: boolean; override;
end;

TRectangle=class(TGeomFigure)
        side1,side2: integer;
        function Plosha: integer; override;
        function Perimetr: integer; override;
        function InputData: boolean; override;
end;

implementation

function TSquare.Plosha: integer;
begin
        Plosha:=side*side;
end;

function TSquare.Perimetr: integer;
begin
        Perimetr:=4*side;
end;

function TSquare.InputData: boolean;
begin
        writeln ('Vvedenna parametriv kvadrata');
        write ('Vvedit ctorony kvadrata: ');
        readln(side);
        if  side<=0 then InputData:=false
                else InputData:=true;
        end;

function TRectangle.Plosha: integer;
begin
         Plosha:=side1*side2;
end;

function TRectangle.Perimetr: integer;
begin
        Perimetr:=(side1+side2)*2;
end;

function TRectangle.InputData: boolean;
begin
        writeln ('Vvedenna parametriv pramokytnuka');
        write ('Vvedit ctorony pramokytnka: ');
        readln(side1,side2);
        if (side1<=0) or (side2<=0) then InputData:=false
                else InputData:=true;
end;

function TTrap.Plosha: integer;
begin
        Plosha:=(side1+side2)*h/2;
end;

function TTrap.Perimetr: integer;
begin
        Perimetr:=side1+side2+2*side3;
end;

function TTrap.InputData: boolean;
begin
        writeln ('Vvedenna parametriv trapeciy');
        write ('Vvedit ctorony trapecii: ');
        readln(side1,side2,side3);
        if (side1<=0) or (side2<=0) or (side3<=0) then InputData:=false
                else InputData:=true;
        end;
end.

а вот и програма
Код

program laboratorna;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  labka in 'labka.pas';

const n=3;
var
        aFigure: array[1..n] of TGeomFigure;
        sum_plosh,sum_perim: integer;
        i: integer;
        tup: char;

begin
  write ('Zadayte tup figury:   ');
  readln(tup);
  writeln;
  for i:=1 to n do
  case tup of
  'k': aFigure[i] := TSquare.Create;
  't': aFigure[i] := TTrap.Create;
  'p': aFigure[i] := TRectangle.Create
end;

for i:=1 to n do
if not aFigure[i].InputData then
        begin
                write ('Pomulka vvedenna danux ');
                exit;
        end;
sum_plosh:=0; sum_perim:=0;
for i:=1 to n do
        begin
                sum_plosh:=sum_plosh+aFigure[i].Plosha;
                sum_perim:=sum_perim+aFigure[i].Perimetr;
        end;
writeln;
writeln('Cyma plosh =',sum_plosh);
writeln('Cyma perimetriv= ',sum_perim);
readln
end. 

smile ПОМОГИТЕ ПОЖАЛУЙСТА.Никак не могу написать площадь трапеции выбивает ошибку ,и еще я не могу  сделать для круга и треугольника...

Автор: bems 7.3.2012, 04:56
где именно выбивает и какую ошибку?

Добавлено через 7 минут и 43 секунды
ошибка в том что у тебя
Plosha возвращает целое а ты пытаешься запихнуть туда вещественное.

или сделай так
Код

function TTrap.Plosha: real;
begin
        Plosha:=(side1+side2)*h/2;
end;


или так

Код

function TTrap.Plosha: integer;
begin
        Plosha:=Round((side1+side2)*h/2);
end;


первый вариант правильней, но он требует изменения объявления метода Plosha во всех классах

Автор: pyxy 7.3.2012, 08:28
Цитата(bems @ 7.3.2012,  04:56)
где именно выбивает и какую ошибку?

Добавлено @ 05:04
ошибка в том что у тебя
Plosha возвращает целое а ты пытаешься запихнуть туда вещественное.

или сделай так
Код

function TTrap.Plosha: real;
begin
        Plosha:=(side1+side2)*h/2;
end;


или так

Код

function TTrap.Plosha: integer;
begin
        Plosha:=Round((side1+side2)*h/2);
end;


первый вариант правильней, но он требует изменения объявления метода Plosha во всех классах

Благодарю, но выводит 0...
не выбивает ошибку просто сумма не считается, а выводится 0

Автор: bems 7.3.2012, 08:54
как именно исправил, какие исходные данный вводил? не заставляй из тебя вытягивать

Автор: pyxy 7.3.2012, 16:35
Цитата(bems @ 7.3.2012,  08:54)
как именно исправил, какие исходные данный вводил? не заставляй из тебя вытягивать

любые данные, площадь не считается ....

Автор: northener 7.3.2012, 18:05
Цитата(pyxy @  7.3.2012,  08:28 Найти цитируемый пост)
Благодарю, но выводит 0

А что кроме 0 может получиться, если h = 0?
Надо вспомнить школу и рассчитать высоту трапеции, зная ее стороны.

Автор: bems 7.3.2012, 23:41
Цитата(northener @  7.3.2012,  18:05 Найти цитируемый пост)
А что кроме 0 может получиться, если h = 0?

ты прочитал это полностью! smile 


pyxy, ну добавь ввод высоты в InputData

Автор: northener 8.3.2012, 00:51
Цитата(bems @  7.3.2012,  23:41 Найти цитируемый пост)
ты прочитал это полностью! smile 

Это ты к кому адресуешь?  smile 
А понял. Нечего было делать - вот и прочитал. Но не полностью, а лишь реализацию методов для трапеции.

Цитата(bems @  7.3.2012,  23:41 Найти цитируемый пост)
pyxy, ну добавь ввод высоты в InputData

Имхо, перебор. Особенно если это учебное задание. Размеры всех сторон трапеции дают всю необходимую информацию о данной фигуре.

Автор: bems 8.3.2012, 00:55
вообще да, но не осилит же

Автор: northener 8.3.2012, 01:01
Цитата(bems @  8.3.2012,  00:55 Найти цитируемый пост)
вообще да, но не осилит же

А это уже его проблемы. И зависит от преподавателя. Хороший преподаватель не примет "лишние сущности при вводе данных для вычислений".

Автор: pyxy 13.3.2012, 16:11
тут вы правы, сама не справлюсь, хоть на примере покажите как делать....

Автор: northener 14.3.2012, 00:37
Цитата(bems @  7.3.2012,  23:41 Найти цитируемый пост)
pyxy, ну добавь ввод высоты в InputData


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)