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

Применяя метод   функциональной  декомпозиции,  спроектируем структуру программы мини-системы управления картотекой служащих:

                                   main     (mainkart.cpp)

                                /          |

                              /           menu -------------podmenu

                            /            /    |     \                              /\

                          /            /      |       \                          /    \  (fkart.cpp)

               init_k  sozd_k  prosm_k  poisk_k      ud_k    zam_k

                 |          | | | |      |    |           |   |   |           | | | | |      | | | | | |

                 |         +| | |-----+--|--------+-|--|--------+| | | |----+| | | | |--form_k

(ind.cpp)  |           +| |---------|-----------|--|----------| | | |-----+| | | |--vvod_k

                 |             | |            +----------+-|---------+| | |-------+| | |--vyvod_k

sort--------+--------+|------------------------|----------+| |---------+| |

dob_ind--------------+                              |                | |               | |

poisk_ind------------------------------------+-----------+|-----------+|

ud_ind------------------------------------------------------+                |

zam_ind------------------------------------------------------------------+

Применяя метод модульной (файловой) организации, сгруппируем функции в файлы кодов:  в файл кодов mainkart.cpp - функции main, menu,  podmenu;  в ind.cpp - функции dob_ind,  poisk_ind, ud_ind, zam_ind, sort; в fkart.cpp - функции init_k, sozd_k, prosm_k, poisk_k, ud_k,  zam_k,  form_k,  vvod_k,  vyvod_k. Предусмотрим для файлов кодов  ind.cpp  и  fkart.cpp  файлы  заголовков  ind.hpp и fkart.hpp.

//первая версия программы с функциями main, menu, podmenu

//файл заголовков ind.hpp

#ifndef ind_hpp

#define ind_hpp

#define zaglushka(st) gotoxy(2,23); cprintf("%*s",60," "); \

gotoxy(2,23); cprintf("%s",st); getch();

#include <conio.h>

#include <iostream.h>

#include <string.h>

const int max_pole=10;

  struct tip_index

  {

    char kluch[max_pole];

    int nomer;

  };

  int dob_ind(char kl[max_pole],int &kol,tip_index index[]);

  int poisk_ind(char kl[max_pole],int nomer,

  int kol,tip_index index[]);

  void ud_ind(int ind,tip_index index[]);

  void zam_ind(int ind,char kl[max_pole],tip_index index[]);

  void sort(int kol,tip_index index[]);

#endif

//файл кодов ind.cpp еще не требуется

//файл заголовков fkart.hpp

#ifndef fkart_hpp

#define fkart_hpp

#include <conio.h>

#include <iostream.h>

#include <fstream.h>

#include <stdlib.h>

#include <dos.h>

#include "ind.hpp"

static const char *imf_k="kart_slu.dat";

  struct t_k

  {

    char tabn[3];

    char fio[30];

    char doljn[30];

    float oklad;

  };

  void init_kart();

  void form_kart(char* option);

  void vvod_kart();

  void vyvod_kart();

  void sozd_kart();

  void prosm_kart();

  void poisk_kart();

  void ud_kart();

  void zam_kart();

#endif

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

//в вызываемых функциях стоят "заглушки"

//функции form_kart,vvod_kart,vyvod_kart еще не требуются

#include "fkart.hpp"

static struct t_k zap;

static struct t_k zap_null={"","","",0};

tip_index index_k[100];

int kol_k;

void init_kart()

{ zaglushka("Вызвана функция init_kart, нажмите <Enter>"); }

void sozd_kart()

{ zaglushka("Вызвана функция sozd_kart, нажмите <Enter>"); }

void prosm_kart()

{ zaglushka("Вызвана функция prosm_kart, нажмите <Enter>"); }

void poisk_kart()

{ zaglushka("Вызвана функция poisk_kart, нажмите <Enter>"); }

void ud_kart()

{ zaglushka("Вызвана функция ud_kart, нажмите <Enter>"); }

void zam_kart()

{ zaglushka("Вызвана функция zam_kart, нажмите <Enter>"); }

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

#include "fkart.hpp"

void podmenu(int x)

{

  char ch;

  char *m[]={ " Удаление ",

                         " Замена   ",

                         " Выход    "

                       };

  int pos[3];

  _setcursortype(_NOCURSOR);

  gotoxy(2,23);

  clreol();

  cputs("Выберите пункт меню и нажмите <Enter>");

  for (int k=0;k<3;k++)

  {

    if (k==0)

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

    else

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

    gotoxy(x,3+k);

    pos[k]=wherey();

    cputs(m[k]);

  }

  k=0;

  for (;;)

  {

    ch=getch();

    if (ch==13) break;

    if (ch==0)

    {

      ch=getch();

      switch (ch)

      {

        case 80: if (k==2) continue;

        gotoxy(x,pos[k]);

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

        cputs(m[k]);

        k++;

        gotoxy(x,pos[k]);

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

        cputs(m[k]);

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

        break;

        case 72: if (k==0) continue;

        gotoxy(x,pos[k]);

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

         cputs(m[k]);

        k--;

       gotoxy(x,pos[k]);

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

       cputs(m[k]);

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

      break;

      }

    }

  }

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

  _setcursortype(_NORMALCURSOR);

  switch (k)

  {

    case 0:  ud_kart();

                  break;

    case 1:  zam_kart();

                  break;

    case 2:  break;

  }

  if (k!=2) podmenu(x);

  return;

}

void menu()

{

  char ch;

  char *m[]={ " Создание ",

                         " Просмотр ",

                         "   Поиск  ",

                         "Корректировка",

                         "   Выход  "

                       };

  int pos[5];

  clrscr();

  _setcursortype(_NOCURSOR);

  gotoxy(2,23);

  clreol();

  cputs("Выберите пункт меню с помощью -> и <-,нажмите <Enter>");

  gotoxy(13,1);

  for (int k=0;k<5;k++)