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

Поиск:

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


Шустрый
*


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

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



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

- Vector в Char  (представить вектор ввиде символов x,y,z)
- Vector в String (представить вектор ввиде символов x,y,z)
- Vector в float
- Vector в double 

так же из этих типов обратно что бы можно было преобразовать допустим из char в Vector, String в  Vector, float в Vector ... etc..

т.е. преобразования в обе стороны, из и в.

Код

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

class Vector
{
    double coords[3]; //координаты вектора
    char cX[1], cY[1], cZ[1];

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 (Vector &vect){coords[0]=vect.cX[1]; coords[1]=vect.cY[1]; coords[2]=vect.cZ[1];}
    
    /*operator char*()
    {
        double i=5;
        char d1=char(i); //явное double к char
        char d2=i; //неявное
        Vector vect(5,2,1); 
        char d3=char(vect); //явное Vector в char
        char d4=vect; //неявное
        return coords;
    }

    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;
}


очень благодарен всем кто хоть как нибудь поможет.
PM MAIL   Вверх
t_gran
Дата 19.12.2011, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



mego4el, что-то не совсем понятно. Как вы видите следующее переводы?
Цитата

- Vector в Char  (представить вектор ввиде символов x,y,z)
- Vector в String (представить вектор ввиде символов x,y,z)
- Vector в float
- Vector в double 


Со String-ом вроде понятно, а с остальными не пойму. Приведите пример.


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
mego4el
Дата 19.12.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Со String-ом вроде понятно, а с остальными не пойму. Приведите пример. 



допустим вот преобразование из пользовательского Vector, в массив, вернее в указатель на double, указывающий на начало мсассива:
Код

operator double*()
    { 
        return coords;
    }    


далее вот его вызов:

Код

 cout<<"mas = ";
    for (double *p = st; p != st+3; ++p)
    {
        cout<<*p<<" ";
        st(1,2,3);
    }
    cout<<endl;


нужно реализовать преобразование "обратно" из массива в вектор.

Char - точно так же как и String. и обратно

во float - просто в числовом виде из Vector (а он double) и обратно

Это сообщение отредактировал(а) mego4el - 19.12.2011, 21:10
PM MAIL   Вверх
t_gran
Дата 20.12.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



mego4el, всё равно не понятно. Как вы в один символ (char) засунете double значение? Или вы имели в виду char*? И зачем координаты засовывать в массив? Вы прям текстом напишите, а не приводите вырезки из алгоритмов.
Код

 x=1.1
 y=2.2
 z=3.3
 
-----------------+-----------------------------------
 Конвертирование | Результат
-----------------+-----------------------------------
double->string   | str="1.1 2.2 3.3"
-----------------+-----------------------------------
double->double[] | arr[0]=1.1; arr[1]=2.2; arr[2]=3.3
-----------------+-----------------------------------
double->char     | ???
-----------------+-----------------------------------
double->float    | x=1.1; y=2.2; z=3.3
-----------------+-----------------------------------

???


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
mego4el
Дата 21.12.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

mego4el, всё равно не понятно. Как вы в один символ (char) засунете double значение? Или вы имели в виду char*? И зачем координаты засовывать в массив? Вы прям текстом напишите, а не приводите вырезки из алгоритмов.


да, имеется в ввиду char*.

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


Шустрый
*


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

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



вектор на самом деле "псевдо вектор", то есть у него в данном случае, даже нет направления, по сути дела это просто три дабла X,Y,Z.

нет, не одним! допустим вектор задан как double x=1, y=2, z=3, и его нужно преобразовать операторной функцией в char*, в итоге на выходе должно получится преобразование, чтото вроде char x=X, y=Y, z=Z, т.е. просто в символы перевести вектор. (без всяких логических убеждений). но я не знаю как расписать сие преобразование, без использования каких либо static_cast и тп.

так же само в float, только что в дабле - будет то же число в флоате, тут должно быть проще, но я не понимаю как это записать..

и самое главное нужно сделать преобразования из этих стандартных типов, обратно в пользовательский Vector
PM MAIL   Вверх
t_gran
Дата 22.12.2011, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



mego4el, что-то вроде этого подхода устроит?
Код

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

class TVector
{
   public:
      enum
      {
         X = 0, Y, Z
      };

   protected:
      double x, y, z;
   
   public:
      TVector(): x(0), y(0), z(0) { ; }

      TVector(double theX, double theY, double theZ)
      : x(theX), y(theY), z(theZ) { ; }
      
      TVector& To(float* theList)
      {
         theList[X] = static_cast<float>(x);
         theList[Y] = static_cast<float>(y);
         theList[Z] = static_cast<float>(z);
         
         return *this;
      }

      TVector& To(double* theList)
      {
         theList[X] = x;
         theList[Y] = y;
         theList[Z] = z;
         
         return *this;
      }
      
      TVector& To(string* theList)
      {
         stringstream buff;
         
         buff << x << " " << y << " " << z;
         buff >> theList[X] >> theList[Y] >> theList[Z];

         return *this;
      }

      TVector& From(double* theList)
      {
         x = theList[X];
         y = theList[Y];
         z = theList[Z];
         
         return *this;
      }

      TVector& From(float* theList)
      {
         x = static_cast<double>(theList[X]);
         y = static_cast<double>(theList[Y]);
         z = static_cast<double>(theList[Z]);
         
         return *this;
      }

      TVector& From(string* theList)
      {
         stringstream buff;

         buff << theList[X] << " " << theList[Y] << " " << theList[Z];
         buff >> x >> y >> z;

         return *this;
      }
      
      friend ostream& operator << (ostream& theOS, const TVector& theVector)
      {
         theOS << "(" << theVector.x << ", " << theVector.y << ", " << theVector.z << ")";

         return theOS;
      }
};

int main()
{
   TVector a(1.1, 2.2, 3.3);
   
   cout << a << endl;

   double dVec[3] = {2.1, 2.2, 2.3};
   float  fVec[3] = {3.1, 3.2, 3.3};
   string sVec[3] = {"4.1", "4.2", "4.3"};
   
   a.From(dVec).From(fVec).From(sVec);
   
   a.To(dVec).To(fVec).To(sVec);
   
   for (unsigned i = 0; i < 3; ++i)
   {
      cout << dVec[i] << " " << fVec[i] << " " << sVec[i] << endl;
   }
   
   return 0;
}



--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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