IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Считаем проценты под Delphi (https://www.imho.ws/showthread.php?t=80992)

steelik 04.03.2005 00:31

Считаем проценты под Delphi
 
как проверить, если в Edit1 ничего не ввели, значит считать X:= X=(S : ((Y*Z)+100))*100 , если Edit2 - то Y=((S-X) : Z) : (X : 100)

Также, какой тип лучше использовать, чтобы посчитать всё это и как поотом вывести? В те же самые Edit-ы. Желательно использовать Integer, даже если числа получаются нецелочисленные, всё равно нужны только округлённые!

вот как условия задачи мои звучат:
edit1 (x) вклад
edit2 (y) процент
edit3 (z) срок хранения (г.)
edit4 (s) итоговая сумма


X=(S : ((Y*Z)+100))*100
Y=((S-X) : Z) : (X : 100)
Z=(S-X) : ((X : 100)*Y)
S=X+((X : 100)*Y)*Z

По этим выражениям рассчитываются все представленные значения. Как я уже говорил - по трем известным вычисляется одна неизвестная. Вклад осуществляется в рублях, обычное число от 1-го и до бесконечности, итоговая сумма то же самое, процент от 1 до 100, срок хранения от 1-го года и до бесконечности, так же срок хранения только в годах, не может быть значений типа 0,8 или 2,4 т.к. в году 12 месяцев, да и лишний головняк никчему.

Madness 04.03.2005 02:25

steelik
div - целочисленное деление, ставь вместо ':' и считай с типом integer.

>если в Edit1 ничего не ввели,
if edit1.text="" then ...

>и как поотом вывести? В те же самые Edit-ы.
edit1.text:=IntToStr(x);

steelik 04.03.2005 10:09

var
X : Integer;
Y : Integer;
Z : Integer;
S : Integer;


procedure TForm1.FormCreate(Sender: TObject);
begin
X := 0;
Y := 0;
Z := 0;
S := 0;
Edit1.Text := '0';
Edit2.Text := '0';
Edit3.Text := '0';
Edit4.Text := '0';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
X:=StrToInt(Edit1.Text);
Y:=StrToInt(Edit2.Text);
Z:=StrToInt(Edit3.Text);
S:=StrToInt(Edit4.Text);

X :=( ( (Y*Z)+100 ) div S)*100;
Edit1.Text := IntToStr(X);

end;

Если в калькуляторе посчитать, одно получается, он считаеть подругому 8( И потом напиши пожалуйста пример с проверкой if... Что-то он там на несоответствие типов boolean, опять ругается!

Madness 04.03.2005 12:54

steelik
>Если в калькуляторе посчитать, одно получается, он считаеть подругому
Пример давай. div отбрасывает дробную часть. Если оно тебе не подходит, попробуй так X :=Round(((Y*Z+100)/S)*100);

>Что-то он там на несоответствие типов boolean, опять ругается!
Кавычки одинарные поставь.

Ghost 04.03.2005 12:59

Попробуй в
Код:

X :=( ( (Y*Z)+100 ) div S)*100;
поменять местами умножение и целочисленное деление
Код:

x := ((y * z + 100) * 100) div s;

steelik 04.03.2005 20:40

x := ((y * z + 100) * 100) div s;
Вот так вот заработало!

Madness
Ты очевидно имел введу if Edit1.Text <> '' then begin ... я так долго не работал с дельфи, что воспринял "=" вполне нормально, потому что частенько на перле сижу.
Как сделать проверку, пока не будет изменено три Edit-а, ну или не введены значения... не активизировать Button1.

Также, как правильно перевести, на дельфийския язык... снова проблемы
Y=((S-X) : Z) : (X : 100)
Z=(S-X) : ((X : 100)*Y)
S=X+((X : 100)*Y)*Z

x := ((y * z + 100) * 100) div s;
Вот так вот заработало!

Madness
Ты очевидно имел введу if Edit1.Text <> '' then begin ... я так долго не работал с дельфи, что воспринял "=" вполне нормально, потому что частенько на перле сижу.
Как сделать проверку, пока не будет изменено три Edit-а, ну или не введены значения... не активизировать Button1.

Также, как правильно перевести, на дельфийския язык... снова проблемы
Y=((S-X) : Z) : (X : 100)
Z=(S-X) : ((X : 100)*Y)
S=X+((X : 100)*Y)*Z

Madness 04.03.2005 20:48

steelik
Мдя, ты хоть попробовать сделать пытался или за тебя все делать нужно?

>Как сделать проверку, пока не будет изменено три Edit-а, ну или не введены значения... не активизировать Button1.
if edit1.text<>'' and ... and edit100.text<>'' then button1.enabled:=true
По дефолту сделай enabled (иль enable, не помню) false.

Y=(S-X)*100/X/Z иль (S-X)*100 div X*Z
Z=(S-X)/X*100/Y иль (S-X)*100 div X*Y
S=X+X/100*Y*Z иль X+X*Y*Z div 100

steelik 05.03.2005 00:39

if Edit1.Text<>'' AND Edit2.Text<>'' AND Edit3.Text<>''
then begin Button1.Enabled:=true end;


Operator not applicable to this operand type
В чем дело? И подскажи, куда лучше вставить эту проверку, в какое событие?

Gunslinger 05.03.2005 01:13

Вставь во все события изменения edit1, edit2, edit3. Только не забудь написать
if Edit1.Text<>'' AND Edit2.Text<>'' AND Edit3.Text<>''
then begin Button1.Enabled:=true end
else begin Button1.Enabled:=false end;

Ghost 05.03.2005 10:29

steelik
Ффух... Тебе это нужно?
Код:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit4: TEdit;
    Button1: TButton;
    procedure Button1Enable(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Enable(Sender: TObject);
begin
  Button1.Enabled := not((Edit1.Text = '') or (Edit2.Text = '') or (Edit3.Text = '') or (Edit4.Text = ''));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.OnChange := Button1Enable;
  Edit2.OnChange := Button1Enable;
  Edit3.OnChange := Button1Enable;
  Edit4.OnChange := Button1Enable;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x, y, z, s: integer;
begin
  x := StrToInt(Edit1.Text);
  y := StrToInt(Edit2.Text);
  z := StrToInt(Edit3.Text);
  s := StrToInt(Edit4.Text);
  Edit1.Text := IntToStr(((y * z + 100) * 100) div s);
  Edit2.Text := IntToStr(((s - x) div z) div (z div 100));
  Edit3.Text := IntToStr((s - x) div ((x div 100) * y));
  Edit4.Text := IntToStr(x + (x div 100) * y * z);
end;

end.



Часовой пояс GMT +4, время: 13:57.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.