Skip to content

Commit 3943ffe

Browse files
authored
Reviews from week 1 homeworks (#16)
1 parent 0ee594b commit 3943ffe

File tree

96 files changed

+6920
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+6920
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
#include <iostream>
2+
#include <new>
3+
#include <cmath>
4+
5+
struct Dot {
6+
int x;
7+
int y;
8+
};
9+
10+
// Според мен тази структура е изцяло излишна. Аз лично бих си пазил само 3те точки в триъгълника.
11+
// Ако държиш да пазиш страната по някакъв начин, начало и край заедно с дължина е в повече(хабиш памет),
12+
// тъй като дължината можеш да изчислиш с двете точки в логаритмично време(заради sqrt) с питагорова формула.
13+
struct Side {
14+
Dot start;
15+
Dot end;
16+
double size;
17+
};
18+
19+
// В тази структура бих използвал само точките и потенциално лицето, ако не искам да го смятам всеки път(въпреки, че мога за константно време).
20+
struct Triangle {
21+
double area;
22+
Side sideA;
23+
Side sideB;
24+
Side sideC;
25+
};
26+
27+
// Тази функция не прави нищо! Въвеждат се стойности на локални променливи, които се освобождават, в края на scope-а на функцията.
28+
// Обект, който е по-голям от 8byte-а(Triangle) трябва да се подава по референция!!!
29+
void getDot(Triangle triangle) {
30+
int x, y;
31+
std::cout << "-100 <= xi, yi <= 100\nx = ";
32+
std::cin >> x;
33+
std::cout << "y = ";
34+
std::cin >> y;
35+
}
36+
37+
// Функцията не прави нищо!
38+
// Обект, който е по-голям от 8byte-а(Triangle) трябва да се подава по референция!!!
39+
void getTriangleDots(Triangle triangle) {
40+
char dots[] = { 'a', 'b', 'c'};
41+
42+
for (char ch: dots) {
43+
std::cout << "Dot " << ch << std::endl;
44+
getDot(triangle);
45+
}
46+
}
47+
48+
double getSideLen(Dot first, Dot second) {
49+
int formula = (second.x - first.x)*(second.x - first.x) + (second.y - first.y) * (second.y - first.y);
50+
51+
return sqrt(formula);
52+
}
53+
54+
void getSides(Triangle &triangle) {
55+
triangle.sideA.size = getSideLen(triangle.sideA.start, triangle.sideA.end);
56+
triangle.sideA.size = getSideLen(triangle.sideB.start, triangle.sideB.end);
57+
triangle.sideA.size = getSideLen(triangle.sideC.start, triangle.sideC.end);
58+
59+
}
60+
61+
double getTriangleArea(Triangle &triangle) {
62+
double a = triangle.sideA.size, b = triangle.sideB.size, c = triangle.sideC.size;
63+
64+
double p = (a + b + c) / 3;
65+
double formulaArea = p*(p - a)*(p - b)*(p - c);
66+
67+
return sqrt(formulaArea);
68+
}
69+
70+
void getTriangle(Triangle &triangle) {
71+
getTriangleDots(triangle);
72+
73+
triangle.area = getTriangleArea(triangle); // Всеки път ще е случайна, заради функциите за вход!!!
74+
}
75+
76+
void sort(Triangle arr[]) {
77+
//selection sort
78+
79+
}
80+
81+
void printTriangleAreas(const Triangle* arr, int size) {
82+
for (int i = 0; i < size; i++) {
83+
// Скобите не са нужни за адресиране на конкретния обект, но не пречи да ги има.
84+
std::cout << (arr[i]).area << std::endl;
85+
}
86+
}
87+
88+
int main()
89+
{
90+
// Добра практика е за индексации и пазене на размери на структури да се използват unsigned числа(size_t за предпочитане).
91+
// = NULL просто крещи ужас за мен! NULL е макро, което първо се използва само в C и второ се използва за указатели.
92+
// Ако искаш да кажеш, че размерът е 0, просто напиши 0!
93+
// Имай предвид, че 2 реда по-надолу ще изискваш от конзолата вход, който ще презапише стойността така или иначе.
94+
int n = NULL;
95+
std::cout << "1 <= N <= 1000\nN = ";
96+
std::cin >> n;
97+
98+
// Тук липсата на валидация на n ти играе много лоша шега.
99+
// Наясно ли си какво става, ако въведа число по-малко от 1?
100+
// При 0 ще работи, но изглежда странно и не е функционално.
101+
// При отрицателни стойности няма да работи като цяло.
102+
Triangle* arr = new(std::nothrow) Triangle[n];
103+
if (!arr) {
104+
return 1;
105+
}
106+
107+
for (int i = 0; i < n; i++) {
108+
std::cout << "3 dost for the" << i+1 << "triangle" << std::endl;
109+
getTriangle(arr[i]);
110+
}
111+
112+
sort(arr);
113+
printTriangleAreas(arr, n);
114+
115+
// Огромна грешка тук е, че не се освобождава паметта. Това се счита за учено по УП и тук се таксува строго, ако липсва.
116+
// Лично аз започвайки да пиша код обвързан с динамична памет винаги я заделям проверявам и освобождавам първо!
117+
// Преди да започна да я използвам, за да съм сигурен, че когато съм готов всичко ще работи.
118+
119+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#include <iostream>
2+
3+
struct ComplexNumber {
4+
int a;
5+
int b;
6+
};
7+
8+
ComplexNumber addComplex(ComplexNumber num1,ComplexNumber num2) {
9+
int realPart = num1.a + num2.a;
10+
int imaginaryPart = num1.b + num2.b;
11+
12+
return ComplexNumber{ realPart, imaginaryPart };
13+
}
14+
15+
ComplexNumber subtractComplex(ComplexNumber num1, ComplexNumber num2) {
16+
int realPart = num1.a - num2.a;
17+
int imaginaryPart = num1.b - num2.b;
18+
19+
return ComplexNumber{ realPart, imaginaryPart };
20+
}
21+
22+
23+
ComplexNumber multiplyComplex(ComplexNumber num1, ComplexNumber num2) {
24+
int a = num1.a, b = num1.b;
25+
int c = num2.a, d = num2.b;
26+
27+
int realPart = a*c - b*d;
28+
int imaginaryPart = a*d + b*c;
29+
30+
return ComplexNumber{ realPart, imaginaryPart };
31+
}
32+
33+
34+
void printComplex(ComplexNumber num) {
35+
int a = num.a, b = num.b;
36+
37+
38+
if (b > 0 && a != 0) {
39+
std::cout << num.a << "+" << num.b << "i" << std::endl;
40+
}
41+
else if (b < 0 && a != 0) {
42+
std::cout << num.a << num.b << "i" << std::endl;
43+
}
44+
else if (b == 0 && a != 0) {
45+
std::cout << num.a << std::endl;
46+
}
47+
else if (b != 0 && a == 0) {
48+
std::cout << num.b << "i" << std::endl;
49+
}
50+
else {
51+
std::cout << num.a << "+" << num.b << "i" << std::endl;
52+
}
53+
}
54+
55+
//to do create input function for complex numbers
56+
int main()
57+
{
58+
ComplexNumber num1 = {6, -4 };
59+
ComplexNumber num2 = { 10, 7 };
60+
61+
printComplex(addComplex(num1,num2));
62+
printComplex(subtractComplex(num1, num2));
63+
printComplex(multiplyComplex(ComplexNumber{0,0},num2));
64+
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include <iostream>
2+
3+
// Бих предпочел коефициентите да са double(реални числа), както е по условие.
4+
struct QuadraticEquation {
5+
int a;
6+
int b;
7+
int c;
8+
};
9+
10+
void readEquation(QuadraticEquation &equation) {
11+
int a, b, c;
12+
13+
//TO DO: validation of the input
14+
std::cout << "enter a b c for quadratic equation\n-100 <= a, b, c <= 100\na = " << std::endl;
15+
std::cin >> a;
16+
std::cout << "b = " << std::endl;
17+
std::cin >> b;
18+
std::cout << "c = " << std::endl;
19+
std::cin >> c;
20+
21+
equation.a = a;
22+
equation.b = b;
23+
equation.c= c;
24+
}
25+
26+
void findSolutions(const QuadraticEquation &equation) {
27+
int a = equation.a, b = equation.b, c = equation.c;
28+
29+
// Нямаш cmath!
30+
double d = sqrt(b*b - 4*a*c);
31+
32+
if (d > 0) {
33+
double x1 = (-b + d) / (2 * a);
34+
double x2 = (-b - d) / (2 * a);
35+
36+
//to do: format the output better
37+
std::cout << "x1 = " << x1 << " x2 = " << x2 << std::endl;
38+
}
39+
else if (d == 0) {
40+
double x1 = (- b)/(2*a);
41+
std::cout << "x1 = x2 = " << x1 << std::endl;
42+
}
43+
else {
44+
std::cout << "The equation does not have real solutions!" << std::endl;
45+
}
46+
47+
}
48+
49+
50+
int main()
51+
{
52+
QuadraticEquation test;
53+
54+
readEquation(test);
55+
findSolutions(test);
56+
}
57+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include <iostream>
2+
// Тази библиотека ви е строго забранено да я ползвате,
3+
// освен ако не е казано изрично, че можете.
4+
#include <vector>
5+
// Тази библиотека няма да ви е разрешена освен, ако не е опоменато.
6+
// За базови сортиращи алгоритми трябва да сте говорили по УП.
7+
#include <algorithm> //sort
8+
#include <iomanip> //setprecision
9+
// Липсва cmath библиотеката!
10+
11+
//Задача 1
12+
struct Point {
13+
int x, y;
14+
};
15+
16+
struct Triangle {
17+
Point p1, p2, p3;
18+
19+
// За методи все още не е говорено, но е добре направено.
20+
double area() const {
21+
// Тази формула я научавам от тук. Умно нещо е алгебрата!
22+
return std::abs((p1.x * (p2.y - p3.y) + p2.x * (p3.y - p1.y) + p3.x * (p1.y - p2.y)) / 2.0);
23+
}
24+
};
25+
26+
int main() {
27+
int N;
28+
std::cin >> N;
29+
30+
// Нямаш валидация за N. Това предизвиква неудобни въпроси от рода на:
31+
// Какво става, ако въведа 0?
32+
// Какво става, ако въведа отрицателна стойност?
33+
// По-добре е размерът ти да е unsigned число.
34+
// За предпочитане size_t, тъй като този тип се използва за размери и индексация на колекции.
35+
36+
std::vector<Triangle> triangles(N);
37+
std::vector<double> areas;
38+
39+
for (int i = 0; i < N; i++) {
40+
std::cin >> triangles[i].p1.x >> triangles[i].p1.y
41+
>> triangles[i].p2.x >> triangles[i].p2.y
42+
>> triangles[i].p3.x >> triangles[i].p3.y;
43+
44+
areas.push_back(triangles[i].area());
45+
}
46+
47+
// Това е извън условието.
48+
// В този курс няма да се учим как да правим състезателни задачи, а как да правим големи проекти.
49+
// В състезателна обстановка се грижим само входа и изхода да съвпадат с условието на задачата,
50+
// без да ни интересува, какво се случва в програмата.
51+
// Тук обаче ни интересува и вътре какво се случва. Затова когато в условието се иска да сортираме
52+
// триъгълниците по тяхното лице, означава да сортираме самите триъгълници, а не само техните лица.
53+
// Това е същото като да ти кажа вземи тези шишета и ги сортирай по височина и ти да ми върнеш лист,
54+
// на който си написал височините им в сортиран ред.
55+
std::sort(areas.begin(), areas.end());
56+
57+
// Значи тук си използвал size_t за размера, но не и горе?
58+
size_t areasSize = areas.size();
59+
//Следващия ред е написан с помощта на chatGPT
60+
std::cout << std::fixed << std::setprecision(1);
61+
for (size_t i = 0; i < areasSize; i++) {
62+
std::cout << areas[i];
63+
if (i < areasSize - 1) {
64+
std::cout << " ";
65+
}
66+
}
67+
std::cout << std::endl;
68+
69+
return 0;
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include <iostream>
2+
// Тази библиотека ви е строго забранено да я ползвате,
3+
// освен ако не е казано изрично, че можете.
4+
#include <vector>
5+
// Тази библиотека няма да ви е разрешена освен, ако не е опоменато.
6+
// За базови сортиращи алгоритми трябва да сте говорили по УП.
7+
#include <algorithm> //sort
8+
#include <iomanip> //setprecision
9+
// Липсва cmath библиотеката!
10+
11+
// Задача 2
12+
struct QuadraticEquation {
13+
double a, b, c;
14+
15+
// Отново, методи не са учени, но е добре написано.
16+
// Това го казвам, защото при контролните най-вече не е добре да се използва материал, който не е учен,
17+
// защото предизвиква съмнения за преписване и също така започва разпитване от преподавателите.
18+
// Така че се придържаме към това, което е учено до момента!
19+
void solve() const {
20+
double D = b * b - 4 * a * c;
21+
if (D > 0)
22+
{
23+
double x1 = (-b - std::sqrt(D)) / (2 * a);
24+
double x2 = (-b - std::sqrt(D)) / (2 * a);
25+
if (x1 > x2)
26+
{
27+
std::swap(x1, x2);
28+
}
29+
std::cout << "x1 = " << x1 << ", x2 = " << x2 << std::endl;
30+
31+
}
32+
else if (D == 0)
33+
{
34+
double x = -b / (2 * a);
35+
std::cout << "x1 = x2 = " << std::fixed << std::setprecision(6) << x << std::endl;
36+
}
37+
else if(D < 0)
38+
{
39+
std::cout << "The equation does not have real solutions!" << std::endl;
40+
}
41+
}
42+
};
43+
44+
int main()
45+
{
46+
QuadraticEquation eq;
47+
std::cin >> eq.a >> eq.b >> eq.c;
48+
eq.solve();
49+
return 0;
50+
}

0 commit comments

Comments
 (0)