Program evidencie napísaný v C, alokácia smerníkov, zoradenie podľa názvov atď

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Kategorija: Programy zos C, C++

Program: Evidenc.c
Subor exe: Evidenc.exe

Program evidencie napísaný v C, alokácia smerníkov, zoradenie podľa názvov atď.
// 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);
}