/********************************/
/* soubor PTR_FN01.C		*/
/* pole ukazatelu na funkce	*/
/********************************/

#include <stdio.h>
#include <process.h>

typedef void (*menu_fcn) (void);	/* definice typu	*/
menu_fcn command[3];		/* pole tri ukazatelu na funkce	*/

void fn_1(void)			/* definice prvni funkce	*/
/**************/
{
 puts("funkce cislo 1\n");	/*puts() je kratsi, nez printf()*/
} /* void fn_1(void) */

void fn_2(void)			/* definice druhe funkce	*/
/**************/
{
 puts("funkce cislo 2\n");
} /* void fn_2(void) */

void fn_3(void)			/* definice treti funkce	*/
/**************/
{
 puts("funkce cislo 3\nKONEC\n");
 exit(0);                       /* ukonceni chodu programu	*/
} /* void fn_3(void) */

void assign_fn(void)		/* prirazeni ukazatelu na fce	*/
/******************/		/* do pole ukazatelu		*/
{
 command[0] = fn_1;
 command[1] = fn_2;
 command[2] = fn_3;
} /* void assign_fn(void) */

void menu(void)			/* funkce s nabidkou		*/
/*************/
{
 int choice;
 do {
     puts("1\tpolozka\n2\tpolozka\n3\tukonceni\n");
     putchar('>');
     scanf("%d", &choice);
     if (choice >= 1 && choice <= 3)
       command[choice - 1]();
       /* ^ volani funkce pomoci pole ukazatelu, () jsou nutne	*/
    } while (1);			/* nekonecny cyklus	*/
} /* void menu(void) */

int main(void)			/* hlavni funkce programu	*/
/************/
{
 assign_fn();	/* volani spravne inicializace pole ukazatelu	*/
 menu();	/* volani nabidky, obsahuje i volbu ukonceni	*/
 return 0;	/* tento radek je vlastne zbytecny, program	*/
		/* ukonci exit() ve treti funkci - fn_3		*/
} /* int main(void) */