Website Summary Files Commits Branches @commit @diff @stats
path: root / Week09 / Exercise01.txt
blob: 9986554fb6385e1e41b5c450f0dbdc54ba5d6468 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Ще запазим броя етажи като глобална константа на име FLOORS (и стойност 5).

По условие е казано, че асансьор се качва по-бързо отколкото слиза. Ще допуснем, че
разликата в скоростите е малка. Допълнително се изисква да приоритизираме скорост.

От тези факти, следва че когато два бутона на еднакво разстояние от един асансьор са натиснати,
то асансьора трябва да приоритизира по-горния етаж.

Също не е казано в какъв формат ни се подават етажите на асансьорите.
Избираме следния format: от 0 до FLOORS-1 вкл. се обозначават етажите, като 0 обозначава партер.


unsigned int newElevatorPosition(bool buttonsPressed[FLOORS], unsigned int currentPosition);

    Функцията newElevatorPosition ще върне новата позиция на асансьора по следния начин:
    започваме от текущата позиция и с цикъл постепенно инкрементираме стойност "distance".
    На всяка итерация ще проверяваме дали на съответния горен и долен етаж
    (текуща позиция + distance и текуща позиция - distance) е натиснат бутон.

    При всяка такава проверка, ще погледнем дали получения етаж е валиден (индекс в buttonsPressed).
    Ако етажа е валиден и на него е натиснат бутон, директно връщаме етажа.
    Първо правим проверката за горния етаж, след това за долния, така имплементираме решението на
    проблема с двата натиснати бутона на еднакво разстояние, който анализирахме по-рано.

    distance ще се мени от 0 до FLOORS-1 вкл. и ако не намерим етаж с натиснат бутон, просто връщаме
    текущата позиция.
    Понеже distance в началото ще е 0, това покрива случая когато бутон е натиснат на текущия етаж.

int main();

    Декларираме булев масив с FLOORS на брой елемента и го попълваме с входни данни.
    Декларираме и попълваме два индекса (от тип unsigned int), които ще съдържат позицията на двата
    асансьора.

    Извикваме newElevatorPosition, като подаваме булевия масив и текущата позиция на първия асансьор.
    Върнатия резултат го изкарваме на екрана и на същата позиция в булевия масив, записваме че бутона
    не е натиснат.

    Аналогично, отново извикваме newElevatorPosition, с (обновения) булев масив и позицията на втория
    асансьор. Резултата го изкарваме.