Skip to content

Commit efbe0cf

Browse files
author
studentfedorov
committed
Added lab 10
1 parent 444c302 commit efbe0cf

File tree

10 files changed

+242
-0
lines changed

10 files changed

+242
-0
lines changed

Lab10/Makefile

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
CXX = g++
2+
CXXFLAGS = -O2 -Wall -Werror -std=c++03 -Iinclude
3+
LDFLAGS =
4+
5+
EXE = main
6+
SRCDIR = src
7+
BINDIR = bin
8+
9+
OBJECTS = $(patsubst $(SRCDIR)/%.cpp,$(BINDIR)/%.o,$(wildcard $(SRCDIR)/*.cpp))
10+
11+
all: $(EXE)
12+
13+
$(EXE): $(BINDIR) $(OBJECTS)
14+
$(CXX) $(OBJECTS) -o $(EXE) $(LDFLAGS)
15+
16+
$(BINDIR)/%.o: $(SRCDIR)/%.cpp
17+
$(CXX) $(CXXFLAGS) -c -MMD -o $@ $<
18+
19+
include $(wildcard $(BINDIR)/*.d)
20+
21+
$(BINDIR):
22+
mkdir -p $(BINDIR)
23+
24+
clean:
25+
rm -rf $(BINDIR) $(EXE)
26+
27+
.PHONY: clean all

Lab10/include/circle.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#pragma once
2+
3+
#include "figure.h"
4+
5+
class Circle : public Figure {
6+
public:
7+
Circle(int id, int x, int y, int radius, const char* l);
8+
void print() const;
9+
bool is_inside(int x, int y) const;
10+
void zoom(int factor);
11+
~Circle();
12+
protected:
13+
int radius;
14+
char *label;
15+
};

Lab10/include/figure.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
class Figure {
4+
public:
5+
Figure(int id, int x, int y);
6+
virtual ~Figure();
7+
8+
virtual void print() const = 0;
9+
virtual bool is_inside(int x, int y) const = 0;
10+
virtual void zoom(int factor) = 0;
11+
void move(int new_x, int new_y);
12+
int get_id() const;
13+
protected:
14+
int id;
15+
int x;
16+
int y;
17+
};

Lab10/include/rectangle.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include "figure.h"
2+
3+
class Rectangle : public Figure {
4+
public:
5+
Rectangle(int id, int x, int y, int width, int height);
6+
void print() const;
7+
bool is_inside(int x, int y) const;
8+
void zoom(int factor);
9+
~Rectangle();
10+
protected:
11+
int width;
12+
int height;
13+
};

Lab10/include/scheme.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
3+
#include "figure.h"
4+
5+
class Scheme{
6+
public:
7+
Scheme(int capacity);
8+
~Scheme();
9+
10+
void push_back_figure(Figure* fg);
11+
void remove_figure(int id);
12+
13+
void print_all_figures();
14+
void zoom_figure(int id, int factor);
15+
Figure* is_inside_figure(int x, int y);
16+
void move(int id, int new_x, int new_y);
17+
18+
private:
19+
Figure** figures_;
20+
int size_;
21+
};

Lab10/src/circle.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "circle.h"
2+
#include <cstring>
3+
#include <cstdio>
4+
#include <cmath>
5+
6+
Circle::Circle(int id, int x, int y, int r, const char* l):Figure(id, x, y){
7+
radius = r;
8+
label = new char[strlen(l)+1];
9+
strcpy(label, l);
10+
}
11+
12+
void Circle::print() const{
13+
printf("Circle %d: x = %d y = %d radius = %d label = %s\n", id, x, y, radius, label);
14+
}
15+
16+
bool Circle::is_inside(int sx, int sy) const{
17+
return (sqrt((sx-x)*(double)(sx-x) + (sy-y)*(double)(sy-y)) <= radius);
18+
}
19+
20+
void Circle::zoom(int factor){
21+
radius *= factor;
22+
}
23+
24+
Circle::~Circle(){
25+
delete []label;
26+
}

Lab10/src/figure.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "figure.h"
2+
3+
Figure::Figure(int id, int x, int y):id(id), x(x), y(y){}
4+
5+
Figure::~Figure(){}
6+
7+
void Figure::move(int new_x, int new_y){
8+
x = new_x;
9+
y = new_y;
10+
}
11+
12+
int Figure::get_id() const{
13+
return id;
14+
}

Lab10/src/main.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <stdio.h>
2+
3+
#include "scheme.h"
4+
#include "rectangle.h"
5+
#include "circle.h"
6+
7+
8+
int main() {
9+
Scheme scheme(10);
10+
11+
scheme.push_back_figure(new Rectangle(1, 5, 5, 10, 10));
12+
scheme.push_back_figure(new Circle(2, 3, 3, 3, "very nice circle"));
13+
14+
scheme.print_all_figures();
15+
16+
Figure* found = scheme.is_inside_figure(5, 5);
17+
if (found != 0) {
18+
found->print();
19+
}
20+
else {
21+
printf("not found\n");
22+
}
23+
24+
scheme.zoom_figure(1, 2);
25+
scheme.print_all_figures();
26+
scheme.remove_figure(1);
27+
scheme.print_all_figures();
28+
29+
return 0;
30+
}

Lab10/src/rectangle.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "rectangle.h"
2+
#include <cstring>
3+
#include <cstdio>
4+
#include <cmath>
5+
6+
Rectangle::Rectangle(int id, int x, int y, int width, int height):Figure(id, x, y), width(width), height(height){}
7+
8+
void Rectangle::print() const{
9+
printf("Rectangle %d: x = %d y = %d width = %d height = %d\n", id, x, y, width, height);
10+
}
11+
12+
bool Rectangle::is_inside(int sx, int sy) const{
13+
return (2 * x - width <= 2 * sx && 2 * sx <= 2 * x + width && 2 * y - height <= 2 * sy && 2 * sy <= 2 * y + height);
14+
}
15+
16+
void Rectangle::zoom(int factor){
17+
width *= factor;
18+
height *= factor;
19+
}
20+
21+
Rectangle::~Rectangle(){}
22+

Lab10/src/scheme.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include "scheme.h"
2+
#include <algorithm>
3+
#include <utility>
4+
5+
Scheme::Scheme(int capacity){
6+
size_ = 0;
7+
figures_ = new Figure* [capacity];
8+
}
9+
10+
Scheme::~Scheme(){
11+
for (int i = 0; i < size_; i++)
12+
delete figures_[i];
13+
delete []figures_;
14+
}
15+
16+
void Scheme::push_back_figure(Figure* fg){
17+
figures_[size_] = fg;
18+
size_++;
19+
}
20+
21+
void Scheme::remove_figure(int id){
22+
int pos = 0;
23+
for (; pos < size_; pos++)
24+
if (figures_[pos] -> get_id() == id)
25+
break;
26+
if (pos == size_)
27+
return;
28+
for (int i = pos; i + 1 < size_; i++)
29+
std::swap(figures_[i], figures_[i+1]);
30+
size_--;
31+
delete figures_[size_];
32+
}
33+
34+
void Scheme::print_all_figures(){
35+
for (int i = 0; i < size_; i++){
36+
figures_[i] -> print();
37+
}
38+
}
39+
40+
void Scheme::zoom_figure(int id, int factor){
41+
for (int i = 0; i < size_; i++)
42+
if (figures_[i] -> get_id() == id)
43+
figures_[i] -> zoom(factor);
44+
}
45+
46+
Figure* Scheme::is_inside_figure(int x, int y){
47+
for (int i = 0; i < size_; i++)
48+
if (figures_[i] -> is_inside(x, y))
49+
return figures_[i];
50+
return NULL;
51+
}
52+
53+
void Scheme::move(int id, int new_x, int new_y){
54+
for (int i = 0; i < size_; i++)
55+
if (figures_[i] -> get_id() == id)
56+
figures_[i] -> move(new_x, new_y);
57+
}

0 commit comments

Comments
 (0)