Jednoduchá databáze v jazyce C
/*
* dbknihy.c
*
* databaze knih
*
* L. Dvorak (D2), SOPMA 2002
*/
#include
#include
#include
#include
/* barvy pro zobrazeni na obrazovce */
#define ZLUTA textcolor(14)
#define BILA textcolor(7)
/* cesta k databazovemu souboru */
#define SOUBOR "c:\\dbknihy\\knihy.txt"
/* cesta k pomocnemu tiskovemu souboru */
#define TSOUBOR "c:\\dbknihy\\tisk.txt"
/*
* fr - cteni z databaze
* fpw - zapis, tiskovy soubor
* fpr - cteni, tiskovy soubor
*
*/
FILE *fr,*fpw,*fpr;
/* struktura zaznamu */
typedef struct {
char nazevk[50];
char autor[25];
char naklad[25];
int rokvyd;
char isbn[20];
float cena;
} KNIHA;
/* zobrazi na displayi zaznam databaze */
void zobraz(KNIHA display)
{
int i;
ZLUTA;
cprintf("N zev:");
BILA;
printf(" %s\n",display.nazevk);
ZLUTA;
cprintf("Autor:");
BILA;
printf(" %s ",display.autor);
ZLUTA;
cprintf("NakladatelstvĽ:");
BILA;
printf(" %s\n",display.naklad);
ZLUTA;
cprintf("Rok vyd nĽ:");
BILA;
printf(" %d ",display.rokvyd);
ZLUTA;
cprintf("ISBN:");
BILA;
printf(" %s ",display.isbn);
ZLUTA;
cprintf("Cena:");
BILA;
printf(" %.2f K\n",display.cena);
for (i=0;i<80;i++)
printf("-");
}
/* ulozi zaznam do pomocneho tiskoveho souboru */
void tiskf(KNIHA printer)
{
int i;
/* ESC sekvence - tucne pismo - HP LaserJet */
char bold[] = "G(s3B";
/* ESC sekvence - konec tucneho pisma - HP LaserJet */
char ebold[] = "H(s0B";
fprintf(fpw,"%sN zev:%s",bold,ebold);
fprintf(fpw," %s\n",printer.nazevk);
fprintf(fpw,"%sAutor:%s",bold,ebold);
fprintf(fpw," %s ",printer.autor);
fprintf(fpw,"%sNakladatelstvĽ:%s",bold,ebold);
fprintf(fpw," %s\n",printer.naklad);
fprintf(fpw,"%sRok vyd nĽ:%s",bold,ebold);
fprintf(fpw," %d ",printer.rokvyd);
fprintf(fpw,"%sISBN:%s",bold,ebold);
fprintf(fpw," %s ",printer.isbn);
fprintf(fpw,"%sCena:%s",bold,ebold);
fprintf(fpw," %.2f K\n",printer.cena);
for (i=0;i<77;i++)
fprintf(fpw,"-");
fprintf(fpw,"\n");
}
/* nacte zaznam z databazoveho souboru */
KNIHA cteniz(void)
{
KNIHA aktz;
fgets(aktz.nazevk,sizeof(aktz.nazevk),fr);
/* odmaze ENTER na konci retezce */
aktz.nazevk[strlen(aktz.nazevk)-1]='\0';
fgets(aktz.autor,sizeof(aktz.autor),fr);
aktz.autor[strlen(aktz.autor)-1]='\0';
fgets(aktz.naklad,sizeof(aktz.naklad),fr);
aktz.naklad[strlen(aktz.naklad)-1]='\0';
fscanf(fr,"%d\n",&aktz.rokvyd);
fgets(aktz.isbn,sizeof(aktz.isbn),fr);
aktz.isbn[strlen(aktz.isbn)-1]='\0';
fscanf(fr,"%f\n",&aktz.cena);
return(aktz);
}
/* vytiskne pomocny tiskovy soubor na tiskarne */
void tisks (void)
{
char radek[131];
if (( fpr = fopen(TSOUBOR,"r")) == NULL) {
printf("Soubor pro tisk se nepodarilo otevrit.\n");
return;
}
while (fgets(radek,130,fpr) != NULL)
fprintf(stdprn,"%s\r",radek);
fclose(fpr);
}
/* prevede cestinu v retezci z malych na velka pismena */
char *czstrupr(char *Buffer)
{
int i,j;
char male[]="
Ľ˘Ł§Řĺçěý";
char velke[]="ŢžÖŕéŐćíü";
for (i=0; Buffer[i]; i++) {
for (j=0;j if (Buffer[i] == male[j])
Buffer[i] = velke[j];
}
}
return Buffer;
}
int main (void)
{
KNIHA zaznam;
FILE *fw;
int c,d,e,i=0;
char hled[50],vpism[50];
do {
clrscr();
printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄż\n");
printf("ł (V)lo§enĽ knihy ł\n");
printf("ł (S)eznam ł\n");
printf("ł Vy(h)led v nĽ ł\n");
printf("ŔÄÄÄ-Esc-konecÄÄÄÄŮ\n");
c = getch();
switch(c) {
case 118: /* v */
case 86: /* V */
clrscr();
printf("\nN zev: ");
gets(zaznam.nazevk);
printf("Autor: ");
gets(zaznam.autor);
printf("NakladatelstvĽ: ");
gets(zaznam.naklad);
printf("Rok vyd nĽ: ");
scanf("%d",&zaznam.rokvyd);
printf("ISBN: ");
scanf("%s",zaznam.isbn);
printf("Cena: ");
scanf("%f",&zaznam.cena);
getc(stdin);
fw = fopen(SOUBOR,"a");
fprintf(fw,"%s\n",zaznam.nazevk);
fprintf(fw,"%s\n",zaznam.autor);
fprintf(fw,"%s\n",zaznam.naklad);
fprintf(fw,"%d\n",zaznam.rokvyd);
fprintf(fw,"%s\n",zaznam.isbn);
fprintf(fw,"%.2f\n",zaznam.cena);
fclose(fw);
break;
case 115: /* s */
case 83: /* S */
if (( fr = fopen(SOUBOR,"r")) == NULL) {
printf("Soubor %s se nepodarilo otevrit.\n",SOUBOR);
exit(1);
}
fpw = fopen(TSOUBOR,"w");
while (!feof(fr)) {
clrscr();
for(i=0;i<6 && !feof(fr);i++) {
zaznam = cteniz();
zobraz(zaznam);
tiskf(zaznam);
}
printf("Pro pokraov nĽ stisknŘte libovolnou kl vesu");
if (!feof(fr)) getch();
i=0;
}
printf(", pro tisk T.");
e = getch();
if (e == 84 || e == 116) {
fclose(fpw);
tisks();
}
fclose(fr);
break;
case 104: /* h */
case 72: /* H */
do {
clrscr();
printf("Podle (n) zvu\n");
printf("Podle (a)utora\n");
d = getch();
switch(d) {
case 110: /* n */
case 78: /* N */
printf("\nHledaně n zev: ");
gets(hled);
if (( fr = fopen(SOUBOR,"r")) == NULL) {
printf("Soubor %s se nepodarilo otevrit.\n",SOUBOR);
exit(1);
}
fpw = fopen(TSOUBOR,"w");
clrscr();
i=0;
while (!feof(fr)) {
zaznam = cteniz();
strcpy(vpism,zaznam.nazevk);
/* v obou porovnavanych retezcich jsou nejprve
* prevedeny ceska pismena na velka
*/
czstrupr(hled);
czstrupr(vpism);
/* a pote i ostatni pismena */
if (strstr(strupr(vpism),strupr(hled))) {
zobraz(zaznam);
/* vybrana data se ukladaji souboru,
* ktery je mozne dle prani vytisknout
*/
tiskf(zaznam);
i++;
}
if (i == 6 || feof(fr)) {
printf("Pro pokraov nĽ stisknŘte libovolnou kl vesu");
getch();
if (!feof(fr))
clrscr();
i=0;
}
}
printf(", pro tisk T.");
e = getch();
if (e == 84 || e == 116) {
fclose(fpw);
/* tisk souboru s vybranymi daty */
tisks();
}
fclose(fr);
break;
case 97: /* a */
case 65: /* A */
printf("\nHledaně autor: ");
gets(hled);
if (( fr = fopen(SOUBOR,"r")) == NULL) {
printf("Soubor %s se nepodarilo otevrit.\n",SOUBOR);
exit(1);
}
fpw = fopen(TSOUBOR,"w");
clrscr();
i=0;
while (!feof(fr)) {
zaznam = cteniz();
strcpy(vpism,zaznam.autor);
/* v obou porovnavanych retezcich jsou nejprve
* prevedeny ceska pismena na velka
*/
czstrupr(hled);
czstrupr(vpism);
/* a pote i ostatni pismena */
if (strstr(strupr(vpism),strupr(hled))) {
zobraz(zaznam);
/* vybrana data se ukladaji souboru,
* ktery je mozne dle prani vytisknout
*/
tiskf(zaznam);
i++;
}
if (i == 6 || feof(fr)) {
printf("Pro pokraov nĽ stisknŘte libovolnou kl vesu");
getch();
if (!feof(fr))
clrscr();
i=0;
}
}
printf(", pro tisk T.");
e = getch();
if (e == 84 || e == 116) {
fclose(fpw);
/* tisk souboru s vybranymi daty */
tisks();
}
fclose(fr);
break;
}
/* pokud je stisknut Esc, ukonci cyklus */
} while (d != 27);
break;
}
/* pokud je stisknut Esc, ukonci cyklus */
} while (c != 27);
}
PŘIDEJTE SVŮJ REFERÁT