Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание ООП.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
201.76 Кб
Скачать

Задание № 10. Создать программу для работы с файлом произвольного доступа "записная книжка"

  

Создать программу для работы с файлом произвольного доступа

"записная книжка". Файл содержит сведения о знакомых.

Структура записи: фамилия имя отчество, телефон, возраст.

Программа должна выдавать следующую информацию:

•о знакомых возраста Х, Х вводится с клавиатуры,

•о знакомых, фамилия которых начинается с буквы W, W вводится с клавиатуры,

•о знакомых с номером телефона N, N вводится с клавиатуры.

Программа должна содержат диаграмму распределения знакомых по возрастам:

сколько процентов составляют знакомые до 16 лет, сколько процентов

составляют знакомые в возрасте 16 до 25, от 25 до 40 лет, после 40 лет.

Программа должна содержать справочную систему.

Текст файлов .cpp:

//--------------- Unit1.cpp ------------------------------------------

#include

#include

#pragma hdrstop

#include "Unit1.h"

#include "grafik.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

struct Notes

{

char Name[60]; // Фамилия, имя, отчество

char Phone[16];

int Age;

};

int poisk;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

// Если файл NoteBook.dat не существует, в Меmo1 посылается сообщение

if(!FileExists("NoteBook.dat"))

{

Memo1->Text="Файл NoteBook.dat не существует";

// btnAdd->Enabled=false; Зачем ?

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::btnAddClick(TObject *Sender)

{

Notes Note1;

// Получение значений из полей ввода

strcpy(Note1.Name,edFio->Text.c_str());

strcpy(Note1.Phone,edTel1->Text.c_str());

Note1.Age=edVozr1->Text.ToInt();

// если файл не существует

if(!FileExists("NoteBook.dat"))

{ // создать файл

ofstream ofile("NoteBook.dat",ios::binary);

ofile.write((char*)&Note1, sizeof(Notes));

ofile.close(); // закрыть файл

}

else

{ // дописать в конец файла

ofstream ofile("NoteBook.dat",ios::app | ios::binary);

ofile.write((char*)&Note1, sizeof(Notes));

ofile.close(); // закрыть файл

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::btncalcClick(TObject *Sender)

{

Memo1->Clear();

Notes Note1;

fstream file("NoteBook.dat", ios::binary | ios::in | ios::out);

char str[80];

file.seekg(0);

while (!file.read((char*)&Note1, sizeof(Notes)).eof())

{

sprintf(str,"%s\tТел: %s\tВозраст: %d", Note1.Name, Note1.Phone, Note1.Age);

Memo1->Lines->Add(str);

}

file.close();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::btnFindClick(TObject *Sender)

{

// Очистка Memo1

Memo1->Clear();

Notes Note1;

// открытие файла для чтения

fstream file("NoteBook.dat", ios::binary | ios::in | ios::out);

char str[80];

file.seekg(0); //указатель размещается на первую запись

// поиск по возрасту

if (poisk==1)

{

while (!file.read((char*)&Note1, sizeof(Notes)).eof())

{

if (Note1.Age==edvozr2->Text.ToInt())

{

sprintf(str,"%s\tТел: %s\tВозраст: %d", Note1.Name, Note1.Phone, Note1.Age);

Memo1->Lines->Add(str);

}

}

}

// поиск по первой букве

if (poisk==2)

{

char buk, bukm[2];

strcpy(bukm,edbukv->Text.c_str());

buk=bukm[0];

while (!file.read((char*)&Note1, sizeof(Notes)).eof())

{

if (Note1.Name[0]==buk)

{

sprintf(str,"%s\tТел: %s\tВозраст: %d", Note1.Name, Note1.Phone, Note1.Age);

Memo1->Lines->Add(str);

}

}

}

// поиск по телефону

if (poisk==3)

{

AnsiString tel1;

while (!file.read((char*)&Note1, sizeof(Notes)).eof())

{

tel1=Note1.Phone;

if (tel1== edtel2->Text.Trim())

{

sprintf(str,"%s\tТел: %s\tВозраст: %d", Note1.Name, Note1.Phone, Note1.Age);

Memo1->Lines->Add(str);

}

}

}

file.close(); // Закрытие файла

}

//---------------------------------------------------------------------------

void __fastcall TForm1::btnQuitClick(TObject *Sender)

{

Form1->Close();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::edvozr2Change(TObject *Sender)

{

btnFind->Enabled=true;

poisk=1;

edbukv->Text="";

edtel2->Text="";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::edbukvChange(TObject *Sender)

{

btnFind->Enabled=true;

poisk=2;

edtel2->Text="";

edvozr2->Text="";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::edtel2Change(TObject *Sender)

{

btnFind->Enabled=true;

poisk=3;

edbukv->Text="";

edvozr2->Text="";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::btnDiagrClick(TObject *Sender)

{

Form2->Visible = true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::btnHelpClick(TObject *Sender)

{

Application->HelpContext(1);

}

//---------------------------------------------------------------------------

//-------------------- grafik.cpp -----------------------------------

#include

#include

#pragma hdrstop

#include "grafik.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm2 *Form2;

struct Notes

{

char Name[60]; // Фамилия, имя, отчество

char Phone[16];

int Age;

};

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm2::FormActivate(TObject *Sender)

{

int v[5], pr[5];

v[1]=v[2]=v[3]=v[4]=0;

Notes Note1;

fstream file("NoteBook.dat",ios::binary | ios::in |ios::out);

char str[80];

// Рассчитаем количество знакомых в каждой возрастной категории

// v[1] - до16

// v[2] - от 16 до 25

// v[3] - от 25 до 40

// v[4] - после 40

file.seekg(0);

while (!file.read((char*)&Note1,sizeof(Notes)).eof())

{

sprintf(str, "%s\tТел: %s\tВозраст: %d", Note1.Name, Note1.Phone, Note1.Age);

if (Note1.Age<16) v[1]++;

if ((Note1.Age>=16)&&(Note1.Age<25)) v[2]++;

if ((Note1.Age>=25)&&(Note1.Age<40)) v[3]++;

if (Note1.Age>=40) v[4]++;

}

file.close();

// Общее количество человек

v[0]=v[1]+v[2]+v[3]+v[4];

// Рассчитаем, какой процент составляет первая возрастная категория (до 16)

pr[1]=(float)v[1]/v[0]*100;

// Изменим высоту прямоугольника, пусть 1% будет отображаться 2 пикселями

Shape1->Height=(int)(pr[1]*2);

// Изменим подпись

Label5->Caption=IntToStr(pr[1])+"%";

// Если категория составляет 0%, будем отображать ее горизонтальной чертой

if (Shape1->Height==0) Shape1->Height=1;

// Выполним расчеты для возрастной категории от 16 до 25

pr[2]=(float)v[2]/v[0]*100;

Shape2->Height=(int)(pr[2]*2);

Label6->Caption=IntToStr(pr[2])+"%";

if (Shape2->Height==0) Shape2->Height=1;

// Выполним расчеты для возрастной категории от 25 до 40

pr[3]=(float)v[3]/v[0]*100;

Shape3->Height=(int)(pr[3]*2);

Label7->Caption=IntToStr(pr[3])+"%";

if (Shape3->Height==0) Shape3->Height=1;

// Выполним расчеты для возрастной категории после 40

pr[4]=(float)v[4]/v[0]*100;

Shape4->Height=(int)(pr[4]*2);

Label8->Caption=IntToStr(pr[4])+"%";

if (Shape4->Height==0) Shape4->Height=1;

//Передвинем фигуры так, чтобы их нижняя граница была на одном уровне

Shape1->Top=240 - Shape1->Height;

Shape2->Top=240 - Shape2->Height;

Shape3->Top=240 - Shape3->Height;

Shape4->Top=240 - Shape4->Height;

}