Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задачки для новичков! Задачи 
:(
    Опции темы
Чoо
Дата 3.12.2010, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата

    Список из полиморфных объектов. Спроектируйте класс "список" таким
    образом, что бы он был способен хранить элементы различных типов,
    производных от базового типа "Элемент". В Класс "Элемент" добавьте
    виртуальный метод print() для вывода элемента в стандартный поток.

Код

/*
    Список из полиморфных объектов. Спроектируйте класс "список" таким
    образом, что бы он был способен хранить элементы различных типов,
    производных от базового типа "Элемент". В Класс "Элемент" добавьте
    виртуальный метод print() для вывода элемента в стандартный поток.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*элемент списка
  Сделаем абстрактным.
*/
struct element{
    element *next; //указатель на следующий элемент присущ любому элементу списка
    virtual void print() = 0;
};

/*элемент хранит имя и фамилию некоего индвида*/
struct element_ns:public element{
    char *name,
         *surname;
    //element_ns *next;

    /*конструктор, выделяющий память для полей элемента*/
    element_ns(const char *nm, const char *snm)
    {
        name =(char*) malloc(sizeof(char)*strlen(nm)+sizeof(char));
        strcpy(name,nm);

        surname=(char *) malloc(sizeof(char)*strlen(snm)+sizeof(char));
        strcpy(surname,snm);

        next = 0; //для нового элемента всегда 0.
    }

    /*деструктор, освобождающий память, занимаемую полями объекта, перед уничтожением объекта*/
    ~element_ns()
    {
        free(name);
        free(surname);
    }

    /*методы класса*/
    void print()
    {
        printf("Элемент класса element_ns: %s, %s\n", name, surname);
    }
};

/*Элемент хранит марку автомобиля и его номер*/
struct element_car:public element{
    char *brand;
    int number;
    //element_car *next;

    /*в конструкторе выделяем память для поля brand, номер по-умолчанию 0*/
    element_car(const char *br, const int no)
    {
        brand = (char*)malloc(sizeof(char)*strlen(br)+sizeof(char));
        strcpy(brand,br);
        number = no;
        next = 0;
    }

    /*в деструкторе освобождаем память, занимаемую brand*/
    ~element_car()
    {
        free(brand);
    }

    /*методы класса*/
    void print()
    {
        printf("Элемент класса element_car: марка: %s; номер: %d\n", brand, number);
    }

};

/*элемент хранит какие-то числа :)*/
struct element_somenumbers:public element{
    int n1,
        n2,
        n3;
    //element_somenumbers *next;

    element_somenumbers(int a, int b, int c)
    {
        n1 = a;
        n2 = b;
        n3 = c;
        next = 0;
    }
    void print()
    {
        printf("Элемент класса element_somenumbers: no.1: %d, no.2: %d, no.3: %d\n",n1, n2, n3);
    }
};

/*класс, реализующий список*/
class list{
private:
    element *head; //голова списка
public:
    /*конструктор*/
    list() {head = 0;}
    /*деструктор*/
    ~list(); //в деструкторе надо освободить память, занимаемую элементами списка и строками в них

    /*методы*/
    void add(const char *nm, const char *snm);
    void add(const char *brand, const int number);
    void add(int a, int b, int c);
    void show(); //выводит все элементы списка на экран
};
list::~list()
{
    while(head)
    {
        element *p = head->next;
        delete head;
        head = p;
    }
}
void list::add(const char *nm, const char *snm)
{
    if(!head)
        head = new element_ns(nm,snm);
    else
    {
        element *p = new element_ns(nm,snm);
        p->next = head;
        head = p;
    }
}
void list::add(const char *brand, const int number)
{
    if(!head)
        head = new element_car(brand,number);
    else
    {
        element *p = new element_car(brand,number);
        p->next = head;
        head = p;
    }
}
void list::add(int a, int b, int c)
{
    if(!head)
        head = new element_somenumbers(a,b,c);
    else
    {
        element *p = new element_somenumbers(a,b,c);
        p->next = head;
        head = p;
    }
}
void list::show()
{
    element *curr = head;
    while(curr)
    {
        curr->print();
        curr = curr->next;
    }

}

int main()
{
    list *o;
    o = new list;
    o->add(1,2,3);
    o->add("Ford", 666);
    o->add("Il", "Sh");
    o->add("opel",777);
    o->add(7,7,7);
    o->add("Ch", "OO");
    o->show();
    delete o;
    return 0;
}


Добавлено @ 00:32
решил с malloc потренироваться smile

Это сообщение отредактировал(а) Чoо - 3.12.2010, 00:51


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
bsa
Дата 6.12.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Чoо, ты на каком языке пишешь?
Цитата(Чoо @  3.12.2010,  01:32 Найти цитируемый пост)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
На С++ это должно быть так:
Код
#include <cstdio>
#include <cstdlib>
#include <cstring>
А по хорошему, вообще используй iostream... Или пиши на Си.

хочешь ты того или не хочешь, но sizeof(char) == 1.
PM   Вверх
Чoо
Дата 6.12.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата(bsa @  6.12.2010,  14:37 Найти цитируемый пост)
Чoо, ты на каком языке пишешь?

честно говоря не знаю, каша в голове smile.


Цитата(bsa @  6.12.2010,  14:37 Найти цитируемый пост)
хочешь ты того или не хочешь, но sizeof(char) == 1. 

не сопрю, но я так понял эта инструкция ни как не влияет на производительность, так как число определяется в процессе компилирования, а не иполнения.


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
bsa
Дата 6.12.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Чoо, а кто говорил про проблемы компиляции? Читать неудобно!
PM   Вверх
Чoо
Дата 6.12.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



bsa, оК, учту в следующих задачах. 
Единственное что, по предыдущему замечанию, есть непонятки. Почему плохо использовать стандартные библиотеки Си в программах на с++ ? smile


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
bsa
Дата 6.12.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Чoо, потому что на С++ все это решается гораздо проще и оптимальней.
PM   Вверх
Чoо
Дата 6.12.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



bsa, тоесть библиотеки типа cstring в принципе выполняют то же самое, что и string.h,  только отличаются более эфективной реализацией?

Это сообщение отредактировал(а) Чoо - 6.12.2010, 19:31


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
bsa
Дата 6.12.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



В С++ string.h зовется cstring. Отличий почти нет, разве что все стандартные символы (функции, переменные) помещены в пространство имен std. Это касается всех стандартных сишных хидеров (cstdio, cstdlib...)
PM   Вверх
Чoо
Дата 7.12.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



bsa, тогда не понимаю, почему если вместо 

Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


использовать
Код

#include <сstdio>
#include <сstdlib>
#include <сstring>

решение будет проще и оптимальней?

***
решил еще одну задачу.
Цитата

    Класс "Слово". Объявите класс "слово", полем которого является массив символов
    в свободной памяти с конструктором копирования и методами:
        - поулчить длину слова
        - определить расстояние между слвоами
        - сравнить объект с другим словом
    Класс должен иметь статическое поле, определяющее порядок следования букв в алфавите.

Код

/*
    Класс "Слово". Объявите класс "слово", полем которого является массив символов
    в свободной памяти с конструктором копирования и методами:
        - поулчить длину слова
        - определить расстояние между слвоами
        - сравнить объект с другим словом
    Класс должен иметь статическое поле, определяющее порядок следования букв в алфавите.
 */
#include <iostream>
using namespace std;

class word{
    char *w;
    int pos_char(const char c); //возвращает позицию символа в маске
    void cpy(char *dest, const char *src);
public:
    static char *mask;

    word():w(0){};
    word(const char *s)
    {
        w = new char[get_length()+1];
        cpy(w,s);
    }
    word(const word &p)
    {
        w = new char[p.get_length()+1];
        cpy(w,p.w);
    }
    ~word()
    {
        delete []w;
    }

    /*методы*/
    char *get_word()
    {
        return w;
    }

    int get_length() const
    {
        int i;
        for(i = 0; w[i]; ++i);
        return i;
    }
    int dist(const word &p); //находит расстояние между словами
    int cmp(const word &p);  //сравнивает объект с другим объектом. Результат выглядит так же, как и в strcmp
};
/*определим порядок следования символов (в объявлении класса было нельзя)*/
char *word::mask = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                  "abcdefghijklmnopqrstuvwxyz";
void word::cpy(char *dest, const char *src)
{
    for(int i = 0; src[i]; dest[i] = src[i], ++i);
}

int word::dist(const word &p)
{
    /*будем искать расстояние Kевенштейна по Вагнеру-Фишеру
      цена замены = цена вставки = цена удаления = 1
    */
    int l = 0; //расстояние

    int m = get_length()+1;
    int n = p.get_length()+1;

    /* инициализируем массив расстояний */
    int **d = 0;
    d = new int*[m];
    for(int i = 0; i < m; ++i)
        d[i] = new int [n];

    for(int i = 0; i < m; ++i)
        for(int j = 0; j< n; ++j)
        {
            if(!i && !j)
                d[i][j] = 0; //случай, когда обе строки не имеют ни одного символа
            else
            if(!i && j)
                d[i][j] = j; //первая строка - 0, вторая содержит символы => d(0,j) = j;
            else
            if(i && !j)
                d[i][j] = i; // d(i,0) = i;
            else            //i и j > 0                
            {
            int cost = w[i-1] == p.w[j-1] ? 0 : 1; //определяем цену замены
             d[i][j] = min(min(
                     d[i-1][j] + 1,         //цена удаления
                     d[i][j-1] + 1),      //цена вставки
                     d[i-1][j-1] + cost);  //цена замены
            }
        }
    if(d)
    {
        l = d[m-1][n-1];
        /*освобождаем память*/
        for(int i = 0; i < m; ++i)
            delete [] d[i];
        delete []d;
    }
    return l;
}
int word::pos_char(const char c)
{
    int i;
    for(i = 0; c!=mask[i] && mask[i]; ++i); //на всякий случай контролируем выход за пределы массива
    return i;
}

int word::cmp(const word &p)
{
    int i;
    for(i = 0; w[i] && p.w[i]; ++i)
    {
        if (pos_char(w[i]) < pos_char(p.w[i]))
            return -1;
        if (pos_char(w[i]) > pos_char(p.w[i]))
            return 1;
    }
    if (get_length() < p.get_length())
        return -1;
    else
    if (get_length() > p.get_length())
        return 1;
    return 0;
}

int main()
{
    word w("array");
    word w2("around");
    cout << "расстояние между словами: " << w.dist(w2) << endl;
    char r;
    switch(w.cmp(w2))
    {
    case -1:
        r = '<';
        break;
    case 1:
        r = '>';
        break;
    default:
        r = '=';
    }
    cout << w.get_word() << r << w2.get_word() << endl;
    return 0;
}

я так понял по условию, что вместо strcmp и getlng надо сделать свои функции. Ну а если их реализовывать самостоятельно, то значит не использовать cstring => придется реализовать и strcpy. 
Результат вроде правильынй smile Хотя вот конструктор не использовал, хоть и сделал его (передавал объект не по значению, а по ссылке)



--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 7.12.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата

    Класс "Депозитный вклад".
    Объявите класс "депозитный вклад", полями которого является:
        - денежная сумма
        - дата последнего перерасчета
    а методами:
        - добавить сумму
        - начислить проценты
        - снять с вклада только проценты
    Статическое поле - годовой процент.

как-то слишком просто... 
Код

/*
    Класс "Депозитный вклад".
    Объявите класс "депозитный вклад", полями которого является:
        - денежная сумма
        - дата последнего перерасчета
    а методами:
        - добавить сумму
        - начислить проценты
        - снять с вклада только проценты
    Статическое поле - годовой процент.
 */
#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;

class deposit{
    float balance;
    time_t date_of_recalc;
    void set_time();
public:
    const static float percent;
    deposit();
    deposit(const float money);

    void add_money(const float money);
    void assessmnt_percent();
    void rent_percent();

};
const float deposit::percent = 0.03;
/*конструкторы*/
deposit::deposit()
{
    balance = 0;
    set_time();
    printf("%s  Cоздан депозитный вклад под %.02f годовых\n  Баланс: %.02f$\n\n",ctime(&date_of_recalc),percent,balance);
}
deposit::deposit(const float money)
{
    balance = money;
    set_time();
    printf("%s  Cоздан депозитный вклад под %.02f годовых\n  Баланс: %.02f$\n\n",ctime(&date_of_recalc),percent,balance);
}

/*методы*/
void deposit::set_time()
{
    date_of_recalc = time(NULL);
}

void deposit::add_money(const float money)
{
    balance += money;
    set_time();
    printf("%s  Приход: +%.2f$\n  Баланс: %.02f$\n\n",ctime(&date_of_recalc),money,balance);

}
void deposit::assessmnt_percent()
{
    balance += balance * percent;
    set_time();
    printf("%s  Начислены проценты: +%.2f$\n  Баланс: %.02f$\n\n",ctime(&date_of_recalc),balance*percent,balance);
}
void deposit::rent_percent()
{
    balance -= balance*percent;
    set_time();
    printf("%s  Сняты проценты: -%.2f$\n  Баланс: %.02f$\n\n",ctime(&date_of_recalc),percent,balance);
}

int main()
{
    deposit d;
    sleep(1);
    d.add_money(100.36);
    sleep(1);
    d.assessmnt_percent();
    sleep(1);
    d.rent_percent();


    return 0;
}



--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 7.12.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата

   Класс "Стек".
   Объявите класс "Стек" с методами push() и pop(). Сделайте это на основе массива

тоже все просто. Память решил выделять так, как советовали ранее: каждый раз в 2 раза больше от имеющегося.
Код

/*
   Класс "Стек".
   Объявите класс "Стек" с методами push() и pop(). Сделайте это на основе массива
 */
#include <iostream>
#include <cstdlib>
using namespace std;

class stack{
    int *st; //указатель на массив чисел
    int curr; //индекс текущего элемента
    int size; //размер массива (кол-во элементов)
public:
    stack():st(0),curr(0),size(0) {};
    ~stack(){delete []st;}
    void push(int);
    int pop();
    int count();

};
void stack::push(int x)
{
    /*выделяем или перераспределяем память*/
    if(curr == size)
    {
        if(!size)
            size += 2;
        else
          size = size *2;
        st = (int *) realloc(st,4*size); //4 байта * кол-во элементов
    }
    st[curr] = x;
    ++curr;
}
int stack::pop()
{
    if(st)
    {
        int x = st[curr-1];
        --curr;
        /*освободим память, если ее выделено в 4 раза больше,чем нужно*/
        if(curr <= size / 4)
        {
            size /= 2;
            st = (int *) realloc(st,4*size);
        }
        return x;
    }
    return 0;
}
int stack::count()
{
    return curr+1;
}


int main()
{
    stack s;
    for(int i = 0; i<20; ++i)
        s.push(i);
    for(;s.count()-1;)
        cout << s.pop() << "  ";

    return 0;
}



--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 7.12.2010, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата

    Класс "очередь".
    Объявите класс "очередь" с методами put() и get().
    Сделайте это на основе связанного списка.

Код

/*
    Класс "очередь".
    Объявите класс "очередь" с методами put() и get().
    Сделайте это на основе связанного списка.
 */

#include <iostream>
using namespace std;

struct el{
    int value;
    el *next;
    el(){value = 0; next = 0;}
    el(const int v):value(v),next(0) {};
};

class stack{
     el *head;
     int count;
public:
     stack():head(0),count(0){};
     ~stack(); //нужно будет пройтись по списку и очистить его
     void put(const int v);
     int get();
     int get_count(){return count;}
};
stack::~stack()
{
    while(head)
    {
        el *curr = head->next;
        delete head;
        head = curr;
    }
}
void stack::put(const int v)
{
    if(!head)
        head = new el(v);
    else
    {
        el *p = new el(v);
        p->next = head;
        head = p;
    }
    ++count;
}
int stack::get()
{
    if(head) //на случай, если программист не контролирует наличие элементов в стеке
    {
        int result = head->value;
        el *p = head->next;
        delete head;
        head = p;
        --count;
        return result;
    }
    return 0;
}

int main()
{
    stack s;
    for(int i = 0; i<20; ++i)
        s.put(i);
    for(;s.get_count();)
        cout << s.get() << "  ";

    return 0;
}

все так же просто


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
mimik
Дата 7.12.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не Rohoss Я
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 1.11.2010

Репутация: нет
Всего: 2



Цитата(Чoо @  7.12.2010,  18:39 Найти цитируемый пост)

Код

for(;s.get_count();)        
    cout << s.get() << "  "; 


почему for а не while?
PM   Вверх
Чoо
Дата 7.12.2010, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



mimik, для разнообразия smile


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 7.12.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата

    Класс "очередь с приоритетами".
    Объявите класс "очередь с приоритетами", который наследует класс очередь.
    Каждый элемент очереди имеет приоритет - целое число. Первым обслуживается
    элемент с самым высоким приоритетом.

честно говоря, я не смог унаследовать класс el :(. Убил пару часов времени - ни как. Наверное надо было изначально проектировать приложение иначе..
но в задании говорили только о наследовании класса "очередь". Вобщем вопрос: можно было как-то унаследовать el? (единственный вариант, который вижу, это наследование, с переопределением поля next. 
потом бы пришлось бы наследовать очередь с переопределением поля head, но так кажется, что этот вариант будет через одно место...
Код

/*
    Класс "очередь с приоритетами".
    Объявите класс "очередь с приоритетами", который наследует класс очередь.
    Каждый элемент очереди имеет приоритет - целое число. Первым обслуживается
    элемент с самым высоким приоритетом.
 */

#include <iostream>
using namespace std;


struct el{
    int value;
    int priority; //добавил
    el *next;
    el(){value = 0; next = 0; priority = 0;}
    el(const int v):value(v),next(0) {priority = 0;}
    el(const int v, const int prior):value(v),priority(prior) {}; //добавил
};

class stack{
protected:
     el *head;
     int count;
public:
     stack():head(0),count(0){};
     ~stack(); //нужно будет пройтись по списку и очистить его
     virtual void put(const int v);
     virtual void put(const int v, const int prior){};
     virtual int get();
     int get_count(){return count;}
};
stack::~stack()
{
    while(head)
    {
        el *curr = head->next;
        delete head;
        head = curr;
    }
}
void stack::put(const int v)
{
    if(!head)
        head = new el(v);
    else
    {
        el *p = new el(v);
        p->next = head;
        head = p;
    }
    ++count;
}
int stack::get()
{
    if(head) //на случай, если программист не контролирует наличие элементов в стеке
    {
        int result = head->value;
        el *p = head->next;
        delete head;
        head = p;
        --count;
        return result;
    }
    return 0;
}


//наследуем класс "стек"
class stack_ext:public stack{
public:
    void put(const int v, const int prior);
    // поскольку элементы упорядочены по приоритету, метод get переопределять не нужно
};
void stack_ext::put(const int v, const int prior)
{
    if(!head)
        head = new el(v,prior);
    else
    {
        /*будем упорядочивать элементы по-убыванию приоритета.
          Это позволит при взятии элементов не производить лишний поиск*/
        el *pre = 0;
        el *curr = head;
        el *p = new el(v,prior);
        while(curr && p->priority > curr->priority)
        {
            pre  = curr;
            curr = curr->next;
        }
        if(!pre)
        {
            /*добавляем в начало списка*/
            p->next = head;
            head = p;
        }
        else
        {
            /*добавляем, ориентируясь на указатель на предыдущий элемент*/
            pre->next = p;
            p->next = curr;
        }
    }
    ++count;
}

int main()
{
    stack *s;
    s = new stack();
    for(int i = 0; i<20; ++i)
        s->put(i);
    for(;s->get_count();)
        cout << s->get() << "  ";
    delete s;
    cout << endl;
    /*стек с приоритетами*/
    s = new stack_ext();
    //для демонстрации ввел вручную 4 числа с разным приоритетом
    s->put(10,5);
    s->put(11,6);
    s->put(12,0);
    s->put(13,0);

    for(;s->get_count();)
        cout << s->get() << "  ";
    delete s;

    return 0;
}




--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Страницы: (8) Все « Первая ... 4 5 [6] 7 8 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1262 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.