Liste tutmak
Dizi ve döngü — beş kart, tek kod
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:
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
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
for (int i = 0; i < 3; i++) {
Serial.println(kartlar[i]);
}
Üç parçası var:
int i = 0— nereden başlai < 3— ne zamana kadar devam eti++— her turdai'yi bir artır
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
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
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
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ı?
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ı.