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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2009, 22:00   #1
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию Вопрос по ассоциативному массиву

Ситуация такова: задали ручками написать шаблонный ас.массив... т.е. ключи могут быть различных типов... однако в некоторых функциях реализация для разных типов будет различной... т.е. надо изначально знать тип передаваемой переменной. Есть ли функции, которые могут это сообщить? или я просто что-то не понимаю? Заранее спасибо.
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Старый 31.05.2009, 22:18   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Почему бы просто не перегрузить функции для разных типов?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 01.06.2009, 15:00   #3
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию

Начал писать... При выполнении обнаруживается ошибка с памятью... Кто протестит и объяснит большое спасибо.
Код HTML:
#include <iostream>
#include "Asmas.h"
#include "String.h"
#include "List.h"
using namespace std;
int main ()
{
	char * buf = new char [20];
	cin >>  buf;
	Asmas mas;
	mas.add(buf);
	delete buf;
	system ("PAUSE");
	return 0;
}
Код HTML:
#ifndef String_h
#define String_h
#include <iostream>
using namespace std;
class String
{
private:
	int size;
	char * str;
public:
	String ();
	~String ();
	String & operator = (char * s);
	bool operator == (char * s);
    friend ostream & operator <<(ostream & stream, const String & s);
};
String :: String ()
{
	str = NULL;
}
String ::~String()
{
	delete [] str;
}
String & String :: operator = (char * s)
{
	size = strlen(s) + 1;
	if(str)
		delete [] str;
	str = new char [size];
	strcpy(str,s);
	return(*this);
}
bool String ::operator == (char *s)
{
	if(strcmp(str,s) == 0)
	{
		return true;
	}
	else
		return false;
}
ostream & operator <<(ostream & stream, const String & s)
{
	stream << s.str;
	return stream;
}
#endif
Код HTML:
#ifndef List_h
#define List_h
#include "String.h"
#include <iostream>
using namespace std;
struct Elem
{
	Elem * next;
	Elem * prev;
	String word;
	int amount;
};
struct List
{
	Elem * begin;
	Elem * list;
};
void push_beg (List * my_list, char * buf);
void push_end (List * my_list,char * buf);
bool isempty (List * my_list);
void del (List * my_list);
List * create ();
void print ( List * my_list );
void search (List* my_list, char * s);
void pop_beg (List * my_list);

List * create()
{
	List * a = new List;
	a->begin = NULL;
	a->list = NULL;
	return a;
}
void search (List* my_list,char * buf)
{   
	bool t = false;
	my_list->list = my_list->begin;
	while (my_list->list->next != NULL)
	{
		if(my_list->list->word == buf)
		{
			my_list->list->amount++;
			t = true;
		}
		my_list->list = my_list->list->next;
	}
	if (t == false)
	{
		push_end(my_list,buf);
	}
}
bool isempty (List * my_list)
{
	if(my_list->begin == NULL)
	{
		return true;
	}
	return false;
}
void push_beg (List * my_list,char * buf)
{    
	 Elem * newit;
	 newit = (Elem *)malloc( sizeof( struct Elem) );
	 newit->word = buf;
	 newit->amount = 1;
     newit->prev = NULL;
	 my_list->begin = newit;
	 newit->next = NULL;
	 my_list->list = my_list->begin; 
}
void push_end (List * my_list, char * buf)
{
	Elem * newit;
	newit = (Elem*)malloc(sizeof(struct Elem));
	my_list->list = my_list->begin;
	while (my_list->list->next!= NULL)
	{
		my_list->list = my_list->list->next;
	}
	newit->next = NULL;
    newit->prev = my_list->list;
	newit->amount = 1;
	newit->word = buf;
    my_list->list->next = newit;
    my_list->list = my_list->list->next; 
}
void del (List * my_list)
{
	while(my_list->begin != NULL )
	{
		pop_beg (my_list);
	}
	delete my_list;
}
void pop_beg (List * my_list)
{
	Elem * newit;
	my_list->list = my_list-> begin;
	newit = my_list-> begin;
	my_list->begin = my_list->list->next;
	if(newit!=NULL)
	{
		delete newit;
	}
}

void print ( List * my_list )
{
	int i = 1;
	my_list->list = my_list->begin;
	Elem * newit = my_list->list;
	while (newit!= NULL )
	{
		cout << newit->word << " = "<<newit->amount<<"\n";
		i++;
		newit = newit->next;
	}
}
#endif
Код HTML:
#ifndef Asmas_h
#define Asmas_h
#include "List.h"
#include "String.h"
class Asmas
{
private:
	List * my_list;
public:
	Asmas ();
	~Asmas ();
	/*int operator [] (char * str);*/
	void add (char * buf);
	void Print ();
};
void Asmas ::Print ()
{
	print(my_list);
}
void Asmas::add (char * buf)
{
	if(isempty(my_list))
	{
		push_beg (my_list,buf);
	}
	else
	{
       search(my_list,buf);
	}
}
Asmas ::~Asmas()
{
	del(my_list);
}
Asmas::Asmas()
{
	my_list = create ();
}
#endif
<= P.S. если я тебе помог нажми весы слева <=

Последний раз редактировалось assasin; 01.06.2009 в 15:04.
assasin вне форума Ответить с цитированием
Старый 01.06.2009, 17:17   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Хм.. Что-то у меня в файле List.h компилятор не знает, что такое String. Соответственно, ругается на все методы, с ним связанные..
Притом ему не нравится именно подключение в Asmas.h

И так и так их тасовал..
Пробовал в MinGW и в Билдере.
Странное что-то..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 01.06.2009, 17:26   #5
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию

писал в MSVS 2005... все компилится
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Старый 01.06.2009, 17:46   #6
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
Сообщение от assasin Посмотреть сообщение
Ситуация такова: задали ручками написать шаблонный ас.массив... т.е. ключи могут быть различных типов... однако в некоторых функциях реализация для разных типов будет различной... т.е. надо изначально знать тип передаваемой переменной. Есть ли функции, которые могут это сообщить? или я просто что-то не понимаю? Заранее спасибо.
Я так думаю вам нужно чтото типа этого
Код:
#include <iostream>

template <typename T>
class array{
public:
	array():data(0), size(0){}

	array(const T*){
		std::cout << "array(T *p)\n";
	}
	~array(){
	}
};

template <>  array<char>::array(const char*){
	std::cout << "template <>  array<char>::array(char *p)\n";
}
int main()
{
	int arr[] = {1,2,3,4};

	array<int> i(arr);
	array<char> c("string");

	return 0;
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 01.06.2009, 17:57   #7
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию

ISergeyN, писать пока начал без шаблонов... причину ошибки понять не могу
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Старый 01.06.2009, 18:31   #8
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Отладчиком пользуйтесь..
Ты здесь
Код:
newit = (Elem *)malloc( sizeof( struct Elem) );
выделяешь память через malloc а он окнструктор обекта не ВЫЗЫВАЕТ!
тоесть у обекта word небыл вызван конструктор.
по етому здесь
Код:
if(str)
	delete [] str;
у тебя баг. так как в str мусор.
замени все
Код:
newit = (Elem*)malloc(sizeof(struct Elem));
на
Код:
newit = new Elem;
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 01.06.2009, 19:01   #9
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию

Все заработало, спасибо! +1
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Старый 01.06.2009, 19:25   #10
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию

количество вхождений слов в текст считает без ошибок. осталось шаблоны прикрутить, сортировку и поиск... Интересно, эту задачу можно было написать за полторы пары? а то нам ее в качестве, как выразились, самой простой зачетной давали... заинтересовала
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Задачка по массиву -ZaK- Помощь студентам 6 18.10.2010 00:08
ЗАДАЧИ ПО МАССИВУ!! СРОЧНО! НАСТЯ 18:) Паскаль, Turbo Pascal, PascalABC.NET 4 10.05.2009 15:23
Помогите с задачкой по массиву Stiff Помощь студентам 5 19.03.2009 00:49
узнать, принадлежит ли значение массиву Жираффа Microsoft Office Excel 4 25.03.2008 14:59