<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>http://www.kiwiki.info/index.php?action=history&amp;feed=atom&amp;title=Triedenie_po%C4%BEa_smern%C3%ADkov_%28rie%C5%A1en%C3%A9_pr%C3%ADklady%29</id>
	<title>Triedenie poľa smerníkov (riešené príklady) - História úprav</title>
	<link rel="self" type="application/atom+xml" href="http://www.kiwiki.info/index.php?action=history&amp;feed=atom&amp;title=Triedenie_po%C4%BEa_smern%C3%ADkov_%28rie%C5%A1en%C3%A9_pr%C3%ADklady%29"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_po%C4%BEa_smern%C3%ADkov_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;action=history"/>
	<updated>2026-05-03T15:56:36Z</updated>
	<subtitle>História úprav pre túto stránku na wiki</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_po%C4%BEa_smern%C3%ADkov_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=6675&amp;oldid=prev</id>
		<title>Juraj na 20:28, 16. august 2010</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_po%C4%BEa_smern%C3%ADkov_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=6675&amp;oldid=prev"/>
		<updated>2010-08-16T20:28:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;sk&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Staršia verzia&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Verzia zo dňa a času 20:28, 16. august 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Riadok 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Riadok 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Kategória:Študijné materiály]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Kategória:Programovanie]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Kategória:jazyk C]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Skripta programovanie (zbierka úloh)}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Skripta programovanie (zbierka úloh)}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_po%C4%BEa_smern%C3%ADkov_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=2545&amp;oldid=prev</id>
		<title>Juraj: Vytvorená stránka „Kategória:Študijné materiály Kategória:Programovanie Kategória:jazyk C {{Skripta programovanie (zbierka úloh)}}  ==Triedenie poľa ukazovateľov alebo Tr…“</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_po%C4%BEa_smern%C3%ADkov_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=2545&amp;oldid=prev"/>
		<updated>2010-03-08T14:12:36Z</updated>

		<summary type="html">&lt;p&gt;Vytvorená stránka „&lt;a href=&quot;/index.php/Kateg%C3%B3ria:%C5%A0tudijn%C3%A9_materi%C3%A1ly&quot; title=&quot;Kategória:Študijné materiály&quot;&gt;Kategória:Študijné materiály&lt;/a&gt; &lt;a href=&quot;/index.php/Kateg%C3%B3ria:Programovanie&quot; title=&quot;Kategória:Programovanie&quot;&gt;Kategória:Programovanie&lt;/a&gt; &lt;a href=&quot;/index.php/Kateg%C3%B3ria:Jazyk_C&quot; title=&quot;Kategória:Jazyk C&quot;&gt;Kategória:jazyk C&lt;/a&gt; {{Skripta programovanie (zbierka úloh)}}  ==Triedenie poľa ukazovateľov alebo Tr…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
[[Kategória:jazyk C]]&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
&lt;br /&gt;
==Triedenie poľa ukazovateľov alebo Triedime štruktúry efektívne==&lt;br /&gt;
===Zadanie===&lt;br /&gt;
Uvažujme rovnaké zadanie ako v predošlom. Navyše požadujme viacúrovňové (vnorené) triedenie podľa triediaceho kritéria s nižšou prioritou ak sú položky podľa aktuálneho triediaceho kritéria ekvivalentné. V našom jednoduchom príklade to znamená, že ak napríklad triedime zamestnancov podľa krstného mena a mená niektorých zamestnancov sú rovnaké, potom budú títo utriedení podľa priezviska. Naopak, ak budeme triediť podľa priezviska a priezviská niektorých zamestnancov budú rovnaké, potom ich utriedime podľa krstného mena. Túto situáciu môžeme rozšíriť aj o triedenie podľa roku narodenia. V tomto prípade môžeme definovať prioritu jednotlivým triediacim kritériam a triediť následne podľa priorít.&lt;br /&gt;
===Metodický komentár===&lt;br /&gt;
:Cieľom tejto úlohy v porovaní s predchádzajúcou je efektívne triediť dáta použitím ukazovateľov a poukázať na ďalšie možnosti pri ich triedení.  Využijú sa pokročilejšie techniky práce s ukazovateľmi, dynamická alokácia a realokácia pamäte. &lt;br /&gt;
===Vzorové dáta===&lt;br /&gt;
:Ako v predošlom.&lt;br /&gt;
===Zjednodušujúce predpoklady===&lt;br /&gt;
:Rovnaké ako v predošlom s tým rozdielom, že počet záznamov v súbore nie je obmedzený. Predpokladáme však, že systém má dostatok voľnej pamäte. &lt;br /&gt;
:V súbore sa teda môže nachádzať niekoľko desiatok, ale aj stoviek tisícov záznamov.&lt;br /&gt;
===Vzorová výzva programu===&lt;br /&gt;
 Vyber postupnost kriterii triedenia. (Prve kriterium ma najvacsiu prioritu.)&lt;br /&gt;
   Meno, Priezvisko, Rok    1&lt;br /&gt;
   Priezvisko, Meno, Rok    2&lt;br /&gt;
   Rok, Meno, Priezvisko    3&lt;br /&gt;
   Rok, Priezvisko, Meno    4&lt;br /&gt;
   Pre ukoncenie programu   0&lt;br /&gt;
 Volba: _&lt;br /&gt;
&lt;br /&gt;
'''Vzorový vstup'''&lt;br /&gt;
 1	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vzorový výstup'''&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
  ZAMESTNANEC                               ROK NARODENIA&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
  Alenka               Biela                    1985&lt;br /&gt;
  Alzbetka             Mudra                    1978&lt;br /&gt;
  Andrea               Mlada                    1990&lt;br /&gt;
  Janko                Maly                     1978&lt;br /&gt;
  Janko                Maly                     1983&lt;br /&gt;
  Jozko                Cierny                   1985&lt;br /&gt;
  Martin               Starsi                   1939&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
===Návod ako začať===&lt;br /&gt;
Prvým významným rozdielom v porovnaní s predchádzajúcim zadaním je skutočnosť, že počet záznamov (zamestnancov) v súbore nie je obmedzený a je vopred neznámy. Z toho dôvodu je použitie statického poľa štruktúr neefektívne. Riešením je dynamická alokácia pamäte. Mohli by sme tak dynamicky alokovať pole štruktúr podľa aktuálnej potreby programu. Ak sa však zamyslíme nad požiadavkou efektívneho triedenia zamestnancov prichádzame k záveru, že ani toto riešenie by nebolo vhodné. Dôvodom je činnosť funkcie ''qsort'', ktorá pri triedení manipuluje s celými položkami poľa, ktoré by v tomto prípade boli štruktúry (keďže by sa jednalo o pole štruktúr či už staticky alebo dynamicky alokované). Funkcia ''qsort'' by tak musela pracovať pri triedení s pomerne veľkým objemom dát. Riešením tejto situácie je použitie dynamicky alokovaného poľa ukazovateľov. Jednotlivé položky poľa by potom už neboli samotné štruktúry, ale adresy týchto štruktúr. Ako vieme, veľkosť adresy je 4 bajty (resp. 8B v 64-bitovom OS). Takže funkcia ''qsort'' bude triediť pole adries tak aby po zotriedení boli splnené požiadavky triedenia dané prioritami triediacich kritérií. Ak zhrnieme doteraz povedané, tak pre pamätanie celého súboru zamestnancov je výhodné použiť dynamicky alokované pole ukazovateľov, v ktorom pre každý prvok poľa budeme dynamicky alokovať pamäťový priestor pre pamätanie štruktúry uchovávajúcej údaje o jednom konkrétnom zamestnancovi.&lt;br /&gt;
&lt;br /&gt;
Druhým významným rozdielom je požiadavka na viacúrovňové triedenie. Pri písaní porovnávacích funkcií zohľadňujúcich tri úrovne priorít triediacih kritérií je výhodné začať od písania funkcií pre jednoúrovňové triedenie (pozri predchádzajúci príklad), tieto ďalej využiť pri písaní dvojúrovňových, a tieto spolu zasa pri písaní trojúrovňových. Takto môžeme veľmi jednoducho a prehľadne podľa potreby napísať rôzne mnohoúrovňové porovnávacie funkcie.&lt;br /&gt;
====Alokácia pamäti====&lt;br /&gt;
Pre alokáciu pamäti je možné využiť funkciu malloc (funkcia jazyka C), alebo new (operátor jazyka C++). Uvedieme definície týchto spôsobov:&lt;br /&gt;
&lt;br /&gt;
'''malloc'''&lt;br /&gt;
&lt;br /&gt;
Funkcia [http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/ malloc] definovaná v knižnici stdlib.h:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   void * malloc ( size_t size );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
;size:veľkosť pamäti, ktorá sa alokuje&lt;br /&gt;
;Návratová hodnota: V prípade úspechu vráti smerník na alokovanú pamäť, v prípade neúspechu vráti NULL. Návratová hodnota je smetník na void, preto si ho treba pretypovať na želaný typ.&lt;br /&gt;
&lt;br /&gt;
'''new'''&lt;br /&gt;
&lt;br /&gt;
Operátor [http://msdn.microsoft.com/en-us/library/kewsb8ba%28VS.71%29.aspx new] je definovaný v knižnici iostream.h nasledovne:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  [::] new [placement] new-type-name [new-initializer]&lt;br /&gt;
  [::] new [placement] ( type-name ) [new-initializer]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Operátor new alokuje mapäť pre premenné (resp. objekty) alebo pole premenných, ktoré sú typu ''type-name'' a vracia ukazovateľ na túto alokovanú pamäť. Ukazovateľ je na rozdiel od funkcie malloc už pretypovaný na správny typ. Pri neúspechu vyvolá výnimku. Spracovanie vyvolanej výnimky je v nasledujúcom kóde:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   int * i_arr;&lt;br /&gt;
   try {&lt;br /&gt;
      i_arr = new int[0x3fffffff];&lt;br /&gt;
   } &lt;br /&gt;
   catch(...) {&lt;br /&gt;
      cout&amp;lt;&amp;lt;&amp;quot;Vynimka: nedostatok pamati pre alokaciu&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Možné riešenie v jazyku C===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define NAZOV_SUBORU &amp;quot;data.txt&amp;quot;&lt;br /&gt;
#define KROK_REALOKACIE 100&lt;br /&gt;
&lt;br /&gt;
// Vytvorenie pomenovanej struktury s nazvom &amp;quot;ZAMESTNANEC&amp;quot;&lt;br /&gt;
struct ZAMESTNANEC {&lt;br /&gt;
   char meno[21];&lt;br /&gt;
   char priezvisko[21];&lt;br /&gt;
   int rok_narodenia;&lt;br /&gt;
   };&lt;br /&gt;
&lt;br /&gt;
// Uplne funkcne prototypy pouzivanych funkcii:&lt;br /&gt;
&lt;br /&gt;
// Nacitanie jedineho zamestnanca zo suboru&lt;br /&gt;
int nacitajZAMESTNANEC(FILE *fr, ZAMESTNANEC *V);	      &lt;br /&gt;
&lt;br /&gt;
// Vypisanie jedineho zamestnanca na monitor&lt;br /&gt;
void vypisZAMESTNANEC(ZAMESTNANEC V);			      &lt;br /&gt;
&lt;br /&gt;
// Porovnanie dvoch zamestnancov podla roku narodenia&lt;br /&gt;
int porovnajROK(const void *V1, const void *V2);	      &lt;br /&gt;
&lt;br /&gt;
// Porovnanie dvoch zamestnancov podla mena&lt;br /&gt;
int porovnajMENO(const void *V1, const void *V2); 	      &lt;br /&gt;
&lt;br /&gt;
// Porovnanie dvoch zamestnancov podla priezviska&lt;br /&gt;
int porovnajPRIEZV(const void *V1, const void *V2);           &lt;br /&gt;
&lt;br /&gt;
// Porovnanie najprv podla priezviska potom podla mena&lt;br /&gt;
int porovnajPRIEZV_MENO(const void *V1, const void *V2);      &lt;br /&gt;
int porovnajMENO_PRIEZV(const void *V1, const void *V2);      // podobne dalej...&lt;br /&gt;
int porovnajMENO_PRIEZV_ROK(const void *V1, const void *V2);&lt;br /&gt;
int porovnajPRIEZV_MENO_ROK(const void *V1, const void *V2);&lt;br /&gt;
int porovnajROK_PRIEZV_MENO(const void *V1, const void *V2);&lt;br /&gt;
int porovnajROK_MENO_PRIEZV(const void *V1, const void *V2);&lt;br /&gt;
&lt;br /&gt;
// Hlavna funkcia programu:&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   // Pozor, zmena v porovnani s predchadzajucim riesenim! &lt;br /&gt;
   ZAMESTNANEC **pole;               &lt;br /&gt;
&lt;br /&gt;
   // Pocet nacitanych zamestnancov            &lt;br /&gt;
   int Pocet_zamestnancov = 0;                  &lt;br /&gt;
   // Prednastaveny maximalny pocet zamestnancov&lt;br /&gt;
   int maxPocet_zamestnancov = 100;             &lt;br /&gt;
   // kriterium triedenia / ukoncenia programu&lt;br /&gt;
   int volba;                                   &lt;br /&gt;
   // pointer na zdrojovy subor, z ktoreho budeme nacitavat zamestnancov&lt;br /&gt;
   FILE *fr;                                    &lt;br /&gt;
   // pointer na funkciu, pomocou ktorej budeme triedit&lt;br /&gt;
   int (*sortFun)(const void *,const void *);   &lt;br /&gt;
   int i;      // pomocna premenna&lt;br /&gt;
   &lt;br /&gt;
   // Otvorenie zdrojoveho suboru v rezime &amp;quot;read&amp;quot;&lt;br /&gt;
   if((fr=fopen(NAZOV_SUBORU,&amp;quot;r&amp;quot;))==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;\n Pozadovany subor sa nepodarilo otvorit!\n&amp;quot;);&lt;br /&gt;
      system(&amp;quot;pause&amp;quot;);&lt;br /&gt;
      exit(1);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // Prvotna alokacia pamate pre pole pointrov na pomenovanu strukturu ZAMESTNANEC&lt;br /&gt;
   if((pole=(ZAMESTNANEC**)malloc(maxPocet_zamestnancov*sizeof(ZAMESTNANEC*)))==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Nedostatok pamete!\n&amp;quot;);&lt;br /&gt;
      system(&amp;quot;pause&amp;quot;);&lt;br /&gt;
      exit(1);&lt;br /&gt;
   }&lt;br /&gt;
   //**********************************************************************&lt;br /&gt;
   //*  Pomocou operatora new sa kod na riadkoch 68 az 73 zapise nasledovne&lt;br /&gt;
   //* try{&lt;br /&gt;
   //*   pole=new (ZAMESTNANEC*)[maxPocet_zamestnancov];&lt;br /&gt;
   //* }&lt;br /&gt;
   //* catch(...)&lt;br /&gt;
   //* {  cout&amp;lt;&amp;lt;&amp;quot;Nedostatok pamete&amp;quot;; &lt;br /&gt;
   //*    exit(1);&lt;br /&gt;
   //* }&lt;br /&gt;
   //*********************************************************************&lt;br /&gt;
&lt;br /&gt;
   // Najprv si musime alokovat priestor pre prveho zamestnanca &lt;br /&gt;
   // (aby data, ktore nacitame sme mali kam ulozit)&lt;br /&gt;
   if((pole[0]=(ZAMESTNANEC*)malloc(sizeof(ZAMESTNANEC)))==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;\n Nedostatok pamete...\n&amp;quot;);&lt;br /&gt;
      exit(1);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   //**********************************************************************&lt;br /&gt;
   //*  Pomocou operatora new sa kod na riadkoch 87 az 91 zapise nasledovne&lt;br /&gt;
   //* try{&lt;br /&gt;
   //*   pole[0]=new ZAMESTNANEC;&lt;br /&gt;
   //* }&lt;br /&gt;
   //* catch(...)&lt;br /&gt;
   //* {  cout&amp;lt;&amp;lt;&amp;quot;Nedostatok pamete&amp;quot;; &lt;br /&gt;
   //*    exit(1);&lt;br /&gt;
   //* }&lt;br /&gt;
   //*********************************************************************&lt;br /&gt;
   // Nacitanie vsetkych zamestnancov zo suboru&lt;br /&gt;
   for(i=0; nacitajZAMESTNANEC(fr,pole[i]); i++)&lt;br /&gt;
   {&lt;br /&gt;
		//Alokujeme si miesto pre dalsieho zamestnanca:&lt;br /&gt;
      if((pole[i+1]=(ZAMESTNANEC*)malloc(sizeof(ZAMESTNANEC)))==NULL)&lt;br /&gt;
      {&lt;br /&gt;
         printf(&amp;quot;\n Nedostatok pamete pre pridanie dalsieho zamestnanca...\n&amp;quot;);&lt;br /&gt;
         system(&amp;quot;pause&amp;quot;);&lt;br /&gt;
         exit(1);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // V pripade potreby realokujeme pole pinterov: (Tato situacia nastane&lt;br /&gt;
      // ak pocet zamestnancov v subore je vacsi ako aktualne nastavna hodnota&lt;br /&gt;
      // premennej maxPocet_zamestnancov)&lt;br /&gt;
      if(i == maxPocet_zamestnancov-2)&lt;br /&gt;
      {&lt;br /&gt;
         maxPocet_zamestnancov += KROK_REALOKACIE;  // Zvysime maximalny pocet zamestnancov&lt;br /&gt;
         //printf(&amp;quot;...realokujem...&amp;quot;);&lt;br /&gt;
         if((pole=(ZAMESTNANEC**)realloc(pole,maxPocet_zamestnancov*sizeof(ZAMESTNANEC*)))==NULL)&lt;br /&gt;
         {&lt;br /&gt;
            printf(&amp;quot; Nedostatok pamate pre realokaciu pola pointerov!\n&amp;quot;);&lt;br /&gt;
            system(&amp;quot;pause&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   Pocet_zamestnancov = i;&lt;br /&gt;
   fclose(fr); // zatvorenie suboru, data uz su nacitane..&lt;br /&gt;
   fr = NULL;  // zaroven nastavime na NULL pre pripad aby &lt;br /&gt;
               // sme v pripade chybneho pouzitia tohto poitera boli vcas varovani&lt;br /&gt;
   &lt;br /&gt;
   // Hlavny cyklus programu &lt;br /&gt;
   do{&lt;br /&gt;
      printf(&amp;quot;\n Vyber postupnost kriterii triedenia. (Prve kriterium ma najvacsiu prioritu.)\n&amp;quot;&lt;br /&gt;
	       &amp;quot;   Meno, Priezvisko, Rok    1\n&amp;quot;&lt;br /&gt;
	       &amp;quot;   Priezvisko, Meno, Rok    2\n&amp;quot;&lt;br /&gt;
	       &amp;quot;   Rok, Meno, Priezvisko    3\n&amp;quot;&lt;br /&gt;
               &amp;quot;   Rok, Priezvisko, Meno    4\n\n&amp;quot;&lt;br /&gt;
	       &amp;quot;   Pre ukoncenie programu   0\n\n&amp;quot;&lt;br /&gt;
	       &amp;quot; Volba: &amp;quot;);&lt;br /&gt;
      scanf(&amp;quot;%d&amp;quot;,&amp;amp;volba);&lt;br /&gt;
      &lt;br /&gt;
      switch(volba)&lt;br /&gt;
      {&lt;br /&gt;
         case 0: break;&lt;br /&gt;
         case 1: sortFun = porovnajMENO_PRIEZV_ROK;   break;&lt;br /&gt;
         case 2: sortFun = porovnajPRIEZV_MENO_ROK;   break;&lt;br /&gt;
         case 3: sortFun = porovnajROK_MENO_PRIEZV;   break;&lt;br /&gt;
         case 4: sortFun = porovnajROK_PRIEZV_MENO;   break;&lt;br /&gt;
         default:&lt;br /&gt;
            printf(&amp;quot;\n Neocakavany vstup. Program bude ukonceny.\n&amp;quot;);&lt;br /&gt;
            volba=0;&lt;br /&gt;
      }&lt;br /&gt;
      if(volba) // Vypisanie utriedeneho pola na monitor&lt;br /&gt;
      {&lt;br /&gt;
         // Utriedenie zamestnancov:&lt;br /&gt;
         qsort((void*)pole,Pocet_zamestnancov,sizeof(pole[0]),sortFun);&lt;br /&gt;
&lt;br /&gt;
         clrscr(); //vycistime si obrazovku&lt;br /&gt;
         printf(&amp;quot;--------------------------------------------------------\n&amp;quot;);&lt;br /&gt;
         printf(&amp;quot; ZAMESTNANEC                               ROK NARODENIA\n&amp;quot;);&lt;br /&gt;
         printf(&amp;quot;--------------------------------------------------------\n&amp;quot;);&lt;br /&gt;
         for(i=0;i&amp;lt;Pocet_zamestnancov;i++)&lt;br /&gt;
            vypisZAMESTNANEC(*pole[i]);&lt;br /&gt;
         printf(&amp;quot;--------------------------------------------------------\n&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
   }while(volba);&lt;br /&gt;
&lt;br /&gt;
   // Na zaver nasleduje uvolnenie pamate, ktoru sme alokovali.&lt;br /&gt;
   // Najprv musime uvolnit pamet, ktoru sme alokovali pre jednotlivych zamestnancov.&lt;br /&gt;
&lt;br /&gt;
   //Pocet alokovanych zamestnancov je o jednehoneho viac...&lt;br /&gt;
   for(i=0; i&amp;lt;skutocnyPocet_zamestnancov + 1;i++) &lt;br /&gt;
      free(pole[i]);&lt;br /&gt;
&lt;br /&gt;
   //Potom uvolnime pamat alokovanu pre pointre&lt;br /&gt;
   free(pole);&lt;br /&gt;
   poleStud = NULL;  // a nastavime na NULL (nie je nevyhnutne potrebne)&lt;br /&gt;
   &lt;br /&gt;
   system(&amp;quot;pause&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Definicie pouzivanych funkcii:&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int nacitajZAMESTNANEC(FILE *fr, ZAMESTNANEC *V)&lt;br /&gt;
{&lt;br /&gt;
   int a;&lt;br /&gt;
   a = fscanf(fr,&amp;quot;%s %s , %d&amp;quot;, V-&amp;gt;meno, V-&amp;gt;priezvisko, &amp;amp;V-&amp;gt;rok_narodenia);&lt;br /&gt;
   if(a == EOF) a = 0;&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
void vypisZAMESTNANEC(ZAMESTNANEC V)&lt;br /&gt;
{&lt;br /&gt;
   printf(&amp;quot; %-20s %-20s     %d\n&amp;quot;, V.meno, V.priezvisko, V.rok_narodenia);&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int porovnajROK(const void *V1, const void *V2)&lt;br /&gt;
{&lt;br /&gt;
   return (*(ZAMESTNANEC**)V1)-&amp;gt;rok_narodenia - (*(ZAMESTNANEC**)V2)-&amp;gt;rok_narodenia;&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int porovnajMENO(const void *V1, const void *V2)&lt;br /&gt;
{&lt;br /&gt;
   return strcmp((*(ZAMESTNANEC**)V1)-&amp;gt;meno, (*(ZAMESTNANEC**)V2)-&amp;gt;meno);&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int porovnajPRIEZV(const void *V1, const void *V2)&lt;br /&gt;
{&lt;br /&gt;
   return strcmp((*(ZAMESTNANEC**)V1)-&amp;gt;priezvisko, (*(ZAMESTNANEC**)V2)-&amp;gt;priezvisko);&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int porovnajPRIEZV_MENO(const void *V1, const void *V2)&lt;br /&gt;
{&lt;br /&gt;
   int a = porovnajPRIEZV(V1, V2);&lt;br /&gt;
   if(a == 0) a = porovnajMENO(V1, V2);&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int porovnajMENO_PRIEZV(const void *V1, const void *V2)&lt;br /&gt;
{&lt;br /&gt;
   int a = porovnajMENO(V1, V2);&lt;br /&gt;
   if(a == 0) a = porovnajPRIEZV(V1, V2);&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int porovnajMENO_PRIEZV_ROK(const void *V1, const void *V2)&lt;br /&gt;
{&lt;br /&gt;
   int a = porovnajMENO_PRIEZV(V1, V2);&lt;br /&gt;
   if(a == 0) a = porovnajROK(V1, V2);&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int porovnajPRIEZV_MENO_ROK(const void *V1, const void *V2)&lt;br /&gt;
{&lt;br /&gt;
   int a = porovnajPRIEZV_MENO(V1, V2);&lt;br /&gt;
   if(a == 0) a = porovnajROK(V1, V2);&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int porovnajROK_PRIEZV_MENO(const void *V1, const void *V2)&lt;br /&gt;
{&lt;br /&gt;
   int a = porovnajROK(V1, V2);&lt;br /&gt;
   if(a == 0) a = porovnajPRIEZV_MENO(V1, V2);&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
int porovnajROK_MENO_PRIEZV(const void *V1, const void *V2)&lt;br /&gt;
{&lt;br /&gt;
   int a = porovnajROK(V1, V2);&lt;br /&gt;
   if(a == 0) a = porovnajMENO_PRIEZV(V1, V2);&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Komentár k uvedenému riešeniu===&lt;br /&gt;
&lt;br /&gt;
Bude zverejnený neskôr.&lt;br /&gt;
&lt;br /&gt;
====Nedostatky uvedeného riešenia a námety na zlepšenie====&lt;br /&gt;
Program nie je vhodný na triedenie extrémne rozsiahlych dát. Riešením tohto nedostatku je použitie iných triediacich funkcií, ktoré pracujú na princípe triedenia triedeného súboru po častiach. Ďalším nedostatkom je výpis utriedených dát na monitor. Táto operácia môže byť pri väčšom počte záznamov časovo veľmi zdĺhavá. Oveľa výhodnejšie a zároveň rýchlejšie je zapisovať výsledky do súboru. V tomto prípade by postačovalo modifikovať funkciu ''vypisZAMESTNANEC'' tak, aby vyhovovala tomuto účelu. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
vypisZAMESTNANEC(FILE *fw, ZAMESTNANEC *V)&lt;br /&gt;
{&lt;br /&gt;
   // Zaroven efektivnejsie pristupujeme k polozkam zamestnanca (parameter V je pointer...)&lt;br /&gt;
   fprintf(fw,&amp;quot; %-20s %-20s     %d\n&amp;quot;, V-&amp;gt;meno, V-&amp;gt;priezvisko, V-&amp;gt;rok_narodenia);  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ak by sme si ďalej zadefinovali funkciu na výpis všetkých zamestnancov celý program by sme zjednodušili a výpis zamestnancov by bol univerzálnejší v tom zmysle, že výpis zamestnancov či už do súboru alebo na monitor by mal jednotnú podobu. Funkcia na výpis všetkých zamestnancov by mohla vyzerať nasledovne:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
vypisZAMESTNANCOV(FILE *fw, ZAMESTNANEC **pole, int Pocet_zamestnancov)&lt;br /&gt;
{&lt;br /&gt;
   printf(&amp;quot;--------------------------------------------------------\n&amp;quot;);&lt;br /&gt;
   printf(&amp;quot; ZAMESTNANEC                               ROK NARODENIA\n&amp;quot;);&lt;br /&gt;
   printf(&amp;quot;--------------------------------------------------------\n&amp;quot;);&lt;br /&gt;
   for(i=0;i&amp;lt;Pocet_zamestnancov;i++)&lt;br /&gt;
      vypisZAMESTNANEC(fw, pole[i]);&lt;br /&gt;
   printf(&amp;quot;--------------------------------------------------------\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Potom by jednoducho stačilo otvoriť nejaký súbor v režime &amp;quot;write&amp;quot; a zavolať túto funkciu na zápis všetkých zamestnancov do súboru. Ak by sme však chceli vypísať zamestnancov na monitor, potom namiesto ukazovateľa na otvorený súbor zadáme ''stdout''. Čiže do programu vložíme riadok:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   vypisZAMESTNANCOV(stdout,pole,Pocet_zamestnancov);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Juraj</name></author>
		
	</entry>
</feed>