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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2010, 18:00   #11
Vampirius
Пользователь
 
Аватар для Vampirius
 
Регистрация: 25.09.2009
Сообщений: 22
По умолчанию

Вообщем вот что получилось:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
//***************************Создание класса дроби******************************
type
     TDrob = class;
         private
              chisl: Integer;   // Числитель дроби
              znam: Integer;    // Знаменатель
         public
              constructor Create;
              destructor Destroy;
//ввод дробей
              procedure Set (chisl, znam: Integer);
         var
a, b, c: TDrob;
s: string;
begin
s := edit1.Text;
a.chisl := strtoint(copy(s, 1, pos('/', s) - 1));
delete(s, 1, pos('/', s));
a.znam := strtoint(s);//Вывод первого числа
memo1.Lines.Add(первая дробь);
memo1.Lines.Add(inttostr(a.chisl) + '/' + inttostr(a.znam));

s := edit2.Text;
b.chisl := strtoint(copy(s, 1, pos('/', s) - 1));
delete(s, 1, pos('/', s));
b.znam := strtoint(s);//Вывод второго числа
memo1.Lines.Add(вторая дробь);
memo1.Lines.Add(inttostr(b.chisl) + '/' + inttostr(b.znam));

        If RadioButton1.checked
then c:= PrTDrob(a, b);//Умножение
memo1.Lines.Add(при умножение получаем);
memo1.Lines.Add(inttostr(c.chisl) + '/' + inttostr(c.znam));
        If RadioButton2.checked
then c:= DelTDrob(a,b);//Деление
memo1.Lines.Add(при деление получаем);
memo1.Lines.Add(inttostr(c.chisl) + '/' + inttostr(c.znam));
        If RadioButton3.checked
then c:= SlTdrob(a,b);//Сложение
memo1.Lines.Add(при сложение получаем);
memo1.Lines.Add(inttostr(c.chisl) + '/' + inttostr(c.znam));
        If RadioButton4.checked
then c:= VichTDrob(a,b);//Вычитание
memo1.Lines.Add(при вычитание получаем);
memo1.Lines.Add(inttostr(c.chisl) + '/' + inttostr(c.znam));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close
end;
//******************************************************************************
              function GetChisl(): Integer;
              function GetZnam(): Integer;
              procedure Add (Chisl, Znam): Integer;
    end;

implementation

{$R *.dfm}
//******************************************************************************
//наибольший общий делитель
function NOD(a, b: integer): integer;
begin
  if a = 0 then NOD := b
  else NOD := NOD(b mod a, a)
end;
//******************************************************************************
//Сокращение дроби
function socrTDrob(x: TDrob): TDrob;
var
        y: integer;
begin
        y := NOD(x.chisl, x.znam);//НОД
                while y <> 1 do begin//Проверка на возможность сокращения
        x.chisl := x.chisl div y;//Если выполняется то сокращаем числитель
        x.znam := x.znam div y;// и знаменатель на их НОД
        y := NOD(x.chisl, x.znam)
end;
  socrTDrob := x
end;
//******************************************************************************
//Произведение дробей
function PrTDrob(a, b: TDrob): TDrob;
var
        y: TDrob;
begin
y.znam := a.znam * b.znam;
y.chisl := a.chisl * b.chisl;
PrDrob := socrTDrob(y);
end;
//******************************************************************************
//Деление дробей
function DelTDrob(a, b:TDrob): TDrob;
var
        y: TDrob;
begin
y.znam:=a.znam * b.chisl;
y.chisl:=a.chisl * b.znam;
UmnTdrob:= socrTDrob(y);
end;
//******************************************************************************
//Сложение дробей
function SlTdrob(a, b: TDrob): TDrob;
var
        y: TDrob;
begin
y.znam:= (a.chisl*b.znam)+(b.chisl*a.znam);
y.chisl:= a.znam*b.znam;
SlTDrob:=socrTDrob(y);
end;
//******************************************************************************
//Вычитание дробей
function VichTDrob(a, b: TDrob): TDrob;
var
        y: TDrob;
begin
y.znam:= (a.chisl*b.znam)-(b.chisl*a.znam);
y.chisl:= a.znam*b.znam;
VichTDrob:=socrTDrob(y);
end;
//******************************************************************************

end.
З.Ы.
не нашёл как скопировать чтобы всё осталось как в Delphi
Лишь утратив всё до конца, мы обретаем свободу...©

Последний раз редактировалось Stilet; 15.04.2010 в 08:04.
Vampirius вне форума Ответить с цитированием
Старый 15.04.2010, 07:29   #12
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

В принципе не плохо, для первого раза. Но экземпляры класса перед использованием нужно инициализировать (то есть вызвать конструктор).
Мало просто написать
Код:
var
    y: TDrob;
нужно далее в тексте процедуры перед первым использованием y писать y:=TDrob.Create;
А в конце работы нужно обязательно освобождать такой объект y.Destroy; или y.Free; (последний деструктор предпочтительней).

Далее, проблемно возвращать экземпляры классов в качестве результатов функций. Вы можете вернуть TDrob, но это не просто результат функции, это полноценный экземпляр класса (который нуждается в инициализации и что гораздо хуже, нуждается в вызове деструктора). То есть перед использованием результата нужно писать result:=TDrob.Create; а уж потом присваивать ему какое-либо значение. Но это еще полбеды как только Вы передадите такой результат из функции, то потом Вы его освободить (вне функции) не сможете. И тогда с каждым вызовом такой функции у Вас будет каждый раз создаваться новый объект TDrob. Теперь представьте, что перед Вами массив дробей - Вы их складываете, умножаете, делите и все такое. Каждая операция возвращающая TDrob будет увеличивать объем памяти требуемой программе для работы. И рано или поздно операционная система откажется ей выделять память. Явление когда программа не контролируемо требует себе все больше ОЗУ называется утечками памяти и является самой распространенной неявной проблемой при работе с классами. Чтобы такого не случилось все экземпляры класса должны явно конструироваться (через вызов Create класса) и разрушаться через вызов Free или Destroy экземпляра класса.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 15.04.2010, 08:09   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это разве будет работать?
Я признаться не знал что до implementation можно описывать код методов.
Да и не вижу где у тебя класс закрывается end'ом...

Оффтоп:
Цитата:
Лишь утратив всё до конца, мы обретаем свободу
Жестокая, книга... Маргинализм... О чем Паланик думал когда ее писал
I'm learning to live...

Последний раз редактировалось Stilet; 15.04.2010 в 08:11.
Stilet вне форума Ответить с цитированием
Старый 15.04.2010, 21:23   #14
Vampirius
Пользователь
 
Аватар для Vampirius
 
Регистрация: 25.09.2009
Сообщений: 22
По умолчанию

Вот именно что первый раз писал классы.
Она не работает. буду дорабатывать чтобы хотя бы запускалась...
Лишь утратив всё до конца, мы обретаем свободу...©
Vampirius вне форума Ответить с цитированием
Старый 16.04.2010, 07:20   #15
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Возьми какой-нибудь учебный пример и распихай все по нужным секциям (что должно быть в Interface, что в implementation и т.д.).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 16.04.2010, 08:32   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
буду дорабатывать
Ну вот по той ссылке что я дал и посмотри как правильно делать
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.04.2010, 20:07   #17
Vampirius
Пользователь
 
Аватар для Vampirius
 
Регистрация: 25.09.2009
Сообщений: 22
По умолчанию

Вопрос: сколько может стоить доработка имеющегося кода до рабочей программы?
Вид Формы имеется.
Лишь утратив всё до конца, мы обретаем свободу...©
Vampirius вне форума Ответить с цитированием
Старый 27.04.2010, 13:42   #18
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Vampirius Посмотреть сообщение
Вопрос: сколько может стоить доработка имеющегося кода до рабочей программы?
Вид Формы имеется.
В смысле? Прога из этой темы?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 27.04.2010, 17:20   #19
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

делфи не очень годится для таких вычислений - он не поддерживает перегрузку математических операций между объектами класса, приходится колдовать

т.е. нельзя объявить объекты класса и делать вычисления между ними, а как удобно на С-подобных языках

Код:
Fract obj = new Fract(); // пустая дробь (для вычислений)
Fract obj1 = new Fract(1, 2); // т.е. дробь 1/2
Fract obj2 = new Fract(2, 3);

obj = obj1 + obj2; // obj будет равен дроби 7/6
надеюсь выйдет след. версия Делфи, где сделают полноценную перегрузку, а пока этого нет даже в 2010 версии
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 29.04.2010, 01:30   #20
Vampirius
Пользователь
 
Аватар для Vampirius
 
Регистрация: 25.09.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
В смысле? Прога из этой темы?
да. Из того что уже есть сделать нечто рабочее
Лишь утратив всё до конца, мы обретаем свободу...©
Vampirius вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
КЛАСС 4ika Общие вопросы C/C++ 1 16.03.2010 21:32
C++ . Класс Ануар56 Помощь студентам 8 23.04.2009 19:41
Собственный класс диалогового окна на чистом WinApi в Delphi Iber Win Api 19 01.12.2008 15:40
Класс Юлёк Фриланс 6 15.06.2008 15:00