МIНIСТЕРСТВО ОСВIТИ І НАУКИ УКРАЇНИ
Національний університет «Львiвська полiтехнiка»
Звіт
до лабораторної роботи №2
на тему
«Прямий метод доступу до файлів на зовнішніх запам’ятовуючих пристроях»
з курсу "Організація баз даних і знань "
Львів 2016
Тема
Прямий метод доступу до файлів на зовнішніх запам’ятовуючих пристроях.
Мета роботи
Розглянути органiзацiю i ведення файлiв прямого доступу; набути практичнi навички у програмуваннi алгоритмiв доступу хешуванням.
Завдання:
1. Написати програму методу прогресуючого переповнення, яка реалiзує такi функцiї:
1. Друк бази даних.
2. Зчитування запису.
3. Введення запису.
4. Видалення запису.
5. Модифiкацiя запису.
6. Вихід.
2. Написати програму методу зв'язаних блокiв, яка реалiзує такi функцiї:
1. Друк бази даних.
2. Зчитування запису.
3. Введення запису.
4. Видалення запису.
5. Модифiкацiя запису.
6. Вихід.
Індивідуальне завдання:
Магазин будівельних матеріалів
Текст програми:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include <iostream.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
#define BLOCKS 10
#define BLOCK_ROWS 6
#pragma argsused
// global vars
FILE *db;
char file_name[100];
struct data{
int id, Number, securityDet, lifetimeDet, salesDet;
int priceDet;
char company[20], nameDet[20], categoryDet[20], returnDet[20];
};
struct data parser(char *s);
int hash(int id){
return (id % BLOCKS)-1;
}
void read_row(char *buf){
int i=0 ;
for (i = 0;i<255&&!feof(db); i++){ //??????? ?????
fscanf(db,"%c",&buf[i]);
buf[i+1]='\0';
if(buf[i]=='\n'){
buf[i]='\0';
break;
}
}
}
void write_row(FILE *f, struct data row){
fprintf(f,"%i|%i|%i|%i|%i|",row.id,row.Number,row.priceDet,row.securityDet,row.lifetimeDet);
fprintf(f,"%i|%s|%s|%s|%s|\n",row.salesDet,row.company,row.nameDet,row.categoryDet,row.returnDet);
}
void block_read(struct data block[]){
int i=0;
char buf[255];
for (i = 0; i < BLOCKS; i++) {
block[i].id=0;
}
for (i = 0; i < BLOCK_ROWS && !feof(db); i++) {
read_row(buf);
block[i]=parser(buf);
}
}
void block_write(FILE *f, struct data *block){
int i=0;
for (i = 0; i < BLOCK_ROWS; i++) {
if(block[i].id==0){
fprintf(f,"0||||||||||\n");
}else{
write_row(f,block[i]);
}
}
}
int db_conect(void){
int i;
char c;
system("pause");
for (i=0;i<sizeof(file_name);i++){file_name[i]='\0';}
printf("Database adress: ");
fflush(stdin);
/**
file_name[0]='f';
file_name[1]='1';
file_name[2]='.';
file_name[3]='d';
file_name[4]='b';
**/
scanf("%s",&file_name);
db=fopen(file_name,"r");
if(db==0){
printf("\ndatabase not find!\n 1- insert new database adress\n 2- exit\n");
c=getchar();
if(c=='1')db_conect();else
if(c!='1')return 0;
}
return 1;
}
struct data parser(char *s){
char b[255];
struct data row;
int i=0, tmp=0,y,bi=0;
row.id=0;
while(s[i]!='\0'&&s[i]!='\n'){
if(s[i]=='|'){
switch (tmp) {
case 0:{row.id=atoi(b);break;}
case 1:{row.Number=atoi(b);break;}
case 2:{row.priceDet=atoi(b);break;}
case 3:{row.securityDet=atoi(b);break;}
case 4:{row.lifetimeDet=atoi(b);break;}
case 5:{row.salesDet=atoi(b);break;}
case 6:{for(y=0;y<sizeof(row.company);y++)row.company[y]=b[y];break;}
case 7:{for(y=0;y<sizeof(row.nameDet);y++)row.nameDet[y]=b[y];break;}
case 8:{for(y=0;y<sizeof(row.categoryDet);y++)row.categoryDet[y]=b[y];break;}
case 9:{for(y=0;y<sizeof(row.returnDet);y++)row.returnDet[y]=b[y];break;}
default:break;
}
for (bi = 0; bi < sizeof(b); bi++)b[bi]='\0';
bi=0;
tmp++;
}else{
b[bi]=s[i];
bi++;
}
i++;
}
return row;
}
void print_shapka(void){
//printf("ID | Remains |Security | Price | Lifetime | Sales | Company | NameDet | Category | ReturnDet\n");
printf("***Output***\n");
}
void print_row(struct data row){
//printf("%3i|%8i|%8i|%8i|%5i|%4i|%6...