| Autor | Správa |
Siriuse
 Užívateľ
 Založený: 23.05.2009 Príspevky: 81 Bydlisko: Michalovce
 | Zaslal: Po 02.11.09 16:02 |   |
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... |
| |
   |
 |
juho
 Zablokovaný užívateľ
 Založený: 16.05.2007 Príspevky: 837
 | Zaslal: Po 02.11.09 19: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 |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Ut 03.11.09 12: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. |
|
| |
   |
 |
Siriuse
 Užívateľ
 Založený: 23.05.2009 Príspevky: 81 Bydlisko: Michalovce
 | Zaslal: St 04.11.09 20: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. |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 |
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ť. |
| |
   |
 |
Siriuse
 Užívateľ
 Založený: 23.05.2009 Príspevky: 81 Bydlisko: Michalovce
 | Zaslal: So 07.11.09 13: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;
|
|
| |
   |
 |
|