Karar vermek — if ve else
"=" koyar, "==" sorar — bir kere karıştır, bir daha karıştırma
Klavyeden bir not gireceksin, kod harf notunu söyleyecek. Yolda, yeni başlayanların bir numaralı hatasını kendi elinle yapacaksın.
Önce şunu bil: kapıdaki görevli
Bir konser girişi düşün. Görevli tek bir şey soruyor: bilet var mı? Varsa içeri. Yoksa geri.
if (bilet_var) {
// iceri al
} else {
// geri cevir
}
if şartı soruyor. Şart doğruysa ilk süslü parantezin içi çalışıyor, yanlışsa else'inki. İkisi birden asla çalışmaz.
Şartı yazmak için karşılaştırma işaretleri var:
| İşaret | Sorduğu soru |
|---|---|
== |
eşit mi? |
!= |
farklı mı? |
> |
büyük mü? |
< |
küçük mü? |
>= |
büyük ya da eşit mi? |
<= |
küçük ya da eşit mi? |
Görev 2'de if (Serial.available() > 0) yazdın. Şimdi ne dediğini biliyorsun: "gelen karakter sayısı sıfırdan büyük mü?"
=koyar,==sorar.
puan = 5→ puan kutusuna 5 koy.puan == 5→ puan 5 mi diye sor. Tek karakter fark, tamamen farklı iş. Birazdan bu farkı unutacak ve ne olduğunu göreceksin.
Kod
void setup() {
Serial.begin(9600);
Serial.println("Notunu yaz (0-100):");
}
void loop() {
if (Serial.available() > 0) {
int notu = Serial.parseInt();
while (Serial.available()) Serial.read();
if (notu >= 50) {
Serial.println("Gectin.");
} else {
Serial.println("Kaldin.");
}
}
}
Yükle. 70 yaz: Gectin. 30 yaz: Kaldin. 50 yaz — sınırda ne oluyor? >= olduğu için geçiyor. > yazsaydın kalırdı. Sınırı hangi tarafa koyduğun senin kararın ve kitlerde bu karar sulama pompasını açıp kapatacak.
Şimdi hata yap — kursun en önemli hatası
if (notu >= 50) satırını şöyle değiştir:
if (notu = 50) {
Tek =. Yükle. Hata yok — derlendi. Şimdi 30 yaz.
Gectin.
Otuz geçti. 10 yaz: geçti. 0 yaz: geçti. Ne yazarsan yaz geçiyor.
Çünkü kod "notu 50 mi?" diye sormadı. "notu kutusuna 50 koy" dedi. Görev 2'deki cümle: = içine koyar. Koydu, sonra if içine baktı — kutuda 50 var, sıfır değil, "doğru" saydı. Her seferinde.
Derleyici bunu yakalayamıyor çünkü yazdığın şey dilbilgisine uygun. Cümlen kurallı ama anlamı yanlış — Görev 0'da bahsettiğimiz "yakalanamayan hata" tam olarak bu.
Bu hata yeni başlayan herkesin başına gelir. Bir kere yaşarsan bir daha yapmazsın. Şimdi yaşadın.
==yaz ve geri koy.
Zincir: else if
Tek soru yetmiyor. Görevli önce VIP mi diye bakıyor, değilse normal bilet mi, o da değilse öğrenci mi. Sırayla.
if (notu >= 85) {
Serial.println("A");
} else if (notu >= 70) {
Serial.println("B");
} else if (notu >= 50) {
Serial.println("C");
} else {
Serial.println("F");
}
Yukarıdan aşağı sorulur. İlk uyan çalışır, gerisi atlanır. 90 yazarsan A — ve 90 aynı zamanda 70'ten de büyük ama B yazmıyor, çünkü orayı hiç sormadı. Sıra önemli: >= 50'yi en üste koysaydın 90 da C olurdu.
Şimdi sen yaz
Zincire bir kademe ekle: 60 ile 69 arası D olsun.
void setup() {
Serial.begin(9600);
Serial.println("Notunu yaz (0-100):");
}
void loop() {
if (Serial.available() > 0) {
int notu = Serial.parseInt();
while (Serial.available()) Serial.read();
if (notu >= 85) {
Serial.println("A");
} else if (notu >= 70) {
Serial.println("B");
// ŞİMDİ SEN YAZ: buraya D kademesini ekle — ama dogru yere
} else if (notu >= 50) {
Serial.println("C");
} else {
Serial.println("F");
}
}
}
🔍 İpucu 1
Zincir yukarıdan aşağı okunuyor ve ilk uyan kazanıyor. D kademesi B'nin altına, C'nin üstüne gelmeli. Yoksa 65 yazdığında ne olur, düşün.
🔍 İpucu 2
} else if (notu >= 60) { ve altına Serial.println("D");
✅ Cevap
} else if (notu >= 70) {
Serial.println("B");
} else if (notu >= 60) {
Serial.println("D");
} else if (notu >= 50) {
Serial.println("C");
Yanlış yere koysaydın — mesela C'nin altına — 65 yazdığında C çıkardı. Çünkü 65, >= 50'ye önce uyar ve D sorusuna hiç sıra gelmez.
Kod hata vermezdi. Bu görevin ikinci sessiz hatası: zincirin sırası yanlışsa bazı kademeler hiç çalışmaz ve kimse sana söylemez. Bir zincir yazdığında en büyük sayıdan en küçüğe doğru sırala — ya da tersi — ama karıştırma.
📄 Görevin tam kodu
void setup() {
Serial.begin(9600);
Serial.println("Notunu yaz (0-100):");
}
void loop() {
if (Serial.available() > 0) {
int notu = Serial.parseInt();
while (Serial.available()) Serial.read();
if (notu >= 85) {
Serial.println("A");
} else if (notu >= 70) {
Serial.println("B");
} else if (notu >= 60) {
Serial.println("D");
} else if (notu >= 50) {
Serial.println("C");
} else {
Serial.println("F");
}
}
}
Olmadıysa
| Ne görüyorsun | Ne yap |
|---|---|
| Her sayı için aynı harf çıkıyor | Bir if'te tek = kalmış. Hepsine bak: soruyorsan == |
expected ')' before '{' |
Şartın parantezi kapanmamış: if (notu >= 50 { |
65 yazınca D yerine C çıkıyor |
D kademesini yanlış sıraya koymuşsun; C'nin üstüne al |
else satırında expected '}' before 'else' |
else'ten önceki bloğun }'si eksik. Her { için bir } |
| Hiç harf çıkmıyor | Serial.println satırlarını süslü parantezlerin içine yazdın mı? |
Kendini test et
Soru: if (notu = 50) tek = ile derlendi ve her zaman "doğru" saydı. Peki if (notu = 0) yazsaydın ne olurdu?
Cevabı gör
Her zaman "yanlış" sayardı — hiç geçemezdin.
Kutuya 0 koyuyor, sonra bakıyor: 0. Kod dünyasında 0 "yanlış", sıfır olmayan her şey "doğru" demek. = 50 her zaman doğruydu çünkü 50 sıfır değil; = 0 her zaman yanlış olur çünkü sıfır sıfır.
Buradan çıkan asıl şey şu: if aslında sayıya bakıyor. Karşılaştırma işaretleri bir sayı üretiyor — doğruysa 1, yanlışsa 0 — ve if o sayıya bakıyor. Yani if (5) bile geçerli ve her zaman doğru. Görev 5'te bu sayıları birleştirmeyi öğreneceksin.
Sera kitinde "toprak susuz mu?" sorusu tam olarak bu: if (toprak > ESIK). Eşiği hangi tarafa koyduğun, bitkinin sulanıp sulanmayacağını belirliyor.
Takıldın, hata tablosu da yetmedi mi?
WhatsApp'tan sor — hangi görevdesin, ekranda ne yazıyor, devrenin fotoğrafı.