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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 15:34   #1
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию

Задача такая:
Составить описание класса для работы со вектором строк (строки
произвольной длины), с операциями включения в вектор, удаления из
вектора элемента с заданным значением, удаления всего вектора или
конца вектора, начиная с заданного элемента.

Класс Vector я описала, но до него мне необходимо описать класс String, так как нельзя пользоваться соответствующими библиотеками. Помогите, пожалуйста.

Вот описание класса Vector,
Код:
class Vector
{
	int size;
	Stroka* v;
	void add (Stroka s) {Stroka* new_v = new Stroka [size+1];
	for (int i=0; i<size; ++i)
	{
		new_v[i] = v[i];
	}
	new_v[size] = s;
		delete[]v;
	v = new_v;
	++size;
	}
};
Это добавление записи в вектор. Остальные методы дописать смогу на основе этого примера (лектор объяснял)

Последний раз редактировалось Stilet; 31.03.2013 в 16:12.
Bitter_Schokolade вне форума Ответить с цитированием
Старый 31.03.2013, 16:33   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

чего вы хотите от String?

Кстати, пример ужасен, как вы собираетесь его использовать?
rrrFer вне форума Ответить с цитированием
Старый 31.03.2013, 18:00   #3
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию

Говорят, что в идеале используются библиотеки string и vector, но нам запретили этим пользоваться. Вот посмотрите, я набросала кое-что, можете ответить, что должно быть на месте "//?" ? Я перегрузила операции в Stroka, там нужно еще что-нибудь?
Код:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;

class Stroka
{
private:
	char* s;
public: Stroka()
		{
			s = new char [50];
			*s = '\0';
		}
		bool operator==(Stroka n)
        {
			return (!strcmp(n.s,s)) ? true : false;
		}
		bool operator!=(Stroka n)
        {
			return (strcmp(n.s,s)) ? true : false;
		}
		~ Stroka ()
		{
			delete [] s;
		}
};

class Vector: Stroka
{
	int size;
	Stroka* v;
	char* s;
public: Vector ()
		{
			s = new char [50];
			*s = '\0';
		}
	void add (Stroka s) {Stroka* new_v = new Stroka [size+1];
	for (int i=0; i<size; ++i)
	{
		new_v[i] = v[i];
	}
	new_v[size] = s;
		delete[]v;
	v = new_v;
	++size;
	}
	void sub (Stroka s) {Stroka* new_v = new Stroka [size-1];
	for (int i = 0; i<size; --i)
	{
		//? дальше верно?
		if (s == v[i])
		{
			new_v [size-1] = s;
		}
		delete[]v;
		v = new_v;
		--size;
		}
	}
	void delfrom (Stroka s) {Stroka* new_v = new Stroka [size-1];
	for (int i = 0; i<size; --i)
	{
		//?
	}    
	}
	void delall (Stroka s) {Stroka* new_v = new Stroka [size-1];
	//?
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	system ("pause");
	return 0;
}

Последний раз редактировалось Bitter_Schokolade; 31.03.2013 в 18:43. Причина: доработка
Bitter_Schokolade вне форума Ответить с цитированием
Старый 31.03.2013, 19:53   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

оператор присваивания, наверное.
вот тут вызываеца: new_v [size-1] = s;
вам же компилятор поди сообщает чего не хватает?
rrrFer вне форума Ответить с цитированием
Старый 31.03.2013, 20:47   #5
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию

Компилятор при таком коде не ругается:
Код:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;

class Stroka
{
private:
	char* s;
public: Stroka()
		{
			s = new char [50];
			*s = '\0';
		}
		bool operator==(Stroka n)
        {
			return (!strcmp(n.s,s)) ? true : false;
		}
		bool operator!=(Stroka n)
        {
			return (strcmp(n.s,s)) ? true : false;
		}
		~ Stroka ()
		{
			delete [] s;
		}
};

class Vector
{
	int size;
	Stroka* v;
public: Vector ()
		{
			//?
		}
	void add (Stroka s) {Stroka* new_v = new Stroka [size+1];
	for (int i=0; i<size; ++i)
	{
		new_v[i] = v[i];
	}
	new_v[size] = s;
		delete[]v;
	v = new_v;
	++size;
	}
	void del (Stroka s) {Stroka* new_v = new Stroka [size-1];
	for (int i = 0; i<size; --i)
	{
		//? дальше верно?
		if (s == v[i])
		{
			new_v [size-1] = s;
		}
		delete[]v;
		v = new_v;
		--size;
		}
	}
	void delfrom (Stroka s) {Stroka* new_v = new Stroka [size-1];
	for (int i = 0; i<size; --i)
	{
		//?
	}    
	}
	void delall (Stroka s) {Stroka* new_v = new Stroka [size-1];
	//?
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	
	system ("pause");
	return 0;
}
Bitter_Schokolade вне форума Ответить с цитированием
Старый 31.03.2013, 21:08   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Компилятор при таком коде не ругается:
если при этом все работает как задумано - то проблем нет, верно? )
попробуйте использовать свою строку и вектор - если будет работать - радуйтесь, компилятор сообщит об ошибках - тоже, ведь нашли ответ на "там нужно еще что-нибудь?"

Цитата:
я набросала кое-что, можете ответить, что должно быть на месте "//?"
поясните зачем вам вот эти функции:
Код:
void delfrom (Stroka s) {Stroka* new_v = new Stroka [size-1];
	for (int i = 0; i<size; --i)
	{
		//?
	}    
	}
	void delall (Stroka s) {Stroka* new_v = new Stroka [size-1];
	//?
	}
и может быть мы придумаем что должно быть на месте "//?".
Пока что мне не понятно почему в функции delall (которая, судя по названию, должна лишь все удалить выделяется память. И форматирование кода очень не нравится.

вместо вопросительных знаков в конструкторе по умолчанию:
Код:
Vector() : size_(0), str_(0) {
}

Последний раз редактировалось rrrFer; 31.03.2013 в 21:11.
rrrFer вне форума Ответить с цитированием
Старый 31.03.2013, 22:57   #7
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию

Премного благодарна!

Эти функции нужны, чтобы решить поставленную задачу (добавить элемент, удалить элемент по значению, удалить элементы,начиная со значения, удалить все).

Я просто не знаю, вдруг еще что-то надо, а я еще main() не заполняла. функции вызывать надо. А у меня в классах ввод-вывод строк не заявлен нигде. Это нормально?
Bitter_Schokolade вне форума Ответить с цитированием
Старый 01.04.2013, 11:26   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Компилятор при таком коде не ругается:
Ну давайте я за него поругаюсь.
1) В классе Stroka не объявлены конструктор копии и оператор присваивания. Не в меру инициативный компилятор, к сожалению, в таком случае создаст их за Вас и это будет простое побитовое копирование. В частности, конструктор копии задействуется при передаче аргумента по значению в operator==. Копия будет создана, а на выходе из функции вызовется деструктор, а в нём delete[]... короче, оригинал будет безнадёжно испорчен. Во-первых, объявите конструктор копии и оператор присваивания; во-вторых, желательно бы передавать в качестве аргумента не объект типа Stroka, а константную ссылку на него, если это возможно (const Stroka&).

2) В методе Vector :: del Вы выделяете массив new_v размера X, а потом обращаетесь к new_v[X]. Поздравляю, Вы только что уронили программу.

3) Там же Вы в цикле вызываете delete[] v. Да и сам цикл получается почти бесконечный...

4)
Цитата:
А у меня в классах ввод-вывод строк не заявлен нигде. Это нормально?
Зависит от определения термина "нормально". Поскольку единственная строка, которую можно создать с использованием Вашего кода - это пустая строка, то вывод, собственно, не очень и нужен...
Abstraction вне форума Ответить с цитированием
Старый 01.04.2013, 19:52   #9
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию

А можете объяснить, как это делать?
[QUOTE=Abstraction;1207078]Во-первых, объявите конструктор копии и оператор присваивания; во-вторых, желательно бы передавать в качестве аргумента не объект типа Stroka, а константную ссылку на него, если это возможно (const Stroka&).[/QUOTE=Abstraction;1207078]

И как исправить 2 и 3 ошибки?
Bitter_Schokolade вне форума Ответить с цитированием
Старый 01.04.2013, 20:36   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
А можете объяснить, как это делать?
Код:
public: 
Stroka() {
	s = new char [50];
	*s = '\0';
}

//Конструктор копии
Stroka(const Stroka& cpy){
  s = new char[50];
  strncpy(cpy.s, s, 49);
}

//Оператор присваивания
Stroka& operator=(const Stroka& src){
  if(this == &src) return *this; //Проверка на присваивание объекта самому себе

  strncpy(s, src.s, 49);
  return *this;
}
Цитата:
И как исправить 2 и 3 ошибки?
А самостоятельно? Логика Vector :: del лично мне недоступна, я даже не вполне понимаю, чего Вы хотели сделать такими действиями. "Если очередной элемент вектора равен удаляемому, скопировать его туда-то" - действие достаточно странное.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Собственный класс строк Amy_Lee Общие вопросы C/C++ 0 08.04.2012 17:27
свой собственный класс MediaPlayer'a nick17 Помощь студентам 2 26.11.2010 13:54
Delphi7,как создать собственный класс ? -ushёl- Общие вопросы Delphi 15 13.06.2010 01:02
Собственный класс диалогового окна на чистом WinApi в Delphi Iber Win Api 19 01.12.2008 15:40
Рисование многоугольника (собственный класс) MaTBeu Общие вопросы C/C++ 1 08.12.2007 14:53