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

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

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

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

Рік:
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:05-

Коментарі

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

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

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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