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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобразование типов 
:(
    Опции темы
mego4el
Дата 24.11.2011, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



имеется следующий код, подскажите, как можно самым простым способом сделать преобразование типов? прочитал много разной теории и никак не могу понять на практике как это.:(

Код

#include <iostream>
class Vector
{
    double coords[3]; 

public:
    double &operator[](int i)
    {
        int k=i%3;
        return coords[k];
    }
    Vector operator() (double x, double y, double z)
    {
        coords[0]=x;
        coords[1]=y;
        coords[2]=z;
        return *this;
    }
    Vector operator () (Vector a, Vector b)
    {
        for (int i=0;i<3;i++)
            coords[i]=a[i+1]*b[i+2]-a[i+2]*b[i+1];
        return *this;
    }
    double operator* (Vector obj)
    {
        double res=0;
        for (int i=0;i<3;i++)
            res+=coords[i]*obj[i];
        return res;
    }

    Vector(double x, double y, double z)
    {
        coords[0]=x;
        coords[1]=y;
        coords[2]=z;
    }

    Vector(double x, double y, double z)
    {
        float 
    }
    void show()
    {
        cout<<"("<<coords[0]<<", "<<coords[1]<<","<<coords[2]<<")\n";
    }
    
    Vector()
    {
        for (int i=0;i<3;i++)
            coords[i]=0;
    }
};

int main()
{
    Vector a,b(2,1,3),c;
    a(1,-3,4);
    a.show();
    b.show();

    cout<<"a*b="<<a*b<<endl;
    c(a,b);
    cout<<"[ab]=";
    c.show();
    return 0;
}

PM MAIL   Вверх
bsa
Дата 24.11.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



какие типы в какие ты не знаешь как преобразовывать?
Естественно, просто так нельзя преобразовать тип Vector к типу double. В тоже время, тип int к последнему вполне корректно автоматически может быть преобразован.

Это сообщение отредактировал(а) bsa - 24.11.2011, 10:45
PM   Вверх
mego4el
Дата 30.11.2011, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нужны преобразования:

в string, массив, float

еще возник вопрос, как можно перегрузить унарный оператор, что бы он менял направление вектора?

спасибо!

Добавлено через 1 минуту и 35 секунд
разумеется из пользовательского типа ( и обратно в него)
PM MAIL   Вверх
bsa
Дата 30.11.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mego4el @  30.11.2011,  04:48 Найти цитируемый пост)
нужны преобразования:

в string, массив, float
Преобразования чего? В массив чего? И как ты хочешь преобразовать массив double в число float?

Цитата(mego4el @  30.11.2011,  04:48 Найти цитируемый пост)
еще возник вопрос, как можно перегрузить унарный оператор, что бы он менял направление вектора?
Какой ответ ты ожидаешь? Варианты: легко, запросто, руками...

Цитата(mego4el @  30.11.2011,  04:48 Найти цитируемый пост)
разумеется из пользовательского типа ( и обратно в него) 

Если ты про преобразование что-то во что-то, то для этого идеально подходит boost::lexical_cast. Если же ты не можешь использовать boost, то можешь сам его аналог написать:
Код
template<class S, class D>
D lexical_cast(S from)
{
    std::stringstream stream;
    stream << from;
    D ret;
    stream >> ret;
    return ret;
}

template<typename S, typename D>
std::vector<D> lexical_cast(const std::vector<S> &from)
{
    std::vector<D> ret;
    ret.reserve(from.size());
    std::transform(from.begin(), from.end(), std::back_inserter(ret), &lexical_cast<S,D>);
    return ret;
}

PM   Вверх
newbee
Дата 30.11.2011, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Bsa злой, у bsa ПМС?))

mego4el, преобразование типов можно сделать двумя способами. Например преобразуем из типа A в тип B.

Способ 1: в B создаем конструктор преобразования из A

Код

B::B(A const &a){
 // вытаскиваем из a нужные части и на основе их конструируем новый B.
}


Способ два: в A создаем оператор преобразования в B

Код

A::operator B()const{
 // вытаскиваем из this нужные части и на их основе создаем и настраиваем B.
}



--------------------
You're face to face
With man who sold the world
PM   Вверх
mego4el
Дата 30.11.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Преобразования чего? В массив чего? И как ты хочешь преобразовать массив double в число float?

да не важно чего, просто хочется понять как это делается, в массив чего угодно. я не знаю как, по этому и спрашиваю. мне сказал преподаватель что нужно преобразовать данный терхмерный вектор в string, float и массив.

newbee, спасибо. я никак не могу найти материалов в интернете, что вообще представляет из себя "пользовательский" и "не пользовательский" тип, не могу разобраться с этими понятиями...
PM MAIL   Вверх
bsa
Дата 30.11.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mego4el @  30.11.2011,  14:32 Найти цитируемый пост)
да не важно чего, просто хочется понять как это делается, в массив чего угодно. я не знаю как, по этому и спрашиваю. мне сказал преподаватель что нужно преобразовать данный терхмерный вектор в string, float и массив.

Ты можешь преобразовать камаз в ящик апельсинов? Я лично нет... А чтобы делать подобное преобразование нужно знать зачем, что в итоге быть должно. Вот пока ты не расскажешь, что должно получиться после преобразования переменной типа double в массив типа int, например, то никто тебе и не расскажет, как это делать. Так как вариантов есть куча, и каждый конкретный для своего особого случая (в одном случае это количество ящиков, которые влезают в кузов, во втором - количество ящиков, необходимое для создания из апельсинов трехмерной модели камаза, в третьем - количество ящиков, для создания картины апельсинами, в четвертом - количество ящиков, которое теоретически может он увезти исходя из массы...).

Цитата(mego4el @  30.11.2011,  14:32 Найти цитируемый пост)
что вообще представляет из себя "пользовательский" и "не пользовательский" тип

пользовательский тип - это любой нестандартный тип (читай структура, объединение и класс). Стандартные:
bool
[[un]signed] char
[[un]signed] [long|long long|short] int
float
[long] double
все "не умные" указатели (void*, MyType *...)
Надеюсь, я ничего не забыл.
PM   Вверх
baldina
Дата 30.11.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mego4el @  30.11.2011,  13:32 Найти цитируемый пост)
 мне сказал преподаватель что нужно преобразовать данный терхмерный вектор в string, float и массив.

1. как преобразовывать (математически) вектор во float пусть расскажет преподаватель, мы не поняли
2. в string видимо имеется в виду создать некое (похоже, произвольное) текстовое представления вектора
например, вектор Vector v(x,y,z) может быть представлен строкой "(x,y,z)".
тогда функция преобразования выглядит так
Код

class Vector {
 ...
  std::string toString () const { 
      std::stringstream result; 
      result << '(';
      for (int i=0; i < 3; ++i) {
         if (i>0) result << ',';
         result << coords[i];
      }
      result << ')';
      return result.str();
  }    
 ...
};

можно std::string toString () const переименовать в operator std::string() const,
тогда можно делать такие вызовы:
Код

Vector v(1,2,3);
std::string str = v;

3. в массив (точнее - в указатель на double, указывающий на начало мсассива) - совсем просто, т.к. представление вектора и есть массив:
Код

class Vector {
 ...
  operator double*() const { 
      return coords;
  }    
 ...
};

...
Vector v(1,2,3);
for (const double *p = v; p != v+3; ++p)
  std::cout << *p;

PM MAIL   Вверх
mes
Дата 30.11.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(baldina @  30.11.2011,  13:42 Найти цитируемый пост)
 т.к. представление вектора и есть массив:

а о том ли векторе Вы говорите, которй нужен тс  smile 


--------------------
PM MAIL WWW   Вверх
baldina
Дата 30.11.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



 smile 
про ето знает только препод, но подозреваю что вероятность высока
PM MAIL   Вверх
mego4el
Дата 12.12.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <iostream>
#include <windows.h>
#include <string.h>
using namespace std;
const int col=system("color 17");

class Vector
{
    double coords[3]; //координаты вектора

public:
    //перегрузка оператора квадратных скобок, для индексации обьектов
    double &operator[](int i)
    {
        int k=i%3;
        return coords[k];
    }
    //перегрузка скобок, для присваивания координатам значений
    Vector operator() (double x, double y, double z)
    {
        coords[0]=x;
        coords[1]=y;
        coords[2]=z;
        return *this;
    }
    //перегрузка скобок, для вычисления вект. произведения
    Vector operator () (Vector a, Vector b)
    {
        for (int i=0;i<3;i++)
            coords[i]=a[i+1]*b[i+2]-a[i+2]*b[i+1];
        return *this;
    }
    //перегрузка звездочки, для вычисления скалярного произведения
    double operator* (Vector obj)
    {
        double res=0;
        for (int i=0;i<3;i++)
            res+=coords[i]*obj[i];
        return res;
    }

    Vector(double x, double y, double z)
    {
        coords[0]=x;
        coords[1]=y;
        coords[2]=z;
    }
    //в массив
    operator double*()
    { 
        return coords;
    }    

    // вычитание векторов
    Vector operator - (Vector &rhs)
    {
        return Vector(coords[0]-rhs.coords[0], coords[1]-rhs.coords[1], coords[2]-rhs.coords[2]);
    }

    //метод для отображения координат
    void show()
    {
        cout<<"("<<coords[0]<<", "<<coords[1]<<","<<coords[2]<<")\n";
    }
    
    Vector()
    {
        for (int i=0;i<3;i++)
            coords[i]=0;
    }

    /*Vector operator string()
    {
        stringstream result; 
        result << '(';
        for (int i=0; i < 3; ++i) 
        {
            if (i>0) result << ',';
            result << coords[i];
        }
        result << ')';
        return result.str();
    }  */

        /*Vector operator - ()
    {
        return Vector( -coords[0], -coords[1], -coords[2] ); //отриц направление
    };

    Vector operator++ (int)
    {
        double x;
        double y;
        double z;
        x=+1;
        y=+2;
        z=+3;
        return *this;
    }*/
};

int main()
{
    Vector a,b,c,m1,m2,st,v;
    //вычитание
    m1(3,3,3);
    m2(1,2,1);
    cout<<"m1 = "; m1.show();
    cout<<"m2 = "; m2.show();
    m1=m1-m2;
    cout<<"m1-m2 = "; m1.show();
    //в указатель на double, указывающий на начало мсассива
    cout<<"mas = ";
    for (double *p = st; p != st+3; ++p)
    {
        cout<<*p<<" ";
        st(1,2,3);
    }
    cout<<endl;
    //в строку
    v(1,2,3);
    //string str = v;
    cout<<"vector to string = "<<"(x,y,z)"<<endl;
    //----
    a(1,-3,4);
    b(2,1,3);
    cout<<"a = "; a.show();
    cout<<"b = "; b.show();
    cout<<"a*b="<<a*b<<endl; //скалярное произвед
    c(a,b); //векторное произвед
    cout<<"[ab]=";
    c.show();
    return 0;
}


подскажите пожалуйста, что не так? преобразование в строку не работает(, и как можно сделать аналогичную реализацию только не в string а в *char ?
и как вообще реализуется преобразование обратно? (из чара обратно в мой вектор), так же интересует тот же вопрос по поводу преобразования вектора в массив и(или) флоат и назад в вектор..
PM MAIL   Вверх
bsa
Дата 12.12.2011, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



mego4el, чукча не читатель, чукча - писатель
Ответь на вопросы, которые тебе были заданы. После этого мы ответим на твои.
Если ты не понял вопросы, то приведи примеры исходных данных и результатов. А так же формулы. Запомни, вектор невозможно преобразовать к числу, не зная что под этим числом подразумевается (есть вектор скорости, и не понятно, тебе нужна ее проекция на X, Y или Z, а может вообще модуль?). Преобразовать к строке тоже самое. Ты хочешь увидеть координаты или модуль или что вообще? Тоже самое и про массив...
Если тебе необходимо просто получить строку в виде (x,y,z), то нет ничего проще - убери слово Vector из строки 72 и раскомментируй.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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