Nasıl çalışılır?

  1. Görevleri sırayla yapın; her görev bir öncekinin üzerine bir şey ekler.
  2. Her görev için simülasyonun klasöründe, kütüphane dosyasının yanında yeni bir dosya açın (ör. c_room/gorev01.c veya py_room/gorev01.py) ve kütüphaneyi ekleyin.
  3. Önce simülasyonu başlatın, sonra programınızı çalıştırın. Sonsuz döngülü programları Ctrl+C ile durdurun.
  4. Takıldığınızda önce ipucuna bakın; cevabı en son açın.

Garaj hakkında bilmeniz gerekenler: Simülasyon açıldığında kapı tam kapalıdır (door_pos_read() = 100; 0 tam açık demektir). Kapı motoru uca gelince kendiliğinden DURMAZ; motoru programınız durdurmalıdır. Kapının tam açılması veya kapanması yaklaşık 7 saniye sürer (Animasyon Hızı varsayılandayken). Duvardaki tuş takımında 0–9, # ve X tuşları vardır; bir tuş yalnızca fareyle basılı tutulduğu sürece 1 okunur, bırakılınca 0 olur — basışlar bir yerde saklanmaz. Uyarı ışığı, tuş takımının hemen üstündeki renkli şerittir. Elle kontrol panelindeki Işık Aç / Işık Kapat ve Kapı Yukarı / Kapı Durdur / Kapı Aşağı düğmeleri, programınızın yazdığı adreslere yazar; bir görev bittiğinde kapıyı bu düğmelerle yeniden kapatabilirsiniz.

1 Başlangıç

Bağlanma, çıkışları açıp kapatma ve bekleme.
01

Simülasyona bağlan

Cevabı gör

Garaj simülasyonunu başlatın. Simülasyona bağlanan, bağlantı başarılıysa ekrana Connected to the garage! yazan ve bağlantıyı kapatan bir program yazın.
Sonra simülasyonu kapatıp programı bir kez daha çalıştırın ve ne olduğunu gözlemleyin.

İpucu
sim_connect() başarılıysa 0 döndürür. Bağlantıyı sim_disconnect() ile kapatın.
sim_connect()sim_disconnect()printf / print
02

Garaj lambasını yak

Cevabı gör

Garajın iç lambasını yakan bir program yazın. Program bittikten sonra lambanın yanık kaldığını gözlemleyin.
Lambayı söndürmek için elle kontrol panelindeki Işık Kapat düğmesine basın.

İpucu
Lamba için garage_lamp() fonksiyonu ve LAMP_ON sabiti kullanılır.
garage_lamp()LAMP_ON
03

Üç saniye yanan lamba

Cevabı gör

Lambayı yakın, 3 saniye bekleyin, sonra söndürün. Program bittiğinde lamba kapalı olmalı.

İpucu
C'de Sleep(3000) 3000 milisaniye bekler; Python'da time.sleep(3) 3 saniye bekler (önce import time).
garage_lamp()LAMP_OFFSleep / time.sleep
04

Uyarı ışığıyla trafik lambası

Cevabı gör

Uyarı ışığını sırasıyla 2 saniye kırmızı (255, 0, 0), 2 saniye sarı (255, 255, 0) ve 2 saniye yeşil (0, 255, 0) yakın; en sonunda söndürün. Uyarı ışığı tuş takımının hemen üstündeki renkli şerittir.

İpucu
warning_light(r, g, b, WARN_ON) rengi ayarlar ve ışığı açar. Sarı, kırmızı ile yeşilin karışımıdır.
warning_light()RGBwarning_light_off()
05

Kapıyı 2 saniye aç

Cevabı gör

Kapı kapalıyken başlayın. Kapı motorunu yukarı yönde çalıştırın, 2 saniye bekleyin ve motoru durdurun. Kapı yaklaşık üçte bir açılmış olmalı.
Kapıyı yeniden kapatmak için elle kontrol panelinde Kapı Aşağı düğmesine, kapı kapanınca Kapı Durdur düğmesine basın.

İpucu
door_motor(DOOR_UP) motoru çalıştırır; motor siz door_motor(DOOR_STOP) diyene kadar çalışmaya devam eder.
door_motor()DOOR_UPDOOR_STOP
06

Aç, bekle, kapat

Cevabı gör

Kapı kapalıyken tam bir kapı döngüsü yapın:
1. Uyarı ışığını turuncu (255, 165, 0) yakın ve kapıyı 7 saniye yukarı çalıştırın (kapı tam açılır).
2. Motoru durdurun, uyarı ışığını söndürün ve 3 saniye bekleyin.
3. Uyarı ışığını kırmızı (255, 0, 0) yakın ve kapıyı 7 saniye aşağı çalıştırın.
4. Motoru durdurun ve uyarı ışığını söndürün.

İpucu
Bu görevde yeni bir komut yok; şimdiye kadar öğrendiklerinizi doğru sırayla yazın.
door_motor()DOOR_DOWNwarning_light()Sleep / time.sleep

2 Temel

Sensör okuma, ekrana yazdırma ve if/else ile karar verme.
07

Kapının konumunu oku

Cevabı gör

Kapının kapalılık yüzdesini okuyup ekrana Door closed: 100% biçiminde yazdırın.
Sonra elle kontrol panelinde Kapı Yukarı düğmesine basın, kapı yarıya gelince Kapı Durdur düğmesine basın ve programı tekrar çalıştırın. Bu kez farklı bir sayı görmelisiniz.

İpucu
door_pos_read() 0 ile 100 arasında bir tam sayı döndürür: 100 tam kapalı, 0 tam açık. Değeri bir değişkende saklayın.
door_pos_read()variableprintf / print
08

Kapı kapalı mı?

Cevabı gör

Kapının konumunu okuyun. Kapı tam kapalıysa (100) ekrana Door is closed yazıp uyarı ışığını yeşil yakın; değilse Door is NOT closed yazıp kırmızı yakın.
Programı bir kez kapı kapalıyken, bir kez de kapıyı elle biraz açtıktan sonra çalıştırın.

İpucu
if (...) { ... } else { ... } yapısını kullanın. Eşitlik == ile kontrol edilir.
if / else==
09

Kapının üç durumu

Cevap sende

Görev 8'i üç duruma genişletin:
• 100 ise Closed yazın, uyarı ışığı yeşil (0, 255, 0).
• 0 ise Fully open yazın, uyarı ışığı kırmızı (255, 0, 0).
• Arada bir değerse Partly open: 40% gibi yüzdeyle birlikte yazın, uyarı ışığı sarı (255, 255, 0).

İpucu
İkinci koşul için C'de else if, Python'da elif kullanılır.
else if / elif
10

Durum raporu

Cevap sende

Lambanın, uyarı ışığının ve kapı motorunun o anki durumunu okuyup yazdırın, örneğin:
Lamp: ON
Warning light: OFF
Motor: UP
Motor için 0 → STOPPED, 1 → UP, 2 → DOWN yazın. Önce programı çalıştırın; sonra elle kontrol panelinde Işık Aç ve Kapı Yukarı düğmelerine basıp tekrar çalıştırın. En sonunda Kapı Durdur'a basmayı unutmayın.

İpucu
garage_lamp_read(), warning_light_read() ve door_motor_read() çıkışların son durumunu okur. Motor değerini DOOR_STOP, DOOR_UP, DOOR_DOWN sabitleriyle karşılaştırın.
garage_lamp_read()warning_light_read()door_motor_read()
11

Bir tuşu oku

Cevabı gör

Program ekrana Press and hold key 5 (3 s)... yazsın ve 3 saniye beklesin. Bu sürede simülasyondaki tuş takımında 5 tuşunu fareyle basılı tutun.
Süre dolunca tuşu okuyun: basılıysa lambayı yakıp Key 5 is pressed yazın, değilse lambayı söndürüp Key 5 is not pressed yazın. Programı bir kez tuşa basarak, bir kez basmadan deneyin.

İpucu
key_read(5) tuş o anda basılıysa 1, değilse 0 döndürür. Tuş takımı basışları saklamaz: tuşu, program okuyana kadar basılı tutmalısınız.
key_read()if / else
12

İki koşul birden

Cevabı gör

Program Press and hold key 1 (3 s)... yazıp 3 saniye beklesin. Kapıyı yalnızca iki koşul birlikte sağlanırsa açın: kapı tam kapalı (100) VE 1 tuşu basılı.
Bu durumda Opening yazıp kapıyı 3 saniye yukarı çalıştırın ve durdurun. Aksi halde Cannot open yazıp uyarı ışığını 2 saniye kırmızı yakın ve söndürün. Programı kapı kapalıyken ve kapı biraz açıkken deneyin.

İpucu
C'de &&, Python'da and iki koşulu birleştirir.
&& / andkey_read()door_pos_read()
13

Konuma göre renk

Cevap sende

Uyarı ışığının rengini kapının konumundan hesaplayın:
kırmızı = (100 − konum) × 255 / 100
yeşil = konum × 255 / 100
mavi = 0
Böylece kapalı kapı yeşil, tam açık kapı kırmızı, yarı açık kapı ara bir renk olur. Konumu ve hesaplanan değerleri Door closed: 50% R=127 G=127 gibi yazdırın. Kapıyı elle farklı konumlara getirip programı birkaç kez çalıştırın.

İpucu
Önce çarpın, sonra bölün. Python'da tam sayı bölmesi // ile yapılır.
arithmeticinteger divisionwarning_light()

3 Orta

Döngüler, sürekli kontrol ve durum takibi.
14

Kapıyı sürekli izle

Cevabı gör

Görev 13'ü sonsuz bir döngüye alın: her 300 ms'de bir konumu okuyup yazdırın ve uyarı ışığının rengini güncelleyin.
Program çalışırken kapıyı elle kontrol panelinden açıp kapatın (uçta Kapı Durdur'a basın) ve rengin yavaş yavaş değiştiğini izleyin. Programı Ctrl+C ile durdurun.

İpucu
C'de while (1) { ... }, Python'da while True: sonsuza kadar döner. Döngünün sonuna kısa bir bekleme koyun.
while (1) / while TrueCtrl+C
15

Sensörle tam aç, tam kapat

Cevabı gör

Görev 6'yı süre yerine sensörle yapın:
1. Uyarı ışığını turuncu (255, 165, 0) yakın, motoru yukarı çalıştırın ve door_pos_read() 0 olana kadar her 50 ms'de bir kontrol ederek bekleyin. Sonra motoru durdurun, ışığı söndürün ve Door is fully open yazın.
2. 1 saniye bekleyin.
3. Aynı şekilde kapıyı konum 100 olana kadar kapatın ve Door is fully closed yazın.
Programı kapı yarı açıkken de deneyin: yine doğru yerde durmalı.

İpucu
while (koşul) koşul doğru olduğu sürece döner. Kapı açılırken koşul door_pos_read() > 0 olabilir.
while (condition)door_pos_read()sensor
16

Uç noktada motoru durduran bekçi

Cevap sende

Sürekli çalışan bir bekçi program yazın: motor yukarı çalışıyorken kapı tam açıksa (0) ya da motor aşağı çalışıyorken kapı tam kapalıysa (100) motoru durdursun ve Limit reached, motor stopped yazsın. Döngü her 50 ms'de bir dönsün.
Programı çalışır halde bırakın ve kapıyı yalnızca elle kontrol panelindeki Kapı Yukarı / Kapı Aşağı düğmeleriyle hareket ettirin: kapı her uca geldiğinde kendiliğinden durmalı.

İpucu
door_motor_read() elle verilen komutu da okur. İki ayrı durumu C'de ||, Python'da or ile birleştirin.
door_motor_read()|| / orwhile (1) / while True
17

Tuş takımıyla kumanda

Cevap sende

Tuş takımını kumanda olarak kullanın: 1 → kapı yukarı, 2 → kapı aşağı, 0 → dur. Kapı uca ulaşınca motor kendiliğinden dursun (Görev 16). Motor çalışırken uyarı ışığı turuncu (255, 165, 0) yansın, motor durunca sönsün. Döngü her 50 ms'de bir dönsün.
Deneyin: 1'e basın, kapı yarıdayken 0'a basın, sonra 2'ye basın.

İpucu
Döngünün her turunda üç tuşu ayrı ayrı if ile okuyun, sonra Görev 16'daki uç kontrolünü yapın. Işığın rengine en son door_motor_read() değerine bakarak karar verin.
key_read()door_motor()while (1) / while True
18

Hangi tuş basılı?

Cevabı gör

Tuş takımının 12 tuşunu (0–11) bir for döngüsüyle tarayın ve basılı olan tuşu yazdırın: rakamlar için Key 7, 10 için Key #, 11 için Key X. Dış döngü her 200 ms'de bir dönsün.
Bir tuşu basılı tuttuğunuzda yazının tekrar tekrar geldiğine dikkat edin; bunu bir sonraki görevde düzelteceksiniz.

İpucu
for (int k = 0; k <= 11; k++) / for k in range(12): k'yı 0'dan 11'e kadar sayar. ADR_KEY_HASH (10) ve ADR_KEY_X (11) sabitleri hazırdır.
forkey_read()ADR_KEY_HASHADR_KEY_X
19

Basışları say

Cevabı gör

# tuşuna kaç kez basıldığını sayın. Tuşu ne kadar uzun basılı tutarsanız tutun her basış yalnızca bir kez sayılsın; sayı her arttığında # pressed 3 times gibi yazdırın.
X tuşu sayacı sıfırlasın ve Counter reset yazsın (sayaç zaten 0 ise bir şey yapmasın). Döngü her 20 ms'de bir dönsün.

İpucu
Bir önceki turda tuşun ne olduğunu bir değişkende saklayın. Önceki 0, şimdiki 1 ise yeni bir basış vardır.
edge detectioncounterprevious state
20

Rakam kadar yanıp sön

Cevap sende

Bir rakam tuşuna (1–9) basılmasını bekleyin, tuş bırakılınca da devam edin. Sonra Blinking 4 times gibi yazdırın ve garaj lambasını o rakam kadar yakıp söndürün (0,5 s yanık, 0,5 s sönük). Ardından yeni bir rakam bekleyin. 0, # ve X tuşları yok sayılsın.

İpucu
İki bekleme döngüsü yazın: biri bir tuş basılana kadar, diğeri o tuş bırakılana kadar. Yanıp sönme için for kullanın.
nested loopswait for releasefor
21

Dört haneli kodu oku

Cevabı gör

Tuş takımından 4 rakam okuyun (bu kez 0 da geçerli; # ve X yok sayılsın). Her rakam basılıp bırakıldığında uyarı ışığı 150 ms mavi (0, 0, 255) yansın (tuş sesi gibi) ve ekrana bir * yazılsın.
4 rakam tamamlanınca rakamları tek sayıda birleştirin (1, 2, 3, 4 → 1234) ve Code: 1234 yazın. Kod 1234 ise uyarı ışığı 3 saniye yeşil, değilse 3 saniye kırmızı yansın; sonra program bitsin.

İpucu
Rakamı sayıya eklemek için code = code * 10 + digit kullanın. 0 da geçerli olduğu için 'tuş yok' anlamında -1 kullanın.
code = code * 10 + digitfor-1 as no key

4 İleri

Fonksiyonlar, zamanlama, durum makineleri ve hataya dayanıklılık.
22

Fonksiyonlarla şifreli kapı

Cevabı gör

Görev 21'i fonksiyonlara bölün ve sürekli çalışan bir şifreli kapı yapın:
• wait_key(): herhangi bir tuşun (0–11) basılıp bırakılmasını bekler, 150 ms mavi tuş ışığı yakar ve tuşun numarasını döndürür.
• open_door() ve close_door(): kapıyı sensöre bakarak tam açar / tam kapatır; hareket sırasında uyarı ışığı turuncu yanar (Görev 15).
Ana döngü 4 rakam okusun (# ve X yok sayılsın) ve her rakam için * yazsın. Kod 1234 ise Access granted yazıp lambayı yaksın, kapıyı açsın, 5 saniye beklesin, kapıyı kapatıp lambayı söndürsün. Yanlışsa Wrong code yazıp uyarı ışığını 2 saniye kırmızı yaksın.

İpucu
Fonksiyonları main'den önce yazın. wait_key() bir değer döndürdüğü için int (Python'da return) kullanır; diğer ikisi void'dir.
functionreturnvoid
23

Dizide şifre: X ile sil, # ile onayla

Cevabı gör

Şifre artık sabit uzunlukta değil. Kullanıcı rakamları yazar ve # ile onaylar:
• Her rakam bir dizide saklansın ve * yazılsın; en fazla 8 rakam saklansın, fazlası yok sayılsın.
• X, o ana kadar yazılanları silsin, Cleared yazsın ve uyarı ışığı 300 ms sarı (255, 255, 0) yansın.
• Doğru şifre 2580'dir ve bir dizide ({2, 5, 8, 0}) saklanır. #'e basılınca girilen rakamları şifreyle karşılaştırın: uzunluk ve tüm rakamlar aynıysa kapıyı Görev 22'deki gibi açıp kapatın (lamba dahil), değilse Wrong code yazıp 2 saniye kırmızı yakın.
Her denemeden sonra giriş sıfırlansın. Görev 22'deki fonksiyonları kullanın.

İpucu
C'de diziyle birlikte kaç eleman dolu olduğunu gösteren bir len değişkeni tutun ve karşılaştırmayı bir fonksiyonda for ile yapın. Python'da liste kullanın; iki liste == ile karşılaştırılabilir.
array / listcheck_code()# / X keys
24

Yanlış deneme sayacı ve kilit

Cevap sende

Görev 23'e güvenlik ekleyin: yanlış denemeleri sayın ve Wrong code (2/3) gibi yazdırın. Art arda 3 yanlış denemede sistem 15 saniye kilitlensin:
• LOCKED for 15 s yazılsın.
• Kilit süresince uyarı ışığı kırmızı yanıp sönsün (250 ms yanık, 250 ms sönük) ve tuşlar dikkate alınmasın.
• Kilit bitince Unlocked yazılsın ve sayaç sıfırlansın.
Doğru şifre girildiğinde de sayaç sıfırlansın. 1. ve 2. yanlış denemede önceki gibi 2 saniye kırmızı yansın.

İpucu
Kilidi bir lockout() fonksiyonuna koyun. 15 saniye, 500 ms'lik 30 yanıp sönmedir. Kilit sırasında wait_key() çağrılmadığı için tuşlar kendiliğinden yok sayılır.
counterlockout()for
25

Kapanırken engel: güvenlik geri dönüşü

Cevap sende

Gerçek garaj kapıları kapanırken önüne bir engel çıkarsa durup geri açılır. Simülasyonda engel sensörü olmadığı için X tuşunu 'engel algılandı' düğmesi olarak kullanın.
close_door_safe() adında bir fonksiyon yazın: kapıyı kapatırken her 50 ms'de konumla birlikte X tuşunu da kontrol etsin. X basılırsa motoru hemen durdursun, Obstacle! Reopening yazsın, uyarı ışığını 1 saniye kırmızı yaksın, kapıyı tam açsın ve 0 döndürsün. Kapı engelsiz kapanırsa 1 döndürsün.
Ana program: #'e basılınca kapıyı açsın, 5 saniye beklesin ve close_door_safe() ile kapatsın; kapı engel yüzünden yeniden açıldıysa 5 saniye bekleyip tekrar kapatmayı denesin. Kapı kapanınca Door closed yazsın.

İpucu
Kapanma döngüsünün içinde bir if ile X'e bakın; bulunca return 0 ile fonksiyondan hemen çıkın. Ana programda while (close_door_safe() == 0) tekrar denemeyi sağlar.
safety stopreturn from loopreturn value
26

Şifre girişinde zaman aşımı

Cevabı gör

Görev 23'teki şifre girişine zaman aşımı ekleyin: kullanıcı en az bir rakam yazdıktan sonra 5 saniye hiçbir tuşa basmazsa giriş silinsin, Timeout, entry cleared yazılsın ve uyarı ışığı 1 saniye sarı yansın.
Bunun için wait_key_timeout(ms) fonksiyonunu yazın: verilen süre içinde bir tuş basılıp bırakılırsa (mavi tuş ışığıyla birlikte) numarasını, süre dolarsa -1 döndürsün. Bu görevde kapıyı hareket ettirmeyin: doğru şifrede Access granted yazıp 3 saniye yeşil, yanlışta Wrong code yazıp 2 saniye kırmızı yakın.

İpucu
Saati okuyun: C'de GetTickCount() bilgisayar açıldığından beri geçen milisaniyeyi (DWORD), Python'da time.time() saniyeyi verir. Başlangıç zamanını saklayın ve farkına bakın.
GetTickCount / time.timetimeoutwait_key_timeout()
27

Programı durdurmadan yanıp sönme

Cevap sende

Görev 17'deki tuş kumandasını geliştirin: kapı hareket ederken uyarı ışığı turuncu (255, 165, 0) yanıp sönsün (300 ms yanık, 300 ms sönük), ama tuşlar her an hemen tepki versin.
Yani yanıp sönmeyi Sleep(300) / time.sleep(0.3) ile YAPMAYIN: döngü 20 ms'de bir dönsün; her turda saati okuyun, son değişimden bu yana 300 ms geçtiyse ışığı tersine çevirin. Motor durunca ışık sönük kalsın. Kapı yarıdayken 0'a basarak kapının hemen durduğunu kontrol edin.

İpucu
Işığın şu an yanık mı sönük mü olduğunu (light_on) ve son değişim zamanını (last_change) iki değişkende tutun.
non-blockingGetTickCount / time.timetoggle
28

Durum makinesiyle kapı

Cevabı gör

Kapıyı bir durum makinesiyle yönetin. Dört durum vardır: CLOSED, OPENING, OPEN, CLOSING.
• CLOSED: motor durur, lamba ve uyarı ışığı söner. # basılınca → OPENING.
• OPENING: lamba yanar, uyarı ışığı turuncu, motor yukarı. Konum 0 olunca → OPEN.
• OPEN: motor durur, uyarı ışığı yeşil. 10 saniye geçince veya # basılınca → CLOSING.
• CLOSING: uyarı ışığı turuncu, motor aşağı. Konum 100 olunca → CLOSED; X basılırsa (engel) Obstacle! yazıp → OPENING.
Her durum değişiminde -> OPEN gibi yeni durumu yazdırın. Program başında kapı kapalı değilse CLOSING ile başlayın. Döngü 20 ms'de bir dönsün, hiçbir yerde uzun Sleep olmasın; tuşlar kenar algılamayla (Görev 19) okunsun.

İpucu
Durumu bir değişkende sayı olarak tutun (C'de enum). Bir enter(state) fonksiyonu yeni duruma geçerken motor ve ışıkları bir kez ayarlasın; ana döngü yalnızca geçiş koşullarını kontrol etsin. new_key() fonksiyonu yalnızca basıldığı anda tuş numarasını, diğer zamanlarda -1 döndürsün.
state machineenumenter()new_key()

5 Proje

Her şeyi birleştiren tam sistemler.
29

Tam garaj kontrolcüsü

Cevabı gör

Görev 28'deki durum makinesini şifreli girişle birleştirin. Durumlar: CLOSED, OPENING, OPEN, CLOSING, LOCKED.
• CLOSED: tuş takımından şifre alınır (Görev 23–26). Rakam → * ve 100 ms mavi ışık (en fazla 8 rakam); X → girişi sil, 300 ms sarı; # → kontrol. Şifre 2580. Doğruysa Access granted → OPENING. Yanlışsa Wrong code (n/3) ve 1 s kırmızı; 3. yanlışta → LOCKED. Giriş doluyken 5 s tuşa basılmazsa Timeout, entry cleared ve 1 s sarı.
• LOCKED: 15 s boyunca uyarı ışığı kırmızı yanıp söner (250 ms), tuşlar yok sayılır; sonra Unlocked → CLOSED.
• OPENING: lamba yanar, motor yukarı, uyarı ışığı turuncu yanıp söner (300 ms, programı durdurmadan — Görev 27). Konum 0 → OPEN.
• OPEN: motor durur, ışık sabit yeşil. 10 s sonra veya # ile → CLOSING.
• CLOSING: motor aşağı, turuncu yanıp sönme. X → Obstacle! Reopening → OPENING. Konum 100 → CLOSED.
CLOSED ve LOCKED durumlarında motor durur, lamba ve uyarı ışığı söner, giriş silinir. Her durum değişimi -> OPEN gibi yazdırılsın; program başında kapı kapalı değilse CLOSING ile başlansın.

İpucu
Görev 28'in iskeletini kullanın; state_time değişkenini enter() içinde ayarlayarak hem LOCKED (15 s) hem OPEN (10 s) süresini ölçün. Şifre işini handle_code(key) adlı bir fonksiyona taşıyın. Yanıp sönmeyi blink(r, g, b, period) fonksiyonunda Görev 27'deki gibi yapın.
state machinenon-blockingarray / listtimeoutsafety stop
30

Kapıyı istenen konuma götür

Cevap sende

Kapıyı tuş takımıyla istenen konuma götürün. Kullanıcı 0–100 arası bir kapalılık yüzdesi yazar ve # ile onaylar (ör. 5, 0, # → %50). Yazılan rakamlar ekranda görünsün; en fazla 3 rakam alınsın. X yazılan sayıyı silsin (Cleared).
• Hiç rakam yoksa ya da değer 100'den büyükse Invalid yazıp uyarı ışığını 1 saniye kırmızı yakın.
• Kapı zaten o konumdaysa Already there yazın.
• Aksi halde program yönü kendisi seçsin: hedef şu anki değerden küçükse kapı yukarı, büyükse aşağı gitsin; hedefe ulaşınca dursun. Hareket sırasında uyarı ışığı turuncu yansın ve konum her değiştiğinde 45% -> 50% gibi yazdırılsın. Hedefe varınca Arrived yazıp 1 saniye yeşil yakın.
• Hareket sırasında X basılırsa kapı hemen dursun ve Stopped yazılsın.

İpucu
Hareketi bir go_to(target) fonksiyonuna koyun. Dikkat: değer küçüldükçe kapı AÇILIR. Durma koşulu yukarı giderken pos <= target, aşağı giderken pos >= target olmalı. Konumu yalnızca değiştiğinde yazdırmak için son yazdırılan değeri saklayın.
go_to()direction choiceinput validationkey_read()
31

Yönetici modu: şifre değiştirme

Cevap sende

Şifre, program değiştirilmeden güncellenebilsin. Kullanıcı şifresi başlangıçta 1234, yönetici şifresi sabit 9999'dur. Tüm girişler # ile onaylanır, X girişi siler (Cleared); her rakam için * yazılır, en fazla 8 rakam alınır.
• Kullanıcı şifresi girilirse: Access granted, kapıyı açın, 5 s bekleyin, kapatın (Görev 22'deki fonksiyonlar).
• Yönetici şifresi girilirse: Admin mode yazılır ve uyarı ışığı sürekli sarı (255, 255, 0) yanar. Enter new code: yazılır, kullanıcı yeni şifreyi yazıp #'e basar; sonra Repeat new code: yazılır ve aynı şifre tekrar girilir. İki giriş aynıysa ve en az 4 rakamlıysa şifre değişir: Code changed yazılır ve uyarı ışığı iki kez yeşil yanıp söner (300 ms yanık, 300 ms sönük). Değilse Code NOT changed yazılır ve 2 s kırmızı yanar.
• Başka bir giriş: Wrong code ve 2 s kırmızı.
Not: Sürekli sarı ışık bozulmasın diye bu görevde tuş ışığı (mavi) kullanmayın.

İpucu
Bir girişi #'e kadar okuyan read_entry() fonksiyonu yazın ve üç yerde kullanın. C'de iki diziyi karşılaştıran same(a, a_len, b, b_len) fonksiyonu, yeni şifreyi kopyalamak için de bir for döngüsü gerekir.
read_entry()array copyglobal variableadmin mode
32

Çok kullanıcılı garaj ve rapor

Cevap sende

Garajı üç kişi kullanıyor ve her birinin 4 haneli kodu var: Ali 1111, Ayse 2222, Can 3333. İsimleri bir dizide, kodları iki boyutlu bir dizide (listelerin listesi) saklayın. Girişler Görev 31'deki gibi okunur (*, X siler, # onaylar).
• Bir kullanıcının kodu girilirse Welcome, Ayse yazılsın, o kişinin açma sayısı 1 artsın, lamba yansın, kapı açılsın, 5 s sonra Görev 25'teki close_door_safe() ile kapatılsın (engel yüzünden açıldıysa 5 s sonra tekrar denensin) ve lamba sönsün.
• Bilinmeyen bir kod girilirse Unknown code yazılsın, yanlış deneme sayacı artsın ve 2 s kırmızı yansın.
• Yalnızca 0 girilip #'e basılırsa rapor yazdırılsın:
Ali: 2 openings
Ayse: 0 openings
Can: 1 openings
Wrong attempts: 1
Total openings: 3

İpucu
find_user() fonksiyonu girilen kodu her kullanıcının koduyla karşılaştırıp kullanıcının sırasını (0–2) ya da bulunamazsa -1 döndürsün. Açma sayıları için kullanıcı sayısı kadar elemanlı bir sayaç dizisi kullanın.
2D array / list of listsfind_user()counter arrayreport