Umiestnenie súboru www.TrSek.com/c/evidenc.c
// EVIDENC.C                 Copyright (c) TrSek alias Zdeno Sekerak 
// Program eviduje polozky v databaze.                               
//                                                                   
// Datum:28.05.96                               http://www.trsek.com 

#include <stdio.h>
#include <alloc.h>
#include <string.h>
#include <conio.h>

#define main_p 6
#define find_p 5

char *main_m[]={"Hlavne menu          "," 1. Zarad polozku     "," 2. Vyrad polozku     "," 3. Hladaj            "," 4. O polozku vyssie  "," 5. O polozku nizsie  "," 6. Koniec            "};
char *find_m[]={"Hladaj polozku podla:"," 1. Nazvu             "," 2. Evidencneho cisla "," 3. Miestnosti        "," 4. Zodpovedneho      "," 5. Spat do menu      "};

typedef struct INVENT
 {
  void *pred;
  char nazov[30];
  int  ev_cis;
  char miest[10];
  char zodp[30];
  char popis[20];
  void *zani;
 } invent;

void farba(int bord, int pap);            /* nadefinuje farby */
int menu (char *main_m[],int pocet,int akt);    /* zobrazi menu */
void rozluc_sa(int cely);            /* rozluckova obrazovka */
invent *zarad (invent *inv_p);            /* zaradi polozku do zoznamu */
invent *vyhod (invent *inv_p);            /* vyjebe ju von */
invent *najdi_mi (invent *inv_p, char nazov[], int podla);    /* hlada kam zaradit polozku, a ktory typ */
invent *najdi_mic (invent *inv_p, int ev_cis);    /* to iste ako najdi_mi, ale pre cislo */
void zotried(invent *inv_p,int podla);        /* zotriedi pole podla typu, nazov, miestnost */
invent *hladaj(invent *inv_p,int podla);    /* hlada v zozname co si uzivatel zamane */
void roleta(invent *inv_p, invent *inv_a);    /* zobrazi roletu zo vsetkych inventarov */
void aktualna (invent *inv_p);            /* zobrazi aktualnu na obrazovku */
void sprava (char *oznam);            /* vypise spravu pre uzivatela */
void vycist (invent *inv_p);            /* vyplni medzerami, alebo nulami */
void podklad(void);                /* podklad obrazovky */

void main()
 {
  invent *inv_p,*inv_a;            /* prvy v zozname zacina pismenom A */
  FILE *f,*fopen();            /* aktulany alebo tiez pomocny */
  int i=0;

  inv_p=malloc(sizeof(invent));     /* alokuj prvy */
  (*inv_p).pred=inv_p;            /* nastav smerniky na cyklicky */
  (*inv_p).zani=inv_p;            /* pre prvy v zozname */
  vycist(inv_p);
  inv_a=inv_p;                /* aktualny prirad na prvy */
  podklad();
  i=1;

  while (i!=main_p) {
     if (inv_a==inv_p) inv_a=(*inv_p).zani;
     aktualna(inv_a);
     roleta(inv_p,inv_a);
     i=menu(main_m,main_p,i);
     switch (i) {
       case 0: i=main_p;        /* budeme koncit */
           break;
       case 1: inv_a=zarad(inv_p);
           break;
       case 2: inv_a=vyhod(inv_a);
           break;
       case 3: while ((i!=5) && (i!=0)) {
          i=menu(find_m,find_p,1);    /* podla coho hladat */
          aktualna(inv_a);
          if ((i>0) && (i<5)) {
             zotried(inv_p,i);        /* zotriedi podla tej polozky */
             roleta(inv_p,inv_a);
             inv_a=hladaj(inv_p,i);    /* a konecne vyhlada */
             aktualna(inv_a);        /* vycmara na obrazovku */
             roleta(inv_p,inv_a);    /* ukaze vysledok */
            }
         }                     /* of while */
           i=1;
           break;
       case 4: inv_a=(*inv_a).pred;
           break;
       case 5: inv_a=(*inv_a).zani;
           break;
       case 6: break;
      default: sprava("Nespravny vyber nepoznam takyto prikaz.");
      }
    }                                 /* of main while */
 sprava("Posielas ma do ... Vies o tom !");

 inv_a=(*inv_p).pred;            /* odstrani vsetky alokacie */
 while (inv_p!=(*inv_a).pred) inv_a=vyhod(inv_a);
 free(inv_a);

 rozluc_sa(1);
 }

void vycist (invent *inv_p)
 {
  strcpy( (*inv_p).nazov,"" );
  (*inv_p).ev_cis=0;
  strcpy( (*inv_p).miest,"");
  strcpy( (*inv_p).zodp,"");
  strcpy( (*inv_p).popis,"");
 }

invent *najdi_mi (invent *inv_p, char nazov[], int podla)
{
 invent *p_pom;

 p_pom=(*inv_p).zani;
 switch (podla) {
   case 1:
       while ((inv_p!=p_pom) && ( strcmp( (*p_pom).nazov,nazov)<0 ))
     p_pom=(*p_pom).zani;
       break;
   case 3:
       while ((inv_p!=p_pom) && ( strcmp( (*p_pom).miest,nazov)<0 ))
     p_pom=(*p_pom).zani;
       break;
   case 4:
       while ((inv_p!=p_pom) && ( strcmp( (*p_pom).zodp,nazov)<0 ))
     p_pom=(*p_pom).zani;
       break;
  }
 return(p_pom);
}

invent *najdi_mic (invent *inv_p, int ev_cis)
{
 invent *p_pom;

 p_pom=(*inv_p).zani;
 while ((inv_p!=p_pom) && ( (*p_pom).ev_cis<ev_cis ) )
    p_pom=(*p_pom).zani;
 return(p_pom);
}

invent *zarad (invent *inv_p)
{
 invent *inv_a;                /* ten zostane zaradeny */
 invent *p_pred;            /* pomocny */

 inv_a=malloc(sizeof(invent));        /* naalokuj pamat */
 p_pred=malloc(sizeof(invent));

 vycist(inv_a);                /* toto nie velmi dobre */
 farba(8,15);
 gotoxy(12,21); cprintf("%30s","");     /* osetrenie obr. by sa nemalo miesat s alokaciami */
 gotoxy(56,21); cprintf("%5s","");
 gotoxy(14,22); cprintf("%10s","");
 gotoxy(36,22); cprintf("%30s","");
 gotoxy(13,23); cprintf("%20s","");

 gotoxy(12,21);scanf("%s",(*inv_a).nazov);
 gotoxy(56,21);scanf("%d",&(*inv_a).ev_cis);
 gotoxy(14,22);scanf("%s",(*inv_a).miest);
 gotoxy(37,22);scanf("%s",(*inv_a).zodp);
 gotoxy(13,23);scanf("%s",(*inv_a).popis);

 inv_p=najdi_mi(inv_p,(*inv_a).nazov,1);
 p_pred=(*inv_p).pred;        /* zapamataj si polozku pred aktualnym */
                /* kde chec dotlacit novy */
 (*p_pred).zani=inv_a;        /* sprav lavu stranu zaradenia */
 (*inv_a).pred=p_pred;

 (*inv_p).pred=inv_a;        /* sprav pravu stranu */
 (*inv_a).zani=inv_p;

 return(inv_a);            /* vrati smernik na doplneny */
}

invent *vyhod (invent *inv_a)
{
 invent *p_pom;                /* pomocny */

 p_pom=(*inv_a).zani;            /* odstran pravu vazbu */
 (*p_pom).pred=(*inv_a).pred;

 p_pom=(*inv_a).pred;            /* odstran lavu vazbu */
 (*p_pom).zani=(*inv_a).zani;

 if ((*inv_a).pred!=inv_a)
     free(inv_a);                       /* od-alokuj, ale len ked nieje posledny */
    else vycist(p_pom);            /* inac len ho zgumuj s NULL sa tazko pracuje */

 return(p_pom);                            /* vrat smarnik na strukturu pred */
}

void farba ( int bor, int pap)
{
 if (bor>0) textbackground(bor);
 if (pap>0) textcolor(pap);
}

void rozluc_sa(int cely)
{
 if (cely) {
    farba(8,15);
    clrscr();
   }
 farba(1,14);
 gotoxy(1,1);
 cprintf(" Triedit ver. 1.xx, Software by Cuciacik alias Richard Dudas, Copyright (c) 1997");
 farba(8,15);
}

int menu (char *main_m[],int pocet,int akt)
{
 int i;
 char ch=0;

 rozluc_sa(0);
 for (i=pocet;i>=0;i--)
     {
      if (i==akt) farba(7,8);
       else farba(8,15);
      gotoxy(3,i+3);
      cprintf("%s",main_m[i]);
     }

 for (i=pocet+1;i<=10;i++)
     {
      farba(8,15);
      gotoxy(3,i+3);
      cprintf("%25s","");
     }


 i=akt;
 while ((ch!=27) && (ch!=13))
  {
  ch=getch();
  if (ch==0) {
     farba(8,15);        /* zrusi predchadzajuce oznacenie */
     gotoxy(3,i+3);
     cprintf("%s",main_m[i]);

     ch=getch();        /* precita klaves */


     if (ch==72) {        /* Up */
     i--;
     if (i<1) i=pocet;
    }
     if (ch==80) {        /* Down */
     i++;
     if (i>pocet) i=1;
    }

     farba(7,8);        /* vykresli podla toho co zvolil */
     gotoxy(3,i+3);
     cprintf("%s",main_m[i]);
    }
   }

  if (ch==13) return(i);
     else return(0);
}

void podklad ( void )
{
 farba(8,15);
 clrscr();
}

void roleta(invent *inv_p, invent *inv_a)
{
invent *p_pom;
int i=1;

 p_pom=inv_p;
 while (p_pom!=inv_a) {            /* najdi ktora v poradi vlastne je */
       p_pom=(*p_pom).zani;
       i++;
      }

 if (i>15) i=i-15;            /* vojde sa na obrazovku ??? */
      else i=0;

 p_pom=(*inv_p).zani;                /* teraz nastav od ktorej vypisovat */
 while (i!=0) {
       p_pom=(*inv_a).zani;
       i++;
      }

 i=1;
 farba(2,14);
 gotoxy(36,3);cprintf("Inventar                        Cis.  Izba");
 while (p_pom!=inv_p) {            /* vypise prvych 15 okolo mojej */
       i++;
       gotoxy(34,i+2);
       if (p_pom==inv_a) cprintf("> ");
            else cprintf("  ");
       gotoxy(36,i+2);
       cprintf("%-30s %5d %5s",(*p_pom).nazov,(*p_pom).ev_cis,(*p_pom).miest);
       p_pom=(*p_pom).zani;
      }


 farba(8,15);
 for (i=i+1;i<=15;i++)            /* domaze obrazovku */
     {
      gotoxy(34,i+2);
      cprintf("  %-30s %5s %5s","","","");
     }
}

void aktualna (invent *inv_p)
{
 int x,y;
 farba(1,14);
 for (x=2;x<=66;x++)
  for (y=18;y<=24;y++)
      {
       gotoxy(x,y);cprintf(" ");
      }

 gotoxy(3,18); cprintf("Evidencna karta inventara skladu");
 gotoxy(3,20); cprintf("Smerniky = %p-%p",(*inv_p).pred,(*inv_p).zani);
 gotoxy(3,21); cprintf("Invetar: %30s Evid. cislo: %5s","","");
 gotoxy(3,22); cprintf("Miestnost: %10s Zodpovedny:%30s","","");
 gotoxy(3,23); cprintf("Poznamka: %20s","");
 farba(7,8);
 gotoxy(14,20); cprintf("%p-%p",(*inv_p).pred,(*inv_p).zani);
 gotoxy(12,21); cprintf("%s",(*inv_p).nazov);
 gotoxy(56,21); cprintf("%5d",(*inv_p).ev_cis);
 gotoxy(14,22); cprintf("%10s",(*inv_p).miest);
 gotoxy(36,22); cprintf("%30s",(*inv_p).zodp);
 gotoxy(13,23); cprintf("%s",(*inv_p).popis);
 farba(8,15);
}

void sprava (char *oznam)
{
 farba(4,14);
 gotoxy(2,25);cprintf("%8s%-54s%-16s"," Zle je:",oznam," Stlac medzeru.");
 while (getch()!=32);
}

int zamenit(invent *inv_a,invent *inv_b)
{
void *pom;

 pom=(*inv_a).zani;                     /* zamenim predchodcov */
 (*inv_a).zani=(*inv_b).zani;
 (*inv_b).zani=pom;

 pom=inv_b;                /* este upravim aby aj na ne ukazovali */
 inv_b=(*inv_a).zani;
 (*inv_b).pred=inv_a;
 inv_b=pom;

 pom=inv_a;                /* este upravim aby aj na ne ukazovali */
 inv_a=(*inv_b).zani;
 (*inv_a).pred=inv_b;
 inv_a=pom;

 pom=(*inv_a).pred;            /* upravim predchodcov */
 (*inv_a).pred=(*inv_b).pred;
 (*inv_b).pred=pom;

 pom=inv_b;                /* este upravim aby aj na ne ukazovali */
 inv_b=(*inv_a).pred;
 (*inv_b).zani=inv_a;
 inv_b=pom;

 pom=inv_a;                /* este upravim aby aj na ne ukazovali */
 inv_a=(*inv_b).pred;
 (*inv_a).zani=inv_b;
 inv_a=pom;

 return(1);                /* len indikator ze zamenil */
}

void zotried(invent *inv_p,int podla)
{
int zmen=1;
int zamen;
invent *inv_a,*inv_b;

 while (zmen) {
   zmen=0;
   inv_a=(*inv_p).zani;
   inv_b=(*inv_a).zani;

   while (inv_b!=inv_p) {
     switch (podla) {
       case 1:
     if ( strcmp( (*inv_a).nazov,(*inv_b).nazov )>0 ) zmen=zamenit(inv_a,inv_b);
     break;
       case 2:
     if ( (*inv_a).ev_cis>(*inv_b).ev_cis ) zmen=zamenit(inv_a,inv_b);
     break;
       case 3:
     if ( strcmp( (*inv_a).miest,(*inv_b).miest )>0 ) zmen=zamenit(inv_a,inv_b);
     break;
       case 4:
     if ( strcmp( (*inv_a).zodp,(*inv_b).zodp )>0 ) zmen=zamenit(inv_a,inv_b);
     break;
      }
     inv_a=(*inv_a).zani;
     inv_b=(*inv_b).zani;
    }
  }
}

invent *hladaj(invent *inv_p,int podla)
{
invent *inv_a;
void *pom;                /* a kam ho mam odlozit, ked este chcem odalokovat */

 inv_a=malloc( sizeof(inv_a) );        /* vyhradim mu priestor */

 switch (podla) {            /* zada podla ktorej polozky chce vyhladavat */
    case 1:
    farba(8,15);            /* najprv ju vyplni */
    gotoxy(12,21); cprintf("%30s","");
    gotoxy(12,21);scanf("%s",(*inv_a).nazov);    /* zavola najdi a odlozi do pom vysledok */
    pom=najdi_mi( inv_p, (*inv_a).nazov, podla );
       break;

    case 2:
    farba(8,15);
    gotoxy(56,21); cprintf("%5s","");
    gotoxy(56,21);scanf("%d",&(*inv_a).ev_cis);
    pom=najdi_mic( inv_p, (*inv_a).ev_cis );
       break;

    case 3:
    farba(8,15);
    gotoxy(14,22); cprintf("%10s","");
    gotoxy(14,22);scanf("%s",(*inv_a).miest);
    pom=najdi_mi( inv_p, (*inv_a).miest, podla );
       break;

    case 4:
    farba(8,15);
    gotoxy(36,22); cprintf("%30s","");
    gotoxy(37,22);scanf("%s",(*inv_a).zodp);
    pom=najdi_mi( inv_p, (*inv_a).zodp, podla );
       break;
   }

  free(inv_a);                /* nech nie je bordel, uz tak je dost velky v state */
  return(pom);
}

Copyrigth by Zdeno Sekerak 2007, http://www.trsek.com