Обновить
28
Никита Гусаков@hell0w0rd

Пользователь

12
Подписчики
Отправить сообщение
Я долго сомневался прежде чем так писать. Однако лабу приняли, все ок. То есть компилятор сам не отправит пустой объект в функцию?
И? Области видимости тоже можно переопределить, только зачем?
Кода других студентов под рукой нет — вот мое бинарное дерево. Заменив NULL на 0 простой заменой по файлу вроде никаких изменений нет, кроме утечек памяти, которые судя по всему и так должны быть. Надо бы исправить.
Скрытый текст
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

class Product{
private:

    int num;
    // string name;
    // string supplier;
    // int count;
    // string date;

public:

    void input(){
        // cout<<"Product:            "; getline(cin, name);
        // cout<<"Supplier:           "; getline(cin, supplier);
        // cout<<"Date:               "; getline(cin, date);
        // cout<<"Amount:             "; cin>>count;
        cout<<"Number of delivery: "; cin>>num;
    }
    static Product getkey(){
        Product key;
        cout<<"Key: ";
        cin>>key.num;
        return key;
    }
    void print(){
        cout<<"Number of delivery: "<<num<<"\n";
        // cout<<"Product:            "<<name<<"\n";
        // cout<<"Supplier:           "<<supplier<<"\n";
        // cout<<"Amount:             "<<count<<"\n";
        // cout<<"Date:               "<<date<<"\n";
    }
    void output(ostream &stream){
        stream<<num;
    }
    friend bool operator <(Product const a, Product const b){
        return a.num < b.num;
    }

    friend bool operator ==(Product const a, Product const b){
        return a.num == b.num;
    }
};

class node
{
public:
    Product data;
    node *left,
         *right;

    void output(ostream &stream){
        if(this != NULL){
            left->output(stream);
            data.output(stream);
            stream<<" ";
            right->output(stream);
        }
    }
    node(Product var){
        data = var;
        left = right = NULL;
    }
    void remove(){
        if(this != NULL){
            left->remove();
            right->remove();
            delete left;
            delete right;
        }
    }
    ~node(){
        this->remove();
    }
    void output_sheets(){
        if(this != NULL){
            if(left == NULL && right == NULL){
                data.print();
            }else{
                left->output_sheets();
                right->output_sheets();
            }
        }
    }
};

class bintree
{
private:
    node *root;
public:
    bintree(){
        root = NULL;
    }
    bool add(){
        Product new_data;
        new_data.input();

        if(root == NULL){
            root = new node(new_data);
            return true;
        }
        node *elem = root,
                        *parent = NULL;
        bool isLeft;
        while(elem != NULL){
            if(new_data == elem->data){
                return false;
            }
            isLeft = new_data < elem->data;
            parent = elem;
            if(isLeft){// если новый элемент меньше корня
                elem = elem->left;
            }else{
                elem = elem->right;
            }
        }
        if(isLeft){
            parent->left = new node(new_data);
        }else{
            parent->right = new node(new_data);
        }
        return true;
    }

    void output(ostream &stream){
        root->output(stream);
    }
    void remove_max(){
        node *elem = root,
             *prev = NULL;
        while(elem->right != NULL){
            prev = elem;
            elem = elem->right;
        }
        if(elem == root){
            root = root->left;
        }else{
            prev->right = NULL;
        }
        delete elem;
    }

    void output_sheets(){
        root->output_sheets();
    }

    Product find(){
        Product key = Product::getkey();
        node *elem = root;
        while(elem != NULL){
            if(key == elem->data){
                return elem->data;
            }else if(key < elem->data){// если новый элемент меньше корня
                elem = elem->left;
            }else{
                elem = elem->right;
            }
        }
        return Product();
    }
};

void clear(){
    cout<<"\n";
    for(int i=0; i<30; i++) cout<<"-";
    cout<<"\n";
}
void menu(){
    clear();
    cout<<"1) Add node\n";
    cout<<"2) Find node by key\n";
    cout<<"3) Output tree\n";
    cout<<"4) Remove node with max key\n";
    cout<<"5) Output tree's sheets\n";
    cout<<"6) Output in file\n";
    cout<<"0) Quit\n";
    cout<<"Your choise: ";
}
int main()
{
    bintree tree;
    int ch;
    while(true)
    {
        menu();
        cin>>ch;
        switch(ch)
        {
            case 1:
                if(!tree.add()){
                    cout<<"Element with this key exsist";
                }else{
                    cout<<"Element succesfully added";
                }
                break;
            case 2:
                tree.find().print();
                break;
            case 3:
                tree.output(cout);
                break;
            case 4:
                tree.remove_max();
                break;
            case 5:
                tree.output_sheets();
                break;
            case 6:{
                char filename[50];
                cout<<"Filename: ";
                cin>>filename;
                ofstream filestr(filename);
                if (filestr.is_open()){
                    tree.output(filestr);
                    filestr.close();
                }else{
                    cout << "Error opening file";
                }
            }
            break;
            case 0:
                return 0;
                break;
        }
    }

}

Конечно выбирает, ведь 0 === (int)0, а NULL = либо 0, а может nullptr
Если изменить f(0) на f(NULL) — компиляторы не сообразят какую из функций выбрать.
Конечно нет! И потому не согласен с тем, что NULL можно заменять в коде 0.
Что и как реализовано в языке в действительности — один вопрос. Области видимости в классах — важен только на этапе компиляции, однако позволяет не натворить глупостей.
И еще раз — потому надо разделять NULL и 0.
А что там должно не работать? Собственно ваш пример должен бы работать, в функцию же отправляется результат выражения, или я чего-то не понимаю?
А используется такое в переборе указателей в списках, деревьях и тд
В примере выше ваша функция принимала переменную, а не указатель. Мое, если можно так сказать возмущение как раз и было в том, что для чисел — использовать числа, а для указания пустоты — строки, или указателя, или возможно еще чего-то о чем я не знаю — NULL
while (1) { // НЕТ!
  :
}

Вот, кстати пример из статьи. Все знают, что while работает только с булевыми значениями, а значит все остальное внутри скобок приводится к булевому значению. Также все знают, что 1 == true.
Так почему же зная то, что NULL = 0 — стоит писать 0, а в циклах такая запись не естественна?
А почему код должен быть не корректен? Срабатывает приведение типов — NULL -> int(0).
Просто всегда бесило в коде знакомых студентов
Foo *a = new Foo();
// код код
if(a == 0)

Ну как указатель можно сравнивать с нулем? Это же логически не верно, пусть даже NULL на самом деле — 0.
То что можно и видимо нужно — я понимаю. Не понимаю почему, ведь 0 — цифра, а NULL — пустота. В целом вопрос — почему нужно использовать 0, когда NULL понятнее?
PS то есть
for(int i=0; i<n; i++){}//  ясно
node *temp = NULL// вот тут явно NULL яснее смотрится чем 0?
Как-то раз мой учитель математики доказал, с одной ошибкой, на которую позже указал, что гипотенуза прямоугольного треугольника может быть равна катету. Все идет от подмены понятий, в данном случае не стоит путать время и отображение происходящего. Свет также находится во времени и зависит от него, в данный момент он просто до нас не дошел. А значит якобы путешествие во времени — всего лишь мираж
Учусь в институте, на c++ только лабы и курсовые. Всегда думал, что правильнее использовать NULL, ибо 0 — цифра, NULL — скорее пустота. Даже в небольших лабах это дает повышение читабельности, зачем нужно использовать 0, если используется не c++11?
Если честно — не понимаю почему? Симфони поставляется скорее как компоненты, в удачной сборки, силекс — еще одна сборка, а есть и другие. Пока учусь — можно эксперементировать, думаю еще пропел попробовать прикрутить, там вроде тоже не сложно.
Почему? Я не мог разобраться с Symfony, узнал про Silex, стал в нем копаться. Через какое-то время опять взял Symfony — все гораздо понятнее, если вы об этом.
Ухты! Узнал о Sublime Web Inspector. Судя по видео — шикарная вещь. Никого не слушайте, собирайте дайджесты, выкладывайте, огромное спасибо за ваш труд.
Мы все привыкли к гибкости и свободе, которую он дает, и мы не хотим от нее отказываться. В то же время, мы хотим, чтобы он был молниеносным, и оказывается, что при достижении миллиона строк кода, поддержка столь гибкого языка становится проблемой.

Хотим рыбку съесть и косточкой не подавиться.
Что же последнее время все так всполошились из-за гибкости языков? Ну нельзя же создать идеальный яп, всегда будут какие-то минусы и какие-то плюсы. Всегда найдется яп над яп, который генерирует родительский яп при компиляции, и выглядит лучше.
Ой. Год sublime использую и не знал о таких возможностях. А автосборку по сохранению не подскажите как настроить?
Прочитал статью — стало интересно. Установил в sublime плагин. Подскажите, как настроить куда выдавать файл, а то сейчас открывается временный файл, с скомпилированным js
Не понятно зачем нужна кнопка «Close», когда " The Python Network" остается.
+ Кнопка меню почему-то перекидывает вниз. Как сказали ниже — новичков(меня на пример) такое поведение запутало

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность