| | |
| Stránka: 1 z 1
| [ Príspevkov: 6 ] | |
Autor | Správa |
---|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce |
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...
|
|
Registrovaný: 16.05.07 Prihlásený: 01.08.17 Príspevky: 837 Témy: 6 | Napísal juho: 02.11.2009 18:38 | |
|
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
|
|
Registrovaný: 11.01.09 Prihlásený: 02.05.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 03.11.2009 11:54 | |
|
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.
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 04.11.2009 19:05 | |
|
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.
|
|
Registrovaný: 11.01.09 Prihlásený: 02.05.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 06.11.2009 23:54 | |
|
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ť.
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 07.11.2009 12:55 | |
|
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;
|
|
| Stránka: 1 z 1
| [ Príspevkov: 6 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|