İşi adlandırmak — fonksiyon
"Çay yap" demek — ve kopyaladığın her satırın bedeli
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.
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.
int dereceyeCevir(int okuma) {
return okuma / 10 - 5;
}
Parçaları:
int(baştaki) — bu fonksiyon sana bir tam sayı geri veriyordereceyeCevir— adıint okuma— parametre. Fonksiyona ne veriyorsun. "Kaç bardak" gibi.return— sonucu geri ver ve bit
Ç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
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:
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.
// Şİ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
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:
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
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ı.