Задачи - УПП, Седмица 7, 17.11.2023
GitHub classroom: classroom.github.com/a/m5M2_CWD
Задача 1
#Това е почти същата задача като през седмица 5
Дефинираме двуизмерен координат като две числа с плаваща запетая. Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати. Няма как функцията да върне две стойности, затова добаваете още два аргумента, които да са указатели към променливи в които да запазим сумираните координати.
Трябва да използвате референции вместо указатели!
От входа получавате два координата, след това връщате тяхната покомпонентна сума използвайки функцията.
Пример:
Вход | Изход |
---|---|
8.0 1.5 -1.9 -100.741 | 6.1 -99.241 |
Задача 2
#Един магазин продава три продукта, които ще бележим с a
, b
и c
.
Правим инвентарна система за тези продукти, като за всеки от тях пазим неговата бройка в склада.
В началото имаме 0 от всеки продукт.
Получавате букви, докато не стигнете до буквата $
.
Ако буквата е a
, b
или c
, тогава този продукт става “сегашния” продукт.
Ако буквата е S
, тогава намаляте бройката на сегашния продукт с 1, а ако е R
- увеличаваме с 10.
НЕ може да използвате масиви! Трябва действията на 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 числа с плаваща запетая. След всяко въведено трябва да изкарате резултата от съответната функция при подадено входното число.
Трябва да използвате указател към функция!
Буквите съответстват на следните функции:
a
- модул на стойностs
- стойност на втора степенh
- занулена частта след запетаятаf
- занулена частта преди (в ляво от) запетаята
Примери:
Вход | Изход |
---|---|
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
е самия низ на задачата.
Програмата получава букви, докато не получи буквата $
.
Всяка буква определя някакво действие:
- при
p
изкарваме на екрана всички задачи - при
d
изкарваме на екрана всички завършени задачи - при
t
изкарваме на екрана всички незавършени задачи - след
a
въвеждаме нова (незавършена) задача на последния свободен индекс
Ако вече пазим 64 задачи, трябва да изкараме грешка на екрана и да продължим с програмата. - след
c
въвеждаме номер на задача и обръщаме нейната изпълненост: ако е изпълнена, става неизпълнена, и ако е неизпълнена, става изпълнена
В началото на програмата нямаме никакви задачи.
Пример: Смесен вход/изход, изход е отбелязан с “> “. Забележете, че има шпации в края на низове за задачи.
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’.
В началото на програмата получавате едно изображение. След това получавате произволен брой команди - букви с възможна последователност от стойности. Трябва да имплементирате следните команди:
s
- изкарвате изображението на екранаr
- завъртате изображението по часовниковата стрелка с 90 градусаl
- завъртате изображението обратно на часовниковата стрелка с 90 градусаh
- обръщате изображението по хоризонтала (първи и последен ред се разменят, след това втори и предпоследен и так. нат.)v
- обръщате изображението по вертикалата (първа и последна колона се разменят, след това втора и предпоследна и так. нат.)f
- след този знак получавате още 4 стойности - това са два координата върху изображението, и трябва да запълните с бяло правоъгълна област с горен ляв ъгъл в първата точка и с долен десен ъгъл във втората точка. В един координат първо посочваме реда и след това колоната, като координатите започват от 0, от горния ляв ъгъл.c
- почти същото катоf
, обаче запълвате с черно, не с бяло
Пример: Смесен вход/изход
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 - брой генерации. Правите толкова генерации, като след всяка една изкарвате на екрана всички стойности от масива на един ред, като една мъртва клетка се изкарва със знака за шпация, докато една жива клетка - със знака “*”.