Задание:
Описать базовый класс СТРОКА.
Обязательные поля класса:
— указатель на char – хранит адрес динамически выделенной памяти для размещения символов строки;
— значение типа int – хранит длину строки в байтах.
Обязательные методы должны выполнять следующие действия:
- конструктор без параметров;
- конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом);
- конструктор, принимающий в качестве параметра символ;
- конструктор копирования;
- получение длины строки;
- очистка строки (делать строку пустой);
- деструктор.
Описать производный от СТРОКА класс БИТОВАЯ_СТРОКА.
Строки данного класса могут содержать только символы ‘0’ или ‘1’. Если в составе инициализирующей строки будут встречены любые символы, отличные от допустимых, БИТОВАЯ_СТРОКА принимает нулевое значение. Содержимое данных строк рассматривается как двоичное число.
Отрицательные числа хранятся в дополнительном коде.
Обязательные методы:
- конструктор без параметров;
- конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом);
- конструктор копирования;
- деструктор;
- изменение знака на противоположный (перевод числа в дополнительный код). Переопределить следующие операции (длина строки результата равна длине большей из строк; в случае необходимости более короткая битовая строка расширяется влево знаковым разрядом);
- присваивание (=);
- сложение (+) – арифметическая сумма строк;
- операция (= =) – проверка на равенство.
Разработчик вправе вводить любое (с обоснованием необходимости) число дополнительных полей и методов.
Написать тестовую программу, которая:
- Динамически выделяет массив указателей на базовый класс (4-6);
- В режиме диалога заполняет этот массив указателями на производные классы, при этом экземпляры производных классов создаются динамически с заданием начальных значений;
- Для созданных экземпляров производных классов выполняет проверку всех разработанных методов с выводом исходных данных и результатов на дисплей.
Для конструкторов копирования каждого класса предусмотреть диагностическую печать количества его вызовов в определенное место дисплея (рекомендуется использовать статические члены класса).
Режим диалога обеспечивается с помощью иерархического меню.
Текст программы:
Файл «STRING.H»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <string.h> #include <stdlib.h> #ifndef _STRING #define _STRING class STRING{ protected: char * str; int len; public: STRING(){str=NULL;}; STRING(char *s); STRING(char c); STRING(const STRING &str2); int GetLength(); void Clear(); char *GetString() { if (str) return str; else return ""; } ~STRING(); }; #include "string.cpp" #endif |
Файл «STRING.CPP»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
STRING::STRING(char *s) { str=strdup(s); len=strlen(s); } STRING::STRING(char c) { str=new char[2]; if (str) { str[0]=c; str[1]=0; len=1; } } STRING::STRING(const STRING &str2) { str=strdup(str2.str); len=str2.len; } int STRING::GetLength() { return len; } void STRING::Clear() { if (str) { len=0; free(str); str=NULL; } } STRING::~STRING() { if (str) {free(str);str=NULL;} } |
Класс «BITSTR.H»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
#include "string.h" #ifndef _BITSTR #define _BITSTR class BITSTRING: public STRING{ protected: int VerifyString(char *s); public: BITSTRING(); BITSTRING(char *s); BITSTRING(const BITSTRING& b); ~BITSTRING(); const BITSTRING& operator = (const BITSTRING& b) { if (str) free(str); if (b.str) { str=strdup(b.str); len=b.len; } else { str=NULL; len=0; } } const BITSTRING operator +(const BITSTRING& b) { int m,p=0,a1,a2; if (len>b.len) m=len; else m=b.len; char *r=new char[m+1]; memset(r,'0',m); r[m]=0; int n1=len-1,n2=b.len-1; for (int n=m-1; n>=0; n--) { if (n1>=0) a1=str[n1]-'0'; else a1=0; if (n2>=0) a2=b.str[n2]-'0'; else a2=0; switch (a1+a2+p) { case 3: r[n]=1; p=2; break; case 2: r[n]='0'; p=1; break; case 1: r[n]='1'; p=0; break; case 0: r[n]='0'; p=0; break; } n1--; n2--; } return BITSTRING(r); } int operator ==(const BITSTRING &b) { int l; if (len>b.len) l=len; else l=b.len; int r=1;; int n1=len-1,n2=b.len-1,k; k=l-1; while (k>=0) { if ((n1>=0)&&(n2>=0)&&(str[n1]!=b.str[n2])) return 0; if ((n1<0)&&(b.str[n2]!='0')) return 0; if ((n2<0)&&(str[n1]!='0')) return 0; k--;n1--;n2--; } return 1; } }; #include "BITSTR.CPP" #endif |
Файл «BITSTR.CPP»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
int BITSTRING::VerifyString(char *s) { if (!s) return 0; for (int n=0; n<strlen(s);n++) { if ((s[n]!='0')&&(s[n]!='1')) return 0; } return 1; } BITSTRING::BITSTRING() { str=NULL; len=0; } BITSTRING::BITSTRING(char *s) { if (VerifyString(s)) STRING::STRING(s); else { str=NULL; len=0; } } BITSTRING::BITSTRING(const BITSTRING& b) { if (VerifyString(b.str)) STRING::STRING(b); } BITSTRING::~BITSTRING() { STRING::~STRING(); } /*const BITSTRING& BITSTRING::operator=(const BITSTRING &b); { if (str) free(str); if (b.str) { str=strdup(b.str); len=b.len; } else { str=NULL; len=0; } } */ |
Класс «LAB11.CPP»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include "string.h" #include <stdio.h> #include "bitstr.h" char *rrr="fff"; STRING str1(rrr); BITSTRING *b; BITSTRING *a; BITSTRING c; void main() { // str1.Clear(); a= new BITSTRING("0001"); b=new BITSTRING("001"); printf("Проверка GetString()%s\n",a->GetString()); if (*a==*b) printf("a==b\n"); else printf("a!=b\n"); c=(*a)+(*b); printf("%s\n",c.GetString()); } |
Вывод: было изучено наследование в С++.