Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2013, 00:36   #1
R'nhbyV
Пользователь
 
Регистрация: 25.01.2013
Сообщений: 17
Лампочка Создать класс "строка"(С++)

Помогите,пожалуйста .Вообще не полнимаю что здесь делать
Вот такое задание:
Описать базовый класс СТРОКА.
Обязательные члены класса:
* указатель на char - хранит адрес динамически выделенной памяти
для размещения символов строки;
* значение типа int - хранит длину строки в байтах.
Обязательные методы должны выполнять следующие действия:
* конструктор без параметров;
* конструктор, принимающий в качестве параметра
Си-строку (заканчивается нулевым байтом);
* конструктор, принимающий в качестве параметра символ (char).
* конструктор копирования;
* деструктор.
* чтение символа из заданной позиции;
Производный от СТРОКА класс СТРОКА_ИДЕНТИФИКАТОР
Строки данного класса строятся по правилам записи идентификаторов
в СИ, и могут включать в себя только те символы, которые могут входить
в состав Си-идентификаторов. Если исходные данные противоречат правилам записи идентификатора, то создается пустая СТРОКА_ИДЕНТИФИКАТОР.
Обязательные методы:
* конструктор без параметров;
* конструктор, принимающий в качестве параметра Си-строку
(заканчивается нулевым байтом);
* конструктор, принимающий в качестве параметра символ (char).
* конструктор копирования;
* деструктор.
* перевод всех символов строки (кроме цифр) в нижний регистр;
Переопределить следующие операции:
* присваивание (=);
* оператор == - проверка на равенство;
Производный от СТРОКА класс БИТОВАЯ_СТРОКА.
Строки данного класса могут содержать только символы '0' или '1'. Если
в составе инициализирующей строки будут встречены любые символы, отличные
от допустимых, БИТОВАЯ_СТРОКА принимает нулевое значение.
Содержимое данных строк рассматривается как двоичное число.
Отрицательные числа хранятся в дополнительном коде.
Число считается отрицательным, если крайний левый(знаковый) разряд = 1,
при этом разрядность числа может быть любой в пределах ограничений, указанных в файле README.TXT. Таким образом, числа 11101 и 101 являются отрицательными и равными по значению.
Обязательные методы:
* конструктор без параметров;
* конструктор, принимающий в качестве параметра
Си-строку (заканчивается нулевым байтом);
* конструктор копирования;
* деструктор;
* удаление лишних ведущих символов (нулей или единиц в зависимости от
знака числа);
Переопределить следующие операции (длина строки результата равна длине большей из строк, в случае необходимости, более короткая битовая строка расширяется влево знаковым разрядом) :
* присваивание (=);
* операция == - проверка на равенство
* операция < - проверка на меньше (по значению).
Разработчик вправе вводить любое (с обоснованием необходимости) число дополнительных членов и методов.
Задание:
Разработать иерархию классов по следующей схеме:
СТРОКА
|
V
| |
СТРОКА_ИДЕНТИФИКАТОР БИТОВАЯ_СТРОКА

с обязательной поддержкой заданных членов и методов.
Написать тестовую программу, которая:
* динамически выделяет массив указателей на базовый класс размерностью,
заданной в п/п. 1.1.
* в режиме диалога заполняет этот массив указателями на производные классы,
при этом экземпляры производных классов создаются динамически с заданием
начальных значений;
* для созданных экземпляров производных классов выполняется
проверка всех разработанных методов (в соответствии с вариантом задания),
с выводом исходных данных и результатов на дисплей.
R'nhbyV вне форума Ответить с цитированием
Старый 22.05.2013, 00:46   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Описать базовый класс СТРОКА.
Обязательные члены класса:
* указатель на char - хранит адрес динамически выделенной памяти
для размещения символов строки;
* значение типа int - хранит длину строки в байтах.
Обязательные методы должны выполнять следующие действия:
* конструктор без параметров;
* конструктор, принимающий в качестве параметра
Си-строку (заканчивается нулевым байтом);
* конструктор, принимающий в качестве параметра символ (char).
* конструктор копирования;
* деструктор.
* чтение символа из заданной позиции;
Начнём с этого задания. Какие пункты Вы можете выполнить? Каков результат их выполнения? Какие пункты Вы не знаете, как выполнить?
Abstraction вне форума Ответить с цитированием
Старый 22.05.2013, 18:06   #3
R'nhbyV
Пользователь
 
Регистрация: 25.01.2013
Сообщений: 17
По умолчанию Вот:

Код:
#include<iostream.h>
using namespace std;
class String
{
private:
char *s;
int n;
//конструктор без параметров
String():s(0),n(0){}
//конструктор принимает строку текста
String(char *str)
{n=strlen(str);
s=new char[n];
for (int i=0; i<n; i++) s[i]=str[i];
}
//а как понять заканчивается нулевым байтом?
//копировщик
String (String& T)
{n=T.n;
s=new char [n];
for (int i=0;i<n;i++)
s[i]=T.s[i];
}
//Деструктор
virtual ~String() 
{if(s)delete[]s;
}
вопросы:
* конструктор, принимающий в качестве параметра символ (char).
* чтение символа из заданной позиции;
вот эти я не сделал
R'nhbyV вне форума Ответить с цитированием
Старый 22.05.2013, 18:27   #4
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Цитата:
конструктор, принимающий в качестве параметра символ (char)
Думаю, вот так можно сделать:
Код:
String::String(char ch)
{
	s = new char[2];
	s[0]=ch;
	s[1]='\0';
}
revizor вне форума Ответить с цитированием
Старый 22.05.2013, 18:36   #5
R'nhbyV
Пользователь
 
Регистрация: 25.01.2013
Сообщений: 17
По умолчанию

спасибо=))
R'nhbyV вне форума Ответить с цитированием
Старый 22.05.2013, 18:39   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
* чтение символа из заданной позиции;
Видимо, имеется в виду метод, который на вход принимает индекс, на выходе - символ.

Что интереснее, Вы:
1) Забыли квалификатор доступа public: - сейчас объект класса нельзя создать, все методы, включая конструкторы, недоступны извне.
2) Аргумент конструктора, наверное, const char* str? Иначе нельзя создать объект по константной строке.
3) При копировании C-строки настоятельно рекомендуется отводить n+1 символ (последний символ - под нуль-терминатор '\0', которым кончается любая C-строка). Прочитайте главу Вашего учебника про C-строки ещё раз.

В остальном вроде вполне сносно.
Abstraction вне форума Ответить с цитированием
Старый 22.05.2013, 18:39   #7
R'nhbyV
Пользователь
 
Регистрация: 25.01.2013
Сообщений: 17
По умолчанию

а в моей реализации конструктора, принимающего строку текста, строка заканчивается нулевым байтом?или для этого что-то нужно дополнительно прописать?

Так?
Код:
#include<iostream.h>
using namespace std;
class String
{
pablic:
char *s;
int n;
//конструктор без параметров
String():s(0),n(0){}
//конструктор принимает строку текста
String( const char* str)
{n=strlen(str);
s=new char[n];
for (int i=0; i<n; i++) s[i]=str[i];
}
//а как понять заканчивается нулевым байтом?
//копировщик
String (String& T)
{n=T.n;
s=new char [n+1];
for (int i=0;i<n;i++)
s[i]=T.s[i];
s[n+1]='/0';
}
//Деструктор
virtual ~String() 
{if(s)delete[]s;
}
//конструктор принимающий в качестве параметра символ (char)
String::String(char ch)
{
	s = new char[2];
	s[0]=ch;
	s[1]='\0';
}

Последний раз редактировалось Stilet; 23.05.2013 в 08:07.
R'nhbyV вне форума Ответить с цитированием
Старый 22.05.2013, 18:57   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
а в моей реализации конструктора, принимающего строку текста, строка заканчивается нулевым байтом?или для этого что-то нужно дополнительно прописать?
Разумеется, нет - Вы же этого не сделали.
Посмотрите описание функции strcpy() / strncpy(). И описание функции strlen(), внимательно.

Далее, не забываем: данные - в private-секции, методы - в public-секции.

Далее, конструктор String::String(char) не устанавливает значение n. Не хорошо.

Далее, если массив имеет длину n+1, то последний элемент имеет индекс n, у Вас ошибка на единицу.
Abstraction вне форума Ответить с цитированием
Старый 22.05.2013, 19:13   #9
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Код:
class String
{
public:
	String();
	String(const char *str);
	String(char ch);
	String(const String &T);
	~String();
private:
	char *s;
	int n;
};

String::String()
	:s(0), n(0)
{

}

String::String(const char *str)
{
	n = strlen(str);
	s = new char[n+1];		// +1
	strcpy(s, str);
}

String::String(char ch)
{
	s = new char[2];
	s[0]=ch;
	s[1]='\0';
	n=1;
}

String::String(const String &T)
{
	n = T.n;
	s = new char[n+1];
	strcpy(s, T.s);
}

String::~String()
{
	delete [] s;
}
Цитата:
конструктор String::String(char) не устанавливает значение n. Не хорошо.
Это моя вина)
revizor вне форума Ответить с цитированием
Старый 22.05.2013, 19:26   #10
R'nhbyV
Пользователь
 
Регистрация: 25.01.2013
Сообщений: 17
По умолчанию

Вроде исправил:
Код:
#include<iostream.h>
using namespace std;
class String
{
private:
char *s;
int n;
public:
//конструктор без параметров
String():s(0),n(0){}
//конструктор принимает строку текста
String( const char* str)
{n=strlen(str);
s=new char[n+1];
for (int i=0; i<n; i++) s[i]=str[i];
s[n]='/0';
}
//копировщик
String (const String& T)
{n=T.n;
s=new char [n+1];
for (int i=0;i<n;i++)
s[i]=T.s[i];
s[n]='/0';
}
//Деструктор
virtual ~String() 
{if(s)delete[]s;
}
//конструктор принимающий в качестве параметра символ (char)
String::String(char ch)
{
n=2;
	s = new char[n];
	s[0]=ch;
	s[1]='\0';
}

Последний раз редактировалось R'nhbyV; 22.05.2013 в 23:57.
R'nhbyV вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Создать класс "прямая", поля класса - координаты двух точек (x1,y1) и (x2,y2) // на C# parol Помощь студентам 0 13.12.2011 14:00
Лабораторка C++: Создать класс "угол на полскости" и выполнить проверку работоспособности. Zidane_13 Помощь студентам 0 13.01.2011 22:18
простенький класс "строка" на С++ TopoRRR Помощь студентам 0 14.12.2009 22:31