Cvičení 3

Struktury, konstrukce, invarianty, operátory.

Zadání - klasifikace trojúhelníků

Klasifikace trojúhelníků

Příklady trojúhelníků

typy trojúhelníků

Struktura

struct Point{
  int x;
  int y;
};

struct Triangle{
  Point a, b, c;
};

Point pt{0, 2};
Triangle tr{{0, 0}, {0, 1}, {1, 2}};
Ř. 4, ";": Nezapomenout středník!
Ř. 10, "}": žádné new

Výčtový typ

enum class TriangleSymmetry{
  EQUILATERAL,
  ISOSCELES,
  SCALENE
};
enum class TriangleAngle{
  ACUTE,
  RIGHT,
  OBTUSE
};

TriangleSymmetry s = TriangleSymmetry::SCALENE;
Ř. 1, "TriangleSymmetry": scoped enum

Členské funkce

struct Point{
  int x, y;

  long dotProduct(const Point& other) const{
    return (long)x * other.x + (long)y * other.y;
  }
  long crossProduct(const Point& other) const{
    return (long)x * other.y - (long)y * other.x;
  }
};

Point p1{1, 2}, p2{2, 3};

long d = p1.dotProduct(p2);
Ř. 4, "const": neměníme objekt
Ř. 8, "y": není potřeba psát this.y

Operátory

struct Point{
  int x, y;

  Point operator-(const Point& other) const {
    return Point{x - other.x, y - other.y};
  }
};

Point operator-(const Point& a, const Point& b){
  return Point{a.x - b.x, a.y - b.y};
}
Ř. 9, ")": ekvivalentí definice mimo třídu

Určení typu

struct Triangle{
  Point a,b,c;

  TriangleAngle angle() const {
    long abc = (b-a).dotProduct(c-a);
    long cab = (a-c).dotProduct(b-c);
    long bca = (c-b).dotProduct(a-b);
    if(abc < 0 || cab < 0 || bca < 0)
      return TriangleAngle::OBTUSE;
    else if(abc == 0 || cab == 0 || bca == 0)
      return TriangleAngle::RIGHT;
    else
      return TriangleAngle::ACUTE;
  }

  TriangleSymmetry symmetry() const {
    long ab = (b-a).dotProduct(b-a);
    long bc = (c-b).dotProduct(c-b);
    long ca = (a-c).dotProduct(a-c);

    if(ab == bc || bc == ca || ca == ab)
      return TriangleSymmetry::ISOSCELES;
    else
      return TriangleSymmetry::SCALENE;
  }
};

Konstruktor

Invariant: vektorový součin úseček nemůže být 0

struct Triangle{
  Point a, b, c;
  Triangle(Point a, Point b, Point c):
    a(a), b(b), c(c){
    if((b-a).crossProduct(c-b) == 0)
      throw exception("invalid triangle");
  }
};

Triangle t1{{0, 1}, {1, 2}, {2, 3}};
Triangle t2{{0, 1}, {1, 2}, {2, 0}};
Ř. 4, ")": inicializace členských proměnných
Ř. 10, "}": výjimka

Skrývání, gettery

class Triangle {
  Point a_, b_, c_;
public:
  Triangle(Point a, Point b, Point c):
    a_(a), b_(b), c_(c){
    if((b-a).crossProduct(c-b) == 0)
      throw exception("invalid triangle");
  }
  Point a() const {
    return a_;
  }
  Point b() const {
    return b_;
  }
  Point c() const {
    return c_;
  }
};
Ř. 1, " ": class = struct{private:
Ř. 2, "a_, b_, c_; a_, b_, c_": nelze přistupovat zvenku
Ř. 9, "const": metoda nemění objekt

Jak trojúhelníky setřídit

#include <algorithm>
#include <tuple>

bool operator<(const Point& left, const Point& right){
    return tie(left.x, left.y) < tie(right.x, right.y);
}
bool operator<(const Triangle& left, const Triangle& right){
  return tie(left.a(), left.b(), left.c()) <
    tie(right.a(), right.b(), right.c());
}
vector<Triangle> triangles;
sort(triangles.begin(), triangles.end());
Ř. 2, ")": setřídí celý vektor

Změna implementace

#include <array>
class Triangle{
  array<Point, 3> points_;

public:
  Triangle(Point a, Point b, Point c):
    points_{a, b, c} {
    ...
  }
  Point a() const {
    return points_[0];
  }
  Point b() const {
    return points_[1];
  }
  Point c() const {
    return points_[2];
  }
};
Ř. 3, "points_": pole pevně dané délky

Výpis

ostream& operator<<(ostream& os, const Point& p){
  os << p.x << ' ' << p.y;
}
ostream& operator<<(ostream& os, const Triangle& t){
  os << t.a() << ' ' << t.b() << ' ' << t.c();
}

Registr kandidátů

Načtěte seznam kandidátů do PS. Pro každou stranu vypište 3 nejmladší kandidáty.

Data (z 12. 10. 2017): ZIP

Zdroj dat: Český statistický úřad, podmínky užití

Kostra programu + načtení vstupu: Kandidati.cpp

Registr kandidátů

Formát výstupu:

Strana1:
Jméno Příjmení, věk, povolání, město.
Jméno Příjmení, věk, povolání, město. 
Jméno Příjmení, věk, povolání, město. 

Strana2:
Jméno Příjmení, věk, povolání, město. 
Jméno Příjmení, věk, povolání, město. 
Jméno Příjmení, věk, povolání, město. 

Není-li výběr jednoznačný, preferujte abecedně první podle příjmení.

Háčky a čárky

Nastavení znakové sady v konzoli:

chcp 1250

Kódování 1250

Háčky a čárky

Pokud stále nefunguje, změňte písmo v konzoli:

Změna písma