КаталогИндекс раздела
НазадОглавлениеВперед


Лабораторная работа ╧4
Работа с динамической памятью в языке С++.

1. Цель работы

Целью лабораторной работы является получение практических навыков при использовании операторов new и delete в языке С++.

2. Темы для предварительного изучения

3. Варианты индивидуальных заданий

Смотри лабораторную работу ╧10 (части I).

4. Задание к выполнению

Написать электронную таблицу для сбора информации из вашего варианта задания.

Количество записей в таблице можно ограничить 12, а также предусмотреть ситуацию, когда в таблице отсутствуют записи.

5. Пример выполнения (вариант 30)


Для выполнения задания нам потребуется класс из лабораторной работы ╧2 со всеми дружественными функциями и функциями-членами. Ещ╦ нужно добавить inline-функцию char ret_name() {return *name;} в описание класса. Потребность в ней будет разъяснена позднее. Также необходимо разработать класс, который будет производить операции добавления, удаления записей, сортировку базы данных. Создадим для этих целей класс DB. Его полями будут:

char title[30]   - название базы данных
church *rows[12];   - количество строк в базе данных (указатель на 12 экземпляров класса church)
int col   - индекс строк в базе данных
int sorted   - флаг, показывающий отсортирована / неотсортирована база данных

Определим конструктор по умолчанию, на который возложим функцию инициализации названия базы данных.

 DB(char *q) {strcpy(title,q); col=0; sorted=0;}
Деструктор будет освобождать память, занимаемую базой данных.

 ~DB(){if (col) for (int i=0; i<col; i++) delete rows[i];}
Определим необходимые функции:

 void add_rec(char *a, char b, int c, int d);
Суть работы функции заключается в том, что ей передаются параметры с типами данных, которые соответствуют всем полям класса church и затем эти параметры передаются в инициализирующий конструктор этого класса при помощи его явного вызова. Т.е, как видно, класс DB не дублирует функции класса church, а гибко с ним взаимодействует.

 void del_rec();
Работа данной функции сводится к освобождению памяти, которую занимает один экземпляр класса. Для этого необходим вызов: delete rows[индекс_удаляемого_объекта] .

 void sort_DB();
Для выполнения сортировки нам потребуется уже упомянутая выше функция char ret_name() , которая будет возвращать названия монастырей для каждого из объектов, по которым и производится сортировка.

 friend ostream & operator<<(ostream &stream, DB &temp);
Как вы заметили, для класса DB перегружен оператор <<. Такое действие позволяет выводить шапку базы данных и дополнительные сведения до вывода самих данных.

Полный текст программы приведен ниже.

Лабораторная работа ╧4
Работа с динамической памятью.
Вариант ╧30
Пример выполнения


	
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iomanip.h>

class church {
 char *name;
 char school;
 unsigned int count;
 unsigned short square;
 friend ostream & operator<<(ostream &stream, church &o1);
 friend istream & operator>>(istream &stream, church &o1);
 friend void shapka(void);
 friend void linebuild(void);
public:
 church() { count=0; square=0;}
 church(char *a, char b, unsigned int &c, float &d);
 void set(char *a,char ,unsigned int ,float );
 void get(char *a, char &b, unsigned int &c, float &d);
 void show(void);
 char  ret_name() {return *name;}
};

class DB {
 char title[30];
 church *rows[12];
 int col;
 int sorted;
public:
 DB(char *q) {strcpy(title,q); col=0; sorted=0;}
 ~DB(){if (col) for (int i=0; i<col; i++) delete rows[i];}
 void add_rec(char *a, char b, int c, int d);
 void del_rec();
 void sort_DB();
 friend ostream & operator<<(ostream &stream, DB &temp);
};

void DB::add_rec(char *a, char b, int c, int d) {
 if (col>=12) return;
 else col++;
 rows[col-1] = new church(a,b,c,d);
 sorted=0;
}

void DB::del_rec() {
 if (col<=0) return;
 delete  rows[col-1];
 col--;
 }

void DB::sort_DB() {
 char s1;
 char s2;
 if (col<2) return;
 church *temp;

 for (int i=0; i<col; i++)
  for (int j=i+1; j<col; j++) {
   s1 = rows[i]->ret_name();
   s2 = rows[j]->ret_name();
    if (s1 > s2) {
     temp=rows[i];
     rows[i]=rows[j];
     rows[j]=temp;
    }
  }
sorted=1;
}

 ostream & operator<<(ostream &stream, DB &o1) {
 stream<<o1.title<<endl;
  if (o1.sorted==0) stream<<"Таблица не отсортирована.\n";
  else stream<<"Таблица отсортирована.\n";
  shapka();
 if (!o1.col) stream<<"Таблица пуста.";
 else {
   for (int i=0; <o1.col; i++) {
    stream<<*o1.rows[i];
   }
 }
return stream;
}

 ostream & operator<<(ostream &stream, church &o1) {
  stream<<"|"<<setw(10)<<o1.name<<"  |  ";
  stream<<setw(5)<<o1.school<<"|";
  stream<<setw(18)<<o1.count<<"  |";
  stream<<setw(17)<<o1.square<<"  |"; endl;
  linebuild();
 return stream;
 }

church::church(char *a, char b, unsigned int &c, float &d) {
 name=new char [strlen(a)+1];
 strcpy(name,a);
 school=b;
 count=c;
 square=d;
}

void church::set(char *a,char b,unsigned int c,float d) {
 for (int i=0; i<10; i++){
  name[i]=a[i];
 }
 school=b;
 count=c;
 square=d;
}

void church::show(void) {
 cout<<name<<" ";
 cout<<school<<" ";
 cout<<count<<" ";
 cout<<square<<" ";
}

void church::get( char * a, char &b, unsigned int &c, float &d)
{
 strcpy(a,name);
 b=school;
 c=count;
 d=square;
}

void shapka(void)
{
 cout<<"_______________________________________________________________\n";
 cout<<"|         Буддистские монастыри Японии периода Нара           |\n";
 cout<<"|-------------------------------------------------------------|\n";
 cout<<"|  Название  | Школа | Количество монахов | Площадь земли(га) |\n";
 cout<<"|-------------------------------------------------------------|\n";
 }

void linebuild(void) {
 cout<<"\n|-------------------------------------------------------------|\n";
}

int main(void) {
  char *n;
  char t;
  unsigned int s;
  float h;
  short i;
  short q,q1;

 clrscr();
 DB *tmp = new DB("\nБАЗА ДАННЫХ ╧1\n");

 for (int a=0; !a;){
 clrscr();
 cout <<"1. Добавить запись\n"  ;
 cout <<"2. Удалить запись\n";
 cout <<"3. Сортировать базу\n";
 cout <<"4. Вывести базу\n";
 cout <<"5. Выход\n";
 cout <<"> ";
 int p;
 cin>>p;
  switch(p) {
    case 1: {
	 cout<<"Наименование, Тип, Посевная площадь, Урожайность \n";
	
	/*cin>>n;  Закомментированные строки отвечают за чтение значений
	 cin>>t;   переменных с клавиатуры и записи их в поля объекта.
	 cin>>s;   Для удобства работы используется инициализация через
	 cin>>h;   конструктор 3-х объектов.
	 tmp->add_rec(n,t,s,h); */

	 tmp->add_rec("Тотайдзи",'Т',220,368.8);
	 tmp->add_rec("Якусидзи",'С',50,54.7);
	 tmp->add_rec("Дайандзи",'Д',10,12.2);
	 break;
    }

    case 2: {
	 tmp->del_rec();
	 break;
    }

    case 3: {
	tmp->sort_DB();
	break;
    }

    case 4: {
	cout<<*tmp;
	cout<<"\nНажмите клавишу для продолжения...";
	getch();
	break;
    }

    case 5: {
	a=1;
	break;
	}

    default :{
	cout << "Неверный вызов";
	getch();
	break;
    }
  }
}
return 0;
}
 

НазадОглавлениеВперед
КаталогИндекс раздела