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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2013, 15:55   #1
Ви5Кторинка
Пользователь
 
Регистрация: 15.05.2012
Сообщений: 10
По умолчанию Решение задач в Делфи

Описать класс «Обыкновенная дробь» с двумя полями: числитель и знаменатель, с двумя перегруженными конструкторами. Реализовать метод сравнения двух дробей, а также метод «положительная дробь» (функция логического типа). Написать программу, демонстрирующую работу с этим классом и протестировать этот метод.
Задачу сделала но преподаватель сказал что еще должны быть свойства (property). Очень прошу помочь, срочно нужно. Вот решенная задача.
Ви5Кторинка вне форума Ответить с цитированием
Старый 24.01.2013, 15:56   #2
Ви5Кторинка
Пользователь
 
Регистрация: 15.05.2012
Сообщений: 10
По умолчанию Решенная задача

Код:
Unit zadacha5;
INTERFACE
 type
 ds=1..3;
 TDrob=class             {описание класса}
      private ch: integer;   {поле Числитель}
              zn: integer;   {поле Знаменатель}
      public constructor Create; overload;  {перегруженный конструктор без параметров}
             procedure vvod;   {процедура для записи в поля}
             procedure vuvod;  {процедура для вывода полей}
             Function znac:boolean; {Функция Положительная дробь}
             Function srav(x:TDrob): ds;    {метод сравнения двух дробей}
             constructor Create (i,j: integer);overload;{перегруженный конструктор с параметрами}
 end;
Var i,j:integer;
IMPLEMENTATION
       constructor  TDrob.Create (i,j: integer);
       begin        ch:=i;    {задаем начальные значения в поля}
                    zn:=j;
       end;
       constructor  TDrob.Create;
       begin   randomize;
                         ch:=random(100);    {задаем случайные значения в поля}
                         zn:=random(100)+1;
       end;
procedure TDrob.vvod;
begin
Writeln ('vvedite chis drobi');
Readln (ch);                   {вводим числитель дроби}
Writeln ('vvedite znam drobi');
Readln (zn);                   {вводим знаменатель дроби}
while zn=0 do begin            {если знам равен 0, то выдаем сообщения об ошибке, и снова вводим знам}
Writeln('Znam ne mojet bit raven 0');
Writeln;
Writeln ('vvedite znam drobi');
Readln (zn);
              end;
end;
procedure TDrob.vuvod;
begin
Writeln ('chis ', ch);    {выводим на экран числитель}
Writeln ('znam ',zn);     {выводим на экран знаменатель}
end;

Function TDrob.znac: boolean; {функция положительная дробь}
begin
if ((ch>0)and(zn<0))or((ch<0)and(zn>0)) then znac:=false  {если знаки в числителе и знаменателе различаются, то функция принимает отрицательное значение}
                                       else znac:=true;   {иначе функция принимает положительное значение}

end;

Function TDrob.srav(x:TDrob): ds;
Var x1_ch:integer;
x2_ch:integer;
x1_zn:integer;
x2_zn:integer;
Begin
x1_ch:=ch;      {считываем значения полей каждой дроби в отдельные переменные}
x2_ch:=x.ch;
x1_zn:=zn;
x2_zn:=x.zn;

if x1_zn<0 then begin x1_ch:=x1_ch*(-1); x1_zn:=x1_zn*(-1); end;   {если знаменатель меньше нуля, то умножаем всю дробь на -1}
if x2_zn<0 then begin x2_ch:=x2_ch*(-1); x2_zn:=x2_zn*(-1); end;   {если знаменатель меньше нуля, то умножаем всю дробь на -1}
if x1_zn<>x2_zn then begin x1_ch:=x1_ch*x2_zn; x2_ch:=x2_ch*x1_zn; end;  {приводим дроби к общему знаменателю}
if x1_ch>x2_ch then result:=1  {сравниваем числители}
               else
     if x1_ch<x2_ch then result:=2    {если числитель первой дроби меньше}
                    else result:=3;
End;

end.



program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  zadacha5;

var  num: 1..5;
     One,Two:TDrob;
begin
  One:=TDrob.Create;    {вызываем конструкторы}
  Two:=TDrob.Create;
  while num<>5 do begin   {пока не введем 5, будет показываться меню}
  Writeln ('1. sozdat drodi  2. vuvesti na ekran  3. opredelit znac  4.sravnit drobi 5. Exit');
  Writeln ('vvedite nomer operacii');
  Readln (num);
  if num=1 then  begin      {если ввели 1}
                 One.vvod;  {вводим первую дробь}
                 Two.vvod;  {вводим вторую дробь}
                 end
                         {если ввели 2}
           else if num=2 then begin One.vuvod; {вызываем функцию вывода для каждой дроби}
                                    Two.vuvod;
                              end
                          else if num=3 then begin     {если ввели 3}
                                              if One.znac then Writeln ('drob 1 pologit')
                                                          else Writeln ('drob 1 otricatelnay');  {вызываем функцию Znac}
                                              if Two.znac then Writeln ('drob 2 pologit')          {для каждой дроби}
                                                          else Writeln ('drob 2 otricatelnay');

                                             end
                                             {если ввели 4}   {сравниваем дроби}
                                        else if num=4 then   if one.srav(two)=1 then Writeln('drob 1 > drobi 2')
                                                                                else
                                                                  if one.srav(two)=2 then Writeln('drob 1 < drobi 2')
                                                                                     else
                                                                      if one.srav(two)=3 then Writeln('drob 1 = drobi 2');

                  end;
end.

Последний раз редактировалось Stilet; 24.01.2013 в 17:03.
Ви5Кторинка вне форума Ответить с цитированием
Старый 24.01.2013, 15:59   #3
Ви5Кторинка
Пользователь
 
Регистрация: 15.05.2012
Сообщений: 10
По умолчанию Пример преподавателя

Код:
unit Drob;

interface

type
  tDrob=class
    private
      FChisl: integer;
      FZnam: integer;
      procedure SetZnam(_Znam:integer);
    public
      property Chisl: integer read FChisl write FChisl;
      property Znam: integer read FZnam write SetZnam;

      procedure Stepen(n: integer);
      procedure Multi(n: integer);
      function Positive(): boolean;
      function Show(): string;

      constructor Create(); overload;
      constructor Create(_Chisl, _Znam: integer); overload;
  end;

implementation

uses Dialogs, Math, SysUtils;

function tDrob.Show(): string;
begin
  result:=IntToStr(FChisl)+'/'+IntToStr(FZnam)
end;

function tDrob.Positive(): boolean;
begin
  result:=FChisl*FZnam>0
end;


procedure tDrob.Stepen(n: integer);
begin
  FChisl:=trunc(exp(n*Ln(FChisl)));
  FZnam:=trunc(Power(FZnam, n))
end;

procedure tDrob.Multi(n: integer);
begin
  FChisl:=n*FChisl;
end;

procedure tDrob.SetZnam(_Znam:integer);
begin
  if _Znam=0 then
    ShowMessage('Недопустимое значение знаменателя.')
  else
    FZnam:=_Znam
end;

constructor tDrob.Create();
begin
  FChisl:=0;
  FZnam:=1;
end;

constructor tDrob.Create(_Chisl, _Znam: integer);
begin
  FChisl:=_Chisl;
  Znam:=_Znam;
end;

end.




unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfMain = class(TForm)
    eCh1: TEdit;
    Label1: TLabel;
    eZn1: TEdit;
    Label2: TLabel;
    eZn2: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    eCh2: TEdit;
    bOk: TButton;
    lRez1: TLabel;
    lRez2: TLabel;
    lChislo: TLabel;
    eChislo: TEdit;
    bStep: TButton;
    bMulti: TButton;
    procedure FormCreate(Sender: TObject);
    procedure eCh1Change(Sender: TObject);
    procedure eCh2Change(Sender: TObject);
    procedure eZn1Change(Sender: TObject);
    procedure eZn2Change(Sender: TObject);
    procedure bOkClick(Sender: TObject);
    procedure eChisloChange(Sender: TObject);
    procedure bStepClick(Sender: TObject);
    procedure bMultiClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fMain: TfMain;

implementation

uses Drob;

{$R *.dfm}
var
  Dr1, Dr2: tDrob;
procedure TfMain.FormCreate(Sender: TObject);
begin
  Dr1:=tDrob.Create(0, 1);
  Dr2:=tDrob.Create(1, 2);
end;

procedure TfMain.eCh1Change(Sender: TObject);
begin
   try
     StrToInt(eCh1.Text)
   except
     eCh1.Text:='0'
   end;
   Dr1.Chisl:=StrToInt(eCh1.Text)
end;

procedure TfMain.eCh2Change(Sender: TObject);
begin
   try
     StrToInt(eCh2.Text)
   except
     eCh2.Text:='0'
   end;
   Dr2.Chisl:=StrToInt(eCh2.Text)
end;

procedure TfMain.eZn1Change(Sender: TObject);
begin
   try
     StrToInt(eZn1.Text)
   except
     eZn1.Text:='1'
   end;
   Dr1.Znam:=StrToInt(eZn1.Text)
end;

procedure TfMain.eZn2Change(Sender: TObject);
begin
   try
     StrToInt(eZn2.Text)
   except
     eZn2.Text:='1'
   end;
   Dr2.Znam:=StrToInt(eZn2.Text)
end;

procedure TfMain.bOkClick(Sender: TObject);
begin
  lRez1.Caption:=Dr1.Show;
  lRez2.Caption:=Dr2.Show
end;

procedure TfMain.eChisloChange(Sender: TObject);
begin
   try
     StrToInt(eChislo.Text)
   except
     eChislo.Text:='0'
   end;
end;

procedure TfMain.bStepClick(Sender: TObject);
var
  Ch: integer;
begin
  Ch:=StrToInt(eChislo.Text);
  Dr1.Stepen(Ch);
  Dr2.Stepen(Ch);

  bOkClick(Sender)
end;

procedure TfMain.bMultiClick(Sender: TObject);
var
  Ch: integer;
begin
  Ch:=StrToInt(eChislo.Text);
  Dr1.Multi(Ch);
  Dr2.Multi(Ch);

  bOkClick(Sender)
end;

end.




program Lab7;

uses
  Forms,
  main in 'main.pas' {fMain},
  Drob in 'Drob.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TfMain, fMain);
  Application.Run;
end.

Последний раз редактировалось Stilet; 24.01.2013 в 17:03.
Ви5Кторинка вне форума Ответить с цитированием
Старый 24.01.2013, 17:15   #4
Ви5Кторинка
Пользователь
 
Регистрация: 15.05.2012
Сообщений: 10
По умолчанию Вот я что то переделала но больше я не знаю что тут и как сделать что бы было как у него.

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  zadacha5 in 'zadach5.pas';  {делает доступными множество подпрограмм манипулирования данными}

var  num: 1..5;
     One,Two:TDrob;
begin
  One:=TDrob.Create;    {вызываем конструкторы}
  Two:=TDrob.Create;
  while num<>5 do begin   {пока не введем 5, будет показываться меню}
  Writeln ('1. sozdat drodi  2. vuvesti na ekran  3. opredelit znac  4.sravnit drobi 5. Exit');
  Writeln ('vvedite nomer operacii');
  Readln (num);
  if num=1 then  begin      {если ввели 1}
                 One.vvod;  {вводим первую дробь}
                 Two.vvod;  {вводим вторую дробь}
                 end
                         {если ввели 2}
           else if num=2 then begin One.vuvod; {вызываем функцию вывода для каждой дроби}
                                    Two.vuvod;
                              end
                          else if num=3 then begin     {если ввели 3}
                                              if One.znac then Writeln ('drob 1 pologit')
                                                          else Writeln ('drob 1 otricatelnay');  {вызываем функцию Znac}
                                              if Two.znac then Writeln ('drob 2 pologit')          {для каждой дроби}
                                                          else Writeln ('drob 2 otricatelnay');

                                             end
                                             {если ввели 4}   {сравниваем дроби}
                                        else if num=4 then   if one.srav(two)=1 then Writeln('drob 1 > drobi 2')
                                                                                else
                                                                  if one.srav(two)=2 then Writeln('drob 1 < drobi 2')
                                                                                     else
                                                                      if one.srav(two)=3 then Writeln('drob 1 = drobi 2');

                  end;
end.








Unit zadacha5;
INTERFACE
 type
 ds=1..3;
 TDrob=class             {описание класса}
 private
      ch: integer;   {поле Числитель}
      zn: integer;   {поле Знаменатель}
 public
 constructor Create; overload;  {перегруженный конструктор без параметров}
 procedure vvod;   {процедура для записи в поля}
 procedure vuvod;  {процедура для вывода полей}
 Function znac:boolean; {Функция Положительная дробь}
 Function srav(x:TDrob): ds;    {метод сравнения двух дробей}
 constructor Create (i,j: integer);overload;{перегруженный конструктор с параметрами}
 property i: integer read chis write chis;     {сваойства}
 property j: integer read znam write znam;

 end;
IMPLEMENTATION
Var i,j:integer;
constructor  TDrob.Create (i,j: integer);
begin
  ch:=i;    {задаем начальные значения в поля}
  zn:=j;
  end;
constructor  TDrob.Create;
begin
randomize;
ch:=random(100);    {задаем случайные значения в поля}
zn:=random(100)+1;
       end;
procedure TDrob.vvod;
begin
   Writeln ('vvedite chis drobi');
   Readln (ch);                   {вводим числитель дроби}
   Writeln ('vvedite znam drobi');
   Readln (zn);                   {вводим знаменатель дроби}
while zn=0 do begin            {если знам равен 0, то выдаем сообщения об ошибке, и снова вводим знам}
   Writeln('Znam ne mojet bit raven 0');
   Writeln;
   Writeln ('vvedite znam drobi');
   Readln (zn);
              end;
end;
procedure TDrob.vuvod;
begin
   Writeln ('chis ', ch);    {выводим на экран числитель}
   Writeln ('znam ',zn);     {выводим на экран знаменатель}
end;

Function TDrob.znac:boolean; {функция положительная дробь}
begin
if ((ch>0)and(zn<0))or((ch<0)and(zn>0)) then znac:=false  {если знаки в числителе и знаменателе различаются, то функция принимает отрицательное значение}
                                       else znac:=true;   {иначе функция принимает положительное значение}

end;

Function TDrob.srav(x:TDrob): ds;
Var
   x1_ch:integer;
   x2_ch:integer;
   x1_zn:integer;
   x2_zn:integer;
Begin
   x1_ch:=ch;      {считываем значения полей каждой дроби в отдельные переменные}
   x2_ch:=x.ch;
   x1_zn:=zn;
   x2_zn:=x.zn;

if x1_zn<0 then begin x1_ch:=x1_ch*(-1); x1_zn:=x1_zn*(-1);
                end;   {если знаменатель меньше нуля, то умножаем всю дробь на -1}
if x2_zn<0 then begin x2_ch:=x2_ch*(-1); x2_zn:=x2_zn*(-1);
                end;   {если знаменатель меньше нуля, то умножаем всю дробь на -1}
if x1_zn<>x2_zn then begin x1_ch:=x1_ch*x2_zn; x2_ch:=x2_ch*x1_zn;
                     end;  {приводим дроби к общему знаменателю}
if x1_ch>x2_ch then result:=1  {сравниваем числители}
               else
     if x1_ch<x2_ch then result:=2    {если числитель первой дроби меньше}
                    else result:=3;
End;

end.

Последний раз редактировалось Stilet; 24.01.2013 в 21:18.
Ви5Кторинка вне форума Ответить с цитированием
Старый 24.01.2013, 20:17   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Проверяй...

ошибка...
исправить
//к общему знаменателю
Ch:=Abs(Chislitel*x.Znamenatel);
ChX:=Abs(x.Chislitel*Znamenatel);
Вложения
Тип файла: zip Project2.zip (1.7 Кб, 12 просмотров)
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 24.01.2013 в 20:22.
Slym вне форума Ответить с цитированием
Старый 25.01.2013, 07:22   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

странно,почему вы с преподавателем пишите на разных платформах.он на делфи,ты на паскале.ну не суть.в твоем коде тебе только нужно заменить свои методы класса его методами-тупо копировать-вставить.и будет тебе как у него и добавить 2 свойства в описание класса.тоже из его кода возьми.и имена переменных как у него сделай.ну и в функции определения знака убери эти ненужные проверки и сделай в одну строчку умножением числитейя на знаменатель.если отрицательное число,то знал минус-если положительное или ноль-плюс.вот и все,ничего сложного
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
решение задач в делфи 7 Sketch_45 Помощь студентам 4 11.05.2013 14:12
Решение 3 задач делфи 7 за оплату. desert/rose Фриланс 8 20.11.2012 14:38
Оплачу решение задач (делфи) lbarmen Фриланс 2 22.11.2010 23:19
решение задач в делфи 7 irkalubimaya Помощь студентам 8 01.10.2009 11:47
Решение задач на делфи или си xakerx86 Помощь студентам 0 06.06.2009 21:35