Umiestnenie súboru www.TrSek.com/c/sk.c
// SK.C                      Copyright (c) TrSek alias Zdeno Sekerak 
// Program je evidencia poloziek v jednoduchej databaze.
//
// Datum:28.05.96                               http://www.trsek.com

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
#include <stdlib.h>
#include "sk.h"


int main(void)
{
 int *pos;
 zoznam *zac=NULL,*kon=NULL;
 char *menu[]={"Zarad","Vyrad","Hladaj","Utried","Otvor","Inventar","Koniec",NULL};
 zaciatok();
 do
    {
        pos=okno(1,1,25,9,menu);
    switch(*pos)
        {
        case -1: return(0);
        case Zarad : zarad(&zac,&kon); break;
        case Vyrad : vyrad(&zac,&kon); break;
        case Hladaj : *pos=2; hladaj(zac); *pos=3; break;
        case Utried : utried(&zac,&kon); break;
        case Otvor : otvor(&zac,&kon); break;
        case Inventar : vypis(zac); break;
        case Koniec: return(0);
        }
    *pos=*pos+1;
    }while(*pos!=(-1));
 return(0);
}


void zaciatok(void)
{
 _setcursortype(0);
 window(1,1,80,25);
 textbackground(BLACK);
 textcolor(WHITE);
 clrscr();
}


int *okno(int x1,int y1,int x2,int y2,char **m)
{
 int x=0,y=2;
 int c;
 static int pos=2;
 window(x1,y1,x2,y2);
 textbackground(WHITE);
 textcolor(BLACK);
 clrscr();
 ramcek(x1,y1,x2,y2);
 while(m[x]!=NULL)
    {
    gotoxy(2,(y++));
    cprintf(m[x++]);
    }
 gotoxy(2,pos);
 textbackground(RED);
 cprintf(m[pos-2]);
 do
    {
    c=getch();
    if(c==13)
        {
        pos=pos-1;
        return(&pos);
        }
    if(c==27)
        {
        pos=(-1);
        return(&pos);        //ak stlaci escape vrati -1
        }
    if(c==0)
        {
        c=getch();
        if(c==72 || c==80)
            {
            textbackground(WHITE);
            gotoxy(2,pos);
            cprintf(m[pos-2]);
            }
        textbackground(RED);
        if((c==80) && (pos<=(x+1)))
            {
            pos=pos+1;
            if (pos>(x+1)) pos=2;
            gotoxy(2,pos);
            cprintf(m[pos-2]);
            }
        if((c==72) && (pos>=2))
            {
            pos=pos-1;
            if(pos<2) pos=(x+1);
            gotoxy(2,pos);
            cprintf(m[pos-2]);
            }
        }
    }while(c!=27);
 pos=pos-1;
   return(&pos);
}

void ramcek(int x1,int y1,int x2,int y2)
{
 int x=0;
 x2=x2-x1;
 y2=y2-y1+1;
 x1=1;
 y1=1;
 gotoxy(x2+1,y2);
 cprintf("¼");
 gotoxy(1,1);
 insline();
 gotoxy(x1,y1);
 cprintf("É");
 gotoxy(x2+1,y1);
 cprintf("»");
 gotoxy(x1,y2);
 cprintf("È");
 gotoxy(1,2);
 for(x=(x1+1);x<=x2;x++)
 {
    gotoxy(x,y1);
    cprintf("Í");
    gotoxy(x,y2);
    cprintf("Í");
 }
 for(x=(y1+1);x<=(y2-1);x++)
 {
    gotoxy(x1,x);
    cprintf("º");
    gotoxy(x2+1,x);
    cprintf("º");
 }
}



void zavri(int x1,int y1,int x2,int y2)
 {
 textbackground(BLACK);
 window(x1,y1,x2,y2);
 clrscr();
 }

int otvor(zoznam **zac,zoznam **kon)
{
 FILE *sub;
 zoznam *pom,*k;
 char msub[13];
 int x=0;
 char poloz[20];
 window(40,1,67,3);
 farby();
 ramcek(40,1,67,3);
 gotoxy(2,2);
 cprintf("Zadaj subor:");
 gotoxy(14,2);
 textbackground(GREEN);
 cprintf("              ");
 gotoxy(14,2);
 nacitaj(msub,13);
 if((strcmp(msub,'\0'))==0)
    {
    zavri(40,1,67,3);
    return(0);
        }
 if((sub=fopen(msub,"r"))==NULL)
    {
    subor("Subor sa neda otvorit!");
    return(0);
    }
 while((fscanf(sub,"%s",poloz))!=(-1))
    {
    if(x==0)
        {
        (*zac)=(zoznam *) malloc(sizeof(zoznam));
        (*zac)->pred=NULL;
        strcpy((*zac)->polozka,poloz);
        fscanf(sub,"\t%d\t%s\t%s\t%s\n\r",&((*zac)->cislo),(*zac)->miestnost,(*zac)->meno,(*zac)->popis);
        }
    if(x==1)
        {
        pom=(zoznam *) malloc(sizeof(zoznam));
        strcpy(pom->polozka,poloz);
        fscanf(sub,"\t%d\t%s\t%s\t%s\n\r",&(pom->cislo),pom->miestnost,pom->meno,pom->popis);
        pom->nasl=NULL;
        (*zac)->nasl=pom;
        pom->pred=(*zac);
        }
    if(x>1)
        {
        k=(zoznam *) malloc(sizeof(zoznam));
        strcpy(k->polozka,poloz);
        fscanf(sub,"\t%d\t%s\t%s\t%s\n\r",&(k->cislo),k->miestnost,k->meno,k->popis);
        k->pred=pom;
        k->nasl=NULL;
        pom->nasl=k;
        pom=k;
        }
    x++;
    }
 if(x==1)
    {
    (*zac)->pred=*zac;
    (*zac)->nasl=*zac;
    *kon=*zac;
    zavri(40,1,67,3);
    pom=(zoznam *) malloc(sizeof(zoznam));
    pom=*zac;
    vypis(pom);
    return(0);
    }
 pom->nasl=(*zac);
 (*zac)->pred=pom;
 *kon=pom;
 zavri(40,1,67,3);
 pom=*zac;
 vypis(pom);
 return(0);
}



void farby(void)
{
 textcolor(BLACK);
 textbackground(WHITE);
 clrscr();
}




int zarad(zoznam **zac,zoznam **kon)
{
 char polozka[20],miestnost[20],pracovnik[20],popis[20],cisl[7];
 int cislo,u;
 zoznam *pom,*p;
 menu();
 gotoxy(16,2);
 nacitaj(polozka,20);
 if((strcmp(polozka,'\0'))==0)
    {
    zavri(1,14,65,22);
    return(0);
    }
 gotoxy(55,2);
 nacitaj(cisl,5);
 if((strcmp(cisl,'\0'))==0)
    {
    zavri(1,14,65,22);
    return(0);
    }
 while(kontrola(cisl,&cislo)!=1)
    {
    gotoxy(55,2);
    nacitaj(cisl,7);
     }
 gotoxy(16,4);
 nacitaj(miestnost,20);
 if((strcmp(miestnost,'\0'))==0)
    {
    zavri(1,14,65,22);
    return(0);
    }
 gotoxy(16,6);
 nacitaj(pracovnik,20);
 if((strcmp(pracovnik,'\0'))==0)
    {
    zavri(1,14,65,22);
    return(0);
    }
 gotoxy(16,8);
 nacitaj(popis,20);
 if((strcmp(popis,'\0'))==0)
    {
    zavri(1,14,65,22);
    return(0);
    }
 if((*zac)==NULL)
    {
    pom=(zoznam *) malloc(sizeof(zoznam));
    *zac=pom;
    strcpy((*zac)->polozka,polozka);
    (*zac)->cislo=cislo;
    strcpy((*zac)->miestnost,miestnost);
    strcpy((*zac)->meno,pracovnik);
    strcpy((*zac)->popis,popis);
    (*zac)->nasl=(*zac);
    (*zac)->pred=(*zac);
    *kon=*zac;
    zavri(1,14,65,22);
    return(0);
    }
    p=(zoznam *) malloc(sizeof(zoznam));
    strcpy(p->polozka,polozka);
    p->cislo=cislo;
    strcpy(p->miestnost,miestnost);
    strcpy(p->meno,pracovnik);
    strcpy(p->popis,popis);
    p->nasl=(*zac);
    p->pred=(*kon);
    (*kon)->nasl=p;
    *kon=p;
 zavri(1,14,65,22);
 return(0);
}


void nacitaj(char *ret,int x)
{
 char c;
 int poc=0;
 _setcursortype(_NORMALCURSOR);
 while((c=getch())!='\r' && c!=27 && poc!=x)
    {
    if(c!='\r' && c!=8)
        {
        ret[poc]=c;
        cprintf("%c",c);
        }
    if(c==8)
        {
        poc=poc-2;;
        cprintf("%c",c);
        }
    poc++;
    }
 if(c==27)
    ret[0]='\0';
 else
    ret[poc]='\0';
 _setcursortype(_NOCURSOR);
}





void subor(char *m)
{
 window(40,1,67,3);
 farby();
 ramcek(40,1,67,3);
 gotoxy(2,2);
 cprintf("%s",m);
 getch();
 zavri(40,1,67,3);
}




int vypis(zoznam *zac)
{
 zoznam *pom;
 int pos=2;
 if(zac==NULL)
    {
    subor("Prazdny zoznam!");
    return(0);
    }
 pom=zac;
 window(10,5,80,20);
 farby();
 ramcek(10,5,80,20);
 do
    {
    gotoxy(2,pos);
    pos++;
    if(zac->nasl==zac)
        {
        cprintf("%s %d %s %s %s",pom->polozka,pom->cislo,pom->miestnost,pom->meno,pom->popis);
        getch();
        zavri(10,5,80,20);
        return(0);
        }
    cprintf("%s %d %s %s %s",pom->polozka,pom->cislo,pom->miestnost,pom->meno,pom->popis);
    pom=pom->nasl;
    }while(pom!=zac);
 getch();
 zavri(10,5,80,20);
 return(0);
}


int vyrad(zoznam **zac,zoznam **kon)
{
 char polozka[20];
 zoznam *pom,*p,*k;
 int u,x=0;
 pom=*zac;
 if(pom==NULL)
    {
    zavri(40,1,75,3);
    subor("Prazdny zoznam!");
    return(0);
    }
 window(40,1,75,3);
 farby();
 ramcek(40,1,75,3);
 gotoxy(2,2);
 cprintf("Zadaj polozku:");
 gotoxy(16,2);
 textbackground(GREEN);
 cprintf("                    ");
 gotoxy(16,2);
 nacitaj(polozka,20);
 if((strcmp(polozka,'\0'))==0)
    {
    zavri(40,1,75,3);
    return(0);
    }
 while((u=strcmp((pom->polozka),polozka))!=0)
    {
    pom=pom->nasl;
        if(pom==(*zac))
            {
            zavri(40,1,75,3);
            subor("Dana polozka neexistuje!");
            return(0);
            }
    }
        if((pom->nasl==pom))
            {
            *zac=NULL;
            zavri(40,1,75,3);
            subor("Prazdny zoznam!");
            return(0);
            }
 if(pom==(*zac))
    {
    p=pom->nasl;
    p->pred=*kon;
    (*kon)->nasl=p;
    *zac=p;
    x=1;
    }
 if(pom==(*kon))
    {
    p=(*kon)->pred;
    p->nasl=*zac;
    (*zac)->pred=p;
    *kon=p;
    x=1;
    }
 if((pom!=(*zac)) && (pom!=(*kon) && x==0))
    {
    p=pom->pred;
    k=pom->nasl;
    p->nasl=k;
    k->pred=p;
    }
 zavri(40,1,75,3);
 return(0);
}



int hladaj(zoznam *zac)
{
 int *pos;
 char *menu[]={ "Polozka","Cislo","Miestnost","Meno","Popis",NULL };
 if(zac==NULL)
    {
    subor("Prazdny zoznam");
    return(0);
    }
    pos=okno(8,6,28,12,menu);
    switch(*pos)
        {
        case -1: zavri(8,6,28,12) ; return(0);
        case 1: hinv(zac); break;
        case 2: hcis(zac); break;
        case 3: hmies(zac); break;
        case 4: hmeno(zac); break;
        case 5: hpop(zac); break;
        }
 zavri(8,6,28,12);
 return(0);
}


int hinv(zoznam *zac)
{
 char polozka[21];
 zoznam *pom;
 int u;
 window(40,5,78,7);
 farby();
 ramcek(40,5,78,7);
 gotoxy(2,2);
 cprintf("Hladana polozka:");
 gotoxy(19,2);
 textbackground(GREEN);
 _setcursortype(_NORMALCURSOR);
 cprintf("                    ");
 gotoxy(19,2);
 nacitaj(polozka,20);
 _setcursortype(_NOCURSOR);
 if((strcmp(polozka,'\0'))==0)
    {
    zavri(40,5,78,7);
    return(0);
    }
 pom=zac;
 zavri(40,5,78,7);
 while((u=strcmp(pom->polozka,polozka))!=0)
    {
    pom=pom->nasl;
    if(pom==zac)
        {
        subor("Neexistujuca polozka!");
        return(0);
        }
    }
 menu();
 vp(pom);
 return(0);
}

int hcis(zoznam *zac)
{
 int cislo;
 char cisl[5];
 zoznam *pom;
 window(40,5,62,7);
 farby();
 ramcek(40,5,62,7);
 gotoxy(2,2);
 cprintf("Hladane cislo:");
 gotoxy(17,2);
 textbackground(GREEN);
 _setcursortype(_NORMALCURSOR);
 cprintf("     ");
 gotoxy(17,2);
 nacitaj(cisl,5);
 if((strcmp(cisl,'\0'))==0)
    {
    zavri(1,12,65,20);
    return(0);
    }
 while(kontrola(cisl,&cislo)!=1)
    {
    gotoxy(17,2);
    nacitaj(cisl,7);
     }
 _setcursortype(_NOCURSOR);
 pom=zac;
 zavri(40,5,62,7);
 while((pom->cislo)!=cislo)
    {
    pom=pom->nasl;
    if(pom==zac)
        {
        rewind(stdin);
        subor("Neexistujuca polozka!");
        return(0);
        }
    }
 menu();
 rewind(stdout);
 vp(pom);
 return(0);
}


void menu(void)
{
 window(1,14,65,22);
 farby();
 ramcek(1,14,65,22);
 gotoxy(2,2);
 cprintf("Nazov polozky:");
 gotoxy(39,2);
 cprintf("Evidencne cislo:");
 gotoxy(2,4);
 cprintf("Miestnost    :");
 gotoxy(2,6);
 cprintf("Pracovnik    :");
 gotoxy(2,8);
 cprintf("popis        :");
 textbackground(GREEN);
 gotoxy(16,2);
 cprintf("                     ");
 gotoxy(55,2);
 cprintf("          ");
 gotoxy(16,4);
 cprintf("                     ");
 gotoxy(16,6);
 cprintf("                     ");
 gotoxy(16,8);
 cprintf("                     ");
}

void vp(zoznam *pom)
{
 gotoxy(16,2);
 cprintf("%s",pom->polozka);
 gotoxy(55,2);
 cprintf("%d",pom->cislo);
 gotoxy(16,4);
 cprintf("%s",pom->miestnost);
 gotoxy(16,6);
 cprintf("%s",pom->meno);
 gotoxy(16,8);
 cprintf("%s",pom->popis);
 getch();
 zavri(1,14,65,22);
}

int hmies(zoznam *zac)
{
 char miestnost[21];
 zoznam *pom;
 int u;
 window(40,5,80,7);
 farby();
 ramcek(40,5,80,7);
 gotoxy(2,2);
 cprintf("Hladana miestnost:");
 gotoxy(21,2);
 textbackground(GREEN);
 _setcursortype(_NORMALCURSOR);
 cprintf("                    ");
 gotoxy(21,2);
 nacitaj(miestnost,20);
 _setcursortype(_NOCURSOR);
 if((strcmp(miestnost,'\0'))==0)
    {
    zavri(40,5,80,7);
    return(0);
    }
 pom=zac;
 zavri(40,5,80,7);
 while((u=strcmp(pom->miestnost,miestnost))!=0)
    {
    pom=pom->nasl;
    if(pom==zac)
        {
        subor("Neexistujuca polozka!");
        return(0);
        }
    }
 menu();
 vp(pom);
 return(0);
}


int hmeno(zoznam *zac)
{
 char meno[21];
 zoznam *pom;
 int u;
 window(40,5,75,7);
 farby();
 ramcek(40,5,75,7);
 gotoxy(2,2);
 cprintf("Hladane meno:");
 gotoxy(16,2);
 textbackground(GREEN);
 _setcursortype(_NORMALCURSOR);
 cprintf("                    ");
 gotoxy(16,2);
 nacitaj(meno,20);
 _setcursortype(_NOCURSOR);
 if((strcmp(meno,'\0'))==0)
    {
    zavri(40,5,75,7);
    return(0);
    }
 pom=zac;
 zavri(40,5,75,7);
 while((u=strcmp(pom->meno,meno))!=0)
    {
    pom=pom->nasl;
    if(pom==zac)
        {
        subor("Neexistujuca polozka!");
        return(0);
        }
    }
 menu();
 vp(pom);
 return(0);
}

int hpop(zoznam *zac)
{
 char popis[21];
 zoznam *pom;
 int u;
 window(40,5,76,7);
 farby();
 ramcek(40,5,76,7);
 gotoxy(2,2);
 cprintf("Hladany popis:");
 gotoxy(17,2);
 textbackground(GREEN);
 _setcursortype(_NORMALCURSOR);
 cprintf("                    ");
 gotoxy(17,2);
 nacitaj(popis,20);
 _setcursortype(_NOCURSOR);
 if((strcmp(popis,'\0'))==0)
    {
    zavri(40,5,76,7);
    return(0);
    }
 pom=zac;
 zavri(40,5,76,7);
 while((u=strcmp(pom->popis,popis))!=0)
    {
    pom=pom->nasl;
    if(pom==zac)
        {
        subor("Neexistujuca polozka!");
        return(0);
        }
    }
 menu();
 vp(pom);
 return(0);
}


int kontrola(char *cisl,int *cislo)
{
 int x=0;
 while(cisl[x]!='\0')
    {
    if((cisl[x]!='0') && (cisl[x]!='1') && (cisl[x]!='2') && (cisl[x]!='3') && (cisl[x]!='4') && (cisl[x]!='5') && (cisl[x]!='6') && (cisl[x]!='7') && (cisl[x]!='8') && (cisl[x]!='9'))
        return(0);
    x++;
    }
 if(x==5)
    {
    if((cisl[0]!='1') && (cisl[0]!='2') && (cisl[0]!='3'))
        return(0);
    if((cisl[1]!='0') && (cisl[1]!='1') && (cisl[1]!='2'))
        return(0);
    if((cisl[2]!='0') && (cisl[2]!='1') && (cisl[2]!='2') && (cisl[2]!='3') && (cisl[2]!='4') && (cisl[2]!='5') && (cisl[2]!='6') && (cisl[2]!='7'))
        return(0);
    if((cisl[3]!='0') && (cisl[3]!='1') && (cisl[3]!='2') && (cisl[3]!='3') && (cisl[3]!='4') && (cisl[3]!='5') && (cisl[3]!='6'))
        return(0);
    if((cisl[4]!='0') && (cisl[4]!='1') && (cisl[4]!='2') && (cisl[4]!='3') && (cisl[4]!='4') && (cisl[4]!='5') && (cisl[4]!='6') && (cisl[4]!='7'))
        return(0);
    }
    *cislo=atoi(cisl);
 return(1);
}


int utried(zoznam **zac,zoznam **kon)
{
 zoznam *pom,*pom1,*pp1,*pp2,*z,*k;
 int x;
 pom=*zac;
 do
    {
    pom1=*zac;
    x=0;
    do
        {
        if((strcmp(pom->polozka,pom1->polozka))>0)
            {
            if(pom==(*zac) && pom1==(*kon) && x!=1)
                {
                *kon=pom1->pred;
                *zac=pom1;
                }
            if(pom==*zac && x!=1)
                {

                z=(*zac)->nasl;
                pp1=pom->pred;       // delete2
                pp2=pom->nasl;
                pp1->nasl=pom->nasl;
                pp2->pred=pom->pred;
                pp1=pom1->pred;       // insert2
                pom1=pp1;
                pp2=pom1->nasl;
                pom->pred=pp1->pred;
                pom->nasl=pom1->nasl;
                pom1->nasl=pom;
                pp1->pred=pom;
                *zac=z;
                x=1;
                }
            if(pom==(*kon) && x!=1)
                {
                k=pom->pred;
                pp1=pom->pred;       // delete2
                pp2=pom->nasl;
                pp1->nasl=pom->nasl;
                pp2->pred=pom->pred;
                pp1=pom1->pred;       // insert2
                pom1=pp1;
                pp2=pom1->nasl;
                pom->pred=pp1->pred;
                pom->nasl=pom1->nasl;
                pom1->nasl=pom;
                pp1->pred=pom;
                (*kon)=k;
                x=1;
                }
           /*    if(pom1==(*zac) && x!=1)
                {
                pp1=pom->pred;       // delete2
                pp2=pom->nasl;
                pp1->nasl=pom->nasl;
                pp2->pred=pom->pred;
                pp1=pom1->pred;       // insert2
                pom1=pp1;
                pp2=pom1->nasl;
                pom->pred=pp1->pred;
                pom->nasl=pom1->nasl;
                pom1->nasl=pom;
                pp1->pred=pom;
                (*zac)=pom;
                x=1;
                }          */
            if((pom!=(*zac)) && (pom!=(*kon)) && (pom1!=(*zac) && x!=1))
            {
            pp1=pom->pred;       // delete2
            pp2=pom->nasl;
            pp1->nasl=pom->nasl;
            pp2->pred=pom->pred;
            pp1=pom1->pred;       // insert2
            pom1=pp1;
            pp2=pom1->nasl;
            pom->pred=pp1->pred;
            pom->nasl=pom1->nasl;
            pom1->nasl=pom;
            pp1->pred=pom;
            x=1;
            }

            }
        if(x==1)
            break;
        pom1=pom1->nasl;
        }while(pom1!=(*zac));
    pom=pom->nasl;
    }while(pom!=(*zac));

 return(0);
}

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