Індексно-послідовний метод доступу до файлів на зовнішніх запам’ятовуючих пристроях.

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Не вказано

Інформація про роботу

Рік:
2016
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Організація баз даних і знань

Частина тексту файла (без зображень, графіків і формул):

МIНIСТЕРСТВО ОСВIТИ І НАУКИ УКРАЇНИ Національний університет «Львiвська полiтехнiка» Звіт до лабораторної роботи №3 на тему «Індексно-послідовний метод доступу до файлів на зовнішніх запам’ятовуючих пристроях.» з курсу "Організація баз даних і знань" Львів 2016 Тема Індексно-послідовний метод доступу до файлів на зовнішніх запам’ятовуючих пристроях. Мета роботи Розглянути органiзацiю i ведення файлiв iндексно-послiдовного доступу; набути практичнi навички у програмуваннi алгоритмiв iндексно-послiдовного доступу до файлiв на зовнiшнiх запам'ятовуючих пристроях. Завдання: Написати програму, яка реал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> #include <math.h> #include <iostream> #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, remaindsDet, priceDet, securityDet, lifetimeDet, salesDet; 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.remaindsDet,row.priceDet,row.securityDet,row.lifetimeDet,row.salesDet); 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); 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.remaindsDet=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("***Output***\n"); } void print_row(struct data row){ printf("\n----------------------------------\n"); printf("ID = %d\n",row.id); printf("Remains = %d\n",row.remaindsDet); printf("Security = %d\n",row.securityDet); printf("Price = %d\n",row.priceDet); printf("Weight = %d\n",row.lifetimeDet); printf("Sales = %d\n",row.salesDet); printf("Company = %s\n",row.company); printf("Name = %s\n",row.nameDet); printf("Category = %s\n",row.categoryDet); printf("Available = %s\n ",row.returnDet); } void showAll(void){ struct data row; char buf[255],b[255]; int i,j,tmp,bi,y; system("pause"); print_shapka(); for (i = 0; !feof(db); i++) { for (j = 0;!feof(db)&&j<255; j++){ fscanf(db,"%c",&buf[j]); buf[j+1]='\0'; if(buf[j]=='\n'){ buf[j]='\0'; break; } } row=parser(buf); if(row.id>0)print_row(row); row.id=0; } fseek(db,0,0); getch(); } void InsertRow(void){ FILE *tmp; struct data row,temp,block[BLOCKS]; int i,bi,h; int insert=0; char buf[255]; system("pause"); printf("********[Insert in %10s]********\n",&file_name); fflush(stdin); printf("* ID(int) = "); scanf("%i",&row.id); fflush(stdin); printf("* Remains(int) = "); scanf("%i",&row.remaindsDet); fflush(stdin); printf("* Security(int) = "); scanf("%i",&row.securityDet); fflush(stdin); printf("* Price(int) = "); scanf("%i",&row.priceDet); fflush(stdin); printf("* Weight(int) = "); scanf("%i",&row.lifetimeDet); fflush(stdin); printf("* Sales(int) = "); scanf("%i",&row.salesDet); fflush(stdin); printf("* Company(char) = "); scanf("%s",&row.company); fflush(stdin); printf("* Name(char) = "); scanf("%s",&row.nameDet); fflush(stdin); printf("* Category(char) = "); scanf("%s",&row.categoryDet); fflush(stdin); printf("*Available(char) = "); scanf("%s",&row.returnDet); h=hash(row.id); fseek(db,0,0); tmp=fopen("tmp.txt","w"); for (bi = 0; bi < BLOCKS && !feof(db); bi++) { block_read(block); if (bi==h) { for (i = 0; i < BLOCK_ROWS; i++) { if(block[i].id==row.id){ insert=1; break; } if(block[i].id==0){ block[i]=row; insert=1; break; } } } block_write(tmp,block); } if(insert==0){ while(bi<=hash(row.id)){ block_read(block); if(bi==h){ block[0]=row; insert=1; } block_write(tmp,block); bi++; } } for (bi = bi; bi < BLOCKS; bi++) { block_read(block); block_write(tmp,block); } while(!feof(db)){ read_row(buf); temp=parser(buf); if(temp.id!=0)write_row(tmp,temp); } if(insert==0){write_row(tmp,row); } fclose(tmp); fclose(db); remove(file_name); rename("tmp.txt",file_name); db=fopen(file_name,"r"); printf("done! press any kay to continue"); getch(); } int rivne(char *a, char *b){ int i; for (i = 0; i >=0; i++) { if(a[i]!=b[i])return 0; if(a[i]=='\0'|b[i]=='\0')break; } return 1; } int quest(void){ char k; while(1>0){ fflush(stdin); k=getchar(); if(k=='Y'|k=='y'){ return 1; }else if(k=='N'|k=='n'){ return 0; } } } void Delete(void){ FILE *tmp; struct data row,temp,block[BLOCKS],dop[10]; int i,bi,h,c,dopc=0,del_dop=0; char buf[255]; system("pause"); fseek(db,0,0); tmp=fopen("tmp.txt","w"); printf("Insert ID for delete row\n ID = "); fflush(stdin); scanf("%i",&c); h=hash(c); for (i = 0; i < BLOCKS && !feof(db); i++) { block_read(block); } for (dopc = 0; !feof(db); dopc++) { read_row(buf); dop[dopc]=parser(buf); } dopc--; fseek(db,0,0); for (bi = 0; bi < BLOCKS && !feof(db); bi++) { block_read(block); if (bi==h) { for (i = 0; i < BLOCK_ROWS; i++) { if(block[i].id==c){ block[i].id=0; for (c=0; c < dopc; c++) { if(hash(dop[c].id)==h){ block[i]=dop[c]; del_dop=dop[c].id; break; } } break; } } } block_write(tmp,block); } while(!feof(db)){ read_row(buf); temp=parser(buf); if(temp.id!=0&&temp.id!=c&&temp.id!=del_dop)write_row(tmp,temp); } fclose(tmp); fclose(db); remove(file_name); rename("tmp.txt",file_name); db=fopen(file_name,"r"); printf("done! press any kay to continue"); getch(); } int Update(){ FILE *tmp; struct data row,temp,block[BLOCKS]; int i,bi,h,c; char buf[255]; system("pause"); fseek(db,0,0); tmp=fopen("tmp.txt","w"); printf("Insert ID for update row\n ID = "); fflush(stdin); scanf("%i",&c); h=hash(c); row.id=0; for (bi = 0; bi < BLOCKS && !feof(db); bi++) { block_read(block); for (i = 0; i < BLOCK_ROWS; i++) { if(block[i].id==c){ row=block[i]; break; } } if(row.id!=0&&row.id==c){ print_shapka(); print_row(row); fflush(stdin); printf("Company(char) = %s UPDATE ? Yes/No: ",row.company); if(quest()){ printf("\tCompany(char) = "); scanf("%s",&row.company); } fflush(stdin); printf("Name(char) = %s UPDATE ? Yes/No: ",row.nameDet); if(quest()){ printf("\tName(char) = "); scanf("%s",&row.nameDet); } fflush(stdin); printf("Category(char) = %s UPDATE ? Yes/No: ",row.categoryDet); if(quest()){ printf("\tCategory(char) = "); scanf("%s",&row.categoryDet); } fflush(stdin); printf("Available(char) = %s UPDATE ? Yes/No: ",row.returnDet); if(quest()){ printf("\tAvailable(char) = "); scanf("%s",&row.returnDet); } fflush(stdin); printf("Remains(int) = %i UPDATE ? Yes/No: ",row.remaindsDet); if(quest()){ printf("\tRemains(int) = "); scanf("%i",&row.remaindsDet); } fflush(stdin); printf("Price(int) = %i UPDATE ? Yes/No: ",row.priceDet); if(quest()){ printf("\tPrice(int) = "); scanf("%i",&row.priceDet); } fflush(stdin); printf("Security(int) = %i UPDATE ? Yes/No: ",row.securityDet); if(quest()){ printf("\tSecurity(int) = "); scanf("%i",&row.securityDet); } fflush(stdin); printf("Weight(int) = %i UPDATE ? Yes/No: ",row.lifetimeDet); if(quest()){ printf("\tWeight(int) = "); scanf("%i",&row.lifetimeDet); } fflush(stdin); printf("Sales(int) = %i UPDATE ? Yes/No : ",row.salesDet); if(quest()){ printf("\tSales(int) = "); scanf("%i",&row.salesDet); } block[i]=row; row.id=0; } block_write(tmp,block); } while(!feof(db)){ read_row(buf); temp=parser(buf); if(temp.id!=0)write_row(tmp,temp); } fclose(tmp); fclose(db); remove(file_name); rename("tmp.txt",file_name); db=fopen(file_name,"r"); printf("done! press any kay to continue"); getch(); return 0; } int Search(){ struct data row,ss; char buf[255],b[255]; int i,j,tmp,bi,y,c; system("pause"); printf("Choose KEY:\n"); printf("1 - ID\n"); printf("2 - Remains\n"); printf("3 - Security\n"); printf("4 - Price\n"); printf("5 - Weight\n"); printf("6 - Sales\n"); printf("7 - Company\n"); printf("8 - Name\n"); printf("9 - Category\n"); printf("10 - Available\n"); scanf("%i",&c); fflush(stdin); switch (c) { case 1:{printf("ID(int) = ");scanf("%i",&ss.id);break;} case 2:{printf("Remains(int) = ");scanf("%i",&ss.remaindsDet);break;} case 3:{printf("Securoty(int) = ");scanf("%i",&ss.securityDet);break;} case 4:{printf("Price(int) = ");scanf("%i",&ss.priceDet);break;} case 5:{printf("Weight(int) = ");scanf("%i",&ss.lifetimeDet);break;} case 6:{printf("Sales(int) = ");scanf("%i",&ss.salesDet);break;} case 7:{printf("Company(char) = ");scanf("%s",&ss.company);break;} case 8:{printf("Name(char) = ");scanf("%s",&ss.nameDet);break;} case 9:{printf("Category(char) = ");scanf("%s",&ss.categoryDet);break;} case 10:{printf("Available(char) = ");scanf("%s",&ss.returnDet);break;} default: return 0; } print_shapka(); for (i = 0; !feof(db); i++) { for (j = 0;!feof(db)&&j<255; j++){ fscanf(db,"%c",&buf[j]); buf[j+1]='\0'; if(buf[j]=='\n'){ buf[j]='\0'; break; } } row=parser(buf); if(row.id>0){ if((c==1&&row.id==ss.id) | (c==2&&rivne(row.returnDet,ss.returnDet)==1) | (c==3&&rivne(row.categoryDet,ss.categoryDet)==1) | (c==4&&rivne(row.company,ss.company)==1) | (c==5&&row.lifetimeDet==ss.lifetimeDet) | (c==6&&row.salesDet==ss.salesDet) | (c==7&&row.priceDet==ss.priceDet) | (c==8&&row.nameDet==ss.nameDet) | (c==9&&row.securityDet==ss.securityDet) | (c==10&&row.remaindsDet==ss.remaindsDet) ) print_row(row); } row.id=0; } fseek(db,0,0); getch(); } int createDB(void){ FILE *tmp; char db_name[255]; printf("DataBase name= "); scanf("%s",&db_name); tmp=fopen(db_name,"w+"); fclose(tmp); printf("Database has been create! choose as default? Y/N:"); if(quest()){ strcpy(file_name,db_name); db=fopen(file_name,"r"); return 1; } return 0; } int menu_pd(void){ char c; system("pause"); printf("DATABASE, Oshchypok Vitalii, KN-25, LABORATORNA-3\n\n"); printf("********[Database: %10s]********\n",&file_name); printf("* 1- insert row *\n"); printf("* 2- show all rows *\n"); printf("* 3- search by key *\n"); printf("* 4- update by key *\n"); printf("* 5- delete by key *\n"); printf("* *\n"); printf("* 0- exit *\n"); printf("**************************************\n"); c=getchar(); switch (c) { case '1':{InsertRow();break;} case '2':{showAll();break;} case '3':{Search();break;} case '4':{Update();break;} case '5':{Delete();break;} case '0':{return 0;} } return 1; } int menu_db(void){ int c=0; system("pause"); printf("DATABASE, Guz Volodymyr, KN-25, LABORATORNA-3\n\n"); printf(" 1 - Select DataBase\n"); printf(" 2 - Create DataBase\n"); printf("\tYour choose:"); while(c!=1&&c!=2){ fflush(stdin); scanf("%i",&c); } if(c==1&&db_conect()){ return 1; }else if(c==2&&createDB()){ return 1; }else return 0; } int main(void){ if(menu_db()==0)return 0; while(menu_pd()==1){} return 0; } Основне меню:  Вставлення нового запису в базу даних:  Друк бази даних на екран:  Пошук за ключем в базі даних:  Видалення запису за ключем в базі даних: / Модифікація запису за ключем в базі даних: / Висновок: При виконанні даної лабораторної роботі я розглянув органiзацiю i ведення файлiв iндексно-послiдовного доступу; набув практичнi навички у програмуваннi алгоритмiв iндексно-послiдовного доступу до файлiв на зовнiшнiх запам'ятовуючих пристроях.
Антиботан аватар за замовчуванням

25.05.2016 15:09

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!