← Kodun diligörev 5 / 10
5 / 10 tamamlandı
görev 5 · ~30 dk

Şartları birleştirmek — && ve ||

İki anahtarlı kasa, iki kapılı oda — ve yanlışını seçince pompa yanar

hedef

Birden fazla şartı tek bir if'te birleştireceksin. Ve yanlış birleştirmenin kod hatası vermeden neye mal olduğunu göreceksin.

Önce şunu bil: iki anahtar, iki kapı

Bankadaki kasa iki anahtarla açılıyor. Biri sende, biri görevlide. İkisi birden dönmeden kapak açılmıyor. Bir tanesi yetmiyor.

Bir de iki kapılı oda düşün. Herhangi birinden girebilirsin. İkisinin de açık olması gerekmiyor, biri yeter.

Kodda:

İşaret Adı Ne zaman doğru
&& ve ikisi birden doğruysa
|| veya en az biri doğruysa
! değil tersini alır

Gündelik dilde zaten kullanıyorsun: "Hava güzel ve ödevim bitti, parka giderim." İkisi de lazım. "Otobüs veya metro varsa yetişirim." Biri yeter.

! ise "değil": !yagmur → yağmur yağmıyor.

Kod

Sera kitindeki kararı sensörsüz kuralım. İki sayı gireceksin: toprak nemi ve depo durumu.

kod · .ino
void setup() {
  Serial.begin(9600);
  Serial.println("Toprak (0-1023) ve depo (1 dolu, 0 bos) yaz:");
}

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

    bool susuz = toprak > 600;        // kuru toprak yuksek sayi verir
    bool depoDolu = depo == 1;

    if (susuz && depoDolu) {
      Serial.println("POMPA ACIK");
    } else {
      Serial.println("pompa kapali");
    }
  }
}

Yükle. Aynı satıra iki sayı: 700 1 → POMPA ACIK. 700 0 → pompa kapali. 300 1 → pompa kapali.

İki yeni şey var:

bool susuz = toprak > 600; — karşılaştırmanın sonucunu bir kutuya koyuyorsun. Görev 4'ün sonunda görmüştün: karşılaştırma bir sayı üretiyor, doğruysa 1 yanlışsa 0. bool o sayı için yapılmış kutu. Adı var diye okuması kolay: if (susuz && depoDolu) neredeyse Türkçe.

&& — ikisi de doğruysa. Toprak kuru ve depo dolu. Biri eksikse pompa çalışmıyor.

Şimdi hata yap — ve bedelini gör

&& yerine || yaz:

kod · .ino
if (susuz || depoDolu) {

Yükle. 700 0 yaz: toprak kuru, depo boş.

kod
POMPA ACIK

Pompa depo boşken çalışıyor. Gerçek kitte bu ne demek: pompa kuru dönüyor. Dalgıç pompalar suyla soğur; boşta birkaç dakika sonra yanar. Kod tek bir hata vermedi. && de || de derleniyor, ikisi de "geçerli" cümle.

Fark, yanlış giderse ne olduğunda. Derleyici sana mantığını söylemiyor. Sensör sana söylemiyor. Pompa söylüyor — ama artık iş işten geçmiş oluyor.

&& yaz, geri koy. Bu iki karakter Sera kitinde pompanın yanmasını engelleyen şeyin ta kendisi.

Şimdi sen yaz

Üçüncü bir şart ekle: gece sulama yok. Bir saat sayısı da al (0-23). Pompa sadece toprak kuru, depo dolu ve saat 7 ile 20 arasındaysa çalışsın.

kod · .ino
void setup() {
  Serial.begin(9600);
  Serial.println("Toprak, depo ve saat yaz (orn: 700 1 14):");
}

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

    bool susuz = toprak > 600;
    bool depoDolu = depo == 1;
    // ŞİMDİ SEN YAZ: gunduz adinda bir bool ac — saat 7 ile 20 arasinda mi

    // ŞİMDİ SEN YAZ: uc sarti && ile birlestir
    if (susuz && depoDolu) {
      Serial.println("POMPA ACIK");
    } else {
      Serial.println("pompa kapali");
    }
  }
}
🔍 İpucu 1

"7 ile 20 arasında" tek bir karşılaştırma değil, iki tane: 7'den büyük ya da eşit ve 20'den küçük ya da eşit. İkisini && ile bağla.

🔍 İpucu 2

bool gunduz = saat >= 7 && saat <= 20; sonra if (susuz && depoDolu && gunduz)

✅ Cevap
kod · .ino
bool gunduz = saat >= 7 && saat <= 20;

if (susuz && depoDolu && gunduz) {

700 1 14 → açık. 700 1 23 → kapalı. 700 0 14 → kapalı.

Dikkat et: "7 ile 20 arası" yazmak için 7 <= saat <= 20 diyemiyorsun. Matematikte doğru, kodda yanlış — derlenir ama saçma sonuç verir. Kod karşılaştırmaları ikişer ikişer yapıyor; iki ayrı soru sorup && ile bağlamak zorundasın.

Bir de şunu fark et: üç şartı üç ayrı bool kutusuna koyduk, sonra birleştirdik. Hepsini tek satıra da yazabilirdin: if (toprak > 600 && depo == 1 && saat >= 7 && saat <= 20). Çalışır. Ama üç ay sonra o satıra bakıp ne dediğini anlaman zor. Adı olan kutu kendini açıklar.

📄 Görevin tam kodu
kod · .ino
void setup() {
  Serial.begin(9600);
  Serial.println("Toprak, depo ve saat yaz (orn: 700 1 14):");
}

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

    bool susuz = toprak > 600;
    bool depoDolu = depo == 1;
    bool gunduz = saat >= 7 && saat <= 20;

    if (susuz && depoDolu && gunduz) {
      Serial.println("POMPA ACIK");
    } else {
      Serial.println("pompa kapali");
    }
  }
}

Olmadıysa

Ne görüyorsun Ne yap
Her girişte POMPA ACIK Bir yerde || kalmış ya da depo = 1 tek eşittirle yazılmış. Görev 4'ü hatırla
Hiçbir zaman açılmıyor saat >= 7 && saat <= 20 yerine saat >= 20 gibi bir şey yazmış olabilirsin; ikisini de kontrol et
expected ')' && ile bağladığın şartlardan biri parantez dışında kalmış
Üçüncü sayı hep 0 Üç sayıyı da aynı satıra, boşlukla yazdın mı? 700 1 14
'gunduz' was not declared bool gunduz = ... satırı if'ten önce olmalı

Kendini test et

Soru: if (!susuz) ne demek? Ve if (!(susuz && depoDolu)) ile if (!susuz && !depoDolu) aynı şey mi?

Cevabı gör

!susuz → "susuz değil", yani toprak nemli.

İkinci soru: aynı şey değil.

!(susuz && depoDolu) → "ikisi birden doğru değil". Yani en az biri yanlış. Toprak nemli olabilir, depo boş olabilir, ikisi de olabilir.

!susuz && !depoDolu → "toprak nemli ve depo boş". İkisi de yanlış olmalı.

İlki daha geniş. Toprak kuru ama depo boşsa ilki doğru, ikincisi yanlış. Parantezin yeri anlamı değiştiriyor. ! işaretini kullanırken neyin tersini aldığını parantezle netleştir — kendin için, çünkü derleyici ikisini de kabul eder.

Sera kitinde pompayı süren satır if (susuzMu && depoDolu && suEmildi) — üç şart, hepsi &&. Biri || olsaydı pompa kuru çalışırdı. Şimdi neden olduğunu biliyorsun.


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

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