← Kodun diligörev 8 / 10
8 / 10 tamamlandı
görev 8 · ~35 dk

İşi adlandırmak — fonksiyon

"Çay yap" demek — ve kopyaladığın her satırın bedeli

hedef

Aynı kodu üç yere kopyalayacak, sonra bir sayıyı değiştirmek için üç yeri de düzeltmek zorunda kalacaksın. Sonra o işe bir ad verip bir kez yazacaksın.

Önce hata yap — kopyala, yapıştır, pişman ol

Bir sıcaklık sensörün var, sayı olarak okuyorsun. Sayıyı dereceye çevirmek için bir hesap gerekiyor: sayıyı 10'a böl, 5 çıkar. Üç ayrı yerde sıcaklık lazım — sabah, öğle, akşam.

kod · .ino
void setup() {
  Serial.begin(9600);

  int sabah = 285;
  Serial.print("Sabah: ");
  Serial.println(sabah / 10 - 5);

  int ogle = 340;
  Serial.print("Ogle: ");
  Serial.println(ogle / 10 - 5);

  int aksam = 260;
  Serial.print("Aksam: ");
  Serial.println(aksam / 10 - 5);
}

void loop() {
}

Yükle: 23, 29, 21. Çalışıyor.

Şimdi sensörü değiştirdin. Yeni sensörün hesabı farklı: 10'a değil 8'e bölmek gerekiyor. Düzelt.

Üç yer. Üçünü de bulman, üçünü de değiştirmen gerekiyor. Birini atlarsan öğle sıcaklığı yanlış çıkar ve kod hata vermez. Otuz yer olsaydı?

Kopyaladığın her satır, ileride düzeltmen gereken bir satırdır. Kopyala-yapıştır ilk beş dakikada hızlı, sonraki beş ayda pahalı.

Önce şunu bil: "çay yap" demek

Birine "çay yap" diyorsun. Su koy, kaynat, demle, süz, bardağa dök — beş adımı tek kelimeyle çağırıyorsun. Ve "iki bardak" diyebiliyorsun; o adımları iki bardak için uyguluyor.

Fonksiyon bu. Bir işe ad veriyorsun, adımları bir kez yazıyorsun, sonra adıyla çağırıyorsun. Kaç kez çağırırsan çağır, adımlar tek yerde.

kod · .ino
int dereceyeCevir(int okuma) {
  return okuma / 10 - 5;
}

Parçaları:

Çağırmak: dereceyeCevir(285) — parantezin içine 285 koydun, sana 23 döndü. Onu bir kutuya koyabilir ya da doğrudan yazdırabilirsin.

Görev 1'den beri fonksiyon çağırıyorsun zaten: delay(1000), Serial.println(x), digitalWrite(LED_BUILTIN, HIGH). Başkasının yazdığı fonksiyonlardı. Şimdi kendininkini yazıyorsun.

Kod

kod · .ino
int dereceyeCevir(int okuma) {
  return okuma / 10 - 5;
}

void setup() {
  Serial.begin(9600);

  Serial.print("Sabah: ");
  Serial.println(dereceyeCevir(285));
  Serial.print("Ogle: ");
  Serial.println(dereceyeCevir(340));
  Serial.print("Aksam: ");
  Serial.println(dereceyeCevir(260));
}

void loop() {
}

Aynı çıktı: 23, 29, 21. Şimdi sensörü değiştir — 10'u 8 yap. Tek yer. Üçü de düzeldi.

Fonksiyonu setup'ın üstüne yazdık. Çağrıldığı yerden önce tanımlı olmalı; dizideki kuralın aynısı.

void — bir şey döndürmeyen fonksiyon

Her fonksiyon bir şey geri vermez. Bazıları sadece iş yapar:

kod · .ino
void selamla() {
  Serial.println("Merhaba!");
}

Baştaki void "hiçbir şey döndürmüyorum" demek. return yok. Çağırınca yazar, biter. setup ve loop'un başındaki void da bu — onlar da bir şey döndürmüyor.

Şimdi sen yaz

İki sayı alıp büyüğünü döndüren fonksiyon yaz. Adı buyukOlan.

kod · .ino
// ŞİMDİ SEN YAZ: buyukOlan fonksiyonunu buraya yaz
//   iki int parametre alsin, buyuk olani return etsin

void setup() {
  Serial.begin(9600);
  Serial.println(buyukOlan(7, 3));      // 7 yazmali
  Serial.println(buyukOlan(2, 9));      // 9 yazmali
  Serial.println(buyukOlan(5, 5));      // 5 yazmali
}

void loop() {
}
🔍 İpucu 1

İskelet: int buyukOlan(int a, int b) { ... }. İçinde Görev 4'teki if: a, b'den büyükse a'yı döndür, değilse b'yi.

🔍 İpucu 2

if (a > b) { return a; } else { return b; }

✅ Cevap
kod · .ino
int buyukOlan(int a, int b) {
  if (a > b) {
    return a;
  } else {
    return b;
  }
}

return çalıştığı anda fonksiyon biter — altında satır olsa da çalışmaz. O yüzden else aslında gerekli değil:

kod · .ino
int buyukOlan(int a, int b) {
  if (a > b) return a;
  return b;
}

İlk return çalışmadıysa demek ki a büyük değil; ikinci satır b'yi döndürür. İkisi de doğru; ilki daha açık, ikincisi daha kısa. Kitlerde ikisini de göreceksin.

buyukOlan(5, 5) neden 5? 5 > 5 yanlış, b döner — o da 5. Eşitlikte hangisini döndürdüğün fark etmiyor.

📄 Görevin tam kodu
kod · .ino
int buyukOlan(int a, int b) {
  if (a > b) {
    return a;
  } else {
    return b;
  }
}

void setup() {
  Serial.begin(9600);
  Serial.println(buyukOlan(7, 3));
  Serial.println(buyukOlan(2, 9));
  Serial.println(buyukOlan(5, 5));
}

void loop() {
}

Olmadıysa

Ne görüyorsun Ne yap
'buyukOlan' was not declared Fonksiyonu setup'ın altına yazmışsın; üstüne al. Ya da adı farklı yazdın
expected ';' before '{' Fonksiyon başlığının sonuna ; koymuşsun: int buyukOlan(int a, int b); — başlıkta noktalı virgül olmaz, süslü parantez gelir
return-statement with no value void yazmışsın ama return a; diyorsun. Bir şey döndürüyorsan baştaki void değil int olmalı
control reaches end of non-void function Bazı yollarda return yok. if doğruysa döndürüyorsun ama yanlışsa? else ya da ikinci return ekle
Hep aynı sayı çıkıyor Parametreleri kullanmıyorsun; içeride sabit bir sayı döndürüyorsun

Kendini test et

Soru: dereceyeCevir(285) çağırdın. Fonksiyonun içinde okuma = 0; yazsaydın, dışarıdaki 285 değişir miydi?

Cevabı gör

Hayır. 285 olduğu gibi kalır.

Fonksiyona bir sayı verdiğinde kopyasını veriyorsun. okuma fonksiyonun kendi kutusu; içine 285'in kopyası konuyor. O kutuyu değiştirmek dışarıdaki hiçbir şeyi değiştirmez. Fonksiyon bitince kutu ölür.

Dışarıya bir şey ulaştırmanın yolu return. "Çay yap" dediğin kişi mutfağa gidiyor, işi yapıyor, sana bardağı getiriyor — mutfakta ne yaptığını görmüyorsun, sadece bardağı alıyorsun. Fonksiyonun içi mutfak, return bardak.

Bunun tersi de var: fonksiyon dışarıdaki bir kutuyu doğrudan değiştirebilir, eğer o kutu en dışta açıldıysa (Görev 7'deki dizi gibi). O zaman "kim değiştirdi" sorusu zorlaşıyor. Mümkünse parametre al, return ver.

Sera kitindeki sula() fonksiyonu tam olarak bu: pompayı aç, bekle, kapat — üç satır, tek ad. Kodda dört yerden çağrılıyor ve sulama süresini değiştirmek istediğinde tek yeri düzeltiyorsun.


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

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