Міністерство освіти і науки України
Національний університет «Львівська Політехніка»
Кафедра
Інформаційних
систем та мереж
Лабораторна робота №10
на тему
Робота зі структурами і файлами.
Львів – 2008
Мета роботи: практичних навичок опрацювання структур та роботи з файлами.
Завдання на роботу
Розробити програму яку забезпечує опрацювання структур даних і їх збереженян у файлі.
Опис деякого обєкту здійснюється за допомогою типу даних структура. Необхідно забезпечити опрацювання 3-5 атрибутів обєкту з використанням різних простих типів даних (стрічки, символи, числа, логічний тип)ю Забезпечити виконання таких операцій:
Ввід даних;
Пошук за значенням атрибуту;
Послідовний перегляд;
Модифікацію значень атрибутів обєктів (структури що його описує);
Видалення обєкту (структури що його описує);
Сортування за значеннями атрибутів;
Результати всіх операцій повинні зберігатись у файлі.
В контрольному прикладі продемонстурвати виконання основних операцій з файлом який містить 10-20 збережених описів обєктів.
Текст програми:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#define n 20
struct Tmob
{
char vyr[28];
char model[28];
char colir[28];
char IMEI[28];
};
int k=0,dija=0,el=0;
Tmob *mob;
void vved();
void menu();
void search();
void print();
void mod();
void del();
void sort(int zn);
void save();
Tmob a;
void main()
{ FILE *f;
textbackground(0);
clrscr();
mob=(Tmob *)malloc(n*sizeof(Tmob));
f=fopen("MOBILA.BIN","rb");
while(fread(&mob[k],sizeof(mob[k]),1,f))
k++;
fclose(f);
print();
getch();
}
void cursor_off()
{
_AH=0x1;
_CH=0x20;
geninterrupt(0x10);
}
void cursor_on()
{
_AH=0x1;
_CH=0x6;
_CL=0x7;
geninterrupt(0x10);
}
//=================
char s[30];
void vved()
{
char c,sm; int x=23,y=4;
//strcpy(s,0);
strcpy(a.vyr,0);
strcpy(a.model,0);
strcpy(a.colir,0);
strcpy(a.IMEI,0);
textcolor(0);
textbackground(11);
window(10,3,70,4);
clrscr();
gotoxy(24,1);
cprintf("Введiть данi:\n\r");
textbackground(BLUE);
window(10,4,70,18);
clrscr();
//------------
textcolor(0);
textbackground(14);
gotoxy(12,4);
cprintf("Виробник: ");
textbackground(15);
gotoxy(23,4);
cprintf(" ");
//---------------
textbackground(14);
gotoxy(12,6);
cprintf(" Модель: ");
textbackground(15);
gotoxy(23,6);
cprintf(" ");
//--------------
textbackground(14);
gotoxy(12,8);
cprintf(" Колiр: ");
textbackground(15);
gotoxy(23,8);
cprintf(" ");
//--------------
strcpy(s,a.vyr);
textbackground(14);
gotoxy(12,10);
cprintf(" IMEI: ");
textbackground(15);
gotoxy(23,10);
cprintf(" ");
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
if(strcmp(s,0)!=0)
{
gotoxy(x,y);
cputs(s);
gotoxy(x,y);
}
while(1)
{if(kbhit) c=getch();
switch(c)
{
case 80:
{y+=2; if(y>10) y-=2;
switch(y-2)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
textbackground(15);
gotoxy(x,y-2);
cprintf(" ");
if(strcmp(s,0)!=0)
{
gotoxy(x,y-2);
cputs(s);
gotoxy(x,y-2);
}
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
switch(y)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
if(strcmp(s,0)!=0)
{
gotoxy(x,y);
cputs(s);
gotoxy(x,y);
}
break;}
case 72:
{y-=2; if(y<4) y+=2;
switch(y+2)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
textbackground(15);
gotoxy(x,y+2);
cprintf(" ");
if(strcmp(s,0)!=0)
{
gotoxy(x,y+2);
cputs(s);
gotoxy(x,y+2);
}
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
switch(y)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
if(strcmp(s,0)!=0)
{
cputs(s);
gotoxy(x,y);
}
break;}
case 27: goto end;
case 13: { cursor_on();
int i=0;
textbackground(11);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
puts(s);
gotoxy(x+strlen(s),y);
i=strlen(s);
//if(i>0) {printf("\b"); i--;}
sm=0;
while(sm!=27&&sm!=13)
if(kbhit) {sm=getch();
if(i>27) {printf("\b"); i--;}
if(sm==8) {i--; if(i>=0) {printf("\b");printf(" ");printf("\b"); s[i]=0;}else i++; } else
if(i<27&&sm!=27&&sm!=13) {s[i]=sm; s[i+1]=0; i++;
if(sm==72||sm==80||sm==77||sm==75) sm=13;
if(sm!=27) printf("%c",sm);
}
}
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
printf("%s ",s);
gotoxy(x,y);
switch(y)
{
case 4: {strcpy(a.vyr,s); break;}
case 6: {strcpy(a.model,s); break;}
case 8: {strcpy(a.colir,s); break;}
case 10: {strcpy(a.IMEI,s); break;}
}
cursor_off();
break;}
}}
end: mob[k]=a; k++; save(); print();
}
int st=0;
void print()
{ char c;
cursor_off();
textcolor(15);
textbackground(11);
window(10,3,70,4);
clrscr();
gotoxy(21,1);
if(st==0)
cprintf(" База даних:\n\r"); else cprintf("Результати пошуку:\n\r");
textbackground(BLUE);
window(10,4,70,18);
clrscr();
//------------
for(int w=0; w<k; w++)
{
if(strlen(mob[w].vyr)>15) mob[w].vyr[15]=0;
if(strlen(mob[w].model)>9)mob[w].model[9]=0;
if(strlen(mob[w].colir)>10)mob[w].colir[10]=0;
if(strlen(mob[w].IMEI)>20)mob[w].IMEI[20]=0;
}
textbackground(GREEN);
textcolor(12);
gotoxy(1,1);
cprintf("%-3s %-15s %-9s %-10s %-20s","№","Виробник","Модель","Колiр","IMEI");
textcolor(15);
if(k!=0)
{
if(st!=1){
for(int i=0; i<k; i++)
if(i!=el)
{textbackground(BLUE);gotoxy(1,i+2);
cprintf("%-3d %-15s %-9s %-10s %-20s",i+1,mob[i].vyr,mob[i].model, mob[i].colir,mob[i].IMEI);
} else
{textbackground(14);gotoxy(1,i+2); //gotoxy(15,4);
cprintf("%-3d %-15s %-9s %-10s %-20s",el+1,mob[el].vyr,mob[el].model, mob[el].colir,mob[el].IMEI);
}
while(1)
{
if(kbhit) c=getch();
switch(c)
{
case 80: {if(el!=k-1) el++; else el=0; textbackground(14); gotoxy(1,el+2);
cprintf("%-3d %-15s %-9s %-10s %-20s",el+1,mob[el].vyr,mob[el].model, mob[el].colir,mob[el].IMEI);
for(int i=0; i<k; i++) if(i!=el){textbackground(BLUE); gotoxy(1,i+2);
cprintf("%-3d %-15s %-9s %-10s %-20s",i+1,mob[i].vyr,mob[i].model, mob[i].colir,mob[i].IMEI);} break;}
case 72: {if(el!=0) el--; else el=k-1; textbackground(14); gotoxy(1,el+2);
cprintf("%-3d %-15s %-9s %-10s %-20s",el+1,mob[el].vyr,mob[el].model, mob[el].colir,mob[el].IMEI);
for(int i=0; i<k; i++) if(i!=el){textbackground(BLUE); gotoxy(1,i+2);
cprintf("%-3d %-15s %-9s %-10s %-20s",i+1,mob[i].vyr,mob[i].model, mob[i].colir,mob[i].IMEI);} break;}
case 13: {menu(); }
}
}}
else
{ int pos=0;
for(int i=0; i<k; i++)
if((strcmp(mob[i].vyr,a.vyr)==0)||(strcmp(mob[i].model,a.model)==0)||(strcmp(mob[i].colir,a.colir)==0)||(strcmp(mob[i].IMEI,a.IMEI)==0))
{pos++; textbackground(BLUE);gotoxy(1,pos+1);
cprintf("%-3d %-15s %-9s %-10s %-20s",i+1,mob[i].vyr,mob[i].model, mob[i].colir,mob[i].IMEI);
st=0;
}
if(st==1) printf(" -------------Не знайдено------------");
st=0; getch(); print();
}}
else{
{el=0; printf(" -----------База даних порожня----------");}
while(1)
{
if(kbhit()) c=getch();
if(c==13) menu();}
}
}
void run()
{
switch(dija)
{
case 2: {vved(); break;}
case 8: exit(0);
case 0: if (k!=0) {mod(); break;}
case 1: if (k!=0) {del(); break;}
case 3: if (k!=0) {search(); break;}
case 4: if (k!=0) {sort(1); break;}
case 5: if (k!=0) {sort(2); break;}
case 6: if (k!=0) {sort(3); break;}
case 7: if (k!=0) {sort(4); break;}
}}
#define kp 9
void menu()
{ char c; char d[kp][40];
dija=0;
//textbackground(11);
//window(10,11,40,18);
strcpy(d[0],"=>Редагувати поточний елемент \n\r");
strcpy(d[1],"=>Видалити поточний елемент \n\r");
strcpy(d[2],"=>Додати новий елемент до бази \n\r");
strcpy(d[3],"=>Пошук за значенням атрибуту \n\r");
strcpy(d[4],"=>Сортувати по полю Виробник \n\r");
strcpy(d[5],"=>Сортувати по полю Модель \n\r");
strcpy(d[6],"=>Сортувати по полю Колiр \n\r");
strcpy(d[7],"=>Сортувати по полю IMEI \n\r");
strcpy(d[8],"=>Вийти з програми \n\r");
textbackground(12); gotoxy(15,4);
if(k==0) textcolor(7); else textcolor(14); cprintf(d[0]);
for(int i=0; i<kp; i++)
if(i!=0){if(i!=2&&i!=8&&k==0) textcolor(7); else textcolor(14); textbackground(11); gotoxy(15,i+4); cprintf(d[i]);}
textcolor(14);
while(1)
{
if(kbhit) c=getch();
switch(c)
{
case 80: {if(dija!=kp-1) dija++; else dija=0; textbackground(12); gotoxy(15,dija+4);if(dija!=2&&dija!=8&&k==0) textcolor(7); else textcolor(14); cprintf(d[dija]); for(int i=0; i<kp; i++) if(i!=dija){textbackground(11); gotoxy(15,i+4);if(i!=2&&i!=8&&k==0) textcolor(7); else textcolor(14); cprintf(d[i]);} break;}
case 72: {if(dija!=0) dija--; else dija=kp-1; textbackground(12); gotoxy(15,dija+4); if(dija!=2&&dija!=8&&k==0) textcolor(7); else textcolor(14); cprintf(d[dija]); for(int i=0; i<kp; i++) if(i!=dija){textbackground(11); gotoxy(15,i+4); if(i!=2&&i!=8&&k==0) textcolor(7); else textcolor(14); cprintf(d[i]);}break;}
case 27: {print();}
case 13: {run();}
}}}
void mod()
{
char c,sm; int x=23,y=4;
//strcpy(s,0);
strcpy(a.vyr,mob[el].vyr);
strcpy(a.model,mob[el].model);
strcpy(a.colir,mob[el].colir);
strcpy(a.IMEI,mob[el].IMEI);
textcolor(14);
textbackground(11);
window(10,3,70,4);
clrscr();
gotoxy(24,1);
cprintf("Редагування:\n\r");
textbackground(BLUE);
window(10,4,70,18);
clrscr();
//------------
textcolor(0);
textbackground(14);
gotoxy(12,4);
cprintf("Виробник: ");
textbackground(15);
gotoxy(23,4);
cprintf(" ");
gotoxy(23,4);
cprintf(a.vyr);
//---------------
textbackground(14);
gotoxy(12,6);
cprintf(" Модель: ");
textbackground(15);
gotoxy(23,6);
cprintf(" ");
gotoxy(23,6);
cprintf(a.model);
//--------------
textbackground(14);
gotoxy(12,8);
cprintf(" Колiр: ");
textbackground(15);
gotoxy(23,8);
cprintf(" ");
gotoxy(23,8);
cprintf(a.colir);
//--------------
strcpy(s,a.vyr);
textbackground(14);
gotoxy(12,10);
cprintf(" IMEI: ");
textbackground(15);
gotoxy(23,10);
cprintf(" ");
gotoxy(23,10);
cprintf(a.IMEI);
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
gotoxy(x,y);
if(strcmp(s,0)!=0)
{
gotoxy(x,y);
cputs(s);
gotoxy(x,y);
}
while(1)
{if(kbhit) c=getch();
switch(c)
{
case 80:
{y+=2; if(y>10) y-=2;
switch(y-2)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
textbackground(15);
gotoxy(x,y-2);
cprintf(" ");
if(strcmp(s,0)!=0)
{
gotoxy(x,y-2);
cputs(s);
gotoxy(x,y-2);
}
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
switch(y)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
if(strcmp(s,0)!=0)
{
gotoxy(x,y);
cputs(s);
gotoxy(x,y);
}
break;}
case 72:
{y-=2; if(y<4) y+=2;
switch(y+2)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
textbackground(15);
gotoxy(x,y+2);
cprintf(" ");
if(strcmp(s,0)!=0)
{
gotoxy(x,y+2);
cputs(s);
gotoxy(x,y+2);
}
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
switch(y)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
if(strcmp(s,0)!=0)
{
cputs(s);
gotoxy(x,y);
}
break;}
case 27: goto end;
case 13: { cursor_on();
int i=0;
textbackground(11);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
puts(s);
gotoxy(x+strlen(s),y);
i=strlen(s);
sm=0;
while(sm!=27&&sm!=13)
if(kbhit) {sm=getch();
if(i>27) {printf("\b"); i--;}
if(sm==8) {i--; if(i>=0) {printf("\b");printf(" ");printf("\b"); s[i]=0;}else i++; } else
if(i<27&&sm!=27&&sm!=13) {s[i]=sm; s[i+1]=0; i++;
if(sm==72||sm==80||sm==77||sm==75) sm=13;
if(sm!=27) printf("%c",sm);
}}
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
printf("%s ",s);
gotoxy(x,y);
switch(y)
{
case 4: {strcpy(a.vyr,s); break;}
case 6: {strcpy(a.model,s); break;}
case 8: {strcpy(a.colir,s); break;}
case 10: {strcpy(a.IMEI,s); break;}
}
cursor_off();
break;}
}}
end: mob[el]=a; save(); print();
}
void del()
{ k--;
if(el!=k){
for(int i=el; i<k; i++)
mob[i]=mob[i+1]; }
else el--;
save();
print();
}
void search()
{
char c,sm; int x=23,y=4; st=1;
//strcpy(s,0);
strcpy(a.vyr,0);
strcpy(a.model,0);
strcpy(a.colir,0);
strcpy(a.IMEI,0);
textcolor(0);
textbackground(11);
window(10,3,70,4);
clrscr();
gotoxy(24,1);
cprintf("Введiть данi:\n\r");
textbackground(BLUE);
window(10,4,70,18);
clrscr();
//------------
textcolor(0);
textbackground(14);
gotoxy(12,4);
cprintf("Виробник: ");
textbackground(15);
gotoxy(23,4);
cprintf(" ");
//---------------
textbackground(14);
gotoxy(12,6);
cprintf(" Модель: ");
textbackground(15);
gotoxy(23,6);
cprintf(" ");
//--------------
textbackground(14);
gotoxy(12,8);
cprintf(" Колiр: ");
textbackground(15);
gotoxy(23,8);
cprintf(" ");
//--------------
strcpy(s,a.vyr);
textbackground(14);
gotoxy(12,10);
cprintf(" IMEI: ");
textbackground(15);
gotoxy(23,10);
cprintf(" ");
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
if(strcmp(s,0)!=0)
{
gotoxy(x,y);
cputs(s);
gotoxy(x,y);
}
while(1)
{if(kbhit) c=getch();
switch(c)
{
case 80:
{y+=2; if(y>10) y-=2;
switch(y-2)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
textbackground(15);
gotoxy(x,y-2);
cprintf(" ");
if(strcmp(s,0)!=0)
{
gotoxy(x,y-2);
cputs(s);
gotoxy(x,y-2);
}
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
switch(y)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
if(strcmp(s,0)!=0)
{
gotoxy(x,y);
cputs(s);
gotoxy(x,y);
}
break;}
case 72:
{y-=2; if(y<4) y+=2;
switch(y+2)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
textbackground(15);
gotoxy(x,y+2);
cprintf(" ");
if(strcmp(s,0)!=0)
{
gotoxy(x,y+2);
cputs(s);
gotoxy(x,y+2);
}
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
switch(y)
{
case 4: {strcpy(s,a.vyr); break;}
case 6: {strcpy(s,a.model); break;}
case 8: {strcpy(s,a.colir); break;}
case 10: {strcpy(s,a.IMEI); break;}
}
if(strcmp(s,0)!=0)
{
cputs(s);
gotoxy(x,y);
}
break;}
case 27: goto end;
case 13: { cursor_on();
int i=0;
textbackground(11);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
puts(s);
gotoxy(x+strlen(s),y);
i=strlen(s);
//if(i>0) {printf("\b"); i--;}
sm=0;
while(sm!=27&&sm!=13)
if(kbhit) {sm=getch();
if(i>27) {printf("\b"); i--;}
if(sm==8) {i--; if(i>=0) {printf("\b");printf(" ");printf("\b"); s[i]=0;}else i++; } else
if(i<27&&sm!=27&&sm!=13) {s[i]=sm; s[i+1]=0; i++;
if(sm==72||sm==80||sm==77||sm==75) sm=13;
if(sm!=27) printf("%c",sm);
}}
textbackground(14);
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
printf("%s ",s);
gotoxy(x,y);
switch(y)
{
case 4: {strcpy(a.vyr,s); break;}
case 6: {strcpy(a.model,s); break;}
case 8: {strcpy(a.colir,s); break;}
case 10: {strcpy(a.IMEI,s); break;}
}
cursor_off();
break;}
}}
end: print();
}
void sort(int zn)
{Tmob temp;
switch(zn)
{
case 1:
{
for(int i=0; i<k; i++)
for(int j=0; j<k-1; j++)
if(strcmp(mob[j].vyr,mob[j+1].vyr)>0)
{temp=mob[j];
mob[j]=mob[j+1];
mob[j+1]=temp; }
break; }
case 2:
{
for(int i=0; i<k; i++)
for(int j=0; j<k-1; j++)
if(strcmp(mob[j].model,mob[j+1].model)>0)
{temp=mob[j];
mob[j]=mob[j+1];
mob[j+1]=temp; }
break; }
case 3:
{
for(int i=0; i<k; i++)
for(int j=0; j<k-1; j++)
if(strcmp(mob[j].colir,mob[j+1].colir)>0)
{temp=mob[j];
mob[j]=mob[j+1];
mob[j+1]=temp; }
break; }
case 4:
{
for(int i=0; i<k; i++)
for(int j=0; j<k-1; j++)
if(strcmp(mob[j].IMEI,mob[j+1].IMEI)>0)
{temp=mob[j];
mob[j]=mob[j+1];
mob[j+1]=temp; }
break; }
}
save();
print();
}
void save()
{FILE *f;
f=fopen("MOBILA.BIN","wb");
for(int i=0; i<k; i++)
fwrite(&mob[i],sizeof(mob[i]),1,f);
fclose(f);
}
Результати виконання програми:
Висновки:
Я набув практичних навичок опрацювання структур та роботи з файлами.