Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра САПР
ЗВІТ
про виконання лабораторної роботи №3
на тему: «Індексно-послідовний метод доступу до файлів на зовнішніх запам’ятовуючих пристроях»
з курсу: «Організація баз даних і знань»
Львів 2008
Тема роботи
Індексно-послідовний метод доступу до файлів на зовнішніх запам’ятовуючих пристроях.
Мета роботи
Розглянути органiзацiю i ведення файлiв iндексно-послiдовного доступу; набути практичнi навички у програмуваннi алгоритмiв iндексно-послiдовного доступу до файлiв на зовнiшнiх запам'ятовуючих пристроях.
Лабораторне завдання
Тема завдання: Персонал школи
1. Написати програму, яка реалiзує алгоритми роботи iндексно-послiдов ного методу доступу до iнформацiї на зовнiшнiх носiях:
1.1. Пошук елемента даних за введеним ключем.
1.2. Вставка елемента даних.
1.3. Видалення елемента даних.
1.4. Модифiкацiя елемента даних.
Короткі теоретичні відомості
Текст програми
#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,*fi;
char fn[50]="db3.txt",fn2[50]="index.txt";
int h(int param)
{
int k,mod1;
fi=fopen(fn2,"r");
while(!feof(fi))
{
fscanf(fi,"%d",&k);
if(param<k) break;
}
if(!feof(fi))
{
fclose(fi);
mod1=(param%10)*sizeof(struct DB);
return (k-10)*sizeof(struct DB)+mod1;
}
return 0;
}
void insert()
{
int hesh;
printf("Uvedit ID (0 dla zaverszennia vvodu)\nІ ");
scanf("%d", &db1.id);
while (db1.id!=0)
{
hesh=h(db1.id);
fseek(f1,hesh, SEEK_SET);
fread(&db2, sizeof(struct DB),1,f1);
if(db2.id==db1.id)
{
printf("\n***ERROR:Zapus z ID %d vze isnuje!!\nVvedit inshyj ID\n",db1.id);
goto error;
}
fseek(f1, hesh, SEEK_SET);
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,id;
printf("Uvedit ID (0 dla zaverszennia vvodu)\nІ ");
scanf("%d", &id);
while (id>0)
{
hesh=h(id);
fseek(f1,hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
// if((db1.id==id)&&(db1.id>=1))
{
fseek(f1, hesh, SEEK_SET);
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;
printf("Uvedit ID (0 dla zaverszennia vvodu)\nІ ");
scanf("%d", &db2.id);
while (db2.id>0)
{
hesh=h(db2.id);
fseek(f1,hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
if(db1.id==db2.id)
{
fseek(f1, hesh, SEEK_SET);
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,id;
printf("Uvedit ID dla poshuku (dla zavershennia vvedit 0)\nІ ");
scanf("%d", &id);
while (id>0)
{
hesh=h(id);
fseek(f1,hesh, SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
if(db1.id==id)
{
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 svyvid()
{
int hesh=0,k=0;
printf("ЙННННЛНННННННННННЛННННННННЛННННННННННННЛННННННННННЛНННННННННЛННННННННЛННННННННН»");
printf("є IDєPRIZVYSHCHEєIMJA єPO-BAT'KOVI єDATA NAR. єPOSADA єTELEFON єZARPLATA є");
printf("МННННОНННННННННННОННННННННОННННННННННННОННННННННННОНННННННННОННННННННОННННННННН№");
fseek(f1,0,SEEK_SET);
while(!feof(f1))
{
fseek(f1,hesh,SEEK_SET);
fread(&db1, sizeof(struct DB),1,f1);
hesh=hesh+sizeof(struct DB);
if(db1.id>=1)
{
printf("є%4dє%-11sє%-8sє%-12sє%-10sє%-9sє%-8sє%9.2fє",db1.id, db1.name, db1.lname, db1.pname, db1.datan, db1.posada, db1.tel, db1.zarplata);
printf("МННННОНННННННННННОННННННННОННННННННННННОННННННННННОНННННННННОННННННННОННННННННН№");
k++;
if(k%10==0)getch();
}
}
getch();
}
void main()
{
int choice;
textcolor(BLUE);
textbackground(YELLOW);
clrscr();
printf("Vvedit' adresu do fajlu BD: ");
scanf("%s",fn);
clrscr();
f1=fopen(fn,"r+");
for(;;)
{
clrscr();
printf("ЙННННННННННННННННННННННННННННННННННННННННСНННННННННННННН»\n");
printf("є Druk bazy danyh (po blokah) і natysnit <1> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Druk bazy danyh (vidsortovanyj) і natysnit <2> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Poshuk zapysu za vvedenym kluchem і natysnit <3> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Vudalennia zapysu za vvedenym kluchem і natysnit <4> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Vstavka zapysu і natysnit <5> є\n");
printf("ЗДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДД¶\n");
printf("є Modyfikacija zapysu і natysnit <6> є\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 :{svyvid();break;}
case 3 :{search();break;}
case 4 :{del(); break;}
case 5 :{insert();break;}
case 6 :{modify();break;}
case 91:{ins2(); break;}
default:{printf("\n\nPOTRIBNO VVESTU CHYSLO VID 0 DO 4\n"); getch();continue;}
}
}
fclose(f1);
}
Результати виконання програми
Головне меню:
╔════════════════════════════════════════╤══════════════╗
║ Druk bazy danyh (po blokah) │ natysnit <1> ║
╟────────────────────────────────────────┼──────────────╢
║ Druk bazy danyh (vidsortovanyj) │ natysnit <2> ║
╟────────────────────────────────────────┼──────────────╢
║ Poshuk zapysu za vvedenym kluchem │ natysnit <3> ║
╟────────────────────────────────────────┼──────────────╢
║ Vudalennia zapysu za vvedenym kluchem │ natysnit <4> ║
╟────────────────────────────────────────┼──────────────╢
║ Vstavka zapysu │ natysnit <5> ║
╟────────────────────────────────────────┼──────────────╢
║ Modyfikacija zapysu │ natysnit <6> ║
╟────────────────────────────────────────┼──────────────╢
║ Vyhid z programy │ natysnit <0> ║
╚════════════════════════════════════════╧══════════════╝
Vy vvely:
Вивід бази даних(по блоках):
║BLOK N0║
╔════╦═══════════╦════════╦═════════╩══╦════╩═════╦═════════╦════════╦═════════╗
║ ID║PRIZVYSHCHE║IMJA ║PO-BAT'KOVI ║DATA NAR. ║POSADA ║TELEFON ║ZARPLATA ║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 1║Dombrova ║Galuna ║Myhajlivna ║29.11.1958║Dyrektor ║42-417 ║ 1750.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 2║Klos ║Luba ║Petrivna ║13.05.1977║Zast.dyr.║42-111 ║ 1560.20║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 6║Dublanko ║Marija ║Ivanivna ║12.11.1951║Zast.Dyr.║42-443 ║ 1450.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 0║ ║ ║ ║ ║ ║ ║ 0.00║
╟────╫───────────╫────────╫────────────╫──────────╫─────────╫────────╫─────────╢
║ 9║Sobchyshak ║Natalia ║Dmytrivna ║15.03.1967║Ped.Org. ║46-112 ║ 1100.00║
╚════╩═══════════╩════════╩════════════╩══════════╩═════════╩════════╩═════════╝
Вивід бази даних(відсортованй):
╔════╦═══════════╦════════╦════════════╦══════════╦═════════╦════════╦═════════╗
║ ID║PRIZVYSHCHE║IMJA ║PO-BAT'KOVI ║DATA NAR. ║POSADA ║TELEFON ║ZARPLATA ║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 1║Dombrova ║Galuna ║Myhajlivna ║29.11.1958║Dyrektor ║42-417 ║ 1750.00║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 2║Klos ║Luba ║Petrivna ║13.05.1977║Zast.dyr.║42-111 ║ 1560.20║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 6║Dublanko ║Marija ║Ivanivna ║12.11.1951║Zast.Dyr.║42-443 ║ 1450.00║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 9║Sobchyshak ║Natalia ║Dmytrivna ║15.03.1967║Ped.Org. ║46-112 ║ 1100.00║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 11║Lyhva ║Myron ║Petrovych ║30.04.1965║Vchytel ║44-114 ║ 1000.00║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 15║Spryns'ka ║Zoriana ║Vasylivna ║12.04.1981║Vchytel ║3-25-48 ║ 980.00║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 19║Jarosh ║Marija ║Lvivna ║15.05.1949║Storozh ║42-130 ║ 890.00║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 20║Dombrova ║Ivan ║Stanisl. ║14.01.1983║Vchytel ║42-417 ║ 890.00║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 21║Grynda ║Lida ║Pavlivna ║21.02.1952║Vchytel ║42-450 ║ 1180.20║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
║ 25║Omelchuk ║Marija ║Petrivna ║15.04.1987║Vchytel ║255-8025║ 1240.50║
╠════╬═══════════╬════════╬════════════╬══════════╬═════════╬════════╬═════════╣
Пошук запису у базі даних:
Dla poshuku po ID vvedit '1'
Dla poshuku po Prizvyshcsu vvedit '2' 1
Uvedit ID dla poshuku (dla zavershennia vvedit 0)
▓ 30
Rezultat:
30 Klynkovskyj Igor Romanovych 17.03.1972 Vchytel 2-25-48 820.00
Vvedit' ID dla poshuku
Vvedit' prizvyshche dla poshuku
▓ Jarosh
REZULTAT:
19 Jarosh Marija Lvivna 15.05.1949 Storozh 42-130 890.00
Видалення запису з бази даних:
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 навички у програмуваннi алгоритмiв iндексно-послiдовного доступу до файлiв на зовнiшнiх запам'ятовуючих пристроях.