Задачи - УПП, Седмица 7, 17.11.2023

GitHub classroom: classroom.github.com/a/m5M2_CWD

Задача 1

Това е почти същата задача като през седмица 5

Дефинираме двуизмерен координат като две числа с плаваща запетая. Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати. Няма как функцията да върне две стойности, затова добаваете още два аргумента, които да са указатели към променливи в които да запазим сумираните координати.

warn Трябва да използвате референции вместо указатели!

От входа получавате два координата, след това връщате тяхната покомпонентна сума използвайки функцията.

Пример:

Вход Изход
8.0 1.5 -1.9 -100.741 6.1 -99.241

Задача 2

Един магазин продава три продукта, които ще бележим с a, b и c. Правим инвентарна система за тези продукти, като за всеки от тях пазим неговата бройка в склада. В началото имаме 0 от всеки продукт.

Получавате букви, докато не стигнете до буквата $. Ако буквата е a, b или c, тогава този продукт става “сегашния” продукт. Ако буквата е S, тогава намаляте бройката на сегашния продукт с 1, а ако е R - увеличаваме с 10.

warn НЕ може да използвате масиви! Трябва действията на S и R да се изкарат във функции!

Когато получите $, изкарвате броя на всеки продукт и спирате програмата.

Пример:

Вход Изход
a R R S S S S S S b R c b b R c R a S c S b S S S a R $ а: 23 b: 17 c: 9

Задача 3

В началото получавате буква - тя съответства на дадена функция, след това получавате 5 числа с плаваща запетая. След всяко въведено трябва да изкарате резултата от съответната функция при подадено входното число.

warn Трябва да използвате указател към функция!

Буквите съответстват на следните функции:

Примери:

Вход Изход
a 0.5 -18.3 192.994 0 -0.003 0.5 18.3 192.994 0 0.003
s 0.5 -18.3 192.994 0 -0.003 0.25 334.89 37246.67404 0 0.000009
h 0.5 -18.3 192.994 0 -0.003 0 -18 192 0 0
f 0.5 -18.3 192.994 0 -0.003 0.5 -0.3 0.994 0 -0.003

Задача 4

Ще имлементираме система за задачи. Една задача е просто низ с дължина от 16 знака, като за всяка задача пазим дали е изпълнена или не. Можем да пазим максимум 64 задачи.

Задачите са номерирани от 1. Когато искаме да искараме задача на екрана, тя трябва да е във формата:

N. [C] TASK

Където N е нейния номер (индекс), C е шпация или буквата “x” (шпация когато не е изпълнена, и “х” когато е), TASK е самия низ на задачата.

Програмата получава букви, докато не получи буквата $. Всяка буква определя някакво действие:

В началото на програмата нямаме никакви задачи.

Пример: Смесен вход/изход, изход е отбелязан с “> “. Забележете, че има шпации в края на низове за задачи.

a
Do exercise 4   
a
Solve homework  
a
Clean room      
p
> 1. [ ] Do exercise 4   
> 2. [ ] Solve homework  
> 3. [ ] Clean room      
c 2
p
> 1. [ ] Do exercise 4   
> 2. [x] Solve homework  
> 3. [ ] Clean room      
d
> 2. [x] Solve homework  
t
> 1. [ ] Do exercise 4   
> 3. [ ] Clean room      
$

Задача 5

Дефинираме изображение като матрица с 40 колони и 20 реда. Всяко изображение има два цвята, черно и бяло, като за черно ще използваме шпация, а за бяло - знакът ‘X’.

В началото на програмата получавате едно изображение. След това получавате произволен брой команди - букви с възможна последователност от стойности. Трябва да имплементирате следните команди:

Пример: Смесен вход/изход

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X                                      X
X   X X XXX X  X  XXX  X X XXX X X     X
X   XXX XX  X  X  X X  XXX X X X X     X
X   X X XXX XX XX XXX   X  XXX XXX     X
X                                      X
X                                      X
X                                      X
X        XXX            XXX            X
X        X X            X X            X
X        XXX            XXX            X
X                                      X
X                                      X
X                                      X
X   XX                     XX          X
X     XX                 XX            X
X       XXXXXXXXXXXXXXXXX              X
X                                      X
X                                      X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
r
v
h
l
h
v
f 0 0 11 14
p
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX                         X
XXXXXXXXXXXXXX X  XXX  X X XXX X X     X
XXXXXXXXXXXXXX X  X X  XXX X X X X     X
XXXXXXXXXXXXXX XX XXX   X  XXX XXX     X
XXXXXXXXXXXXXX                         X
XXXXXXXXXXXXXX                         X
XXXXXXXXXXXXXX                         X
XXXXXXXXXXXXXX          XXX            X
XXXXXXXXXXXXXX          X X            X
XXXXXXXXXXXXXX          XXX            X
XXXXXXXXXXXXXX                         X
X                                      X
X                                      X
X   XX                     XX          X
X     XX                 XX            X
X       XXXXXXXXXXXXXXXXX              X
X                                      X
X                                      X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Задача 6

Ще имплементираме програма, която намира състоянието на един елементарен едноклетъчен автомат след даден брой генерации и определено правило. Задачата изглежда сложна, но не е толкова зле.

За нашите цели, един “елементарен едноклетъчен автомат” е просто един голям булев масив. Ще наричаме стойност true жива и стойност false мъртва. За всяка клетка в масива имаме правила, в зависимост от стойностите на клетката в ляво и в дясно променяме сегашната клетка. Направили сме една “генерация” след като обиколим всички клетки един път (от ляво на дясно) и обновим техните стойности.

Би трябвало това да ви напомня на играта “Живот” от John Conway.

Конкретните правила са тези при “правило 30”.
Ако сегашната клетка е жива:

Ако сегашната клетка е мъртва:

Нашият масив има 99 стойности, като първоначално всички са мъртви, освен тази в средата.

В началото на програмата получавате N - брой генерации. Правите толкова генерации, като след всяка една изкарвате на екрана всички стойности от масива на един ред, като една мъртва клетка се изкарва със знака за шпация, докато една жива клетка - със знака “*”.