Index · Правила · Поиск· Группы · Регистрация · Личные сообщения· Вход

Список разделов Компьютерный раздел
 
 
 

Раздел: Компьютерный раздел C++ 

Создана: 18 Декабря 2003 Чтв 21:21:11.
Раздел: "Компьютерный раздел"
Сообщений в теме: 7, просмотров: 1768

  1. VIRUS


    Завсегдатай


    Более 10 лет на форумеМуж.
    18 Декабря 2003 Чтв 21:21:11
    Вот какой у меня вопрос, а точнее их два:

    1(основной). Как производиться смена кодировки в Visual C++ 6.0 ... короче чтобы воспринимало в самом компиляторе и в софте русский шрифт.

    2. Нужно описать Классы списка(можно и двухсвязного),стека, дека или очереди. Если у кого-то есть сие творение буду очень признателен за исходник!!!

    Вот собственно и всё! Очень срочно!!
  2. Shadow


    Хранитель


    Более 10 лет на форуме
    19 Декабря 2003 Птн 10:51:09
    1) По смене кодировки: ежели хошь писать комменты на русском в теле проги, то просто смени шрифт в самом редакторе.

    2) Для решения ентого вопроса необходимо обратиться на http://www.google.com и запросить там исходники на С++, или например глянуть тут:
    [внешняя ссылка]

    собЦЦтвенна фсе :)
  3. 19 Декабря 2003 Птн 11:01:47
    Попробуй сам сделать, будет хорошо...
    портом меньше проблем...
    а искать такое в 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;
    }
  4. VIRUS


    Завсегдатай


    Более 10 лет на форумеМуж.
    19 Декабря 2003 Птн 20:03:41
    2 igreg - большое спасибо, пригодилось!

    2 Shadow - сенкс за ссылочку, а на счёт кодировки то мне нужно писать не комменты(как раз в самой среде у меня хорошо воспринимается кириллица), а непосредственно текст в менюшки в откомпиленных прогах VC 6.0, например на кнопке, или так же в консольном режиме...
  5. Shadow


    Хранитель


    Более 10 лет на форуме
    20 Декабря 2003 Суб 10:14:48
    прописывай сразу шрифт в свойствах кнопки тот, который идет с поддержкой русских букв, или системный бери. Но тогда при попадании на не русскоязычную систему будут косяки :( а на счет консоли все проще, заранее пользуй 866 кодировку это ж стандарт и виндовс его и пользует :)))) а вот в оконных идет кодировка 1251 :)
  6. VIRUS


    Завсегдатай


    Более 10 лет на форумеМуж.
    20 Декабря 2003 Суб 20:08:18
    Да...только где это настраивается в Си
  7. 20 Декабря 2003 Суб 20:20:49
    AnsiToOem
    StrToOem
    StrToAnsi
    что-то вроде этих функций
    лежат в string.h