Tekrar etmek — for ve while
On kez şınav, temiz olana kadar sil — ve çıkışı unutursan ne olur
Aynı işi elle on kez yazmak yerine karta "on kez yap" diyeceksin. Sonra "olana kadar yap" diyeceksin. Ve bir kez, yanlışlıkla, "hep yap" diyeceksin.
Bu kursun en uzun görevi. İki yarısı var; arada mola verebilirsin.
Birinci yarı — elle yazmak
1'den 5'e kadar sayıları ekrana yaz. Bildiğin araçlarla:
void setup() {
Serial.begin(9600);
Serial.println(1);
Serial.println(2);
Serial.println(3);
Serial.println(4);
Serial.println(5);
}
void loop() {
}
Çalışır. Peki 100'e kadar olsaydı? 1000? Yüz satır yazmak sadece yorucu değil — bir satırda yazım hatası yaparsan yüz satırın arasında bulman gerekiyor.
Bir de bak: beş satırın hepsi aynı işi yapıyor, sadece sayı değişiyor. Değişen tek şeyi bir kutuya koyup "bu kutuyu artırarak tekrar et" diyebilsen…
Önce şunu bil: for — kaç kez olduğunu biliyorsan
"On kez şınav çek." Sayıyı baştan biliyorsun. Yapıyorsun, sayıyorsun, ona gelince duruyorsun.
for (int i = 1; i <= 5; i++) {
Serial.println(i);
}
Parantezin içinde üç parça var, noktalı virgülle ayrılmış:
| Parça | Ne yapıyor | Ne zaman |
|---|---|---|
int i = 1 |
sayacı kur, 1'den başla | bir kez, en başta |
i <= 5 |
devam edeyim mi? | her turdan önce sorulur |
i++ |
sayacı bir artır | her turun sonunda |
i++ yeni bir yazım; i = i + 1 ile aynı şey, sadece kısa. Görev 2'deki "kutudakini al, bir ekle, geri koy".
Akışı elle izle: i 1 → şart doğru → yaz → i 2 → doğru → yaz → … → i 5 → doğru → yaz → i 6 → yanlış → döngü biter. Beş satır çıktı, iki satır kod.
Kod
void setup() {
Serial.begin(9600);
for (int i = 1; i <= 5; i++) {
Serial.println(i);
}
Serial.println("Bitti.");
}
void loop() {
}
Yükle. Ekranda 1'den 5'e kadar sayılar, altında Bitti. Şimdi 5'i 100 yap, yükle. Yüz satır. Kodda tek karakter değişti.
Bu sefer loop boş ve iş setup'ta — çünkü bir kez sayıp durmak istiyoruz, sonsuza kadar tekrar değil.
İkinci yarı — while: kaç kez olduğunu bilmiyorsan
"Temiz olana kadar sil." Kaç kez sileceğini bilmiyorsun. Her seferinde bakıyorsun: temiz mi? Değilse bir daha.
while (sart) {
// sart dogru oldugu surece tekrar et
}
for'un ikinci parçasının tek başına hali. Sayaç yok, artırma yok — sadece "devam edeyim mi?" sorusu. Hepsini sen yönetiyorsun.
Görev 2'den beri kopyaladığın while (Serial.available()) Serial.read(); satırı buydu: "gelen karakter kaldığı sürece bir tane oku." Kaç karakter geldiğini bilmiyorsun, o yüzden while.
Şimdi hata yap — ve kartı kilitle
Şunu setup'a yaz, yükle:
int sayac = 0;
while (sayac < 5) {
Serial.println(sayac);
}
Serial Monitor'ü aç. Ekran sıfırlarla doluyor. Durmuyor. Kaydırma çubuğu küçülüyor, sayılar akıyor.
sayac hep 0. Şart 0 < 5 hep doğru. Döngü hiç bitmiyor. Kart kilitlenmedi — ona "hep yap" dedin, o da yapıyor. Fişi çekene kadar.
Çıkış yolunu unutan tek kişi sensin.
forsayacı senin yerine artırıyordu.while'da o iş senin. Unutursan sonsuz döngü — ve kod hata vermiyor, çünkü "sonsuza kadar tekrar et" geçerli bir talimat.
Serial Monitor'ü kapat. Döngünün içine sayac++; ekle. Yükle. Beş satır, durdu.
Kuralı şöyle tut: bir while yazarken "bu şart hiç bozulmazsa ne olur?" diye sor. Cevap "sonsuza kadar bekler" ise ya ikinci bir çıkış koy, ya da o işi while ile yapma.
Şimdi sen yaz
for ile 1'den 100'e kadar sayıların toplamını hesapla. Sadece toplamı yazdır, tek satır.
void setup() {
Serial.begin(9600);
int toplam = 0;
// ŞİMDİ SEN YAZ: 1'den 100'e bir for dongusu kur,
// her turda i'yi toplam kutusuna ekle
Serial.print("Toplam: ");
Serial.println(toplam);
}
void loop() {
}
🔍 İpucu 1
Döngünün dışında bir toplam kutusu açtın, 0 ile başlıyor. Döngünün içinde her turda "kutudakini al, i ekle, geri koy" — Görev 2'deki kalıp.
🔍 İpucu 2
for (int i = 1; i <= 100; i++) { toplam = toplam + i; }
✅ Cevap
for (int i = 1; i <= 100; i++) {
toplam = toplam + i;
}
Ekranda Toplam: 5050.
toplam kutusunu döngünün dışında açtın. İçeride açsaydın her turda sıfırlanır, sonunda sadece 100 kalırdı. Kutunun nerede açıldığı, ne zaman yaşadığını belirliyor: süslü parantezin içinde açılan kutu, o parantez bitince ölür.
Bir de int sınırını hatırla: 1'den 100'e toplam 5050, sorun yok. 1'den 1000'e 500500 — int'e sığmaz, Görev 3'teki taşma olur. Deneyip gör.
📄 Görevin tam kodu
void setup() {
Serial.begin(9600);
int toplam = 0;
for (int i = 1; i <= 100; i++) {
toplam = toplam + i;
}
Serial.print("Toplam: ");
Serial.println(toplam);
}
void loop() {
}
Olmadıysa
| Ne görüyorsun | Ne yap |
|---|---|
| Ekran durmadan doluyor | Sonsuz döngü. Serial Monitor'ü kapat, döngüde sayacı artırdığından emin ol, yeniden yükle |
Toplam: 100 |
int toplam = 0; satırını döngünün içine koymuşsun; dışarı al |
Toplam: 4950 |
i <= 100 yerine i < 100 yazmışsın; 100 dahil olmadı |
'i' was not declared |
for (int i = ... — int eksik, ya da i'yi döngü dışında kullanıyorsun |
| Hiçbir şey çıkmıyor | setup bir kez çalışır ve bitmiş olabilir. Kartın üstündeki reset düğmesine bas — baştan çalışır, çıktıyı görürsün |
Kendini test et
Soru: for (int i = 0; i < 5; i++) ile for (int i = 1; i <= 5; i++) — ikisi de beş tur dönüyor. Farkı ne, ve neden kodda çoğunlukla ilkini göreceksin?
Cevabı gör
İlki 0, 1, 2, 3, 4 sayıyor. İkincisi 1, 2, 3, 4, 5.
Kodda çoğunlukla ilkini göreceksin çünkü bilgisayar sıfırdan saymaya başlar. Görev 7'de bir listenin elemanlarını numaralayacaksın ve ilk elemanın numarası 0 olacak. Beş elemanlı listenin numaraları 0-4; i < 5 tam oturuyor.
Alışkanlık yapması biraz zaman alır. Ama kural net: sıfırdan başla, < ile bitir. "Kaç tane" sayısını doğrudan yazıyorsun, kafanda eksi bir yapmıyorsun.
Ev Güvenlik kitinde okuttuğun kartı yetkili listesinde arayan kod bir for döngüsü — listedeki her kartla karşılaştırıyor.
Kitlerde while ile beklemeyi göremeyeceksin, ve sebebi tam da bu görev: bekleyen bir döngü sistemi durdurur. Afet kitinde "mesaj geldi mi?" sorusu while ile değil if ile soruluyor — gelmediyse loop dönmeye devam ediyor, sistem canlı kalıyor. Beklemeden beklemenin nasıl yapıldığı Yazılım temelleri'nin konusu.
Takıldın, hata tablosu da yetmedi mi?
WhatsApp'tan sor — hangi görevdesin, ekranda ne yazıyor, devrenin fotoğrafı.