Simple Vector
A. First Edition
This is really a trivial practice for Vector which I find so difficult to memorize. So, I decide to write a simple
code to help myself to memorize them.
What is the basic operation of Vector?
E.Further improvement
F.File listing
project client:
1. vector.h
2. vector.cpp
3. main.cpp
file name: vector.h
#include <stdio.h> #include <stdlib.h> class Vector { friend Vector operator *(double scalar, const Vector& v); private: int degree; double* tuples; //this is stupid way for passing result in operator + //static Vector result; public: void set(double num1,...); //Vector(int defaultDegree=3, ...); Vector(int defaultDegree=3); ~Vector(); void display(); double norm() const; Vector unit(); bool orthogonal(const Vector& other); double cos(const Vector& other); Vector project(const Vector& other); double distance(const Vector& other); Vector operator+(const Vector& other); Vector operator-(const Vector& other); const Vector& operator=(const Vector& other); const Vector& operator*(double scalar); double operator*(const Vector& other); };
file name: vector.cpp
#include "vector.h" #include <stdarg.h> #include <math.h> Vector operator *(double scalar, const Vector& v) { Vector result(v.degree); for (int i=0; i<result.degree; i++) { result.tuples[i]=v.tuples[i]*scalar; } return result; } //Vector Vector::result; Vector::~Vector() { //delete []tuples; //tuples=NULL; } Vector::Vector(int defaultDegree):degree(defaultDegree) { tuples=new double[degree]; } double Vector::norm() const { double result=0; for (int i=0; i<degree; i++) { result+=tuples[i]*tuples[i]; } return sqrt(result); } Vector Vector::operator -(const Vector& other) { if (degree!=other.degree) { printf("degree not same\n"); exit(1); } Vector result(degree); for (int i=0; i<degree; i++) { result.tuples[i]=tuples[i]-other.tuples[i]; } return result; } Vector Vector::project(const Vector& other) { return cos(other) * other; } double Vector::distance(const Vector& other) { return (this->operator -(other)).norm(); } double Vector::cos(const Vector& other) { return (this->operator *(other))/(norm()*other.norm()); } bool Vector::orthogonal(const Vector& other) { return this->operator *(other)==0; } Vector Vector::unit() { return this->operator *(1/this->norm()); } void Vector::set(double num1, ...) { double* ptr=&num1; for (int i=0; i<degree; i++) { tuples[i]=*ptr; ptr++; } } void Vector::display() { printf("("); for (int i=0; i<degree-1; i++) { printf("%.3f,", tuples[i]); } printf("%.3f)\n", tuples[degree-1]); } /* Vector::Vector(int defaultDegree, ...):degree(defaultDegree) { char* ptr=(char*)&defaultDegree; tuples=new double[degree]; //double d=num1; //va_list marker; //va_start( marker, num1 ); ptr+=sizeof(int); for (int i=0; i<degree; i++) { //printf("num %d: %e\n", i, *(double*)(ptr)); tuples[i]=*(double*)(ptr); ptr+=sizeof(double); } } */ Vector Vector::operator +(const Vector& other) { if (degree!=other.degree) { printf("degree not same\n"); exit(1); } Vector result(degree); for (int i=0; i<degree; i++) { result.tuples[i]=tuples[i]+other.tuples[i]; } return result; } const Vector& Vector::operator =(const Vector& other) { degree=other.degree; for (int i=0; i<degree; i++) { tuples[i]=other.tuples[i]; } return *this; } const Vector& Vector::operator *(double scalar) { for (int i=0; i<degree; i++) { tuples[i]*=scalar; } return *this; } double Vector::operator *(const Vector& other) { if (degree!=other.degree) { printf("degree not same!\n"); exit(1); } double result=0; for (int i=0; i<degree; i++) { result+=tuples[i]*other.tuples[i]; } return result; }
file name: main.cpp
#include "vector.h" int main() { Vector v; v.set(3.4, 5.6, 8.0); v.display(); Vector u; u=v; u.display(); u=u+v; u.display(); printf("result of scalar 5.3: %.3f\n", u*v); printf("u.cos(v)=%.3f\n", u.cos(v)); return 0; }
What is the result?
(3.400,5.600,8.000)
(3.400,5.600,8.000)
(6.800,11.200,16.000)
result of scalar 5.3: 213.840
u.cos(v)=1.000
Press any key to continue