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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2015, 00:02   #1
t0pep0
Новичок
Джуниор
 
Регистрация: 14.09.2015
Сообщений: 3
По умолчанию Разбить на функции в класс

Всем доброго времени суток, незнаю где просить помощи. В общем сделал лабу, необходимо теперь все что в мейне занести в отдельный класс и разбить пофункция, у меня не получается так как не могу работать почему то с переменной root. Помогите.

Код:
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <fstream>
using namespace std;
 
//vector-dinamicheskiy massiv
//list-spisok
//map-associativniy massiv
 
class Node // Node.h
{
public:
int a;//chislo
char c;//simvol
Node *left, *right;//struct bin tree
 
Node(){left=right=NULL;}//pustoi konstruktor
 
Node(Node *L, Node *R)//prinimaet 2 ssilki na levogo i pravogo son 
{ left = L;
right = R;
a = L->a + R->a; }
};
void print(Node* root,unsigned k=0) // main.cpp
{
if(root != NULL)
{
print(root->left, k+3);//k otvechaet za otstupi
for(unsigned i=0;i<k;i++)
{
cout<<" ";
}
 
if(root->c)
cout<<root->a<<"("<<root->c<<")"<<endl;
else
cout<<root->a<<endl;
print(root->right, k+3);
}
}
 
 
struct MyCompare//sortirovka // main.cpp
{
bool operator()(const Node* l, const Node* r) const
{ return l->a < r->a; }
}; 
 
 
vector<bool> code; //globalnaya peremennaya 
map<char,vector<bool> > table; //associaciya simvola s kodom 
 
void BuildTable(Node *root) // main
{   
if (root->left!=NULL) 
{ code.push_back(0);
BuildTable(root->left);}
 
if (root->right!=NULL)
{ code.push_back(1);
BuildTable(root->right);}
 
if (root->left==NULL && root->right==NULL) 
table[root->c]=code; //associiruem bukvu s kodom 
 
code.pop_back();
}
 
 
int main (int argc, char *argv[])
{
////// считаем частоты символов~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ifstream f("1.txt", ios::out | ios::binary);
 
map<char,int> m;//associativniy massiv poshitaem kol-vo vhojdeniy kajdogo symvola
 
while (!f.eof())
{ char c = f.get(); 
m[c]++;}
//vivedem na ekran kolvo vxojdeniy
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<"chislo vxojdeniy:"<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
map<char,int>::iterator ii;
for(ii=m.begin(); ii != m.end(); ++ii)
cout << ii->first << ":" << ii->second << endl;
 
 
////// записываем начальные узлы в список list~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
list<Node*> t;
for( map<char,int>::iterator itr=m.begin(); itr!=m.end(); ++itr)
{ 
Node *p = new Node;
p->c = itr->first;
p->a = itr->second; 
t.push_back(p); }   
 
 
////// создаем дерево~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
while (t.size()!=1)
{ 
t.sort(MyCompare());
 
Node *SonL = t.front();//leviy son prisvaivaem pervim elementam kotorie idut v spiske
t.pop_front();//perviy element udalyaem, na ego mesto stanovitcya vtoroy
Node *SonR = t.front(); //ctanovitsya pervim v spiske 
t.pop_front();//ydalyaem
 
Node *parent = new Node(SonL,SonR); 
t.push_back(parent);
 
}
 
Node *root = t.front(); //root - указатель на вершину дерева
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<< "derevo"<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
print(root);//vivod dereva na ekran
////// создаем пары 'символ-код':   ~~~~~~~~~~~~~~~~~~~~~~~~~   
 
BuildTable(root);
for(int i=0; i<!f.eof();i++)
{
char c=f.get();
vector<bool> x = table[c]; 
for (int n=0;n<x.size();n++)
cout<<x[n];
}
 
 
////// Выводим коды в файл output.txt~~~~~~~~~~~~~~~~~~~~~~~
 
f.clear(); f.seekg(0); // перемещаем указатель снова в начало файла
 
ofstream g("output.txt", ios::out | ios::binary);
 
int count=0; char buf=0;
while (!f.eof())
{ char c = f.get();
vector<bool> x = table[c];
for(unsigned n=0; n<x.size(); n++)
{buf = buf | x[n]<<(7-count); 
count++; 
if (count==8) { count=0; g<<buf; buf=0; } 
}
 
} 
 
 
f.close();
g.close(); 
 
///// считывание из файла output.txt и преобразование обратно~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<"Decoding text:"<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
ifstream F("output.txt", ios::in | ios::binary);
 
setlocale(LC_ALL,"Russian"); // чтоб русские символы отображались в командной строке
 
Node *p = root;
count=0; char byte; 
byte = F.get();
while(!F.eof())
{ bool b = byte & (1 << (7-count) ) ; 
if (b) p=p->right; else p=p->left;
if (p->left==NULL && p->right==NULL) 
{cout<<p->c; p=root;} 
count++;
if (count==8) 
{count=0; byte = F.get();}
}
 
F.close();  
system("pause");
 
 
}

Последний раз редактировалось Stilet; 15.09.2015 в 06:45.
t0pep0 вне форума Ответить с цитированием
Старый 15.09.2015, 14:05   #2
t0pep0
Новичок
Джуниор
 
Регистрация: 14.09.2015
Сообщений: 3
По умолчанию

Никто не может помочь?
t0pep0 вне форума Ответить с цитированием
Старый 15.09.2015, 14:21   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну дык определите почему не можете, тут нет телепатов.

root видимо должен быть полем (приватным) в классе Дерево.

И код форматируйте нормально.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.09.2015, 14:32   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не могу работать почему то с переменной root
Текст ошибки в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.09.2015, 15:36   #5
t0pep0
Новичок
Джуниор
 
Регистрация: 14.09.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Текст ошибки в студию.
Вот как я делаю. В Дебаггере что проблема с root
Код:
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <fstream>
using namespace std;

vector<bool> code; //globalnaya peremennaya 
map<char,vector<bool> > table; //associaciya simvola s kodom 

class Node // Node.h
{
public:
	int a;//chislo
	char c;//simvol
	Node *left, *right;//struct bin tree

	Node(){left=right=NULL;}//pustoi konstruktor

	Node(Node *L, Node *R)//prinimaet 2 ssilki na levogo i pravogo son 
	{ left = L;
	right = R;
	a = L->a + R->a; }
};

struct MyCompare//sortirovka // main.cpp
{
bool operator()(const Node* l, const Node* r) const
{ return l->a < r->a; }
}; 

void print(Node* root,unsigned k);
void BuildTable(Node *root);


class Haf_Tree{
public :
	Haf_Tree(std::string filename);
	void code();
	void decode();
private:
	ifstream f;
	Node *root;
	int count;
};

Haf_Tree::Haf_Tree(std::string filename)
{

		////// считаем частоты символов~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	ifstream f(filename, ios::out | ios::binary);

	map<char,int> m;//associativniy massiv poshitaem kol-vo vhojdeniy kajdogo symvola

	while (!f.eof())
	{ char c = f.get(); 
	m[c]++;}
	//vivedem na ekran kolvo vxojdeniy
	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
	cout<<"chislo vxojdeniy:"<<endl;
	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
	map<char,int>::iterator ii;
	for(ii=m.begin(); ii != m.end(); ++ii)
		cout << ii->first << ":" << ii->second << endl;


	////// записываем начальные узлы в список list~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	list<Node*> t;
	for( map<char,int>::iterator itr=m.begin(); itr!=m.end(); ++itr)
	{ 
		Node *p = new Node;
		p->c = itr->first;
		p->a = itr->second; 
		t.push_back(p); }	


	////// создаем дерево~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	

	while (t.size()!=1)
	{ 
		t.sort(MyCompare());

		Node *SonL = t.front();//leviy son prisvaivaem pervim elementam kotorie idut v spiske
		t.pop_front();//perviy element udalyaem, na ego mesto stanovitcya vtoroy
		Node *SonR = t.front(); //ctanovitsya pervim v spiske 
		t.pop_front();//ydalyaem

		Node *parent = new Node(SonL,SonR); 
		t.push_back(parent);

	}

	Node *root = t.front(); //root - указатель на вершину дерева
}

void Haf_Tree::code()
{
	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
	cout<< "derevo"<<endl;
	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
	print(root,0);//vivod dereva na ekran
	////// создаем пары 'символ-код':	~~~~~~~~~~~~~~~~~~~~~~~~~	

	BuildTable(root);
	for(int i=0; i<!f.eof();i++)
	{
		char c=f.get();
		vector<bool> x = table[c]; 
		for (int n=0;n<x.size();n++)
			cout<<x[n];
	}


	////// Выводим коды в файл output.txt~~~~~~~~~~~~~~~~~~~~~~~

	f.clear(); f.seekg(0); // перемещаем указатель снова в начало файла

	ofstream g("output.txt", ios::out | ios::binary);

	count=0; char buf=0;
	while (!f.eof())
	{ char c = f.get();
	vector<bool> x = table[c];
	for(unsigned n=0; n<x.size(); n++)
	{buf = buf | x[n]<<(7-count); 
	count++; 
	if (count==8) { count=0; g<<buf; buf=0; } 
	}

	} 
	f.close();
	g.close(); 
}
void Haf_Tree::decode()
{

	///// считывание из файла output.txt и преобразование обратно~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
	cout<<"Decoding text:"<<endl;
	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
	ifstream F("output.txt", ios::in | ios::binary);

	setlocale(LC_ALL,"Russian"); // чтоб русские символы отображались в командной строке

	Node *p = root;
	count=0; char byte; 
	byte = F.get();
	while(!F.eof())
	{ bool b = byte & (1 << (7-count) ) ; 
	if (b) p=p->right; else p=p->left;
	if (p->left==NULL && p->right==NULL) 
	{cout<<p->c; p=root;} 
	count++;
	if (count==8) 
	{count=0; byte = F.get();}
	}

	F.close();	
	system("pause");
}
void print(Node* root,unsigned k) // main.cpp
{
	if(root != NULL)
	{
		print(root->left, k+3);//k otvechaet za otstupi
		for(unsigned i=0;i<k;i++)
		{
			cout<<" ";
		}

		if(root->c)
			cout<<root->a<<"("<<root->c<<")"<<endl;
		else
			cout<<root->a<<endl;
		print(root->right, k+3);
	}
}
void BuildTable(Node *root) // main
{	
	if (root->left!=NULL) 
	{ code.push_back(0);
	BuildTable(root->left);}

	if (root->right!=NULL)
	{ code.push_back(1);
	BuildTable(root->right);}

	if (root->left==NULL && root->right==NULL) 
		table[root->c]=code; //associiruem bukvu s kodom 

	code.pop_back();
}

int main ()
{
	Haf_Tree haf("1.txt");
	haf.code();
	haf.decode();
	return 0;
}
Неправильно передавал указатель root в другую функцию, но теперь у меня из цикла не выходит (((

Последний раз редактировалось Stilet; 15.09.2015 в 18:33.
t0pep0 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разбить код на функции dissable1 Помощь студентам 0 24.12.2014 18:01
Перестановка элементов массива. Добавить процедуры и функции в класс Deman1986 Помощь студентам 2 25.02.2014 21:19
разбить на отдельные функции romanu416 Общие вопросы C/C++ 0 08.11.2013 14:01
разбить программу на функции main и пользовательскую функцию Ferghost Общие вопросы C/C++ 2 31.05.2009 18:15
Разбить на функции dma Помощь студентам 1 10.03.2009 07:21