Struktury, konstrukce, invarianty, operátory.
struct Point{ int x; int y; }; struct Triangle{ Point a, b, c; }; Point pt{0, 2}; Triangle tr{{0, 0}, {0, 1}, {1, 2}};
enum class TriangleSymmetry{ EQUILATERAL, ISOSCELES, SCALENE }; enum class TriangleAngle{ ACUTE, RIGHT, OBTUSE }; TriangleSymmetry s = TriangleSymmetry::SCALENE;
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);
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}; }
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; } };
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}};
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_; } };
#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()); }
#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]; } };
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(); }
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
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í.
Nastavení znakové sady v konzoli:
chcp 1250
Pokud stále nefunguje, změňte písmo v konzoli: