5 / 8 tamamlandı
görev 5 · ~30 dk

Liste tutmak

Dizi ve döngü — beş kart, tek kod

hedef

Birden çok değeri tek bir isimde tutmak ve hepsini tek döngüyle gezmek.

Önce şunu bil

Ev güvenlik kitinde bir kapı kilidi kuracaksın. Yetkili kartların numaralarını koda yazacaksın. İki kart varsa şöyle yazılabilir:

kod · .ino
int kart1 = 163;
int kart2 = 195;

Peki beş kart olsa? On kart olsa? kart3, kart4, kart5... ve her yeni kart için kontrol kodunu da uzatman gerekir.

Bu yaklaşım kısa sürede çöküyor. Çözüm dizi.

Dizi ve döngü — hatırlatma

kod · .ino
int kartlar[3] = {163, 195, 88};

Tek ad, üç bölme, numaralar sıfırdan. Dizi Kodun dili Görev 7'de, for döngüsü Görev 6'da anlatıldı — sınırın dışına çıkmanın neden sessizce bozduğu da orada.

Burada ikisinin birlikte ne yaptığına bakıyoruz: dizi veriyi tutuyor, döngü onu geziyor. Asıl kazanç bu ikisinin birleşiminde.

for — hepsini gezmek

kod · .ino
for (int i = 0; i < 3; i++) {
  Serial.println(kartlar[i]);
}

Üç parçası var:

i sırayla 0, 1, 2 oluyor ve döngü üç kez dönüyor. i 3 olunca şart bozuluyor ve duruyor.

i++ yazmayı unutursan i hiç artmaz, şart hep doğru kalır ve döngü sonsuza kadar döner. Kart kilitlenmiş gibi görünür.

Kod

kod · .ino
const int KART_SAYISI = 3;
int yetkili[KART_SAYISI] = {163, 195, 88};

// ŞİMDİ SEN YAZ:
// yetkiliMi adinda bir fonksiyon yaz.
// Bir numara alsin, listede varsa true dondursun.

void setup() {
  Serial.begin(9600);
  Serial.println("Kart numarasi gir:");
}

void loop() {
  if (Serial.available() > 0) {
    int numara = Serial.parseInt();
    while (Serial.available()) Serial.read();

    Serial.print(numara);
    if (yetkiliMi(numara)) {
      Serial.println("  ->  Hos geldin");
    } else {
      Serial.println("  ->  Yetkisiz");
    }
  }
}

Şimdi sen yaz

🔍 İpucu 1

Diziyi for ile gez. Her turda yetkili[i] ile gelen numarayı karşılaştır.

Eşitlik kontrolü iki eşittir: ==

🔍 İpucu 2

Eşleşme bulursan hemen return true; yazabilirsin — döngünün bitmesini beklemene gerek yok.

Döngü hiç eşleşme bulmadan biterse, o zaman return false;

✅ Cevap
kod · .ino
bool yetkiliMi(int numara) {
  for (int i = 0; i < KART_SAYISI; i++) {
    if (yetkili[i] == numara) {
      return true;
    }
  }
  return false;
}

İki ince nokta var.

return true döngünün içinde. Eşleşmeyi bulduğun an fonksiyondan çıkıyorsun; kalan kartlara bakmanın anlamı yok. Buna erken çıkış denir ve hem hızlı hem okunur.

return false döngünün dışında. Oraya ancak döngü hiçbir şey bulamadan bittiğinde ulaşılıyor. İçine yazsaydın ilk kart tutmadığında hemen "yetkisiz" derdi — diğerlerine hiç bakmazdı.

Bu iki return'ün yeri, bu fonksiyonun tamamı. Yerlerini değiştirmek kodu bozar ama derleyici uyarmaz.

📄 Görevin tam kodu
kod · .ino
const int KART_SAYISI = 3;
int yetkili[KART_SAYISI] = {163, 195, 88};

bool yetkiliMi(int numara) {
  for (int i = 0; i < KART_SAYISI; i++) {
    if (yetkili[i] == numara) {
      return true;
    }
  }
  return false;
}

void setup() {
  Serial.begin(9600);
  Serial.println("Kart numarasi gir:");
}

void loop() {
  if (Serial.available() > 0) {
    int numara = Serial.parseInt();
    while (Serial.available()) Serial.read();

    Serial.print(numara);
    if (yetkiliMi(numara)) {
      Serial.println("  ->  Hos geldin");
    } else {
      Serial.println("  ->  Yetkisiz");
    }
  }
}

Şimdi dördüncü bir kart eklemeyi dene. KART_SAYISI'nı 4 yap, listeye bir sayı ekle. Bitti — yetkiliMi fonksiyonuna hiç dokunmadın.

İyi kod böyle olur: yeni bir şey eklemek, var olanı bozmadan mümkünse doğru yerdesin.

Çalıştı mı?

kod
163  ->  Hos geldin
195  ->  Hos geldin
88   ->  Hos geldin
200  ->  Yetkisiz
0    ->  Yetkisiz

Listedeki üç numara geçiyor, başkası geçmiyor.

Olmadıysa

Ne görüyorsun Ne yap
Hep "Yetkisiz" == yerine = yazmışsın. Tek eşittir atama yapar, karşılaştırmaz
Hep "Hos geldin" return false; satırını döngünün içine koymuşsun
Sadece ilk kart geçiyor return false; yine döngünün içinde
Kart donuyor, Serial susuyor i++ yazmayı unutmuşsun, sonsuz döngü
Garip sayılar çıkıyor Döngüde i <= KART_SAYISI yazmışsın; < olacak, rafın dışına uzanıyorsun

Kendini test et

Soru: Gerçek kitte kart numarası tek sayı değil, dört baytlık bir dizi. Yetkili listesi de byte YETKILI[2][4] diye yazılıyor. Bu ne demek?

Cevabı gör

Dizinin içinde dizi. İki elemanlı bir raf, ama her elemanı tek bir sayı değil, dört sayılık küçük bir raf.

YETKILI[0] → birinci kartın dört baytı YETKILI[0][2] → birinci kartın üçüncü baytı

Neden dört bayt? Çünkü RFID kartların kimlik numarası tek bir sayıya sığmıyor. Dört ayrı parça halinde geliyor.

Karşılaştırma da bu yüzden iki katmanlı: dış döngü kartları geziyor, iç döngü o kartın dört baytını tek tek kontrol ediyor. Ev güvenlik kitinde bu kodu göreceksin ve tanıdık gelecek — bugün yazdığın şeyin iki katmanlısı, o kadar.


Takıldın, hata tablosu da yetmedi mi?

WhatsApp'tan sor — hangi görevdesin, ekranda ne yazıyor, devrenin fotoğrafı.