Diskuze: pascal - dynamické alokování proměnných

Ostatní jazyky Delphi Delphi (Pascal) pascal - dynamické alokování proměnných

Avatar
haubeltova
Člen
Avatar
haubeltova:

Ahoj :) Potřebuju napsat proceduru, která načte ze souboru souřadnice polygonů..
na každém řádku souboru je výčet po sobě jdoucích bodů jednoho polygonu, potřebuju to dynamicky a pořád mi tam něco nefunguje :( Kdyby se na to někdo podíval, budu vděčná :)
Snažila jsem se to napsat jako lineární spojový seznam polygonů, kde každá "buňka" obsahuje odkaz na další lineární spojový seznam (vlákno bodů)...

type Tbod = record
x: real;
y: real;
end;
type Tbody =^body; {linearni spojovy seznam, obsahuje jednotlive body}
body = record
souradnice: Tbod;
dalsi:Tbody;
end;
type Tpolygony =^polygon; {linearni spojovy seznam, obsahuje polygony}
polygon = record
cislo: integer;
info: Tbody;
dalsi: Tpolygony;
end;
procedure nacti_data (var hlava:Tpolygony);
var punkt: Tbod;
poradove_cislo: integer;
posuvnik_v_po­lygonech: Tpolygony;
posuvnik_v_bodech: Tbody;
begin
assign (data, 'data.txt');
reset (data);
new (hlava);
hlava^.dalsi:=nil;
new (posuvnik_v_po­lygonech);
posuvnik_v_po­lygonech^.dal­si:=nil;
hlava:=posuvnik_v_po­lygonech;
poradove_cislo:=1;

while not EOF (data) do
begin
posuvnik_v_po­lygonech^.cis­lo:=poradove_cis­lo;
inc (poradove_cislo);
{new (posuvnik_v_po­lygonech^.info);
posuvnik_v_po­lygonech^.info^dal­si:=nil;}
posuvnik_v_bo­dech:=posuvnik_v_po­lygonech^.info;
while not EOLN (data) do
begin
read (data, punkt.x);
read (data, punkt.y);
posuvnik_v_bo­dech^.souradni­ce.x:=punkt.x;
posuvnik_v_bo­dech^.souradni­ce.y:=punkt.y;
new (posuvnik_v_bo­dech^.dalsi);
posuvnik_v_bo­dech^.dalsi^.dal­si:=nil;
posuvnik_v_bo­dech:=posuvnik_v_bo­dech^.dalsi;
end;
new (posuvnik_v_po­lygonech^.dal­si);
posuvnik_v_po­lygonech^.dal­si^.dalsi:=nil;
posuvnik_v_po­lygonech:=posuv­nik_v_polygonech^­.dalsi;
end;
close (data);
end;

 
Odpovědět 24.8.2013 19:35
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na haubeltova
Inoue Yūki:

Dívka se tu vidi málokdy... Alespoň nadšení nezmizelo :)

Nahoru Odpovědět  -1 24.8.2013 19:48
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

Nauč se odsazovat. Dost blbě se to čte.

new (hlava);
hlava^.dalsi:=nil;
new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;
hlava:=posuvnik_v_polygonech;

Tady vidíš, že jsi vytvořila dynamickou proměnnou "hlava" a o pár řádek níž jsi ji zlikvidovala tím, že jsi do ní uložila "posuvnik_v_po­lygonech".

Nahoru Odpovědět  +1 24.8.2013 20:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
haubeltova
Člen
Avatar
haubeltova:

Ahoj :) Děkuju moc za přečtení :D

Pardon, za to odsazování, nějak se to okopírovalo bez toho, tak pokus číslo 2...

Jé, děkuju moc, to je pravda... to by mi tam asi zůstalo alokovaný prázdný místo bez odkazu... takže jen nevytvářet new (hlava)? Tím, že to mám jednosměrný spojový seznam, tak potřebuju mít jeden odkaz na začátek (hlava) a jeden, abycvh mohla pracovat s "aktuálním koncem" (posuvník v polygonech)... Ale myslím, že v tom není hlavní chyba :( Myslím, že ten největší problém je u těch vložených spojových seznamů do toho hlavního, těch, které obsahují souřadnice bodů :(

Editováno 24.8.2013 20:48
 
Nahoru Odpovědět 24.8.2013 20:41
Avatar
haubeltova
Člen
Avatar
haubeltova:

procedure nacti_data (var hlava:Tpolygony);
var punkt: Tbod;
poradove_cislo: integer;
posuvnik_v_po­lygonech: Tpolygony;
posuvnik_v_bodech: Tbody;
begin
assign (data, 'data.txt');
reset (data);
new (hlava);
hlava^.dalsi:=nil;
new (posuvnik_v_po­lygonech);
posuvnik_v_po­lygonech^.dal­si:=nil;
hlava:=posuvnik_v_po­lygonech;
poradove_cislo:=1;

while not EOF (data) do
begin
posuvnik_v_po­lygonech^.cis­lo:=poradove_cis­lo;
inc (poradove_cislo);
{new (posuvnik_v_po­lygonech^.info);
posuvnik_v_po­lygonech^.info^dal­si:=nil;}
posuvnik_v_bo­dech:=posuvnik_v_po­lygonech^.info;
while not EOLN (data) do
begin
read (data, punkt.x);
read (data, punkt.y);
posuvnik_v_bo­dech^.souradni­ce.x:=punkt.x;
posuvnik_v_bo­dech^.souradni­ce.y:=punkt.y;
new (posuvnik_v_bo­dech^.dalsi);
posuvnik_v_bo­dech^.dalsi^.dal­si:=nil;
posuvnik_v_bo­dech:=posuvnik_v_bo­dech^.dalsi;
end;
new (posuvnik_v_po­lygonech^.dal­si);
posuvnik_v_po­lygonech^.dal­si^.dalsi:=nil;
posuvnik_v_po­lygonech:=posuv­nik_v_polygonech^­.dalsi;
end;
close (data);
end;

 
Nahoru Odpovědět 24.8.2013 20:49
Avatar
haubeltova
Člen
Avatar
 
Nahoru Odpovědět 24.8.2013 20:55
Avatar
haubeltova
Člen
Avatar
haubeltova:

Tak nakonec vloženo jako obrázek :D omluvám se, ale opravdu nevím, jak to sem jinak vložit, snad už je to přehlednější :o)

 
Nahoru Odpovědět 24.8.2013 20:57
Avatar
haubeltova
Člen
Avatar
haubeltova:
type Tbod    = record
    x: real;
    y: real;
                        end;
type Tbody =^body;  {linearni spojovy seznam, obsahuje jednotlive body}
     body = record
     souradnice: Tbod;
     dalsi:Tbody;
                 end;
type Tpolygony =^polygon; {linearni spojovy seznam, obsahuje polygony}
     polygon = record
       cislo: integer;
       info: Tbody;
       dalsi: Tpolygony;
                      end;

procedure nacti_data (var hlava:Tpolygony);
var punkt: Tbod;
    poradove_cislo: integer;
    posuvnik_v_polygonech: Tpolygony;
    posuvnik_v_bodech: Tbody;
begin
assign (data, 'data.txt');
reset (data);
new (hlava);
hlava^.dalsi:=nil;
new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;
hlava:=posuvnik_v_polygonech;
poradove_cislo:=1;

while not EOF (data) do
  begin
    posuvnik_v_polygonech^.cislo:=poradove_cislo;
    inc (poradove_cislo);
    {new (posuvnik_v_polygonech^.info);
    posuvnik_v_polygonech^.info^dalsi:=nil;}
    posuvnik_v_bodech:=posuvnik_v_polygonech^.info;
    while not EOLN (data) do
      begin
        read (data, punkt.x);
        read (data, punkt.y);
        posuvnik_v_bodech^.souradnice.x:=punkt.x;
        posuvnik_v_bodech^.souradnice.y:=punkt.y;
        new (posuvnik_v_bodech^.dalsi);
        posuvnik_v_bodech^.dalsi^.dalsi:=nil;
        posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
      end;
     new (posuvnik_v_polygonech^.dalsi);
     posuvnik_v_polygonech^.dalsi^.dalsi:=nil;
     posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
  end;
close (data);
end;

Tak nakonec jsem se doklikala i k normálnímu vložení xD

Editováno 24.8.2013 21:02
 
Nahoru Odpovědět 24.8.2013 21:01
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

Ty nevidíš to tlačítko pro vložení zdrojového kódu? Jako obrázek to sem nedávej, s tím nemohu dělat vůbec nic.

Kdybys aspoň měla pro posuvníky pohodlnější názvy :( Proč tam vlastně máš to slovo "posuvnik"? Vždycky jsme na takové pomocné proměnné používali "p" nebo tak nějak.

new(hlava);
hlava^.dalsi:=nil;
posuvnik_v_polygonech:=hlava;
poradove_cislo:=1;

To je jen část úpravy. Ještě se dívám na zbytek.

Nahoru Odpovědět 24.8.2013 21:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

Ještě si přisadím: Vždycky nás varovali před používáním názvů proměnných: "promenna", "cislo", "retezec", "zaznam" apod. To už je lepší používat názvy "i", "j", "k", "p".

Nahoru Odpovědět 24.8.2013 21:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

Místo

posuvnik_v_bodech^.souradnice.x:=punkt.x;
posuvnik_v_bodech^.souradnice.y:=punkt.y;

stačí jen

posuvnik_v_bodech^.souradnice:=punkt;
Nahoru Odpovědět  +1 24.8.2013 21:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

Celé by se ti to dělalo mnohem lépe, kdyby sis implementovala datové typy seznam polygonů a seznam bodů. V téhle změti se mi to dost blbě hledá a snadno se v tom udělá chyba. Také máš na konci vždy jeden zbytečný prvek, který vůbec nemusel vzniknout.

Nahoru Odpovědět 24.8.2013 21:29
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
haubeltova
Člen
Avatar
haubeltova:

Děkuju moc :o) já vím, že to je dost paskvil... studuju matematiku, programování máme spíš okrajově... :P už teď se v tom přestávám orientovat, možná to i přepíšu, abych to měla pojmenované výstižněji :o) vždycky mi to zkompilovalo, ale hlásí mi to běhové chyby už před tím

posuvnik_v_bodech^.souradnice.x:=punkt.x;
posuvnik_v_bodech^.souradnice.y:=punkt.y;

respektive před

posuvnik_v_bodech^.souradnice:=punkt;

... zkrátka je tam nějaký problém s alokováním začátku toho seznamu bodů, který je uložen u každého polygonu :(

 
Nahoru Odpovědět 24.8.2013 21:31
Avatar
haubeltova
Člen
Avatar
haubeltova:

Seznam polygonů a seznam bodů? Jako nějak odděleně? Problém je, že já nemám zadané žádné požadavky na vstup, takže tam může být libovolné množství polygonů... tím pádem polygony musím ukládat dynamicky... zárove%n každý polygon může mít libovolný počet vrcholů, takže ty body potřebuju ukládat také dynamicky... nic jiného, než jednosměrný spojový seznam polygonů, kde každý prvek obsahuje odkaz na jednosměrný spojový seznam bodů, mě nenapadá...

 
Nahoru Odpovědět 24.8.2013 21:35
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

Pokud studuješ matematiku, tak vás mají učit jazyky Python nebo Matlab (resp. Octave), které na rozdíl od Pascalu budeš používat a budou ti vyhovovat mnohem víc. Takhle je to pro tebe jen utrpení a nulový přínos.

Nahoru Odpovědět 24.8.2013 21:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
haubeltova
Člen
Avatar
haubeltova:

Jn, ale s tím asi moc nepohnu :D Dokonce se mi i nějakým zázrakem podařilo udělat zkoušku, jen musím doklepat zápočet a pak už to nikdy neuvidím :D max. jen tak "pro radost" jako nějaký nepovinný předmět :D mně to i vcelku baví, jen to ladění je vždycky oříšek :D

 
Nahoru Odpovědět  +1 24.8.2013 21:40
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

No právě. Klíčové je to slovo seznam . Je tedy víc než vhodné si vyrobit abstraktní datový typ seznam, který bude umět přidávat položky, mazat položky, zjistit svoji délku apod. To vše bez podobných experimentů s ukazateli. Ty zůstanou uvězněny ve funkcích seznamu a vně nebudou vůbec vidět.

Bohužel nevím, co všechno dnešní Pascal umí. Pokud v něm funguje OOP, mohlo by to řešení být mnohem, mnohem jednodušší, ba i triviální.

Nahoru Odpovědět 24.8.2013 21:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
haubeltova
Člen
Avatar
haubeltova:

Aha, tak to už je nad moje znalosti a schopnosti :D děkuju moc za rady a opravy, když tam bude těch chyb míň, tak to třeba najdu :D Ještě jednou díky za čas a hezký večer :)

 
Nahoru Odpovědět 24.8.2013 21:46
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

Programování v Pythonu nebo Octave. To je pro radost.

Nahoru Odpovědět 24.8.2013 21:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

Možná je v Pascalu datový typ seznam. Zkus ho použít.

Nahoru Odpovědět 24.8.2013 21:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Vojtěch Mašek (Woyta):

Klasický pascal neumí dynamicky přidělovat paměť.
Všechny potřebné proměnné se alokují při spuštění programu v deklarační části "var".

Editováno 25.8.2013 0:07
Nahoru Odpovědět 25.8.2013 0:04
Výraz "to nejde" není v mém slovníku
Avatar
Kit
Redaktor
Avatar
Odpovídá na Vojtěch Mašek (Woyta)
Kit:

V tom případě nezbývá nic jiného, než si naimplementovat vlastní ArrayList nebo LinkedList. Při každé manipulaci se seznamem by se mi už nechtělo hrát si s ukazateli jako za pionýrských dob.

V Pascalu jsou ještě dynamicky alokované proměnné přes funkce new() a dispose(). Ovšem je to podobný hard-level jako malloc() v C. Pro mne už to není. Užil jsem si toho dost a nyní se bez toho docela rád obejdu.

Nahoru Odpovědět 25.8.2013 0:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na haubeltova
David Čápka:

Můžeš se inspirovat tímto seznamem v Pascalu: http://mircosoft.mzf.cz/…/SEZNAMY.PAS Jinak se divím, že se to ještě někde učí, je to muzejní jazyk :)

Editováno 25.8.2013 9:15
Nahoru Odpovědět 25.8.2013 9:15
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Když ten vyučující nic jiného neumí ...

Učit matematiky Pascal je zbytečné, zejména na takových hloupých příkladech. Tím jen získají odpor k programování. Počítač se pro ně stane protivníkem, přitom má být spojencem.

Nahoru Odpovědět 25.8.2013 10:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
haubeltova
Člen
Avatar
haubeltova:

Nejde o vyučujícího...Na MFF se všichni učí Pascal...i informatici začínají pascalem a pak jdou na jiné programovací jazyky - teorie, že pascal vzniknul jako výukovej jazyk a snadno se z něj přechází na ostatní jazyky (prý), protože se v něj člověk nenaučí žádné "chyby"... co povoluje pascal, povolují všechny ostatní jazyky, né naopak (nemám s čím porovnávat, jen papouškuju) :D

Děkuju moc za ten příklad seznamu... s tím celkem nemám problémy, jenže já pořebuju přesně takovýhle seznam, ale v každé položce seznamu potřebuju odkaz na další jednosměrný seznam... a když mám v dynamicky alokované proměnné další dynamicky alokovaný proměnný, tak už nevím, jak se to píše... respektive myslela jsem si, že vím, ale pořád mi to hlásí chybu :D

respektive o prázdninách mi ukradli notebook s (nesmějte se moc) windows Xp, kde mi fungoval starej borland pascal... teď mám novej noťas, s windows 8 a to už nerozjede... takže to zkouším v lazaru a akorát mi to hlásí chyby, ale nepíše "CO" se tomu nelíbí, takže jsem z toho mírně zoufalá :D Pardon za tento výlev, musela jsem si postěžovat xD

 
Nahoru Odpovědět 25.8.2013 11:29
Avatar
Nahoru Odpovědět 25.8.2013 12:40
Výraz "to nejde" není v mém slovníku
Avatar
Kit
Redaktor
Avatar
Odpovídá na haubeltova
Kit:

Nic z toho mi k smíchu nepřipadá.

Ten původní Borland Pascal už nenajdeš?

Pascal byl svého času dobrý programovací jazyk a pro výuku se hodil. Dokonce jsem v něm kdysi dělal i OOP, ale vůbec mi to nešlo. Dnes už je překonán lepšími jazyky, které se pro výuku hodí mnohem lépe a můžeš u nich dokonce i zůstat. Pro programátory je to Java či C#, pro matematiky spíš Python (nativně umí nejen seznamy, ale např. komplexní čísla) a pro práci s maticemi Matlab či Octave.

Posledně jmenované umí nativně násobit nebo invertovat matice, počítat determinanty, řešit soustavy rovnic a vykreslí třeba i výsledné 3D grafy. Tohle by se měli učit matematici používat, tohle je pro ně užitečné.

Nahoru Odpovědět 25.8.2013 13:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Ahoj,

** Sehnání BP7 **
jestli jsi z MFF (což předpokládám, že podle příspěvku výše ano) a máš problém sehnat Borland Pascal 7, měl by se nchaázet na strojích v počítačových laboratořích. Na Malé Straně je určitě, v karlíně by mohl být také. Mělo by ho stačit jen zkopírovat k sobě. Myslím, že žádné další kroky při jeho instalaci nenastávají. V labu na Malé Straně jsem prakticky každý všední den, takže ti ho můžu případně sehnat. Ale budeš na něj asi potřebovat virtuální počítač. Resp. ono existuje i grafické rozhraní pro Windows (bpw.exe myslím), ale nevím, jak moc dobře funguje, dělal jsem v něm jen jednou.

** Lazarus **
Lazarus by měl pro tvoje potřeby stačit, ale co jsem ho zkoušel před nějakou dobou, nedosahuje takového komfortu co se týče vývoového prostředí. Například krokování v něm bylo velmi bolestivé (alespoň mně probíhalo po jednotlivých instrukcích CPu, což předpokládám, že zažít nechceš).

Co se týče výukovosti:
Podle mě to myslí tak, že v Pascalu není třeba v základu používat složitější (a nebezpečnější) věci jako ukazatele či objekty (třídy), navíc se tam dobře pracuje s řetězci. To znamená, že začátečníci by neměli být mateni nutností začít hned používat OOP (alespoň trošku), což je v Javě či C# nemine. Je fakt, že třeba na Ostravské univerzitě se začíná Javou a první semestr je ta výuka čistě procedurální. Přišlo mi ale, že to ty lidi dost mate, když tam mají podivné zápisy (volání metod na objektech, definice třídy), kterým nerozumí, ale potřebují je, aby mohli programovat procedurálně.

Matlab/Matematicu se, pokud vím, budete učit ve vyšších ročnících. Nejsem na matematice, ale občas na nějaký ten předmět od vás zavítám. O Pythonu/Octave nic nevím. Ono tím programováním v Pascalu nás zřejmě chtějí trochu naučit, jak to všechno funguje na systémové úrovni, což je podle mě dobře. Vím, že ale docela dost studentů (a studentek) potřebuje nějaký čas (popř. lépe podané vysvětlení než na přednáškách/cvi­čeních), než tyhle věci jako dynamické datové struktury, pochopí (to se týká i informatiků).

Pokud je problém ještě aktuální, tak můžeš někam hodit aktuální verzi zdrojáku a já se na ni podívám.

Nahoru Odpovědět  +1 25.8.2013 13:53
2 + 2 = 5 for extremely large values of 2
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Dráb
Kit:

Práce s řetězci se v Pascalu nějak zlepšila? Vždycky byla děsně nepohodlná, musela se deklarovat maximální délka stringu a už si ani nepamatuji, jak se stringy spojovaly, vyhledávaly substringy apod.

Nahoru Odpovědět 25.8.2013 14:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Vojtěch Mašek (Woyta):

V Turbo Pascalu se s řetězci dělalo celkem dobře, už si nepamatuju ty funkce ale třeba spojování se dělalo operátorem +

Nahoru Odpovědět 25.8.2013 14:37
Výraz "to nejde" není v mém slovníku
Avatar
Kit
Redaktor
Avatar
Odpovídá na Vojtěch Mašek (Woyta)
Kit:

Vím, že byl problém s dynamickou délkou stringu, musela se vždy deklarovat maximální délka. Ani nevím, jak je to s podporou Unicode - asi není žádná. Dynamické struktury byly k dispozici jen přes ukazatele, takže na úrovni jazyka C...

Nahoru Odpovědět 25.8.2013 14:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Kit
Martin Dráb:

Deklarovat maximální délku nebylo povinné. Pokud tak člověk neudělal, maximální délka byla nastavena na 255 znaků (což je i maximální délka pascalovského řetězce vůbec).

Pro spojování se používal operátor +. Pro vyhledávání substringů lze použít funkci Pos. Asi tam nenajdeš nějaké extra pokročilé funkce pro dělání vylomenin, ale pro výukové účely to určitě stačí, zvláště když jde o algoritmy a ne o programovací jazyk jako takový.

Jasně, C#, Java, C++ apod. mají práci s řetězci také jednoduchou. Ale třeba v proovnáním s C jsou pascalovské řetězce naprosto megasuper.

Nahoru Odpovědět 25.8.2013 14:43
2 + 2 = 5 for extremely large values of 2
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na haubeltova
David Čápka:

Koukni se na web člena Mircosoft, mám dojem, že tam má toho Pascala ke stažení. FreePascal funguje jinak a určitě bych to v něm nedělal, protože to potom nemusí fungovat.

Nahoru Odpovědět 25.8.2013 14:44
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Pascal uměl stringy dobře, to v céčku to byl porod.

Nahoru Odpovědět 25.8.2013 14:45
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Nahoru Odpovědět 25.8.2013 14:56
Výraz "to nejde" není v mém slovníku
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Dráb
Kit:

To je hrozné, jak se to člověku vykouří z hlavy. A to jsem v Pascalu napsal stovky programů...

255 znaků, už si vzpomínám. Bylo to kvůli tomu, že v prvním bytu byla délka stringu. Dnes už to moc nevyhovuje, dnešní programátoři jsou schopni napsat do zdrojáku i delší řádek :)

Stringy v C jsou horší, navíc nejsou binary-safe. Pokud někdo tuto vlastnost potřebuje, tak se na #0 nespoléhá a udělá to podobně jako v Pascalu, tedy délku samostatně.

Když jsem potřeboval udělat v RAM seznam z řetězců proměnné délky, tak to bylo docela náročné. Implementace slovníku byla i delší než na stránku. Dnes je to součástí programovacích jazyků. Stačí jen použít.

Nahoru Odpovědět 25.8.2013 15:08
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Koukni se na web člena Mircosoft, mám dojem, že tam má toho Pascala ke
stažení. FreePascal funguje jinak a určitě bych to v něm nedělal, protože to
potom nemusí fungovat.

Freepascal by měl být dostatečně kompatibilní s BP, zvláště pokud se zapne režim kompatibility. Myslím, že automatický systém pro vyhodnocování úloh na MFF (CoDex) používá překldač Freepascalu. Gramatika Freepascalu je ale trochu odlišná od BP (některé zdrojáky jdou zkompilovat v BP, ale ne ve FP). Plus je rozdíl v tom, že BP programy běží v "reálném" režimu procesoru, kdežto FP v chráněném (v případě programů pro DOS). Ale to by nemělo být znatelné v případě programování algoritmických úloh.

Stringy v C jsou horší, navíc nejsou binary-safe. Pokud někdo tuto
vlastnost potřebuje, tak se na #0 nespoléhá a udělá to podobně jako v
Pascalu, tedy délku samostatně.

Právě kvůli problémům s s ukončovacím nulovým znakem se třeba ve Windows kernelu většinou používají speciální verze stringů, které jsou definovány strukturou UNICODE_STRING.

typedef struct _LSA_UNICODE_STRING {
  USHORT Length;
  USHORT MaximumLength;
  PWSTR  Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;

Jádro exportuje rutiny pro práci s nimi. Samozřejmě to není zrovna procházka růžovým sadem, s takovými řetězci pracovat.

Hm a koukám, že už jsme hodně mimo téma.

Nahoru Odpovědět 25.8.2013 15:18
2 + 2 = 5 for extremely large values of 2
Avatar
haubeltova
Člen
Avatar
Odpovídá na Martin Dráb
haubeltova:

Ahoj:) Díky moc, to je dobrý nápad, ale nevím, co mají v labech za operační systém, mně to na těch starejch xp-čkách běželo, teď mám windows 8, stáhla jsem to asi 10 z různých zdrojů, vždycky zkusila nainstalovat a nefunguje to... Jj, problém je aktuální, mám naprogramovat zápočtovej program a nevím, jak to funguje s vloženými spojáky do spojáku... jakmile mi bude fungovat tahle procedura s načítáním dat, tak zbytek už bude analogickej, s tím si poradím, ale když nemůžu zjistit v čem je chyba, jen že mi to nefunguje, tak je to opravování "po slepu"... včera jsem to znova přepsala, snad už to je lepší, ale nefunguje pořád :D

type Tbod    = record

    x: real;
    y: real;

type Tbody =^body; {linearni spojovy seznam, obsahuje jednotlive body}
     body = record
     souradnice: Tbod;
     dalsi:Tbody;
            end;
type Tpolygony =^polygon; {linearni spojovy seznam, obsahuje polygony}
     polygon = record
       cislo: integer;
       info:Tbody;
       dalsi: Tpolygony;
               end;

procedure nacti_data (var hlava: Tpolygony; var sirka_lesa: real);
var posuvnik_v_polygonech: Tpolygony;
    posuvnik_v_bodech: Tbody;
    punkt: Tbod;
    poradove_cislo: integer;
begin
  assign (data, 'data.txt');
  reset (data);
  {readln (data, sirka_lesa); }
  {new (posuvnik_v_polygonech);
  posuvnik_v_polygonech^.dalsi:=nil;}
  hlava:=posuvnik_v_polygonech;
  poradove_cislo:=1;

  while not EOF (data) do
    begin
      new (posuvnik_v_polygonech);
      posuvnik_v_polygonech^.dalsi:=nil;
      posuvnik_v_polygonech^.cislo:=poradove_cislo;
      inc (poradove_cislo);
      posuvnik_v_bodech:=posuvnik_v_polygonech^.info;
      posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
      while not EOLN (data) do
        begin
          new (posuvnik_v_bodech);
          posuvnik_v_bodech^.dalsi:=nil;
          read (data, punkt.x);
          read (data, punkt.y);
          posuvnik_v_bodech^.souradnice:=punkt;
          posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
        end;
    end;
  close (data);
end;

děkuju moc za přečtení :)

 
Nahoru Odpovědět 25.8.2013 18:37
Avatar
haubeltova
Člen
Avatar
haubeltova:

Ještě jednou děkuju moc všem za přečtení a za rady :)

 
Nahoru Odpovědět 25.8.2013 18:40
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Ahoj,

assign (data, 'data.txt');
reset (data);
readln (data, sirka_lesa);
new (posuvnik_v_polygonech);
posuvnik_v_polygonech^.dalsi:=nil;
hlava:=posuvnik_v_polygonech;
poradove_cislo:=1;

Tohle je docela OK. Tento kód v podstatě otevře soubor se vstupními daty, načte šířku lesa (ať je to, co je to) a vytvoří hlavu seznamu polygonů.

Cyklus

while not EOF (data) do

bych trochu přeorganizoval. Tvoje implementace tohoto cyklu aktuálně funguje tak, že nejprve vyžvoří polygon, následně jej (vnitřním while cyklem) naplní. Mluvím o tom, jaká je asi tvoje představa, že by to mělo fungovat.

Předpokládáš, že chceš dělat ten seznam polygonů s hlavou. Přes new() vytvoř novou proměnnou typu Tpolygony, ne ale přes posuvnik_v_po­lygonech (ten ma odkazovat vždy na poslední prvek seznamu polygonů), ale přes nějakou dočasnou proměnnou, kterou si zavedeš. Jakmile ji inicializuješ (nezapomeň inicializovat i položku info na nil či spíše na hlavu seznamu bodů (kterou případě dynamicky alokuješ)). Jakmile inicializaci této proměnné provedeš, stačí nasměrovat posuvnik_v_bodech na její položku ifno a zařadit ji do seznamu polygonů (za poslední prvek, na který odkazuje posuvnik_v_po­lygonech). To lze provést třeba takto:

posuvnik_v_bodech := docasna^.info;
posuvnik_v_polygonech^.dalsi := docasna;
posuvnik_v_polygonech := posuvnik_v_polygonech^.dalsi;

Co se týče načítání seznamu bodů, je tato část kódu

new (posuvnik_v_bodech);
posuvnik_v_bodech^.dalsi:=nil;
read (data, punkt.x);
read (data, punkt.y);
posuvnik_v_bodech^.souradnice:=punkt;

skoro v pořádku, jen je zase třeba pro vytvoření "instance" bodu použít nějakou dočasnou proměnnou (např docasny_bod), protože proměnná posuvnik_v_bodech má za úkol odkazovat na poslední bod v seznamu bodů, aby do tohoto seznamu bylo možno přidávat (význam je obdobný jako u proměnné posuvnik_v_po­lygonech). Jakmile jsou souřadnice bodu vyplněny, je třeba tento bod přidat do seznamu, což, pokud má seznam bodů hlavu (viz výše), se provede obdobně jako při přidávání nového polygonu do seznamu, tedy např. takto:

posuvnik_v_bodech^.dalsi := docasny_bod;
posuvnik_v_bodech := posuvnik_v_bodech^.dalsi;

Jakmile ti skončí vnější cyklus, znamená to, že jsi dočetla vstupní soubor na konec řádku. Nevím, zda je to nutné, ale já bych ještě přidal za tento cyklus příkaz, který nastaví pozici ve vstupním souboru na začátek další řádky.

readln(data);

Poznámky
Složitost implementace dost závisí na tom, jaké druh spojových seznamů použiješ a jaké operace na něm provádíš. Jednosměrné spojové seznamy výborně fungují, pokud se do nich přidává na začátek (třeba za hlavu, pokud ji mají). Pokud přidáváš na jejich konec, musíš vždy mít u sebe odkaz na jejich poslední prvek, kteroužto funkci plní proměnné posuvnik_v_po­lygonech a ""posuvnik_v_bo­dech**, nebo jej vždy zíískat procházením seznamu od začátku. Pokud bys nové polygony (resp. body) přidávala na začátek seznamů, posuvníky nebudeš potřebovat. Na druhou stranu asi tvé algoritmy počítají s tím, že polygony a body v nich nebudou načteny v opačném pořadí.

Ideální by samozřejmě bylo udělat si nějaké funkce pro vytvoření bodu a polygonu a jejich inicializaci, aby to celé bylo přehlednější. Například nějaké tkaové funkce by kód dost zpřehlednily:

Function VytvorBod(x,y:Integer):TBody;
Function VytvorPolygon(poradove_cislo:Integer):TPolygony;
Procedure VlozPolygon(ZaKoho:TPolygon; CoVlozit:TPolygony);
Procedure VlozBod(ZaKoho:TBody; CoVlozit:TBody);

Nešel jsem ale do toho, protože jsem chtěl, aby kód, co jsi sem dala, se příliš nezměnil, což pro tebe bude méně matoucí.

Samozřejmě by se daly implementovat i obecné rutiny pro práci se spojovými seznamy (často je používám, ale moje oblíbené spojové seznamy jsou obousměrné cyklické s hlavou), ale v Pascalu/Delphi se to neimplementuje úplně snadno (lidsky čitelně). V základu jde o to, že každý záznam, který budeš nějak zařazovat do spojového seznamu, vybavíš položkou

dalsi : TPrvek;

která bude obsahovat odkaz na položku dalsi dalšího záznamu v seznamu. Obecné rutiny pro práci se spojovými seznamy pak budou pracovat použe s těmito položkami dalsi, jinak nebudou záviset na struktuře vkládaných záznamů, nebudou ani vědět, kde se položka dalsi v těch záznamech nachází, z čehož plyne jejich obecnost. Pak může nastat i případ, že jeden záznam těchto položek dalsi (samozřejmě různě pojmenovaných) obsahuje více, což mu dává schopnost býti ve více spojových seznamech zároveň.

nechtěl jsem ale jít touto cestou, protože je buď potřeba ukazatelům dost dobře rozumět a mít je už v krvi, aby vynikla krása tohoto řešení, nebo je to dobré/nutné ukázat na z tužkou papíře a fórum nepovažuji za dostatečně rychlý způsob komunikace na vysvětlení případných nejasností.

Jinak v labu na Malé Straně jsou stále Windows XP, takže tam Borland Pascal 7 bude fungovat. Alespoň když jsem navštěvoval první ročník, bylo tomu tak.

P.S. Vím, že by bylo pro všechny strany snadnější, kdybych sem vyplivl správné řešení přímo jako kód, ale:

  • obecně to nedělám rád, ne napoprvé,
  • nevím, komu ten zápočtový program budeš ukazovat, ale jeden můj kamarád cvičí matematiky programování v Pascalu a je tu jisté (asi velmi malé) nebezpečí, že by mohl poznat můj styl.
Nahoru Odpovědět 25.8.2013 19:54
2 + 2 = 5 for extremely large values of 2
Avatar
haubeltova
Člen
Avatar
haubeltova:

Pardon, dostala jsem se k tomu až teď :o) ještě jsem to znovu přepsala, byly tam chyby asi i v něčem jiném, ale ten readln mi moc pomohl, děkuju xD už to v pohodě načítá... zkoušela jsem tam ještě přidat načtení jedný proměnný, ale to z nějakýho záhadnýho důvodu nebere... ale hlavně, že to načítá ty body, při nejhorším budu mít 2 vstupní soubory, nebo tu jednu proměnnou načtu z obrazovky... nakonec to vypadá takhle:

procedure nacti_data (var hlava: Tpolygony; var sirka_lesa:real);
var posuvnik_v_polygonech: Tpolygony;
    posuvnik_v_bodech: Tbody;
    punkt: Tbod;
    poradove_cislo: integer;
begin
  assign (data, 'data.txt');
  reset (data);
  readln (data, sirka_lesa);
  new (posuvnik_v_polygonech);
  posuvnik_v_polygonech^.dalsi:=nil;
  hlava:=posuvnik_v_polygonech;
  poradove_cislo:=1;
  while not EOF (data) do
    begin
      posuvnik_v_polygonech^.cislo:=poradove_cislo;
      inc (poradove_cislo);
      new (posuvnik_v_bodech);
      posuvnik_v_bodech^.dalsi:=nil;
      posuvnik_v_polygonech^.info:=posuvnik_v_bodech;
      while not EOLN (data) do
        begin
          read (data, punkt.x);
          read (data, punkt.y);
          posuvnik_v_bodech^.souradnice:=punkt;
          new (posuvnik_v_bodech^.dalsi);
          posuvnik_v_bodech^.dalsi^.dalsi:=nil;
          posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
        end;
       readln (data);
       new (posuvnik_v_polygonech^.dalsi);
       posuvnik_v_polygonech^.dalsi^.dalsi:=nil;
       posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
    end;
  close (data);
end;

Ještě jednou děkuju moc všem za pomoc :o)

 
Nahoru Odpovědět 28.8.2013 19:36
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Kdyžtak ještě ukaž nějaká vstupní soubor, třeba z toho bude poznat, proč se nenačítá šířka lesa.

Nahoru Odpovědět 28.8.2013 22:04
2 + 2 = 5 for extremely large values of 2
Avatar
haubeltova
Člen
Avatar
haubeltova:

Tak už to mám nakonec hotové :D dokonce i uznané to už mám :) Děkuju všem za pomoc, ze začátku jsem se v tom vážně plácala :)

{Zapoctovy program na predmet Programovani II - NPRM045}
{Tema: Cesta mezi polygony}
{Libuse Haubeltová}
program polygony24;

uses Crt;
const vypisy = true; {hodnota true: program vypise na obrazovku jednotlive kroky, false: pouze vystup do souboru}
{***deklarace datovych typu***}
type Tbod    = record {bod v rovine jednoznacne urceny x-ovou a y-ovou souradnici}
    x: real;
    y: real;   end;
type Tvektor = record {vektor urceny x-ovou a y-ovou souradnici}
    x: real;
    y: real;   end;
type Tprimka = record {primka urcena koeficienty a,b,c z obecneho tvaru primky z analytické geometrie (ax+by+c=0)}
    a: real;
    b: real;
    c: real;   end;
type Tusecka = record {usecka dana pocatecnim a koncovym bodem, na poradi nezalezi}
    zac: Tbod;
    kon: Tbod; end;
type Tbody =^body; {linearni spojovy seznam, obsahuje jednotlive body}
     body = record
     souradnice: Tbod;
     dalsi:Tbody;
            end;
type Tpolygony =^polygon; {linearni spojovy seznam, obsahuje polygony, v kazdem polygonu odkaz na lin.spoj.seznam bodu}
     polygon = record
       cislo: integer;
       info:Tbody;
       z_info:Tbody;
       dalsi: Tpolygony;
               end;
{***deklarace globalnich promennych***}
var vstup, vystup, data: text;
    hlava: Tpolygony;
    sirka_lesa, polomer: real;
    projde: boolean;
    cislo_nepruchozi, pocet_komponent:integer;

{***procedury pro praci s daty - nacteni dat ze souboru, vypisy***}
procedure priprav_data; {vytvori kopii vstupniho souboru bez nepotrebnych znaku}
var radekvstupu: string;
delkaradku, znak, i: integer;
begin
assign (vstup, 'vstup1.txt');
reset (vstup);
assign (data, 'data.txt');
rewrite (data);
while not EOF (vstup) do
  begin
     readln (vstup, radekvstupu);
     delkaradku:=length(radekvstupu);
     for i:=1 to delkaradku do
       begin
         znak:=ord(radekvstupu[i]);
         case znak of
           91: ;
           59: write (data, ' ');
           93: ;
           else write (data, chr(znak));
         end;
       end;
     writeln (data);
  end;
  close (data);
  close (vstup);
end;

procedure vypis_polygon (co:Tbody); {vypise seznam bodu celeho polygonu (jejich souradnice)}
var posuvnik_v_bodech:Tbody;
begin
 posuvnik_v_bodech:=co;
 while posuvnik_v_bodech^.dalsi<>nil do
   begin
     write ('[', posuvnik_v_bodech^.souradnice.x:4:2, ';', posuvnik_v_bodech^.souradnice.y:4:2, ']', ' ');
     posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
   end;
end;

procedure polygon_do_souboru (co:Tbody); {vypise seznam bodu celeho poFlygonu (jejich souradnice) do souboru}
var posuvnik_v_bodech:Tbody;
begin
 posuvnik_v_bodech:=co;
 while posuvnik_v_bodech^.dalsi<>nil do
   begin
     write (vystup, '[');
     write (vystup, posuvnik_v_bodech^.souradnice.x:4:2);
     write (vystup, ';');
     write (vystup, posuvnik_v_bodech^.souradnice.y:4:2);
     write (vystup, '] ');
     posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
   end;
  writeln (vystup);
end;

procedure vypis_polygony (hlava: Tpolygony); {vypise souradnice bodu vsech polygonu, seznam bodu kazdeho polygonu zvlast na radek}
var posuvnik_v_polygonech: Tpolygony;
begin
if vypisy=true
  then begin
         posuvnik_v_polygonech:=hlava;
         while posuvnik_v_polygonech^.dalsi<>nil do
           begin
             vypis_polygon (posuvnik_v_polygonech^.info);
             writeln;
             posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
           end;
       end;
end;

procedure vypis_z_polygony (hlava: Tpolygony); {vypise souradnice vsech polygonu zvetsenych o polomer obra}
var posuvnik_v_polygonech: Tpolygony;
begin
if vypisy=true
  then begin
         posuvnik_v_polygonech:=hlava;
         while posuvnik_v_polygonech^.dalsi<>nil do
           begin
             vypis_polygon (posuvnik_v_polygonech^.z_info);
             writeln;
             posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
           end;
       end;
end;

procedure nacti_data (var hlava: Tpolygony; var sirka_lesa: real; var polomer: real); {nacte data z upravene kopie vstupniho souboru}
var zacatek: Tpolygony;
    posuvnik_v_bodech: Tbody;
    punkt: Tbod;
    poradove_cislo: integer;
begin
  assign (data, 'data.txt');
  reset (data);
  readln (data, sirka_lesa);
  readln (data, polomer);
  new (hlava);
  hlava^.dalsi:=nil;
  zacatek:=hlava;
  poradove_cislo:=1;
  while not EOF (data) do
    begin
      hlava^.cislo:=poradove_cislo;
      inc (poradove_cislo);
      new (posuvnik_v_bodech);
      posuvnik_v_bodech^.dalsi:=nil;
      hlava^.info:=posuvnik_v_bodech;
      while not EOLN (data) do
        begin
          read (data, punkt.x);
          read (data, punkt.y);
          posuvnik_v_bodech^.souradnice:=punkt;
          new (posuvnik_v_bodech^.dalsi);
          posuvnik_v_bodech^.dalsi^.dalsi:=nil;
          posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
        end;
      readln (data);
      new (hlava^.dalsi);
      hlava^.dalsi^.dalsi:=nil;
      hlava:=hlava^.dalsi;
    end;
  hlava:=zacatek;
  close (data);
  if vypisy=true then
   begin
     writeln ('nacteno ze vstupniho souboru');
     vypis_polygony (hlava);
     writeln ('sirka lesa= ', sirka_lesa:4:2);
     writeln ('polomer kruhového obra= ', polomer:4:2);
   end;
end;

{***jednoduche funkce pro zakladni ulohy v rovine z analyticke geometrie***}
function vyrob_vektor (a, b: Tbod): Tvektor; {ze souradnic bodu A,B urci souradnice vektoru ->AB}
begin
vyrob_vektor.x:=b.x-a.x;
vyrob_vektor.y:=b.y-a.y;
end;

function normalovy_vektor (v: Tvektor): Tvektor; {urci normalovy vektor k vektoru ->v}
begin
normalovy_vektor.x:=v.y;
normalovy_vektor.y:= (-1)*v.x;
end;

function opacny_vektor (v: Tvektor): Tvektor; {urci opacny vektor k vektoru ->v}
begin
opacny_vektor.x:=(-1)*v.x;
opacny_vektor.y:=(-1)*v.y;
end;

function velikost_vektoru (v: Tvektor): real; {urci eukleidovskou normu vektoru ->v}
begin
velikost_vektoru:=sqrt (v.x*v.x+v.y*v.y);
end;

function vyrob_vektor_velikosti (v:Tvektor; polomer:real): Tvektor; {z vektoru ->v vyrobi vektor, jehoz eukleidovská norma = polomer, smer zachova}
var k: real;
begin
k:=sqrt((polomer*polomer)/((v.x*v.x)+(v.y*v.y)));
vyrob_vektor_velikosti.x:=v.x*k;
vyrob_vektor_velikosti.y:=v.y*k;
end;

function posun_bod (a: Tbod; v: Tvektor): Tbod; {posune bod A o vektor ->v}
begin
posun_bod.x:=a.x+v.x;
posun_bod.y:=a.y+v.y;
end;

function vzdalenost_bodu (a,b: Tbod): real; {spočítá vzdálenost bodů A,B}
var v: Tvektor;
begin
v:=vyrob_vektor (a,b);
vzdalenost_bodu:=velikost_vektoru(v);
end;

function vyrob_primku (a: Tbod; v: Tvektor):Tprimka; {urci primku z bodu A se smerovym vektorem ->v}
var normal: Tvektor;
begin
normal:=normalovy_vektor(v);
vyrob_primku.a:=normal.x;
vyrob_primku.b:=normal.y;
vyrob_primku.c:=((((normal.x)*(a.x))+((normal.y)*(a.y)))*(-1));
end;

function vyrob_primku_z_bodu (a,b: Tbod):Tprimka; {urci primku prochazejici body A,B}
var vektor: Tvektor;
begin
vektor:=vyrob_vektor (a,b);
vyrob_primku_z_bodu:=vyrob_primku (a,vektor);
end;


function je_bod_napravo_od_primky (a,b,x: Tbod): boolean; {urci, zdali je bod x v polorovině "vpravo" od orientovane usecky AB, nebo v opacne polorovine}
var u, v: Tvektor;
    d: real;
begin
u:=vyrob_vektor (A, B);
v:=vyrob_vektor (A, X);
d:=(u.x*v.y)-(u.y*v.x);
if d>0 then je_bod_napravo_od_primky:=false
       else je_bod_napravo_od_primky:=true;
end;

function lezi_bod_na_primce (A,B,X:Tbod):boolean; {urci, zdali bod X alezi primce prochazejici body AB}
var primka: Tprimka;
begin
primka:=vyrob_primku_z_bodu (A,B);
if round((primka.a*x.x+primka.b*x.y+primka.c)*10000)/10000=0
       then lezi_bod_na_primce:=true
       else lezi_bod_na_primce:=false;
end;

function rovnobezky (a,b,c,d: Tbod): boolean; {urci, zdali jsou primky/usecky dane body A,B a C,D rovnobezne}
var u, v: Tvektor;
koeficient: real;
begin
u:=vyrob_vektor (a,b);
v:=vyrob_vektor (c,d);
if (u.x=0) AND (u.y=0) OR (v.x=0) AND (v.y=0)
  then begin
         rovnobezky:=true;
         exit;
       end;
if u.x=0
  then begin
         if v.x=0
           then rovnobezky:=true
           else rovnobezky:=false;
           exit;
       end;
if v.x=0
  then begin
         rovnobezky:=false;
         exit;
       end;
if u.y=0
  then begin
         if v.y=0
           then rovnobezky:=true
           else rovnobezky:=false;
           exit;
       end;
if v.y=0
  then begin
         rovnobezky:=false;
         exit;
       end;
koeficient:=u.x;
u.x:=1;
u.y:=u.y/koeficient;
koeficient:=v.x;
v.x:=1;
v.y:=v.y/koeficient;
if (round (u.y*10000)/10000 = round (v.y*10000)/10000)
  then rovnobezky:=true
  else rovnobezky:=false;
end;

function urci_prusecik_primek (a,b,c,d :Tbod): Tbod; {urci prusecik ruznobeznych primek, v pripade rovnobezek bez vysledku, napise chybovou hlasku}
var primka1, primka2: Tprimka;
    koeficient, y :real;
begin
if rovnobezky (a,b,c,d) = true
  then begin
         writeln ('!!!Behova chyba, neosetreny prusecik ruznych/totoznych primek/usecek!!!');
         exit;
       end;
primka1:=vyrob_primku_z_bodu (a,b);
primka2:=vyrob_primku_z_bodu (c,d);
if primka1.a=0
  then begin
         if (primka2.a)=0 then writeln ('rovnobezky');
         if primka1.b=0 then writeln ('ne primka, ale bod');
         y:=(-1)*primka1.c/primka1.b;
         urci_prusecik_primek.y:=y;
         urci_prusecik_primek.x:=(((primka2.b)*y+primka2.c)/((-1)*primka2.a));
         exit;
       end
  else if primka2.a=0
         then begin
                if primka1.a=0 then writeln ('rovnobezky2');
                if primka2.b=0 then writeln ('bod');
                y:=primka2.c*(-1)/primka2.b;
                urci_prusecik_primek.y:=y;
                urci_prusecik_primek.x:=(((primka1.b)*y+primka1.c)/((-1)*primka1.a));
                exit;
              end
         else begin
                koeficient:=primka1.a;
                primka1.a:=1;
                primka1.b:=primka1.b/koeficient;
                primka1.c:=primka1.c/koeficient;
                koeficient:=(-1)*primka2.a;
                primka2.a:=-1;
                primka2.b:=primka2.b/koeficient;
                primka2.c:=primka2.c/koeficient;
if primka1.b+primka2.b=0 then writeln ('rovnobezky');
                y:=(((-1)*(primka1.c+primka2.c))/(primka1.b+primka2.b));
                urci_prusecik_primek.y:=y;
                urci_prusecik_primek.x:=((-1)*((y*primka1.b)+primka1.c));
              end;
end;

function lezi_bod_na_usecce (zac,kon,x:Tbod): boolean; {urci, zdali bod x lezi na usecce dane body "zac", "kon"}
var u, v: Tvektor;
    koeficient:real;
begin
{if ((zac.x=x.x)AND(zac.y=x.y)) OR ((kon.x=x.x)AND(kon.y=x.y))  }       {1) je bod X koncovym bodem usecky?}
if ((round (zac.x*1000))/1000 = (round(x.x*1000))/1000) AND ((round(zac.y*1000))/1000=(round(x.y*1000))/1000) OR
   ((round (kon.x*1000))/1000 = (round(x.x*1000))/1000) AND ((round(kon.y*1000))/1000=(round(x.y*1000))/1000)
  then begin
         lezi_bod_na_usecce:=true;
         exit;
       end;
lezi_bod_na_usecce:=true;
if lezi_bod_na_primce (zac, kon, x) = false                           {2) lezi bod X na primce dane body "zac", "kon"?}
  then begin
         lezi_bod_na_usecce:=false;
         exit;
       end;
u:=vyrob_vektor (zac, x);
v:=vyrob_vektor (kon, x);
if u.x = 0                                                            {3) lezi bod X mezi body "zac", "kon"? }
  then if (v.x=0) AND (((u.y>0) AND (v.y<0)) OR ((u.y<0) AND (v.y>0)))
         then begin
                lezi_bod_na_usecce:=true;
                exit;
              end
         else begin
                lezi_bod_na_usecce:=false;
                exit;
              end
   else if u.y=0 then if (v.y=0) AND (((u.x<0) AND (v.x>0)) OR ((u.x>0) AND (v.x<0)))
                         then begin
                                lezi_bod_na_usecce:=true;
                                exit;
                               end
                          else begin
                                 lezi_bod_na_usecce:=false;
                                 exit;
                               end
                  else begin
                         koeficient:=abs(u.x);
                         u.x:=u.x/koeficient;
                         u.y:=u.y/koeficient;
                         koeficient:=abs(v.x);
                         v.x:=v.x/koeficient;
                         v.y:=v.y/koeficient;
                         if (round (u.x*10000)/10000=round((-1)*v.x*10000)/10000) AND (round(u.y*10000)/10000=round((-1)*v.y*10000)/10000)
                           then lezi_bod_na_usecce:=true
                           else lezi_bod_na_usecce:=false;
                       end;
end;

function maji_usecky_prusecik (a,b,c,d: Tbod): boolean; {urci, zdali mají usecky spolecny bod/body}
var p,q: Tprimka;
    x: Tbod;
begin
if rovnobezky (a,b,c,d) = true
   then if lezi_bod_na_usecce(a,b,c) OR lezi_bod_na_usecce (a,b,d) OR lezi_bod_na_usecce (c,d,a) OR lezi_bod_na_usecce (c,d,b)
           then begin
                  maji_usecky_prusecik:=true;
                  exit;
                end
           else begin
                  maji_usecky_prusecik:=false;
                  exit;
                end
   else begin
          x:=urci_prusecik_primek (a,b,c,d);
          if lezi_bod_na_usecce (a,b,x) AND lezi_bod_na_usecce (c,d,x)
             then maji_usecky_prusecik:=true
             else maji_usecky_prusecik:=false;
        end;
end;

function urci_prusecik_usecek (a,b,c,d: Tbod): Tbod;       {urci prusecik neprekryvajicich se usecek}
begin
if (rovnobezky (a,b,c,d)=true) and (maji_usecky_prusecik(a,b,c,d)=true)
  then begin
         writeln ('!!!Behova chyba, usecky se prekryvaji!!!');
         exit;
       end;
if maji_usecky_prusecik (a,b,c,d) = true
   then urci_prusecik_usecek:=urci_prusecik_primek (a,b,c,d);
end;

function vzdalenost_bodu_od_primky (a,b,x: Tbod): real; {urci vzdalenost bodu X od primky dane body A,B}
var p: Tprimka;
begin
p:=vyrob_primku_z_bodu (a,b);
vzdalenost_bodu_od_primky:=abs(x.x*p.a+x.y*p.b+p.c)/sqrt(p.a*p.a+p.b*p.b);
end;

function vzdalenost_bodu_od_usecky (a,b,x: Tbod): real;               {urci vzdalenost bodu X od usecky dane body A,B}
var p: Tprimka;
    pata, y: Tbod;
    n: Tvektor;
    odjednoho, oddruheho: real;
begin
    if lezi_bod_na_usecce(a,b,x)=true
      then begin
             vzdalenost_bodu_od_usecky:=0;
             exit;
           end;
    p:=vyrob_primku_z_bodu (a,b);
    n.x:=p.a;
    n.y:=p.b;
    y:=posun_bod(x, n);
    pata:=urci_prusecik_primek (a,b,x,y);
    if lezi_bod_na_usecce (a,b,pata) = true
      then vzdalenost_bodu_od_usecky:=vzdalenost_bodu_od_primky (a,b,x)
      else begin
             odjednoho:=vzdalenost_bodu(a,x);
             oddruheho:=vzdalenost_bodu(b,x);
             if odjednoho<oddruheho
               then vzdalenost_bodu_od_usecky:=odjednoho
               else vzdalenost_bodu_od_usecky:=oddruheho
           end;
end;

function vystrc_poc_bod (a,b :Tbod) :Tbod;   {slouzi ke zvetseni polygonu, posune pocatecni bod hrany kolmo ven z polygonu o polomer obra}
var v, n: Tvektor;
    x: Tbod;
begin
v:=vyrob_vektor (a,b);
n:=normalovy_vektor(v);
n:=vyrob_vektor_velikosti (n, polomer);
x:=posun_bod (a,n);
if je_bod_napravo_od_primky (a,b,x)
   then begin
          vystrc_poc_bod.x:=x.x;
          vystrc_poc_bod.y:=x.y;
        end
   else begin
          n:=opacny_vektor(n);
          x:=posun_bod (a,n);
          vystrc_poc_bod.x:=x.x;
          vystrc_poc_bod.y:=x.y;
        end;
end;

function vystrc_konc_bod (a,b :Tbod) :Tbod;   {slouzi ke zvetseni polygonu, posune koncovy bod hrany kolmo ven z polygonu o polomer obra}
var v, n: Tvektor;
    x: Tbod;
begin
v:=vyrob_vektor (a,b);
n:=normalovy_vektor(v);
n:=vyrob_vektor_velikosti (n, polomer);
x:=posun_bod (a,n);
if je_bod_napravo_od_primky (a,b,x)=false
   then begin
          vystrc_konc_bod.x:=x.x;
          vystrc_konc_bod.y:=x.y;
        end
   else begin
          n:=opacny_vektor(n);
          x:=posun_bod (a,n);
          vystrc_konc_bod.x:=x.x;
          vystrc_konc_bod.y:=x.y;
        end;
end;

{***Klicove procedury a funkce***}

function lezi_bod_na_obvodu (a: Tbod; polygon: Tbody): boolean; {urci, jestli bod A lezi na obvodu polygonu}
var zac, kon: Tbod;
posuvnik: Tbody;
begin
lezi_bod_na_obvodu:=false;
posuvnik:=polygon;
while posuvnik^.dalsi^.dalsi<>nil do
  begin
    zac:=posuvnik^.souradnice;
    kon:=posuvnik^.dalsi^.souradnice;
    if lezi_bod_na_usecce (zac,kon,a)=true
      then begin
             lezi_bod_na_obvodu:=true;
             exit;
           end;
    posuvnik:=posuvnik^.dalsi;
  end;
end;

function je_bod_uvnitr (a: Tbod; polygon: Tbody):boolean; {urci, jestli je bod uvnitr polygonu, na obvodu se nepocita}
var mimo,vrchol: Tbod;
prvni, druhy: Tbody;
zac, kon: Tbod;
protnuti: integer;
vrcholy: boolean;
posuvnik_v_bodech: Tbody;

begin
if lezi_bod_na_obvodu (a, polygon)= true
  then begin
         je_bod_uvnitr:=false;
         exit;
       end;
mimo.x:=sirka_lesa+polomer+1;
vrcholy:=false;
mimo.y:=1;
while vrcholy<>true do
  begin
     posuvnik_v_bodech:=polygon;
     mimo.y:=mimo.y+0.1;
     vrcholy:=true;
     while posuvnik_v_bodech^.dalsi<>nil do
       begin
          vrchol:=posuvnik_v_bodech^.souradnice;
          if lezi_bod_na_usecce (a,mimo,vrchol) = true
             then begin
                    vrcholy:=false;
                    break;
                    break;
                  end
             else posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
        end;
  end;
posuvnik_v_bodech:=polygon;
protnuti:=0;
while posuvnik_v_bodech^.dalsi^.dalsi<>nil do
  begin
    zac:=posuvnik_v_bodech^.souradnice;
    kon:=posuvnik_v_bodech^.dalsi^.souradnice;
    if maji_usecky_prusecik (zac, kon, a, mimo) = true
      then begin
             inc (protnuti);
           end;
    posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
  end;
if protnuti mod 2=0
  then je_bod_uvnitr:=false
  else je_bod_uvnitr:=true;
end;

procedure zvetsi_polygon (var hlava: Tpolygony); {zvetsi polygon o polomer obra (musime zapocitat i kruznice kolem bodu}
var posuvnik_v_bodech, z_posuvnik_v_bodech: Tbody;
zac,kon, novy: Tbod;
begin
  posuvnik_v_bodech:=hlava^.info;
  new (hlava^.z_info);
  hlava^.z_info^.dalsi:=nil;
  z_posuvnik_v_bodech:=hlava^.z_info;
  while posuvnik_v_bodech^.dalsi^.dalsi<>nil do
    begin
      zac:=posuvnik_v_bodech^.souradnice;
      kon:=posuvnik_v_bodech^.dalsi^.souradnice;
      novy:=vystrc_poc_bod (zac, kon);
      z_posuvnik_v_bodech^.souradnice:=novy;
      new (z_posuvnik_v_bodech^.dalsi);
      z_posuvnik_v_bodech^.dalsi^.dalsi:=nil;
      z_posuvnik_v_bodech:=z_posuvnik_v_bodech^.dalsi;

      novy:=vystrc_konc_bod (kon, zac);
      z_posuvnik_v_bodech^.souradnice:=novy;
      new (z_posuvnik_v_bodech^.dalsi);
      z_posuvnik_v_bodech^.dalsi^.dalsi:=nil;
      z_posuvnik_v_bodech:=z_posuvnik_v_bodech^.dalsi;

      posuvnik_v_bodech:=posuvnik_v_bodech^.dalsi;
    end;
    new (z_posuvnik_v_bodech^.dalsi);
    z_posuvnik_v_bodech^.dalsi^.dalsi:=nil;
    z_posuvnik_v_bodech^.souradnice:=hlava^.z_info^.souradnice;
end;


function pocet_bodu (polygon: Tbody):integer; {spocita pocet bodu polygonu}
var posuvnik: Tbody;
body:integer;
begin
body:=1;
posuvnik:=polygon;
while posuvnik^.dalsi<>nil do
  begin
    inc (body);
    posuvnik:=posuvnik^.dalsi;
  end;
pocet_bodu:=body;
end;

procedure procisti_polygon (var polygon: Tbody); {procisti duplicitnihrany/hrany uvnitr polygonu, ktere vznikly pri zvetseni}
var zac, kon, zacmazani, konmazani, smazat, odkaz: Tbody;
prusecik: Tbod;
upravit:boolean;
a,b,c,d: Tbod;
begin
if pocet_bodu (polygon)<=4
  then exit;
upravit:=false;
zac:=polygon;
kon:=polygon^.dalsi^.dalsi;
a:=zac^.souradnice;
b:=zac^.dalsi^.souradnice;
while kon^.dalsi^.dalsi^.dalsi<>nil do
  begin
    c:=kon^.souradnice;
    d:=kon^.dalsi^.souradnice;
    if maji_usecky_prusecik (a,b,c,d)=true
      then begin
           zacmazani:=zac;
           konmazani:=kon;
           upravit:=true;
           end;
    kon:=kon^.dalsi;
  end;
if upravit=true
  then begin
         c:=konmazani^.souradnice;
         d:=konmazani^.dalsi^.souradnice;
         if rovnobezky (a,b,c,d)=true
           then begin
                  odkaz:=zacmazani^.dalsi;
                  zacmazani^.dalsi:=konmazani^.dalsi;
                  while odkaz^.dalsi<>zac^.dalsi do
                    begin
                      smazat:=odkaz;
                      odkaz:=odkaz^.dalsi;
                      dispose (smazat);
                    end;
                end
           else begin
                  prusecik:=urci_prusecik_usecek (a,b,c,d);
                  zacmazani^.dalsi^.souradnice:=prusecik;
                  odkaz:=zacmazani^.dalsi^.dalsi;
                  zacmazani^.dalsi^.dalsi:=konmazani^.dalsi;
                  while odkaz^.dalsi<>zacmazani^.dalsi^.dalsi do  {jen odkaz}
                    begin
                      smazat:=odkaz;
                      odkaz:=odkaz^.dalsi;
                      dispose (odkaz);
                    end;
                 end;
      end;
if pocet_bodu (polygon^.dalsi)<=4
  then exit;
zac:=polygon^.dalsi;
while zac^.dalsi^.dalsi^.dalsi^.dalsi<>nil do
  begin
    upravit:=false;
    kon:=zac^.dalsi^.dalsi;
    a:=zac^.souradnice;
    b:=zac^.dalsi^.souradnice;
    while kon^.dalsi^.dalsi<>nil do
      begin
        c:=kon^.souradnice;
        d:=kon^.dalsi^.souradnice;
        if maji_usecky_prusecik (a,b,c,d)
          then begin
                 upravit:=true;
                 zacmazani:=zac;
                 konmazani:=kon;
               end;
        kon:=kon^.dalsi;
      end;
    if upravit=true
      then begin
             c:=konmazani^.souradnice;
             d:=konmazani^.dalsi^.souradnice;
             if rovnobezky(a,b,c,d)=true
               then begin
                      odkaz:=zacmazani^.dalsi;
                      zacmazani^.dalsi:=konmazani^.dalsi;
                      while odkaz^.dalsi<>zacmazani^.dalsi do
                        begin
                          smazat:=odkaz;
                          odkaz:=odkaz^.dalsi;
                          dispose (smazat);
                        end;
                      upravit:=false;
                    end
               else begin
                      prusecik:=urci_prusecik_usecek (a,b,c,d);
                      zacmazani^.dalsi^.souradnice:=prusecik;
                      odkaz:=zacmazani^.dalsi^.dalsi;
                      zacmazani^.dalsi^.dalsi:=konmazani^.dalsi;
                      konmazani^.dalsi:=nil;
                      while odkaz^.dalsi<>nil do
                        begin
                          smazat:=odkaz;
                          odkaz:=odkaz^.dalsi;
                          dispose (smazat)
                        end;
                      upravit:=false;
                    end;
           end;
      if pocet_bodu (zac^.dalsi)<=4
        then exit
        else zac:=zac^.dalsi;
  end;
end;

procedure zvetsi_polygony (hlava: Tpolygony); {zvetsi vsechny polygony o polomer obra}
var posuvnik_v_polygonech: Tpolygony;
begin
  posuvnik_v_polygonech:=hlava;
  while posuvnik_v_polygonech^.dalsi<>nil do
    begin
      zvetsi_polygon (posuvnik_v_polygonech);
      procisti_polygon (posuvnik_v_polygonech^.z_info);
      procisti_polygon (posuvnik_v_polygonech^.z_info);
      posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
    end;
  if vypisy=true
    then begin
           writeln;
           writeln ('zvetsene polygony: ');
           vypis_z_polygony (hlava);
         end;
end;

function dostatecna_vzdalenost_bodu_od_vsech_hran (vrchol: Tbod; polygon: Tbody; polomer: real): boolean; {urci, jestli ma bod "vrchol" vzdalenost od vsech hran zvetseneho polygonu alespon polomer}
var posuvnik: Tbody;
a,b: Tbod;
begin
  dostatecna_vzdalenost_bodu_od_vsech_hran:=true;
  posuvnik:=polygon;
  if posuvnik^.dalsi=nil then exit;
  while posuvnik^.dalsi^.dalsi<>nil do
    begin
      a:=posuvnik^.souradnice;
      b:=posuvnik^.dalsi^.souradnice;
      if vzdalenost_bodu_od_usecky (a,b,vrchol)<polomer
        then begin
               dostatecna_vzdalenost_bodu_od_vsech_hran:=false;
               exit;
             end
        else posuvnik:=posuvnik^.dalsi;
    end;
end;

function dostatecna_vzdalenost_bodu_od_vsech_bodu (vrchol:Tbod; polygon:Tbody; polomer: real): boolean; {urci, jestli ma bod "vrchol" vzdalenost od puv. bodu polygonu alespon polomer*2}
var posuvnik:Tbody;
a,b: Tbod;
begin
  posuvnik:=polygon;
  a:= vrchol;
  while posuvnik^.dalsi<>nil do
    begin
      b:=posuvnik^.souradnice;
      if vzdalenost_bodu (a,b)<polomer*2
        then begin
               dostatecna_vzdalenost_bodu_od_vsech_bodu:=false;
               exit;
             end
        else posuvnik:=posuvnik^.dalsi;
    end;
dostatecna_vzdalenost_bodu_od_vsech_bodu:=true;
end;

function otestuj_dva_polygony (polygon1, polygon2: Tpolygony): boolean; {otestuje, jestli 2 polygony patri do stejne komponenty}
var puv1, puv2, n1, n2: Tbody;
vrchol, a,b: Tbod;
begin
otestuj_dva_polygony:=false;
puv1:=polygon1^.info;
puv2:=polygon2^.info;
n1:=polygon1^.z_info;
n2:=polygon2^.z_info;
while n1^.dalsi<>nil do  {cyklus, ktery kontroluje, zdali nejaky bod ze zvets. polygonu neni ve zvets. polygonu}
  begin
    vrchol:=n1^.souradnice;
    if je_bod_uvnitr (vrchol, n2)=true
      then begin
             otestuj_dva_polygony:=true;
             exit;
           end
      else n1:=n1^.dalsi;
  end;
n1:=polygon1^.z_info;

while n2^.dalsi<>nil do  {to samé pro druhý polygon}
  begin
    vrchol:=n2^.souradnice;
    if je_bod_uvnitr (vrchol, n1)=true
      then begin
             otestuj_dva_polygony:=true;
             exit;
           end
      else n2:=n2^.dalsi;
  end;
n2:=polygon2^.z_info;

while puv1^.dalsi<>nil do {zjisti, zdali vzdalenost vsech bodu puvodniho polygonu je dostatecna od druheho puv. polygonu}
  begin
    vrchol:=puv1^.souradnice;
    if (dostatecna_vzdalenost_bodu_od_vsech_hran (vrchol, n2, polomer) = false) OR
       (dostatecna_vzdalenost_bodu_od_vsech_bodu (vrchol, puv2, polomer) = false)
        then begin
               otestuj_dva_polygony:=true;
               exit;
             end
         else puv1:=puv1^.dalsi;
  end;
puv1:=polygon1^.info;

while puv2^.dalsi<>nil do {to samé pro druhý polygon}
  begin
    vrchol:=puv2^.souradnice;
    if (dostatecna_vzdalenost_bodu_od_vsech_hran (vrchol, n1, polomer) = false) OR
       (dostatecna_vzdalenost_bodu_od_vsech_bodu (vrchol, puv1, polomer) = false)
        then begin
               otestuj_dva_polygony:=true;
               exit;
             end
         else puv2:=puv2^.dalsi;
  end;
puv2:=polygon2^.info;
otestuj_dva_polygony:=false;
end;

procedure urci_komponenty (var hlava: Tpolygony);
var posuvnik1, posuvnik2, prejmenovavac: Tpolygony;
nove_cislo, stare_cislo: integer;
begin
posuvnik1:=hlava;
if posuvnik1^.dalsi=nil
  then exit
  else posuvnik2:=hlava^.dalsi;
while posuvnik1^.dalsi^.dalsi<>nil do
  begin
    posuvnik2:=posuvnik1^.dalsi;
    while posuvnik2^.dalsi<>nil do
    begin
      if otestuj_dva_polygony (posuvnik1, posuvnik2) = true
        then begin
               nove_cislo:=posuvnik1^.cislo;
               stare_cislo:=posuvnik2^.cislo;
               posuvnik2^.cislo:=nove_cislo;
               prejmenovavac:=hlava;
               while prejmenovavac^.dalsi<>nil do
                 begin
                   if prejmenovavac^.cislo=stare_cislo
                     then prejmenovavac^.cislo:=nove_cislo;
                   prejmenovavac:=prejmenovavac^.dalsi;
                 end;
             end;
       posuvnik2:=posuvnik2^.dalsi;
    end;
    posuvnik1:=posuvnik1^.dalsi;
  end;
end;

procedure vypis_komponenty (hlava: Tpolygony);
var komponenty: Tpolygony;
begin
komponenty:=hlava;
while komponenty^.dalsi<>nil do
  begin
     write (komponenty^.cislo, ' ');
     komponenty:=komponenty^.dalsi;
  end;
end;

function cislo_obsazeno (hlava:Tpolygony; cislo:integer): boolean;
var posuvnik_v_polygonech:Tpolygony;
begin
posuvnik_v_polygonech:=hlava;
while posuvnik_v_polygonech^.dalsi<>nil do
  begin
    if posuvnik_v_polygonech^.cislo=cislo
      then begin
             cislo_obsazeno:=true;
             exit;
           end;
    posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
  end;
cislo_obsazeno:=false;
end;

function cislo_max (hlava: Tpolygony): integer;
var posuvnik_v_polygonech: Tpolygony;
    max: integer;
begin
posuvnik_v_polygonech:=hlava;
max:=1;
while posuvnik_v_polygonech^.dalsi<>nil do
  begin
    if max<posuvnik_v_polygonech^.cislo
      then max:=posuvnik_v_polygonech^.cislo;
    posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
  end;
cislo_max:=max;
end;

procedure prejmenuj_komponentu (var hlava: Tpolygony; stare, nove: integer); {hleda polygony s cislem komponenty "stare", prepise cislo na "nove"}
var posuvnik_v_polygonech: Tpolygony;
begin
  posuvnik_v_polygonech:=hlava;
  while posuvnik_v_polygonech^.dalsi<>nil do
    begin
      if posuvnik_v_polygonech^.cislo=stare
        then posuvnik_v_polygonech^.cislo:=nove;
      posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
    end;
end;

procedure prejmenuj_komponenty (var hlava: Tpolygony); {prejmenuje komponenty, aby byla vyuziva vsechna cisla od 1 do "pocet komponent"}
var stare, nove, i, hranice: integer;
begin
stare:=2;
hranice:=cislo_max (hlava);
for i:=1 to hranice do
  begin
    nove:=i;
    stare:=i+1;
    while (cislo_obsazeno (hlava, nove)=false) AND (stare<=hranice) do
      begin
        prejmenuj_komponentu (hlava, stare, nove);
        inc (stare);
      end;
  end;
if vypisy=true
  then begin
         writeln ('komponenty souvislosti: ');
         vypis_komponenty(hlava);
       end;
end;

function najdi_extremy (hlava: Tpolygony): Tbod;    {.x-bude maximum, .y bude minimum, najde nejmensi a nejvetsi x-ovou souradnici v polygonu}
var minimum, maximum: real;
    posuvnik: Tbody;
begin
  posuvnik:=hlava^.info;
  minimum:=sirka_lesa;
  maximum:=0;
  while posuvnik^.dalsi<>nil do
    begin
      if posuvnik^.souradnice.x<minimum
        then minimum:=posuvnik^.souradnice.x;
      if posuvnik^.souradnice.x>maximum
        then maximum:=posuvnik^.souradnice.x;
      posuvnik:=posuvnik^.dalsi;
    end;
najdi_extremy.x:=maximum;
najdi_extremy.y:=minimum;
end;

procedure najdi_problem (hlava: Tpolygony; var projde: boolean; var cislo_nepruchozi: integer; pocet_komponent: integer); {hleda komponentu, ktera ma od obou hranic lesa vzdalenost mensi nez 2*polomer}
var posuvnik: Tpolygony;
  komponenta,i: integer;
  extremy: Tbod;
  k_min, k_max: real;
begin
for i:=1 to pocet_komponent do
begin
  projde:=true;
  komponenta:=i;
  posuvnik:=hlava;
  k_min:=sirka_lesa;
  k_max:=0;
  while posuvnik^.dalsi<>nil do
    begin
      if posuvnik^.cislo=komponenta
         then begin
                extremy:=najdi_extremy (posuvnik);
                if extremy.x>k_max
                   then k_max:=extremy.x;
                if extremy.y<k_min
                   then k_min:=extremy.y;
                posuvnik:=posuvnik^.dalsi;
               end
         else posuvnik:=posuvnik^.dalsi;
    end;
  if (k_min<0+2*polomer) AND (k_max>sirka_lesa-2*polomer)
    then begin
            projde:=false;
            cislo_nepruchozi:=komponenta;
            exit;
         end;
end;
end;

procedure vyrob_vystup (hlava: Tpolygony); {vypisuje pozadovana data do souboru vystup.txt}
var komponenta, pocet_komponent, i: integer;
posuvnik_v_polygonech: Tpolygony;
begin
  assign (vystup, 'vystup.txt');
  rewrite (vystup);
  komponenta:=1;
  pocet_komponent:=cislo_max(hlava);
  write (vystup, 'Zjisteny vysledek pro les sirky ');
  write (vystup, sirka_lesa:4:2);
  write (vystup, ' a obra s polomerem ');
  write (vystup, polomer:4:2);
  writeln (vystup, ':');

  for i:=1 to pocet_komponent do
    begin
      posuvnik_v_polygonech:=hlava;
      write (vystup, 'Komponenta souvislosti cislo ');
      write (vystup, i);
      writeln (vystup, ':');
      while posuvnik_v_polygonech^.dalsi<>nil do
        begin
          if posuvnik_v_polygonech^.cislo = i
            then polygon_do_souboru (posuvnik_v_polygonech^.info);
            posuvnik_v_polygonech:=posuvnik_v_polygonech^.dalsi;
        end;
      posuvnik_v_polygonech:=hlava;
    end;
  writeln (vystup);
  if projde=true
    then writeln (vystup, 'Vysledek vypoctu: Obr muze zadanym lesem projit.')
    else begin
           write (vystup, 'Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: ');
           writeln (vystup, cislo_nepruchozi);
         end;
  close (vystup);
end;

{***Zacatek samotneho tela programu***}
begin
Clrscr;
priprav_data;
nacti_data (hlava, sirka_lesa, polomer);
if sirka_lesa<polomer*2
  then begin
         assign (vystup, 'vystup.txt');
         rewrite (vystup);
         writeln (vystup, 'Obr je sirsi nez les, nemuze tedy projit.');
         close (vystup);
       end
   else begin
         zvetsi_polygony (hlava);
         urci_komponenty (hlava);
         if vypisy = true
           then writeln;
         prejmenuj_komponenty (hlava);
         pocet_komponent:= cislo_max (hlava);
         najdi_problem (hlava, projde, cislo_nepruchozi, pocet_komponent);
         if vypisy = true
           then if projde=true
                  then writeln ('Obr projde lesem.')
                  else writeln ('Obr lesem neprojde, problemova komponenta: c.', cislo_nepruchozi);
         vyrob_vystup (hlava);
        end;
end.
 
Nahoru Odpovědět 18.9.2013 15:22
Avatar
haubeltova
Člen
Avatar
haubeltova:

ještě sem dám nějaké vstupy a výstupy :)

Vstup:
11
0.3
[1.75;8.5] [3.5;9.75] [0.5;10] [1.75;8.5]
[4.25;6.25] [9.25;5.75] [6.25;8] [4.25;6.25]
[1.75;2.25] [4;2.75] [2.75;4] [1.5;3.25] [1.75;2.25]
[9.25;7.25] [10;7.75] [10;8.75] [9.25;9.5] [8.25;9.25] [9;8.75] [8.5;7.75] [9.25;7.25]
[2.25;4.75] [2.75;6.25] [3.5;6] [3;8] [1.5;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8;5.5] [7.25;5] [6.25;5.25] [6.5;4.25] [8.5;4.5] [8.5;2.75] [9.5;3.75] [9.75;0.75]
[4.5;3.75] [5.5;5] [4.25;5] [4.5;3.75]
[0.5;0.5] [3;1] [2.5;1.75] [1.5;1.5] [0.75;2.25] [0.5;0.5]
[4.5;8] [5.25;8.5] [5;9.25] [4.25;10] [4.25;8.75] [4.5;8]
[4;1.75] [5;1] [7.25;2] [5.75;3] [4.1;1.75]

Vystup:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.30:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
Komponenta souvislosti cislo 2:
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25] [6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
Komponenta souvislosti cislo 3:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
Komponenta souvislosti cislo 4:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75] [8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 5:
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
Komponenta souvislosti cislo 6:
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
Komponenta souvislosti cislo 7:
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 8:
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 9:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]

Vysledek vypoctu: Obr muze zadanym lesem projit.

Vystup pro poloměr 0.4:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.40:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25] [6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 2:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 3:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75] [8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 4:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]

Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: 1

Obrázek:

 
Nahoru Odpovědět 18.9.2013 15:29
Avatar
haubeltova
Člen
Avatar
haubeltova:

ještě sem dám nějaké vstupy a výstupy :)

Vstup:
11
0.3
[1.75;8.5] [3.5;9.75] [0.5;10] [1.75;8.5]
[4.25;6.25] [9.25;5.75] [6.25;8] [4.25;6.25]
[1.75;2.25] [4;2.75] [2.75;4] [1.5;3.25] [1.75;2.25]
[9.25;7.25] [10;7.75] [10;8.75] [9.25;9.5] [8.25;9.25] [9;8.75] [8.5;7.75] [9.25;7.25]
[2.25;4.75] [2.75;6.25] [3.5;6] [3;8] [1.5;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8;5.5] [7.25;5] [6.25;5.25] [6.5;4.25] [8.5;4.5] [8.5;2.75] [9.5;3.75] [9.75;0.75]
[4.5;3.75] [5.5;5] [4.25;5] [4.5;3.75]
[0.5;0.5] [3;1] [2.5;1.75] [1.5;1.5] [0.75;2.25] [0.5;0.5]
[4.5;8] [5.25;8.5] [5;9.25] [4.25;10] [4.25;8.75] [4.5;8]
[4;1.75] [5;1] [7.25;2] [5.75;3] [4.1;1.75]

Vystup:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.30:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
Komponenta souvislosti cislo 2:
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25] [6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
Komponenta souvislosti cislo 3:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
Komponenta souvislosti cislo 4:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75] [8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 5:
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
Komponenta souvislosti cislo 6:
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
Komponenta souvislosti cislo 7:
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 8:
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 9:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]

Vysledek vypoctu: Obr muze zadanym lesem projit.

Vystup pro poloměr 0.4:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.40:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25] [6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 2:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 3:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75] [8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 4:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]

Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: 1

Obrázek:

 
Nahoru Odpovědět 18.9.2013 15:30
Avatar
haubeltova
Člen
Avatar
haubeltova:

ještě sem dám nějaké vstupy a výstupy :)

Vstup:
11
0.3
[1.75;8.5] [3.5;9.75] [0.5;10] [1.75;8.5]
[4.25;6.25] [9.25;5.75] [6.25;8] [4.25;6.25]
[1.75;2.25] [4;2.75] [2.75;4] [1.5;3.25] [1.75;2.25]
[9.25;7.25] [10;7.75] [10;8.75] [9.25;9.5] [8.25;9.25] [9;8.75] [8.5;7.75] [9.25;7.25]
[2.25;4.75] [2.75;6.25] [3.5;6] [3;8] [1.5;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8;5.5] [7.25;5] [6.25;5.25] [6.5;4.25] [8.5;4.5] [8.5;2.75] [9.5;3.75] [9.75;0.75]
[4.5;3.75] [5.5;5] [4.25;5] [4.5;3.75]
[0.5;0.5] [3;1] [2.5;1.75] [1.5;1.5] [0.75;2.25] [0.5;0.5]
[4.5;8] [5.25;8.5] [5;9.25] [4.25;10] [4.25;8.75] [4.5;8]
[4;1.75] [5;1] [7.25;2] [5.75;3] [4.1;1.75]

Vystup:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.30:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
Komponenta souvislosti cislo 2:
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25] [6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
Komponenta souvislosti cislo 3:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
Komponenta souvislosti cislo 4:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75] [8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 5:
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
Komponenta souvislosti cislo 6:
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
Komponenta souvislosti cislo 7:
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 8:
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 9:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]

Vysledek vypoctu: Obr muze zadanym lesem projit.

Vystup pro poloměr 0.4:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.40:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25] [6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 2:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 3:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75] [8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 4:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]

Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: 1

Obrázek:

 
Nahoru Odpovědět 18.9.2013 15:30
Avatar
haubeltova
Člen
Avatar
haubeltova:

ještě sem dám nějaké vstupy a výstupy :)

Vstup:
11
0.3
[1.75;8.5] [3.5;9.75] [0.5;10] [1.75;8.5]
[4.25;6.25] [9.25;5.75] [6.25;8] [4.25;6.25]
[1.75;2.25] [4;2.75] [2.75;4] [1.5;3.25] [1.75;2.25]
[9.25;7.25] [10;7.75] [10;8.75] [9.25;9.5] [8.25;9.25] [9;8.75] [8.5;7.75] [9.25;7.25]
[2.25;4.75] [2.75;6.25] [3.5;6] [3;8] [1.5;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8;5.5] [7.25;5] [6.25;5.25] [6.5;4.25] [8.5;4.5] [8.5;2.75] [9.5;3.75] [9.75;0.75]
[4.5;3.75] [5.5;5] [4.25;5] [4.5;3.75]
[0.5;0.5] [3;1] [2.5;1.75] [1.5;1.5] [0.75;2.25] [0.5;0.5]
[4.5;8] [5.25;8.5] [5;9.25] [4.25;10] [4.25;8.75] [4.5;8]
[4;1.75] [5;1] [7.25;2] [5.75;3] [4.1;1.75]

Vystup:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.30:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
Komponenta souvislosti cislo 2:
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25] [6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
Komponenta souvislosti cislo 3:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
Komponenta souvislosti cislo 4:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75] [8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 5:
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
Komponenta souvislosti cislo 6:
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
Komponenta souvislosti cislo 7:
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 8:
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 9:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]

Vysledek vypoctu: Obr muze zadanym lesem projit.

Vystup pro poloměr 0.4:
Zjisteny vysledek pro les sirky 11.00 a obra s polomerem 0.40:
Komponenta souvislosti cislo 1:
[1.75;8.50] [3.50;9.75] [0.50;10.00] [1.75;8.50]
[4.25;6.25] [9.25;5.75] [6.25;8.00] [4.25;6.25]
[2.25;4.75] [2.75;6.25] [3.50;6.00] [3.00;8.00] [1.50;7.75] [2.25;4.75]
[9.75;0.75] [10.25;4.25] [9.25;5.25] [8.00;5.50] [7.25;5.00] [6.25;5.25] [6.50;4.25] [8.50;4.50] [8.50;2.75] [9.50;3.75] [9.75;0.75]
[4.50;3.75] [5.50;5.00] [4.25;5.00] [4.50;3.75]
[4.50;8.00] [5.25;8.50] [5.00;9.25] [4.25;10.00] [4.25;8.75] [4.50;8.00]
Komponenta souvislosti cislo 2:
[1.75;2.25] [4.00;2.75] [2.75;4.00] [1.50;3.25] [1.75;2.25]
[0.50;0.50] [3.00;1.00] [2.50;1.75] [1.50;1.50] [0.75;2.25] [0.50;0.50]
Komponenta souvislosti cislo 3:
[9.25;7.25] [10.00;7.75] [10.00;8.75] [9.25;9.50] [8.25;9.25] [9.00;8.75] [8.50;7.75] [9.25;7.25]
Komponenta souvislosti cislo 4:
[4.00;1.75] [5.00;1.00] [7.25;2.00] [5.75;3.00] [4.10;1.75]

Vysledek vypoctu: Obr nemuze zadanym lesem projit. Problemova je komponenta c.: 1

Obrázek:

 
Nahoru Odpovědět 18.9.2013 15:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 47 zpráv z 47.