diff --git a/practical_work/forces/Makefile b/practical_work/forces/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..6ef1cce54f914858ed0409dbeebde34136475830
--- /dev/null
+++ b/practical_work/forces/Makefile
@@ -0,0 +1,15 @@
+CC=gcc
+OPTS=-g -O3 -Wall -Wextra
+LINK=-lm
+
+main: main.o particle.o ../vec2/vec2.o
+	$(CC) $(OPTS) -o $@ $^ $(LINK)
+
+main.o: main.c
+	$(CC) $(OPTS) -c $^
+
+particle.o: particle.c particle.h
+	$(CC) $(OPTS) -c $^
+
+clean:
+	rm -f *.o main
diff --git a/practical_work/forces/main.c b/practical_work/forces/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..61a4717bd4935a156f9df0b93039ac94e0516ba4
--- /dev/null
+++ b/practical_work/forces/main.c
@@ -0,0 +1,15 @@
+#include "../vec2/vec2.h"
+#include "particle.h"
+
+int main() {
+    particle p = particle_create(vec2_create(0.0,0.0), 1.0);
+    particle_print(p);
+
+    int number = 10;
+    particle *parts = particle_random_create_list(vec2_create(0.0,0.0), vec2_create(1.0, 1.0), 0.0, 10.0, number);
+    particle_print_list(parts, number);
+
+    vec2 force = particle_compute_grav_force(parts[0], p);
+    vec2_print(force);
+
+}
\ No newline at end of file
diff --git a/practical_work/forces/particle.c b/practical_work/forces/particle.c
new file mode 100644
index 0000000000000000000000000000000000000000..ed3d1a5be3a9749a3be92646fe6f5f3c662b15e7
--- /dev/null
+++ b/practical_work/forces/particle.c
@@ -0,0 +1,63 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <assert.h>
+#include "particle.h"
+
+static double G = 6.27e-11;
+
+static double rand_to_range(double x0, double x1) {
+    double delta = x1 - x0;
+    double rescaled = (double)rand() / RAND_MAX * delta + x0;
+
+    return rescaled;
+}
+
+particle particle_create(vec2 r_, double m_) {
+    particle p = {.r = r_, .m = m_};
+    return p;
+}
+
+particle particle_random_create(vec2 min_r, vec2 max_r, double min_m, double max_m) {
+    double m = rand_to_range(min_m, max_m);
+
+    double x = rand_to_range(min_r.x, max_r.x);
+    double y = rand_to_range(min_r.y, max_r.y);
+
+    vec2 r = vec2_create(x, y);
+
+    return particle_create(r, m);
+}
+
+particle *particle_random_create_list(vec2 min_r, vec2 max_r, double min_m, double max_m, int number) {
+    particle *p = malloc(number * sizeof(particle_create));
+
+    srand(time(NULL));
+
+    for (int ip = 0; ip < number; ++ip) {
+        p[ip] = particle_random_create(min_r, max_r, min_m, max_m);
+    }
+
+    return p;
+}
+
+vec2 particle_compute_grav_force(particle lhs, particle rhs) {
+    vec2 rij = vec2_sub(lhs.r, rhs.r);
+    double distance = vec2_norm(rij);
+    assert(distance > 1e-10);
+    double factor = G * lhs.m * rhs.m / (distance * distance * distance);
+    printf("factor = %g %g %g %g %g\n", factor, lhs.m, rhs.m, distance, G);
+    return vec2_mul(factor, rij);
+}
+
+void particle_print(particle p) {
+    printf("m = %g\n", p.m);
+    vec2_print(p.r);
+}
+
+void particle_print_list(particle *p, int number) {
+    for (int ip = 0; ip < number; ++ip) {
+        printf("particle %d: \n", ip);
+        particle_print(p[ip]);
+    }
+}
diff --git a/practical_work/forces/particle.h b/practical_work/forces/particle.h
new file mode 100644
index 0000000000000000000000000000000000000000..bee52616efb487d0bc2cc417efbe736bbf8d4331
--- /dev/null
+++ b/practical_work/forces/particle.h
@@ -0,0 +1,24 @@
+#ifndef _PARTICLE_H_
+#define _PARTICLE_H_
+
+#include "../vec2/vec2.h"
+
+typedef struct _particle {
+    vec2 r;
+    double m;
+} particle;
+
+particle particle_create(vec2 r_, double m_);
+
+particle particle_random_create(vec2 min_r, vec2 max_r, double min_m, double max_m);
+
+particle *particle_random_create_list(vec2 min_r, vec2 max_r, double min_m, double max_m, int number);
+
+vec2 particle_compute_grav_force(particle lhs, particle rhs);
+
+void particle_print(particle p);
+
+void particle_print_list(particle *p, int number);
+
+
+#endif
\ No newline at end of file
diff --git a/practical_work/vec2/vec2.c b/practical_work/vec2/vec2.c
index 62272c359ced528332771a10b5477eee627464bc..834ae1340682c06d2d32c006e22a3efc71e45de1 100644
--- a/practical_work/vec2/vec2.c
+++ b/practical_work/vec2/vec2.c
@@ -51,5 +51,5 @@ bool vec2_is_approx_equal(vec2 lhs, vec2 rhs, double eps) {
 }
 
 void vec2_print(vec2 v) {
-    printf("x = %f, y = %f\n", v.x, v.y);
+    printf("x = %g, y = %g\n", v.x, v.y);
 }
\ No newline at end of file