C++
Создана: 18 Декабря 2003 Чтв 21:21:11.
Раздел: "Компьютерный раздел"
Сообщений в теме: 7, просмотров: 1771
-
Вот какой у меня вопрос, а точнее их два:
1(основной). Как производиться смена кодировки в Visual C++ 6.0 ... короче чтобы воспринимало в самом компиляторе и в софте русский шрифт.
2. Нужно описать Классы списка(можно и двухсвязного),стека, дека или очереди. Если у кого-то есть сие творение буду очень признателен за исходник!!!
Вот собственно и всё! Очень срочно!! -
1) По смене кодировки: ежели хошь писать комменты на русском в теле проги, то просто смени шрифт в самом редакторе.
2) Для решения ентого вопроса необходимо обратиться на http://www.google.com и запросить там исходники на С++, или например глянуть тут:
[внешняя ссылка]
собЦЦтвенна фсе :) -
Попробуй сам сделать, будет хорошо...
портом меньше проблем...
а искать такое в MSDN и Microsofte это слишком круто
template <class T>
class CStack{
public:
explicit CStack() : Head(0) {}; //инициализируем стек
CStack(const CStack<T> & input); //копирующий конструктор
CStack(const T input[],int size); //делаем стек из массива
~CStack(); //деструктор
void Push(T input=0); //положить элемент в стек
T Pop(); //взять элемент из стека
T SeeTop(){if (Head) return Head->Data;return 0;};
bool isEmpty() {if(Head) return false;return true;};
void Release(); //очистить стек
CStack<T> & operator = (const CStack<T> & input); //приравниваем один стек другому
CStack<T> & operator = (const T); //изменяем верхний элемент
CStack<T> & operator += (const CStack<T> & input); //приписываем элементы второго стека к первому
CStack<T> & operator += (const T); //добавляем элемент
private:
struct _StackElem{
T Data; //информация
_StackElem *Last; //указатель на предыдущий
_StackElem(T _Data=0,_StackElem* _Last=0) : Data(_Data) , Last(_Last) {} ; //конструктор
};
_StackElem* Head; //вершина стека
void Reverse(_StackElem *& to,const _StackElem * from); //обратить стек
};
template <class T>
CStack<T> ::CStack(const CStack<T> & input) : Head(0)
{
Reverse(Head,input.Head);
}
template <class T>
CStack<T> ::CStack(const T input[],int size) : Head(0)
{
//грузим массив + его размер в функцию и создаем стэк.
for(int i=0;i<size;i++)
{
Push(input[i]);
}
}
template <class T>
CStack<T> ::~CStack()
{
Release(); //очистка памяти
}
template <class T>
void CStack<T> ::Push(T input)
{
_StackElem *temp=new _StackElem(input,Head);
Head=temp;
}
template <class T>
T CStack<T> ::Pop()
{
if (Head) //если есть хоть один элемент
{
_StackElem *temp=Head;
T data=temp->Data;
Head=Head->Last;
delete temp;
return data;
}
return 0;
}
template <class T>
void CStack<T> ::Release()
{
while(Head) //пока в стеке что-то есть - очищаем его
Pop();
}
template <class T>
void CStack<T> ::Reverse(_StackElem *& to,const _StackElem * from)
{
_StackElem *buf,*temp=0,*del;
while(from) //копируем в промежуточный стек, то есть наоборот
{
buf=new _StackElem(from->Data,temp);
temp=buf;
from=from->Last;
}
while(temp) //результат! из переворачиваем промежуточный
{
buf=temp;
temp=temp->Last;
buf->Last=to;
to=buf;
}
}
template <class T>
CStack<T> & CStack<T> ::operator = (const CStack<T> & input)
{
if (Head!=input.Head) //если не присваиваем себе саому
{
Release();
Reverse(Head,input.Head);
}
return *this;
}
template <class T>
CStack<T> & CStack<T> ::operator = (const T input)
{
Head->Data=input;
return *this;
}
template <class T>
CStack<T> & CStack<T> ::operator += (const CStack<T> & input)
{
if(Head!=input.Head)
{
Reverse(Head,input.Head);
}
return *this;
}
template <class T>
CStack<T> & CStack<T> ::operator += (const T input)
{
Push(input);
return *this;
}
**********************************
template <class T>
class CList{
public:
struct _ListElem{
T Data; //данные
_ListElem *Next; //указатель на следующий
_ListElem(T _Data=0,_ListElem *_Next=0) : Data(_Data) , Next(_Next) {}; //конструктор
};
template <class T>
class iterator;
friend class iterator<T>; //итератору должны быть доступны все, даже закрытые, члены класс
CList(); //конструктор
CList(const CList &); //копирующий конструктор
~CList(); //деструктор
void Push(const T); //положить элемент в список
T Pop(); //удалить элемент на который указывает Ptr
T See(){if (Ptr) return Ptr->Data;return 0;}; //увидеть данные в Ptr
_ListElem* Begin() {return Head->Next;}; //начало списка. Вообще-то должно
//возвращать тип Iterator, но не пашет
_ListElem* End() {while(Ptr)Ptr=Ptr->Next;return Ptr;};//конец списка, сдвигает Ptr в конец
void GoToBegin() {Ptr=Head;}; //передвигает Ptr в начало
//перегружаем операторы
CList<T> & operator =(const CList<T> &); //перегружаем равенство
friend ostream & operator <<(ostream &,CList<T> &); //перегружаем вывод
private:
void Release(); //очистить список
_ListElem *Head,*Ptr; //указатели на голову и как бы текущий элементы
};
//класс итератор, перебирает список
template <class T>
class iterator{
public:
friend class CList;
iterator(CList<T>::_ListElem *_Ptr=0) : Ptr(_Ptr) {}; //конструктор
//перегруженные операторы
iterator operator++();
iterator<T> operator++(int);
CList<T>::_ListElem* operator ->() {return Ptr;};
T & operator *() {return Ptr->Data;};
operator CList<T>::_ListElem*(){return Ptr;}; //преобразование
private:
CList<T>::_ListElem *Ptr;
};
template <class T>
CList<T>::CList()
{
Head=new _ListElem(0);
Ptr=Head;
}
template <class T>
CList<T>::CList(const CList & List)
{
Head=new _ListElem(0);
Ptr=Head;
_ListElem *temp=List.Head->Next;
while(temp)
{
Ptr->Next=new _ListElem(temp->Data);
Ptr=Ptr->Next;
temp=temp->Next;
}
}
template <class T>
CList<T>::~CList()
{
Release();
delete Head;
}
template <class T>
void CList<T>::Push(const T input)
{
_ListElem *temp=new _ListElem(input,Ptr->Next);
Ptr->Next=temp;
Ptr=Ptr->Next;
}
template <class T>
T CList<T>::Pop()
{
if (Ptr)
{
T output=Ptr->Data;
_ListElem *temp=Head;
/* if(Head==Ptr)
{
Ptr=Head->Next;
delete Head;
Head=Ptr;
}*/
if(Ptr!=Head)
{
while((temp->Next!=Ptr)&&(temp->Next))
temp=temp->Next;
temp->Next=Ptr->Next;
delete Ptr;
Ptr=temp;
}
if(Ptr==Head)
{
Ptr=Head->Next;
delete Head;
Head=Ptr;
return output;
}
return output;
}
return 0;
}
template <class T>
void CList<T>::Release()
{
while(Ptr)
Pop();
}
template <class T>
ostream & operator <<(ostream & out,CList<T> & List)
{
//формирование потока без использования итератора
/*
if ((List.Head)&&(List.Head->Next))
{
List.Ptr=List.Head->Next;
while(List.Ptr)
{
out<<List.Ptr->Data<<" ";
List.Ptr=List.Ptr->Next;
}
out<<endl;
}
else
out<<endl;
return out;
*/
//формирование с итератором
iterator<T> it;
for(it=List.Begin();it!=List.End();it++)
{
out<<*it<<" ";
}
out<<endl;
return out;
}
template <class T>
CList<T> & CList<T> ::operator =(const CList<T> & List)
{
if (List.Ptr != (*this).Ptr)
{
Release();
Ptr=Head;
_ListElem *temp=List.Head->Next;
while(temp)
{
Ptr->Next=new _ListElem(temp->Data);
Ptr=Ptr->Next;
temp=temp->Next;
}
}
return *this;
} -
2 igreg - большое спасибо, пригодилось!
2 Shadow - сенкс за ссылочку, а на счёт кодировки то мне нужно писать не комменты(как раз в самой среде у меня хорошо воспринимается кириллица), а непосредственно текст в менюшки в откомпиленных прогах VC 6.0, например на кнопке, или так же в консольном режиме... -
прописывай сразу шрифт в свойствах кнопки тот, который идет с поддержкой русских букв, или системный бери. Но тогда при попадании на не русскоязычную систему будут косяки :( а на счет консоли все проще, заранее пользуй 866 кодировку это ж стандарт и виндовс его и пользует :)))) а вот в оконных идет кодировка 1251 :)
-