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

İşi adlandır

Fonksiyon yaz, şartları birleştir — && ile || arasındaki fark

hedef

Kendi fonksiyonunu yazmak ve birden fazla şartı birleştirmek.

Fonksiyon — hatırlatma

Bir işe ad verip tek satırla çağırmak. Kodun dili Görev 8'de void, parametre ve return ile birlikte anlatıldı.

Burada fonksiyonun iki farklı işini ayırıyoruz, çünkü sistem kurarken ikisi farklı yerlerde duruyor:

Cevap veren fonksiyon

Bazı fonksiyonlar iş yapar, bazıları soru cevaplar:

kod · .ino
bool susuzMu(int deger) {
  return deger > 600;
}

Baştaki void yerine bool var — bu fonksiyon geriye bir doğru/yanlış döndürecek demek. return o cevabı gönderiyor.

Parantez içindeki int deger ise parametre: fonksiyona dışarıdan verdiğin bilgi. susuzMu(720) dediğinde deger içeride 720 oluyor.

İki şartı birleştirmek

Sulaması için iki şeyin birden doğru olması gerekiyor: toprak susuz olacak ve depoda su olacak. && ve || farkı Kodun dili Görev 5'te; burada o farkın bedeli var.

Yanlışını seçersen kod yine derlenir. Fark, depo boşaldığı gün ortaya çıkar: || yazdıysan pompa kuru döner ve yanar. Dalgıç pompa suyla soğuyor; susuz kalan pompanın ömrü dakikalarla ölçülüyor.

Kod

kod · .ino
const int SUSUZ_ESIGI    = 600;
const int DEPO_BOS_ESIGI = 200;

void sula() {
  Serial.println("   >>> SULUYORUM");
}

// ŞİMDİ SEN YAZ:
// sulanmaliMi adinda bir fonksiyon yaz.
// Iki parametre alsin: toprak ve depo.
// Toprak susuzsa VE depoda su varsa true dondursun.

void setup() {
  Serial.begin(9600);
  Serial.println("Iki sayi gir: once toprak, sonra depo");
}

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

    Serial.print("toprak=");
    Serial.print(toprak);
    Serial.print("  depo=");
    Serial.println(depo);

    if (sulanmaliMi(toprak, depo)) {
      sula();
    } else {
      Serial.println("   sulamiyorum");
    }
  }
}

Serial Monitor'e iki sayıyı arada boşlukla yazacaksın: 720 500 gibi.

Şimdi sen yaz

🔍 İpucu 1

Fonksiyon bool döndürecek ve iki int parametre alacak:

kod · .ino
bool sulanmaliMi(int toprak, int depo) {
  return ...;
}

return'ün sağına iki şartı && ile birleştirerek yaz.

✅ Cevap
kod · .ino
bool sulanmaliMi(int toprak, int depo) {
  return toprak > SUSUZ_ESIGI && depo > DEPO_BOS_ESIGI;
}

Karşılaştırmalar zaten doğru/yanlış üretiyor, && de onları birleştiriyor. Fazladan if yazmana gerek yok.

Buradaki en yaygın hata && yerine || yazmak. Öyle yazsaydın sistem depo bomboşken bile sulardı — ve kod hata vermezdi. Derleyici senin ne demek istediğini bilmiyor, sadece yazdığını yapıyor.

Bir de fonksiyonun adına bak: sulanmaliMi. Soru gibi. Çağırdığın yerde if (sulanmaliMi(...)) diye okunuyor, neredeyse Türkçe. İyi isim, yorum yazma ihtiyacını ortadan kaldırır.

📄 Görevin tam kodu
kod · .ino
const int SUSUZ_ESIGI    = 600;
const int DEPO_BOS_ESIGI = 200;

void sula() {
  Serial.println("   >>> SULUYORUM");
}

bool sulanmaliMi(int toprak, int depo) {
  return toprak > SUSUZ_ESIGI && depo > DEPO_BOS_ESIGI;
}

void setup() {
  Serial.begin(9600);
  Serial.println("Iki sayi gir: once toprak, sonra depo");
}

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

    Serial.print("toprak=");
    Serial.print(toprak);
    Serial.print("  depo=");
    Serial.println(depo);

    if (sulanmaliMi(toprak, depo)) {
      sula();
    } else {
      Serial.println("   sulamiyorum");
    }
  }
}

Çalıştı mı?

Dört durumu da dene:

kod
720 500   ->  SULUYORUM      (susuz + su var)
720 50    ->  sulamiyorum    (susuz ama depo bos)
300 500   ->  sulamiyorum    (depo dolu ama toprak iyi)
300 50    ->  sulamiyorum

Sadece birinci satırda suluyor. && bunu yapıyor.

Şimdi &&'i || yap ve aynı testi tekrarla. İkinci ve üçüncü satırda da sulamaya başlayacak — gerçek bir sistemde pompanın yanması demek bu.

Olmadıysa

Ne görüyorsun Ne yap
Hep suluyor && yerine \|\| yazmışsın
Hiç sulamıyor İkinci sayıyı girmemişsin; 720 500 gibi ikisini birden yaz
Derleme hatası: sulanmaliMi was not declared Fonksiyonu loop'un üstüne yaz — C yukarıdan aşağı okuyor
İkinci sayı hep 0 Aralarına boşluk koydun mu?

Kendini test et

Soru: sula() fonksiyonunun başında void yazıyor, sulanmaliMi'nin başında bool. Neden?

Cevabı gör

void "geriye bir şey döndürmüyorum" demek. sula() bir iş yapıyor — ekrana yazıyor, gerçek sistemde pompayı açıyor. Sana rapor vermesine gerek yok.

bool ise "geriye bir doğru/yanlış göndereceğim" demek. sulanmaliMi() iş yapmıyor, soru cevaplıyor.

Bu ayrım kodu okunur tutuyor: fonksiyonun ilk kelimesine bakarak ne tür bir şey olduğunu anlıyorsun.

İyi bir alışkanlık şu: bir fonksiyon ya iş yapsın ya soru cevaplasın, ikisini birden yapmasın. Soru cevaplayan bir fonksiyon aynı zamanda bir şeyi değiştiriyorsa, onu çağıran kişi bunu beklemez — ve hata tam oradan çıkar.


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

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