Інститут менеджменту та економіки „Галицька Академія”
з дисципліни “Об’єктно-орієнтовне програмування”
Тема – Робота з файлами.
1. Відомості про студента складаються з його імені, прізвища, назви групи та факультету. Створити за даним зразком файл, який містить відомості про студентів. Використовуючи сформований файл, вияснити:
- число однофамільців у групі;
- число однофамільців на факультеті.
Анотація
В роботі було розроблено програму на основі роботи з файлами з використанням класів. Програму виконано на мові програмування С++.
Summary
In work the program was developed on basis|foundation| of work with files with the use of classes. The program is executed|done,implemented| in programming language|speech| of С++.
Зміст
ЗМІСТ……………………………………………………………..6
ОПИС ОСНОВНИХ ФУНКЦІЙ, ЩО ВИКОРИСТАНІ В
ПРОГРАМІ………………………………………………………. 7
КОД ПРОГРАМИ З ПОЯСНЕННЯМИ (РЕМАРКАМИ) …… 9
ОПИС РОБОТИ 17
ВИСНОВКИ 18
ПЕРЕЛІК ВИКОРИСТАНИХ ЛІТЕРАТУРНИХ ДЖЕРЕЛ 19
2. ОПИС ОСНОВНИХ ФУНКЦІЙ, ЩО ВИКОРИСТАНІ В ПРОГРАМІ
Головна функція main( ) містить виклик чотирьох функцій, які ефективно вирішують поставлене завдання:
- функція Vvid_info( ) – забезпечує можливість поповнення файлу даних з клавіатури.
функція Show( ) – забезпечує можливість перегляду всіх записів з файлу даних .
Функція Statistic( ) – забезпечує можливість перегляду числа однофамільців у групі і на факультеті.
функція exit( ) – забезпечує можливість виходу з програми
Для ефективного використання оперативної пам’яті і спрощення доступу до даних вся інформація про студентів зведена в двох класах Student і Dekanat. Клас Student включає в себе такі змінні класу:
Тип і ім’я | Призначення
Char surname[20] | Прізвище (до 20 знаків)
char Grypa[12] | Група (до 12 знаків)
Клас Dekanat включає в себе такі змінні класу:
Тип і ім’я | Призначення
Char name[20] | Імя (до 20 знаків)
char Faculty[12] | Факультет (до 12 знаків)
Дані класу Dekanat є з специфікатором доступу private – тобто, доступ до них мають тільки методи класу. А дані класу Student ‘ з специфікатором доступу protected – тобто, доступ до них мають методи класу Student і всі похідні класи від класу Student.
Для вводу даних використовується конструктор.
Для роботи з даними класу використовуються такі методи:
Клас Student:
Void Show();
Клас Dekanat:
void Showw(ifstream *,int);
void Read(ifstream *);
char* Gryp();
char* Surn();
char* Facult();
В програмі створюється один масив об’єктів і його використовують у всій програмі. В класі використовується перевантаження конструкторів.
Програма на мові С++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <iostream.h>
#include <fstream.h>
int zm=10,ji,m=0;
class Student
{
public:
Student (); //Конструктори
Student(char *,char *); //класу Student
void Show(int);
protected:
char surname[20];
char Grypa[12];
};
Student::Student(){}
//---------------------------------------------------------
Student::Student(char *surname,char *Grypa)
{
strcpy(Student::surname,surname);
strcpy(Student::Grypa,Grypa);
}
//------------------------------------------------------
void Student::Show(int i)
{
gotoxy(14,zm+i); printf("%s", surname);
gotoxy(27,zm+i); cout<<Grypa;
}
//---------------------------------------------------------------------------
class Dekanat:Student
{
public:
Dekanat(char *,char *,char *,char *,ofstream *); //Конструктори класу
Dekanat(); //Dekanat
void Showw(ifstream *,int);
void Read(ifstream *);
char* Gryp();
char* Surn();
char* Facult();
private:
char name[20];
char Faculty[12];
};
Dekanat::Dekanat(char *name,char *surname,char *Grypa,char *Faculty,ofstream *Write):Student(surname,Grypa)
{
strcpy(Dekanat::name,name);
strcpy(Dekanat::Faculty,Faculty);
*Write<<name<<'\t'<<surname<<'\t'<<Grypa<<'\t'<<Faculty<<'\n'; //Запис у файл
}
Dekanat::Dekanat():Student()
{}
//---------------------------------------------------------
void Dekanat::Showw(ifstream *R,int i)
{
*R>>name>>surname>>Grypa>>Faculty;//Читання даних з файлу
Show(i);
gotoxy(3,zm+i); cout<<name;
gotoxy(35,zm+i); cout<<Faculty;
}
//---------------------------------------------------
void Dekanat::Read(ifstream *R )
{
*R>>name>>surname>>Grypa>>Faculty; //Читання з файлу
}
//-------------------------------------------------------
char* Dekanat::Gryp()
{
return Grypa;
}
//-------------------------------------------------------
char* Dekanat::Surn()
{
return surname;
}
//-------------------------------------------------------------
char* Dekanat::Facult()
{
return Faculty;
}
void Vvid_info();
void Show();
void Vuhid();
void Tabluca();
void Statistic();
//-----------------------------------------------------
//Student S[100];
Dekanat D[100];
//------------------------------------
void main()
{
ifstream S("Inst.txt",ios::out);//Створює файл, якщо файлу не існує
if (S.fail())
{
cerr << "Pomulka vidkrutta faily." << endl;
sleep(2);
exit(1);
}
while(1)
{
clrscr();
cout<<"\t\tKursova robota z Obektno-orientovnogo programuvanya.\n";
cout<<"\t\t\tStydentku grypu PZ-04.\n";
cout<<"\t\t\tKaidanskoi Nadii";
printf("\n\n\t Vuberit odun z pynktiv...\n\n");
printf("\t[1] - Vvedenya vidomostei pro stydentiv\n\t[2] - Pereglad danux y faili\n\t"
"[3] - Pereglad statustuku\n\t[4] - Vuxid z programu\n");
switch(getch())
{
case 49: //1
Vvid_info();
break;
case 50: //2
Show();
break;
case 51: //3
Statistic();
break;
case 52: //4
exit(1);
break;
}
}
}
//------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
void Vvid_info()
{
int i,f;
char name[12],surname[12],Grypa[12],facultet[12];
clrscr();
cout<<"\n\nZapownit tablicu\n";
gotoxy(1, 6);
Tabluca();
for(i=0;i<100;i++)
{
ofstream Write("Inst.txt",ios::app);// Відкриває файл для додавання запису
if (Write.fail())
{
cerr << "Pomulka vidkrutta faily." << endl;
sleep(2);
exit(1);
}
if(i>0)
{ gotoxy(1, zm+i);
cout<<"| | | | |\n";
cout<<"|__________|____________|_______|________|\n";
}
gotoxy(1,zm+i+4);
cout<<" - Natusnit na [1] dla vuhody\n";
cout<<" - Lyby klavishy dla vvody";
f=getch();
if(f==49)break;
gotoxy(1,zm+i+4);
cout<<" \n";
cout<<" ";
gotoxy(3,zm+i);
cin>>name;
name[9]=NULL;
gotoxy(14,zm+i);
cin>>surname;
surname[9]=NULL;
gotoxy(27,zm+i);
cin>>Grypa;
gotoxy(35,zm+i);
cin>>facultet;
Dekanat Stydent(name,surname,Grypa,facultet,&Write);
Write.close();
}
}
//---------------------------------------------------------------------------
void Tabluca()
{
cout<<" __________ ____________ _______ ________ \n";
cout<<"| | | | |\n";
cout<<"| Imja | Prizvushe | Grypa |Fakyltet|\n";
cout<<"|----------|------------|-------|--------|\n";
cout<<"| | | | |\n";
cout<<"|__________|____________|_______|________|\n";
}
//--------------------------------------------------------------------------------
void Show()
{
int i=0;
clrscr();
ifstream R("Inst.txt",ios::in);//Відкриває файл для читання
if (R.fail())
{
cerr << "Pomulka vidkrutta faily." << endl;sleep(2);
exit(1);
}
cout<<"\n\nDani y faili:";
gotoxy(1,6);
Tabluca();
while(!R.eof())
{
D[i].Showw(&R,i);
cout<<"\n| | | | |\n";
i++;
}
gotoxy(1,zm+i-1);
cout<<"|__________|____________|_______|________|\n";
cout<<" ";
R.close();
cout<<"\n - Dlya vuhody v menu, natusnit lyby klavishy";
getch();
}
//-------------------------------------------------------------------------
void Statistic()
{
int choise,g,i,j,odn,cm;
char A[12],B[12],Cop1[12],Cop2[12];
clrscr();
cout<<"\n[1] - Vuvestu odnofamilciv y grypi[1]\n";
cout<<"[2] - Vuvestu odnofamilciv na fakylteti\n";
choise=getch();
if(choise==49)
{
clrscr();
ifstream R("Inst.txt",ios::in);
if (R.fail())
{
cerr << "Pomulka vidkrutta faily." << endl;
sleep(2);
exit(1);
}
i=0;
while(!R.eof())
{
D[i].Read(&R);
i++;
}
i--;
j=0;odn=0;
ofstream RT("Stat",ios::trunc);
while(j!=i)
{
ifstream S("Stat",ios::in);
cm=1;
while(!S.eof())
{
S>>Cop1>>Cop2;
if(!strcmp(Cop1,D[j].Surn()))
if(!strcmp(Cop2,D[j].Gryp()))cm=0;
}
if(cm==1)
{
strcpy(A,D[j].Surn());
strcpy(B,D[j].Gryp());
g=j+1;
while(g!=i)
{
if(!strcmp(B,D[g].Gryp()))
if(!strcmp(A,D[g].Surn()))
{
ofstream W("Stat",ios::app);
W<<A<<'\t'<<B<<'\n';
odn++;
}
g++;
}
if(odn!=0)
{cout<<"Y grypi "<<D[j].Gryp()<<' '<<odn<<" odnofamilciv\n";odn=0;}
}
j++;
}
}
else
if(choise==50)
{
clrscr();
ifstream R("Inst.txt",ios::in);
if (R.fail())
{
cerr << "Pomulka vidkrutta faily." << endl;
sleep(2);
exit(1);
}
i=0;
while(!R.eof())
{
D[i].Read(&R);
i++;
}
i--;
j=0;odn=0;
ofstream RT("Stat",ios::trunc);
while(j!=i)
{
ifstream S("Stat",ios::in);
cm=1;
while(!S.eof())
{
S>>Cop1>>Cop2;
if(!strcmp(Cop1,D[j].Surn()))
if(!strcmp(Cop2,D[j].Facult()))cm=0;
}
if(cm==1)
{
strcpy(A,D[j].Surn());
strcpy(B,D[j].Facult());
g=j+1;
while(g!=i)
{
if(!strcmp(B,D[g].Facult()))
if(!strcmp(A,D[g].Surn()))
{
ofstream W("Stat",ios::app);
W<<A<<'\t'<<B<<'\n';
odn++;
}
g++;
}
if(odn!=0)
{cout<<"Na fakylteti "<<D[j].Facult()<<' '<<odn<<" odnofamilciv\n";odn=0;}//getch();
}
J++;
}
}
cout<<"\n - Dlya vuhody v menu, natusnit lyby klavishy";
getch();
remove("Stat");
}
Опис роботи
Виконання програми починається з головної main(). В ній за допомогою команди вибору switch створюється меню. У цьому меню є чотири функції, які викликаються в залежності від клавіш на які натиснути (від 1-4).
Якщо натиснути на [1], то викликається функція вводу даних.
Якщо на [2], то функція перегляду даних у файлі.
Якщо на [3], то функція перегляду попередньої версії файлу – до видалення запису з можливістю відновлення.
Якщо [4], то фунція виходу з програми.
ВИСНОВКИ
В даній роботі я сформувала файл, який містить відомості про студента, які складаються з його імені, назви групи та факультету. Використовуючи ці дані, за даним