Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра САПР
ЗВІТ
про виконання лабораторної роботи №2
на тему: «Прямий метод доступу до файлів на зовнішніх запам’ятовуючих пристроях»
з курсу: «Організація баз даних і знань»
Виконав: ст. гр. КН-3
Львів 2008
Тема роботи
Прямий метод доступу до файлів на зовнішніх запам’ятовуючих пристроях
Мета роботи
Розглянути органiзацiю i ведення файлів прямого доступу; набути практичні навички у програмуванні алгоритмів доступу з хешуванням.
Лабораторне завдання
Тема завдання: Персонал школи
1. Написати програму методу зв’язаних блоків, яка реалізує такі функції:
1. Друк бази даних.
2. Зчитування запису.
3. Введення запису.
4. Видалення запису.
5. Модифікація запису.
6. Пошук запису.
7. Вихід.
Короткі теоретичні відомості
Текст програми
#include <stdio.h>
#include <conio.h>
#include <string.h>
struct DB
{
int id;
char name[12];
char lname[9];
char pname[13];
char datan[11];
char posada[10];
char tel[9];
float zarplata;
};
struct DB db1,db2;
FILE *f1;
char fn[50]="db2.txt";
int h(int param)
{
int k;
k=param%10;
return k*sizeof(struct DB)*10;
}
void insert()
{
int hesh,o;
printf("Uvedit ID (0 dla zaverszennia vvodu)\nІ ");
scanf("%d", &db1.id);
while (db1.id!=0)
{
o=0;
hesh=h(db1.id);
fseek(f1,hesh, SEEK_SET);
fread(&db2, sizeof(struct DB),1,f1);
while((db2.id>0)&&(o<10))
{
if(db2.id==db1.id)
{
printf("\n***ERROR:Zapus z ID %d vze isnuje!!\nVvedit inshyj ID\n",db1.id);
goto error;
}
hesh=hesh+sizeof(struct DB);
fseek(f1, hesh, SEEK_SET);
fread(&db2, sizeof(struct DB),1,f1);
o++;
}
fseek(f1, hesh, SEEK_SET);
if (o<=10)
{
printf("Uvedit'\nPrizvyshche(11), Imja(8), Po-bat'kovi(12), d/n(10), posadu(9), telefon(8), zarplatu\n");
scanf("%s%s%s%s%s%s%f", db1.name, db1.lname, db1.pname, db1.datan, db1.posada, db1.tel, &db1.zarplata);
fwrite(&db1, sizeof(struct DB), 1, f1);
printf("***Zapys dodano***\n");
}
error:
printf("Uvedit' ID\nІ ");
scanf("%d", &db1.id);
}
}
void ins2()
{
int hesh=0,i;
fseek(f1,0, SEEK_SET);
fwrite(&db2, sizeof(struct DB),1,f1);
for(i=0;i<100;i++)
{
hesh=hesh+sizeof(struct DB);
fseek(f1, hesh, SEEK_SET);
fwrite(&db2, sizeof(struct DB),1,f1);
}
}
void vyvid()
{
int i,j=0,k=0,l=0;
clrscr();
fseek(f1,0, SEEK_SET);
fread(&db2,sizeof(struct DB),1,f1);
for(i=1;i<=100;i++)
{
if (k==0)
{
getch();
clrscr();
printf(" єBLOK N%dє\n",j);
printf("ЙННННЛНННННННННННЛННННННННЛНННННННННКННЛННННКНННННЛНННННННННЛННННННННЛННННННННН»");
printf("є IDєPRIZVYSHCHEєIMJA єPO-BAT'KOVI єDATA NAR. єPOSADA єTELEFON єZARPLATA є");
printf("МННННОНННННННННННОННННННННОННННННННННННОННННННННННОНННННННННОННННННННОННННННННН№");
}
printf("є%4dє%-11sє%-8sє%-12sє%-10sє%-9sє%-8sє%9.2fє",db2.id, db2.name, db2.lname, db2.pname, db2.datan, db2.posada, db2.tel, db2.zarplata);
if(l<9)
printf("ЗДДДДЧДДДДДДДДДДДЧДДДДДДДДЧДДДДДДДДДДДДЧДДДДДДДДДДЧДДДДДДДДДЧДДДДДДДДЧДДДДДДДДД¶");
fseek(f1,i*sizeof(struct DB), SEEK_SET);
fread(&db2,sizeof(struct DB),1,f1);
k=i%10;
j=i/10;
l++;
if(l==10)
{
printf("ИННННКНННННННННННКННННННННКННННННННННННКННННННННННКНННННННННКННННННННКНННННННННј");
l=0;
}
}
getch();
}
////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
void del()
{
struct DB db2={0, NULL, NULL, NULL, NULL, NULL, NULL, 0.00};
int hesh,o,id;
printf("Uvedit ID (0 dla zaverszennia vvodu)\nІ ");
scanf("%d", &id);
while (id>0)
{
o=0;
hesh=h(id);
fseek(f1,hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
while((db1.id!=id)&&(o<10))
{
hesh=hesh+sizeof(struct DB);
fseek(f1, hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
o++;
}
fseek(f1, hesh, SEEK_SET);
if ((o<=10)&&(db1.id>0))
{
fwrite(&db2, sizeof(struct DB), 1, f1);
printf("\n****Zapys vydaleno****");
}
else printf("\n***ERROR: Ne isnuje zapysu, jakyj vy hochete vydalyty\n");
printf("\nVvedit' ID dla vydalennia\n?І ");
scanf("%d",&id);
}
}
void modify()
{
struct DB db2;
int hesh,o;
printf("Uvedit ID (0 dla zaverszennia vvodu)\nІ ");
scanf("%d", &db2.id);
while (db2.id>0)
{
o=0;
hesh=h(db2.id);
fseek(f1,hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
while((db1.id!=db2.id)&&(o<10))
{
hesh=hesh+sizeof(struct DB);
fseek(f1, hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
o++;
}
fseek(f1, hesh, SEEK_SET);
if ((o<=10)&&(db1.id>0))
{
printf("Uvedit' novi dani \nPrizvyshche(11), Imja(8), Po-bat'kovi(12), d/n(10), posadu(9), telefon(8), zarplatu\n");
scanf("%s%s%s%s%s%s%f", db2.name, db2.lname, db2.pname, db2.datan, db2.posada, db2.tel, &db2.zarplata);
fwrite(&db2, sizeof(struct DB), 1, f1);
printf("\n****Zapys modyfikovano****");
}
else printf("\n***ERROR: Ne isnuje zapysu, jakyj vy hochete modyfikuvaty\n");
printf("\nVvedit' ID dla modyfikaciji\nІ ");
scanf("%d",&db2.id);
}
}
void search()
{
int choice;
err:printf("\nDla poshuku po ID vvedit '1'\nDla poshuku po Prizvyshcsu vvedit '2' ");
scanf("%d",&choice);
if (choice==1) search1();
else
if(choice==2) search2();
else {printf("\nPotribno vvesty '1' abo '2'");goto err; }
}
search1()
{
int hesh,o,id;
printf("Uvedit ID dla poshuku (dla zavershennia vvedit 0)\nІ ");
scanf("%d", &id);
while (id>0)
{
o=0;
hesh=h(id);
fseek(f1,hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
while((db1.id!=id)&&(o<10))
{
hesh=hesh+sizeof(struct DB);
fseek(f1, hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
o++;
}
fseek(f1, hesh, SEEK_SET);
if ((o<=10)&&(db1.id>0))
{
printf("Rezultat: \n");
printf("%3d %-11s %-8s %-12s %-10s %-9s %-8s %-6.2f",db1.id, db1.name, db1.lname, db1.pname, db1.datan, db1.posada, db1.tel, db1.zarplata);
}
else printf("\n***ERROR: Ne isnuje zapysu, jakyj vy hochete znajtu");
printf("\nVvedit' ID dla poshuku\nІ ");
scanf("%d",&id);
}
return 0;
}
search2()
{
int hesh=0,i,k,l=0;
char name[12];
printf("\n Vvedit' prizvyshche dla poshuku\nІ ");
scanf("%s",name);
fseek(f1,0, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
printf("REZULTAT:\n");
while(!feof(f1))
{
for(k=0;k<=strlen(db1.name);k++)
if (db1.name[k]==name[k])l=1;
else{l=0;break;}
if (l==1)
printf("\n%3d %-11s %-8s %-12s %-10s %-9s %-8s %-6.2f",db1.id, db1.name, db1.lname, db1.pname, db1.datan, db1.posada, db1.tel, db1.zarplata);
hesh=hesh+sizeof(struct DB);
fseek(f1, hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
}
getch();
return 0;
}
/*
void sortvyvid()
{
int i,j,hesh=0;
struct DB db2[100],db3;
fseek(f1,0, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
for(i=0;i<100;i++)
{
if (db1.id>0)
db2[i]=db1;
hesh=hesh+sizeof(struct DB);
fseek(f1, hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
}
for(j=0;j<99;j++)
for(i=0;i<100;i++)
{
//printf("\n%3d %-11s %-8s %-12s %-10s %-9s %-8s %-6.2f",db1.id, db1.name, db1.lname, db1.pname, db1.datan, db1.posada, db1.tel, db1.zarplata);
if(db2[i].id>db2[i+1].id)
{
db3=db2[i];
db2[i]=db2[i+1];
db2[i+1]=db3;
}
}
for(i=0;i<100;i++)
if(db2[i].id>0) printf("\n%3d %-11s %-8s %-12s %-10s %-9s %-8s %-6.2f",db1.id, db1.name, db1.lname, db1.pname, db1.datan, db1.posada, db1.tel, db1.zarplata);
getch();
}
*/
void main()
{
int choice;
f1=fopen(fn,"r+");
textcolor(BLUE);
textbackground(YELLOW);
clrscr();
for(;;)
{
clrscr();
printf("ЙННННННННННННННННННННННННННННННННННННННННСНННННННННННННН»\n");
printf("є Druk bazy danyh і natysnit <1> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Poshuk zapysu za vvedenym kluchem і natysnit <2> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Vudalennia zapysu za vvedenym kluchem і natysnit <3> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Vstavka zapysu і natysnit <4> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Modyfikacija zapysu і natysnit <5> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Vyhid z programy і natysnit <0> є\n");
printf("ИННННННННННННННННННННННННННННННННННННННННПННННННННННННННј\n");
printf("Vy vvely: ");
scanf("%d",&choice);
printf("\n\n");
switch (choice)
{
case 0: {exit(1); break;}
case 1: {vyvid(); break;}
case 2: {search();break;}
case 3: {del(); break;}
case 4: {insert();break;}
case 5: {modify();break;}
case 91:{ins2(); break;}
default:{printf("\n\nPOTRIBNO VVESTU CHYSLO VID 0 DO 4\n"); getch();continue;}
}
}
fclose(f1);
}
Результати виконання програми
Головне меню:
╔════════════════════════════════════════╤══════════════╗
║ Druk bazy danyh │ natysnit <1> ║
╟────────────────────────────────────────┼──────────────╢
║ Poshuk zapysu za vvedenym kluchem │ natysnit <2> ║
╟────────────────────────────────────────┼──────────────╢
║ Vudalennia zapysu za vvedenym kluchem │ natysnit <3> ║
╟────────────────────────────────────────┼──────────────╢
║ Vstavka zapysu │ natysnit <4> ║
╟────────────────────────────────────────┼──────────────╢
║ Modyfikacija zapysu │ natysnit <5> ║
╟────────────────────────────────────────┼──────────────╢
║ Vyhid z programy │ natysnit <0> ║
╚════════════════════════════════════════╧══════════════╝
Vy vvely:
Вивід бази даних:
║BLOK N0║
╔════╦═══════════╦════════╦═════════╩══╦════╩═════╦═════════╦════════╦═════════╗
║ ID║PRIZVYSHCHE║IMJA ║PO-BAT'KOVI ║DATA NAR. ║POSADA ║TELEFON ║ZARPLATA ║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 80║Spryns'ka ║Zoriana ║Vasylivna ║12.04.1981║Vchytel ║5-25-38 ║ 1350.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 20║Jarish ║Andrij ║Rostyslav. ║26.01.1988║San/teh. ║42-105 ║ 885.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 50║Bukliv ║Pavlo ║Jaroslavov. ║31.05.1988║Vchytel ║42-235 ║ 1455.50║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 60║Glunchak ║Pavlo ║Myronovych ║21.02.1989║Teh.prac.║42-211 ║ 885.90║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╚════╩═══════════╩════════╩════════════╩══════════╩═════════╩════════╩═════════╝
Пошук запису у базі даних:
Dla poshuku po ID vvedit '1'
Dla poshuku po Prizvyshcsu vvedit '2' 2
Vvedit' prizvyshche dla poshuku
▓ Omelchuk
REZULTAT:
11 Omelchuk Petro Petrovuch 26.11.1964 Zast.dyr. 2558025 1600.00
23 Omelchuk Marija Petrivna 15.04.1987 Vchytel 2558025 1525.29
Видалення запису з бази даних:
Uvedit ID (0 dla zaverszennia vvodu)
▓ 27
****Zapys vydaleno****
Vvedit' ID dla vydalennia
?▓
Вставка запису у базу даних:
Uvedit ID (0 dla zaverszennia vvodu)
▓ 10
Uvedit'
Prizvyshche(11), Imja(8), Po-bat'kovi(12), d/n(10), posadu(9), telefon(8), zarpl
atu
Zaritslyj Ivan Mykhailovyc 06.07.1989 Vchytel 42-221 1150.00
***Zapys dodano***
Модифікація запису у базі даних:
Uvedit ID (0 dla zaverszennia vvodu)
▓ 47
Uvedit' novi dani
Prizvyshche(11), Imja(8), Po-bat'kovi(12), d/n(10), posadu(9), telefon(8), zarpl
atu
Kalytka Pavlo Petrovych 30.03.1971 Vchytel 44-669 1400.20
****Zapys modyfikovano****
Vvedit' ID dla modyfikaciji
▓
Висновки
На цій лабораторній роботі я розглянув органiзацiю i ведення файлiв прямого доступу; набув практичнi навички у програмуваннi алгоритмiв доступу хешуванням.