Основы алгоритмизации и языки программирования: Практикум на С++ (Система программирования С++. Процедурное программирование. Объектно-ориентированное программирование), страница 12

//вторая версия программы

//файл заголовков index.hpp без изменений

//файл кодов index.cpp

#include "index.hpp"

//функция init_ind

void ind::init_ind(int i,char* kl)

{

  strcpy(index[i].kluch,kl);

  index[i].nomer=i;

  return;

}

//функция init_kol, инициализация количества элементов массива

void ind::init_kol(int k)

{kol=k;}

//функция dob_ind

int ind::dob_ind(char* kl)

{

  int nom;

  for (int i=0;i<kol;i++)

  if (index[i].kluch[0]=='\0')

  {

    strcpy(index[i].kluch,kl);

    return(index[i].nomer);

  }

  strcpy(index[kol].kluch,kl);

  index[kol].nomer=kol;

  nom=kol;

  kol++;

  return(nom);

}

//функция poisk_ind

int ind::poisk_ind(char* kl,int i,int& nomer)

{

  while (i<kol)

  {

    if (index[i].kluch[0]!='\0')

    {

      if (!strcmp(kl,index[i].kluch))

      {

            nomer=index[i].nomer;

            return(i);

      }

    }     

    i++;

  }

  return(-1);

}

//функция cor_ind

void ind::cor_ind(int i,char* kl)

{

  strcpy(index[i].kluch,kl);

  return;

}

//файл заголовков akt.hpp без изменений

//файл кодов akt.cpp

#include "akt.hpp"

fstream p_akt;

static int razm_zap;

//функция zapis_zap

void akt::zapis_zap(int nomer)

{

  p_akt.seekg((long)(nomer*razm_zap),ios::beg);

  p_akt.write((char *)&tabn,razm_zap);

  if (!p_akt.good())

  {

    cout<<‘\a’;

    gotoxy(2,23);

    cerr<<“Ошибка записи в файл “<<imf<<“,нажмите <Enter>\n”;

    getch();

    exit(-1);

  }

  return;

}

//функция chtenie_zap

void akt::chtenie_zap(int nomer)

{

  p_akt.seekg((long)(nomer*razm_zap),ios::beg);

  p_akt.read((char *)&tabn,razm_zap);

  if (!p_akt.good() && !p_akt.eof())

  {

    cout<<‘\a’;

    gotoxy(2,23);

    cerr<<“Ошибка чтения файла “<<imf<<“,нажмите <Enter>\n”;

    getch();

    exit(-1);

  }

  return;

}

//функция init

void akt::init()

{

  clrscr();

  razm_zap=(sizeof tabn)+(sizeof fio)+(sizeof vid)+(sizeof objem);

  p_akt.open(imf,ios::in|ios::out|ios::nocreate|ios::binary);

  if (!p_akt)

  {

    p_akt.open(imf,ios::in|ios::out|ios::binary);

    if (!p_akt)

    {

      gotoxy(2,23);

      clreol();

      cerr<<"Ошибка открытия файла "<<imf<<",нажмите <Enter>\n";

      getch();

      exit(-1);

    }

    tabn[0]='\0';

    fio[0]='\0';

    vid[0]='\0';

    objem=0;

    zapis_zap(0);

}

int pr=0;

int i=0;

chtenie_zap(i); 

while(!p_akt.eof())

  {

    init_ind(i,tabn);

    if (tabn[0]!='\0') pr=1;

    i++;

   chtenie_zap(i);

}

init_kol(i);

p_akt.clear(0);

if (!pr)

  {

    cout<<'\a';

    gotoxy(2,23);

    clreol();

    cout<<"Файл "<<imf

            <<" пустой,нажмите <Enter> и <Создание>\n";

    getch();

  }

  return;

}

//функция formecran

void akt::formecran(char* podmenu)

{

  const int col=4;

  window(10,3,70,16);

  textattr(15+(1<<4));

  clrscr();

  gotoxy(10,2);

  cputs("АКТ РАБОТ");

  gotoxy(40,2);

  cputs(podmenu);

  textattr(0+(7<<4));

  gotoxy(col,6);

  cputs(" Таб.номер :                          ");

  gotoxy(col,8);

  cputs(" Фио       :                          ");

  gotoxy(col,10);

  cputs(" Код работ :                          ");

  gotoxy(col,12);

  cputs(" Объем     :                          ");

  window(1,1,80,25);

  textattr(15+(0<<4));

  gotoxy(2,23);

  clreol();

  return;

}  

//функция vvod

void akt::vvod()

{

  const int col=25;

  gotoxy(col,8);

  cin>>tabn;

  gotoxy(col,10);

  cin.seekg(0,ios::end);

  cin.get(fio,sizeof(fio));

  gotoxy(col,12);

  cin>>vid;

  do

  {

    gotoxy(col,14);

    cout<<"               ";

    gotoxy(col,14);

    cin.clear(0);

    cin.seekg(0,ios::end);

    cin>>objem;

  }

  while(!cin);

  return;

}

//функция vyvod

void akt::vyvod()

{

  const int col=25;

  gotoxy(col,8);

  cout<<tabn;

  gotoxy(col,10);

  cout<<fio;

  gotoxy(col,12);

  cout<<vid;

  gotoxy(col,14);

  cout<<objem;

  return;

}

//функция sozdanie

void akt::sozdanie()

{

  char ch;

  int nomer;

  do

  {

    formecran("Создание/Добавление");

    vvod();

    nomer=dob_ind(tabn);

    zapis_zap(nomer);

do

    {

      gotoxy(2,23);

      cout<<"Продолжить добавление?: <Enter> Да, <Esc> Нет";

      ch=getch();

    }

    while (ch!=13 && ch!=27);

  }

  while (ch==13);

return;

}

//функция correct

void akt::correct(int x)

{

  char tab[10];

  char ch;

  int nomer;

  const int col=25;

  char* cor;

  switch(x)

  {

    case 1: cor="Поиск";

                break;

    case 2: cor="Замена";

                break;

    case 3: cor="Удаление";

                break;

  }

  do

  {

    formecran(cor);

    gotoxy(2,23);

    cout<<"Введите таб.номер записи:";

    cin>>tab;

    for (int ind=0;

    (ind=poisk_ind(tab,ind,nomer))!=-1;

     ind++)

    {

      chtenie_zap(nomer);

      formecran(cor);

      vyvod();

      do

      {

      gotoxy(2,23);

      if (x==1)

            cout<<"Запись найдена?:<Enter> Да, <Esc> Нет\n";

      else

      cout<<cor<<" записи?:<Enter> Да, <Esc> Нет\n";

      ch=getch();

      }

      while (ch!=13 && ch!=27);

      if (ch==13) break;

    }

    if (ind==-1)

    {

      gotoxy(2,23);

      clreol();

      cout<<"Запись не найдена,нажмите <Enter>\n";

      getch();

      return;

    }

    if (x==2 || x==3)

    {

      if (x==2)

      {

            formecran(cor);

            vvod();

      }

      else

      {

            tabn[0]='\0';

            fio[0]='\0';

            vid[0]='\0';

            objem=0;

      }

      zapis_zap(nomer);

      cor_ind(ind,tabn);