Problem p00068 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <iostream>

using namespace std;

struct point {
  double x;
  double y;

  bool operator!=(point &p) { return (x != p.x || y != p.y); }
  bool operator==(point &p) { return (x == p.x && y == p.y); }
};

point getLeftPoint(int n, point *points);
double getCrossProduct(const point &a, const point &b, const point &o);
point operator-(const point &a, const point &b);
istream &operator>>(istream &s, point &p);

int main(void) {
  point points[100];
  int n;
  int ans;

  while (1) {
    cin >> n;
    if (cin.eof()) {
      break;
    }
    for (int i = 0; i < n; i++) {
      cin >> points[i];
    }

    point leftPoint = getLeftPoint(n, points);
    point stdPoint = leftPoint;
    point outsideLeftPoint;
    int vertexCounter = 0;

    while (1) {
      for (int i = 0; i < n; i++) {
        int flag = 0;
        if (points[i] != stdPoint) {
          for (int j = 0; j < n; j++) {
            if (points[j] != stdPoint) {
              if (getCrossProduct(points[i], points[j], stdPoint) > 0) {
                flag = 1;
                break;
              }
            }
          }
          if (flag == 0) {
            outsideLeftPoint = points[i];
            break;
          }
        }
      }
      stdPoint = outsideLeftPoint;
      vertexCounter++;
      if (outsideLeftPoint == leftPoint) {
        break;
      }
    }
    ans = n - vertexCounter;
    std::cout << ans << endl;
  }

  return 0;
}

point getLeftPoint(int n, point *points) {
  point leftPoint = points[0];
  for (int i = 1; i < n; i++) {
    if (points[i].x < leftPoint.x) {
      leftPoint = points[i];
    }
  }
  return leftPoint;
}

double getCrossProduct(const point &a, const point &b, const point &o) {
  point ao = a - o;
  point bo = b - o;
  return (ao.x * bo.y) - (ao.y * bo.x);
}

point operator-(const point &a, const point &b) {
  point p;
  p.x = a.x - b.x;
  p.y = a.y - b.y;
  return p;
}

istream &operator>>(istream &s, point &p) {
  char c;
  return s >> p.x >> c >> p.y;
}

Fixed submission:
#include <iostream>

using namespace std;

struct point {
  double x;
  double y;

  bool operator!=(point &p) { return (x != p.x || y != p.y); }
  bool operator==(point &p) { return (x == p.x && y == p.y); }
};

point getLeftPoint(int n, point *points);
double getCrossProduct(const point &a, const point &b, const point &o);
point operator-(const point &a, const point &b);
istream &operator>>(istream &s, point &p);

int main(void) {
  point points[100];
  int n;
  int ans;

  while (1) {
    cin >> n;
    if (n == 0) {
      break;
    }
    for (int i = 0; i < n; i++) {
      cin >> points[i];
    }

    point leftPoint = getLeftPoint(n, points);
    point stdPoint = leftPoint;
    point outsideLeftPoint;
    int vertexCounter = 0;

    while (1) {
      for (int i = 0; i < n; i++) {
        int flag = 0;
        if (points[i] != stdPoint) {
          for (int j = 0; j < n; j++) {
            if (points[j] != stdPoint) {
              if (getCrossProduct(points[i], points[j], stdPoint) > 0) {
                flag = 1;
                break;
              }
            }
          }
          if (flag == 0) {
            outsideLeftPoint = points[i];
            break;
          }
        }
      }
      stdPoint = outsideLeftPoint;
      vertexCounter++;
      if (outsideLeftPoint == leftPoint) {
        break;
      }
    }
    ans = n - vertexCounter;
    std::cout << ans << endl;
  }

  return 0;
}

point getLeftPoint(int n, point *points) {
  point leftPoint = points[0];
  for (int i = 1; i < n; i++) {
    if (points[i].x < leftPoint.x) {
      leftPoint = points[i];
    }
  }
  return leftPoint;
}

double getCrossProduct(const point &a, const point &b, const point &o) {
  point ao = a - o;
  point bo = b - o;
  return (ao.x * bo.y) - (ao.y * bo.x);
}

point operator-(const point &a, const point &b) {
  point p;
  p.x = a.x - b.x;
  p.y = a.y - b.y;
  return p;
}

istream &operator>>(istream &s, point &p) {
  char c;
  return s >> p.x >> c >> p.y;
}