Создать программу для работы с файлом произвольного доступа
"записная книжка".
Создать программу для работы с файлом произвольного доступа
"записная книжка". Файл содержит сведения о знакомых.
Структура записи: фамилия имя отчество, телефон, возраст.
Программа должна выдавать следующую информацию:
•о знакомых возраста Х, Х вводится с клавиатуры,
•о знакомых, фамилия которых начинается с буквы 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;
}
//---------------------------------------------------------------------------
Упакованные файлы проекта
|