
Delphi pole
Zdravím.
Když mam pole.
pole: array[1..5] of integer;
begin
pole[1]:= 7;
pole[2]:= 0;
pole[3]:= 0;
pole[4]:= 0;
pole[5]:= 11;
Potřebují zjistit, jestli je ve všech polích stejné číslo.
Přečtu si do proměnné první pole[1] a pak pomocí smyčky for projedu zbytek a porovnám.
Je jednodušší řešení?
Není. Jenom se to dá trochu zoptimalizovat tím, že skočíš, jakmile najdeš první odlišný prvek.
Jen taková připomínka, pokud se pole inicializuje hned za beginem, bylo by možná lepší ho inicializovat už v deklaraci zápisem typu:
přesnou syntaxi si ale zjistěte v dokumentaci, toto zrovna z hlavy nevim a taky to musím hledat, když to zrovna potřebuju.
Existuje řešení, které není jednodušší (teda jak se to vezme), ale vede na jednodušší (rychlejší) kód. Jde o to, že indexování pole znamená kombinaci násobení a sčítání (hodnota je uložená na adrese základ+číslo_prvku*velikost_prvku), pokud je potřeba přistupovat k prvkům pole sekvenčně (což tady je), neni potřeba pořád dokola násobit (chytrý kompilátor použije posun, ale stejně to při každém indexování musí dělat opakovaně) a sčítat (k tomu si přidejte cyklus for), ale stačí adresu (ukazatel) navyšovat o velikost prvku.
postup by vypadal asi takto (nemám to plně promyšlené, tak jen naznačím)
Lze to asi napsat na tucet dalších způsobů, ale snad jsem tu myšlenku vystihnul. Zrovna v delphi se s ukazateli pracuje trochu hůř (skoro mám pocit, že ani nejdou sčítat), alespoň co vím z verzí 3 a 7. Matně si vzpomínám, že inc(ukazatel) ho inkrementoval o velikost jeho typu, takže druhý parametr inc je zbytečný, ale to by opět bylo nutné ověřit v nápovědě. Tedy spousta zjišťování, kvůli drobné optimalizaci - to by mělo smysl, pokud by se to porovnávání dělalo v programu nějak často, nebo by ta pole byla hodně velká.