[ Príspevkov: 6 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 23.05.09
Prihlásený: 16.01.18
Príspevky: 95
Témy: 39 | 39
Bydlisko: Michalovce
NapísalOffline : 02.11.2009 15:02 | Intervaly

Potreboval by som pomoc s algorytmizovanim jedneho problemu. Mam dva casove intervaly v hodinach, s tym ze mozu prejst aj do dalsieho dna. Potrebujem zistit ci sa jeden cely interval nachadza v druhom. Jediny problem je v tom ze tie intervaly mozu prejst do dalsieho dna, priklad: nachadza sa 22-24 v intervale 22-01? vystup ma byt true, skusal som to tak ze ak je koniec nadradeneho intervalu mensi ako zaciatok tak priratam 24 taktiez aj v tom druhom ale pokial je su nadradeny: 22-02 a ten druhy 00-01 tak to nefunguje, jednedochu je to riadna blbost. Alebo vlastne by to potreboval trosku inac mam jeden interval od do, a vela malych intervalov a treba vypisat ktore su a ktore niesu uplne cele v tom nadradenom. Dufam ze som vas nemystifikoval, a dufam ze ste taky makaci ze to poriesite, dakujem dakujem...


Offline

Užívateľ
Užívateľ
Intervaly

Registrovaný: 16.05.07
Prihlásený: 01.08.17
Príspevky: 837
Témy: 6 | 6
NapísalOffline : 02.11.2009 18:38 | Intervaly

mystifikacia? hmmm naprv pises ze mas dva intervaly potom ze ich mas vela. preco si sem nedal usek kodu...aby si nemystifikoval
aky typ mas interval ake tam mas premenne?
a ktory to je nadradeny interval ... a to tam existuje aj podradeny
ako sak a co chces matematicke riesenie alebo logicke?
napr to logicke si skusal:
Kód:
INT1 22-02
INT2 00-01
if((22<00)or(02>01))then INT2 sa nachadza v INT1

ale som si vsimol ze tam mas 25 hodinovy den ked od 0 po 24 je 25 cisel. tak ale modulo 24 by malo ten martansky den odstranit


Offline

Skúsený užívateľ
Skúsený užívateľ
Intervaly

Registrovaný: 11.01.09
Prihlásený: 28.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 03.11.2009 11:54 | Intervaly

Nech sa páči, malo by to fungovať správne :) . Je to zapuzdrené v triede TInterval kôli jednoduchému ovládaniu. To si ale samozrejme uprav podľa tvojich potrieb. Celá "veda" je vo funkcii Is1In2:

Kód:
unit Unit1;

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs;

interface

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

  INTERVAL = record
    _od, _do: byte;
  end;

  TInterval = class
    int_1, int_2: INTERVAL;
  public
    function Is1In2: boolean;
    constructor Create(i1, i2: INTERVAL);
    destructor Destroy; override;
  end;

var
  Form1: TForm1;
  prvy_interval, druhy_interval: INTERVAL;
  moje_intervaly: TInterval;

implementation

{ TForm1 }

constructor TInterval.Create(i1, i2: INTERVAL);
begin

  if (int_1._od = 0) then int_1._od:= 24;    // oprava v pripade chybneho zadania}
  if (int_1._do = 0) then int_1._do:= 24;
  if (int_2._od = 0) then int_2._od:= 24;
  if (int_2._do = 0) then int_2._do:= 24;

  int_1:= i1;
  int_2:= i2;

end;

destructor TInterval.Destroy;
begin

  inherited;

end;

function TInterval.Is1In2: boolean;
begin

  result:= false;

  if not( (int_1._od >= int_2._od) or (int_1._od <= int_2._do) ) then exit;

  if not( (int_1._do >= int_2._od) or (int_1._do <= int_2._do) ) then exit;

  result:= true;

end;


{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin

  prvy_interval._od:= 22; prvy_interval._do:= 1;
  druhy_interval._od:= 22; druhy_interval._do:= 2;

  moje_intervaly:= TInterval.Create(prvy_interval, druhy_interval);
  if moje_intervaly.Is1In2 then
    ShowMessage('ok');

end;

end.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 23.05.09
Prihlásený: 16.01.18
Príspevky: 95
Témy: 39 | 39
Bydlisko: Michalovce
Napísal autor témyOffline : 04.11.2009 19:05 | Intervaly

tak to upresnim, na vstupe su 4 real premenne, zaciatok a koniec nadradeneho intervalu (to je ten v ktorom sa ma nachadzat ten druhy), a potom ten normalny interval tiez zaciatok a koniec. Vystup ma byt boolean, pokial sa nachadza tak true. Intervaly mozu prechadzat aj do druheho dna (22-02 a pod) aalebo byt aj cely v druhom dni (22-02, 01,02). Interval sa nachadza v nadradenom iba ak je tam cely. Nesmie zacinat v intervale a koncit mimo, pretoze tam uz nieje priklad(22-24,23-01 by malo vypisat false a nie true). Ze musia byt cele, inac to nefunguje Fico. Staci ak mi napisete len tu funkciu.


Offline

Skúsený užívateľ
Skúsený užívateľ
Intervaly

Registrovaný: 11.01.09
Prihlásený: 28.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 06.11.2009 23:54 | Intervaly

Mám otázku. Keďže tie koncové body intervalov majú byť real, chceš používať aj hodnoty, ako 13.5, 5.25 atď ? Ak nie (teda budeš používať iba celé čísla, aké si uvádzal aj v príkladoch), tak riešenie viem prerobiť.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 23.05.09
Prihlásený: 16.01.18
Príspevky: 95
Témy: 39 | 39
Bydlisko: Michalovce
Napísal autor témyOffline : 07.11.2009 12:55 | Intervaly

Jasne, aj s desatinou castou pretoze do vstupu na programe sa zadavaju aj hodiny ako 20:20 a podobne, tak pre zjednodussenie sa to premeni na real a bude to 20,3

ale uz som to spravil

Kód:
function intcheck(zac,kon, chzac, chkon: real):boolean;
begin
  result:=false;

If Kon<Zac
then
Kon:=Kon+24;

if Zac>chzac
then
chzac:=chzac+24;
if Kon<chzac
then
result:=true;

if zac>chkon
then
chkon:=chKon+24;

if Kon<ChKon
then
result:=true;
end;


 [ Príspevkov: 6 ] 


Intervaly



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

gmail - dlhé intervaly načítavania mailov

v Internet, služby a sociálne siete

5

500

03.07.2013 22:43

comix



© 2005 - 2026 PCforum, edited by JanoF