#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <iostream.h>
//#include "test.h"

struct vec2d{
  float x;
  float y;
};

//Function prototypes (for functions defined after main)
int multiply(int i,int j);
float multiply(float x,float y);
int multiply(int i,int j,int k);
//module function prototype
vec2d operator + (const vec2d& p1, const vec2d& p2);

int main()
{

  //Example of function overloading ->
  int m23,m234;
  float mf2pi;
  float xVal = 2.0;
  float yVal = 3.14;
  m23 = multiply(2,3);
  mf2pi = multiply(xVal,yVal);
  m234 = multiply(2,3,4);
  cout << "m23 = "<<m23<<"\n";
  cout << "mf2pi = "<<mf2pi<<"\n";
  cout << "m234 = "<<m234<<"\n";

  //Example of overloading the "+" operator
  vec2d aVec;
  vec2d bVec;
  vec2d cVec;
  aVec.x = 2;
  aVec.y = 3;
  bVec.x = 4;
  bVec.y = 5;

  cVec = aVec + bVec;

  cout << "cVec = "<<cVec.x<<" "<<cVec.y<<"\n";

  //Another way to define the vectors->
  vec2d  dVec = {6.0f, 7.0f};
  vec2d  eVec = {8.0f, 9.0f};
  cVec = dVec + eVec;
  vec2d fVec = dVec + eVec;
  cout << "cVec = "<<cVec.x<<" "<<cVec.y<<"\n";
  cout << "fVec = "<<fVec.x<<" "<<fVec.y<<"\n";
 
}

int multiply(int num1, int num2){
return num1*num2;
}

float multiply(float num1, float num2){
return num1*num2;
}

int multiply(int num1, int num2, int num3){
return num1*num2*num3;
}

vec2d operator + (const vec2d& p1, const vec2d& p2) {
  vec2d xyVec;

  xyVec.x = p1.x + p2.x;
  xyVec.y = p1.y + p2.y;
  return xyVec;
}
