diff options
feat(Week03): Add exercises and solutions
11 files changed, 297 insertions, 0 deletions
| -rw-r--r-- | Week03/Exercise01.cpp | 10 | ||||
| -rw-r--r-- | Week03/Exercise02.cpp | 10 | ||||
| -rw-r--r-- | Week03/Exercise03.cpp | 19 | ||||
| -rw-r--r-- | Week03/Exercise05.cpp | 10 | ||||
| -rw-r--r-- | Week03/Exercise06.cpp | 14 | ||||
| -rw-r--r-- | Week03/Exercise07.cpp | 18 | ||||
| -rw-r--r-- | Week03/Exercise08.cpp | 10 | ||||
| -rw-r--r-- | Week03/Exercise10.cpp | 10 | ||||
| -rw-r--r-- | Week03/Exercise12.cpp | 10 | ||||
| -rw-r--r-- | Week03/Exercise13.cpp | 16 | ||||
| -rw-r--r-- | Week03/README.md | 170 |
diff --git a/Week03/Exercise01.cpp b/Week03/Exercise01.cpp new file mode 100644 index 0000000..80a4149 --- /dev/null +++ b/Week03/Exercise01.cpp @@ -0,0 +1,10 @@ +#include <iostream> + +int main() { + int x; + std::cin >> x; + + std::cout << ((x + 1) % 2); + + return 0; +} diff --git a/Week03/Exercise02.cpp b/Week03/Exercise02.cpp new file mode 100644 index 0000000..4f7ca3c --- /dev/null +++ b/Week03/Exercise02.cpp @@ -0,0 +1,10 @@ +#include <iostream> + +int main() { + char letter; + std::cin >> letter; + + std::cout << (char)(letter + 32); + + return 0; +} diff --git a/Week03/Exercise03.cpp b/Week03/Exercise03.cpp new file mode 100644 index 0000000..3d76b46 --- /dev/null +++ b/Week03/Exercise03.cpp @@ -0,0 +1,19 @@ +#include <iostream> + +int main() { + int a, b, c; + std::cin >> a >> b >> c; + /* Алтернативно може да направите: + * int a; + * int b; + * int c; + * std::cin >> a; + * std::cin >> b; + * std::cin >> c; + */ + + std::cout << ((b - a) == (c - b)); + /* Друга формула, която също работи е: + * (a + c) / 2 == b + */ +} diff --git a/Week03/Exercise05.cpp b/Week03/Exercise05.cpp new file mode 100644 index 0000000..a56209a --- /dev/null +++ b/Week03/Exercise05.cpp @@ -0,0 +1,10 @@ +#include <iostream> + +int main() { + double bgn; + std::cin >> bgn; + + std::cout << (bgn / 1.95583); + + return 0; +} diff --git a/Week03/Exercise06.cpp b/Week03/Exercise06.cpp new file mode 100644 index 0000000..ee919b4 --- /dev/null +++ b/Week03/Exercise06.cpp @@ -0,0 +1,14 @@ +#include <iostream> + +int main() { + bool p, q; + std::cin >> p >> q; + + std::cout << ((!p || q) && (!q || p)); + /* Ако се вгледате в таблицата на истинност, тогава + * може да се досетите, че има по-прост израз: + * p == q + */ + + return 0; +} diff --git a/Week03/Exercise07.cpp b/Week03/Exercise07.cpp new file mode 100644 index 0000000..1746447 --- /dev/null +++ b/Week03/Exercise07.cpp @@ -0,0 +1,18 @@ +#include <iostream> + +int main() { + int a, b, c, d; + std::cin >> a >> b >> c >> d; + + float average = (float)(a + b + c + d) / 4.0; + int sum = a + b + c + d; + float inv_sum = 1.0 / (float)a + 1.0 / (float)b + 1.0 / (float)c + 1.0 / (float)d; + int product = a * b * c * d; + std::cout << average << ' ' << sum << ' ' << inv_sum << ' ' << product; + /* В горните сметки можем да пропуснем конвертиранията към float. + * Защо? + * И какво можем да променим, така че сметките да се нуждаят от конвертиране? + */ + + return 0; +} diff --git a/Week03/Exercise08.cpp b/Week03/Exercise08.cpp new file mode 100644 index 0000000..8f655cf --- /dev/null +++ b/Week03/Exercise08.cpp @@ -0,0 +1,10 @@ +#include <iostream> + +int main() { + double a, b, c, d, x; + std::cin >> a >> b >> c >> d >> x; + + std::cout << (a * x * x * x + b * x * x + c * x + d == 0); + + return 0; +} diff --git a/Week03/Exercise10.cpp b/Week03/Exercise10.cpp new file mode 100644 index 0000000..dda943e --- /dev/null +++ b/Week03/Exercise10.cpp @@ -0,0 +1,10 @@ +#include <iostream> + +int main() { + float a1, a2, a3, b1, b2, b3; + std::cin >> a1 >> a2 >> a3 >> b1 >> b2 >> b3; + + std::cout << (a1 * b1 + a2 * b2 + a3 * b3); + + return 0; +} diff --git a/Week03/Exercise12.cpp b/Week03/Exercise12.cpp new file mode 100644 index 0000000..f13fe59 --- /dev/null +++ b/Week03/Exercise12.cpp @@ -0,0 +1,10 @@ +#include <iostream> + +int main() { + char current, goal; + std::cin >> current >> goal; + + std::cout << ((goal - current + 26) % 26); + + return 0; +} diff --git a/Week03/Exercise13.cpp b/Week03/Exercise13.cpp new file mode 100644 index 0000000..f38156e --- /dev/null +++ b/Week03/Exercise13.cpp @@ -0,0 +1,16 @@ +#include <iostream> + +int main() { + const double PI = 3.14159; + + double alpha, beta; + std::cin >> alpha >> beta; + + double x = alpha + beta; + double sinx = (16.0 * x * (PI - x)) / (5 * PI * PI - 4 * x * (PI - x)); + x += PI / 2; + double cosx = (16.0 * x * (PI - x)) / (5 * PI * PI - 4 * x * (PI - x)); + std::cout << (sinx / cosx); + + return 0; +} diff --git a/Week03/README.md b/Week03/README.md new file mode 100644 index 0000000..e32f046 --- /dev/null +++ b/Week03/README.md @@ -0,0 +1,170 @@ +# Задачи + +<https://syndamia.com/teaching/upp-2025/week03/> + +## За решаване + +### Задача 1 + +Получавате цяло число. Трябва да върнете 0 ако е нечетно и 1 ако е четно. + +|Вход|Изход| +|---|---| +|5|0| +|10|1| + +### Задача 2 + +Получавате главна буква. Трябва да върнете съответната малка буква. + +|Вход|Изход| +|---|---| +|A|a| +|Z|z| +|U|u| + +### Задача 3 + +Получавате 3 цели числа, трябва да върнете 1 ако образуват аритметична прогресия и 0 иначе. + +|Вход|Изход| +|---|---| +|1 2 3|1| +|4 5 7|0| +|4 6 7|0| +|-3 5 13|1| + +### Задача 5 + +Получавате десетично число: сума в левове. Трябва да върнете същата сума в евро, като 1 € = 1.95583 лв. + +Поради прецизност при такива числа, вашите изходи може с много малко да се различават. + +|Вход|Изход| +|---|---| +|1|0.511292| +|1.95583|1| +|15|7.66938| +|199.99|102.253| +|450|230.081| + +### Задача 6 + +Получавате две булеви стойности. Трябва да върнете 1 ако свойството "би-импликация" е изпълнено за тях. Иначе върнете 0. + +Припомняме, че би-импликацията и импликацията се дефинират по следния начин: + + + +|Вход|Изход| +|---|---| +|0 1|0| +|1 1|1| +|1 0|0| +|0 0|1| + +### Задача 7 + +Получавате 4 цели числа от входа. За тях трябва да изкарате: + +- средно аритметично, +- сума, +- сума от вида 1/<първо число> + 1/<второ число> + ..., +- умножение. + +|Вход|Изход| +|---|---| +|1 2 3 4|2.5 10 2.08333 24| +|13 151 7 29|50.0 200 0.260886 398489| +|-293 6 0 -1|-72.0 -288 inf 0| + +### Задача 8 + +Получавате 5 реални числа: коефициентите на полином от трета степен a (a различно от 0), b, c, d и потенциален негов корен x. + +Трябва да върнете 1 ако x е корен на уравнението и 0 ако не е. + +Припомняме, че x е корен на кубично уравнение, когато: + + + +|Вход|Изход| +|---|---| +|2 3 -11 -6 2|1| +|2 3 -11 -6 -0.5|1| +|2 3 -11 -6 -3|1| +|2 3 -11 -6 -2|0| +|3 -3 -90 0 0|1| +|5 -2 5 -2 0.4|1| + +### Задача 10 + +Получавате 6 реални числа: коефициентите на два (ортонормирани) триизмерни вектора. Върнете тяхното точково умножение. + +Припомняме, че алгебричата дефиниция на точковото умножение е: + + + +|Вход|Изход| +|---|---| +|1 3 -5 4 -2 -1|3| +|1.5 2.45 3.8 1.01 5 7.005|40.384| +|-1 -2 3 4 0 -8|-28| +|3 2 1 6 5 2|30| + +## За самоподготовка + +### Задача 12 + +Първите релефни етикети (които човек може сам да попълни) са въведени през 1958 от DYMO. + +Механични устройства съдържат диск с букви (знаци), който се завърта докато не се избере желаната буква. Чрез стискане на дръжката, малък чук прищипва лентата върху диска (който има релефи на буквите), пластмасовата лента се изкривява и буква се отпечтва (подобно на пишеща машина). + +Нека нашия диск съдържа само малки букви. Във входа получавате две малки букви: коя буква е избрана в момента и коя буква е желана. Трябва да върнете с колко позиции на ляво (обратно на часовниковата стрелка) трябва да се завърти диска, така че желаната буква да се избере. + +|Вход|Изход| +|---|---| +|a a|0| +|a b|1| +|a z|25| +|z a|1| +|k j|25| +|w d|7| + +### Задача 13 + +През 629, индийския математик Бхаскара 1ви представя една забележителна апроксимация на синус функцията (в радиани): + + + +От входа ще получите два ъгъла в радиани, α и β, чиято сума е между 0 и π/2 (включително). + +Използвайки единствено апроксимацията на Бхаскара 1ви, пресметнете tg(α + β). +Не може да използвате коренуване! + +За константата π, използвайте поне 5 цифри след десетичната запетая. +Подсказка +Използвайте факта, че може да представите косинус чрез отместване на синус. + +|Вход|Изход| +|---|---| +|0 0|0| +|0.392698 0.392698|1| +|0 1.047196|1.72973| +|3.14159 -1.570795|inf| +|-0.523598 1.047196|0.578125| +|0.523598 0.392698|1.30265| + +### Задача 16 + +Получавате 8 реални числа: всеки две последователни образуват координат в равнината. Първите два координата представят горния ляв и долния десен ъгъл на първи правоъгълник. Вторите два координата представят горния ляв и долния десен ъгъл на втори правоъгълник. + +Трябва да върнете 1 ако правоъгълниците се пресичат и 0 иначе. + +|Вход|Изход| +|---|---| +|0 6 4 0 6 6 8 2|0| +|0 6 4 0 4 6 8 2|1| +|0 6 4 0 3 3 8 2|1| +|-3 4.5 2.1 0.5 0 6 4 0|1| +|-4 8 5 -2 0 6 4 0|1| |
