Liste tutmak — dizi
Numaralı dolaplar, sıfırdan sayma — ve dolabın dışına çıkınca ne olur
Beş sayıyı beş ayrı kutuda değil, tek bir listede tutacaksın. Sonra döngüyle listeyi gezip en büyüğünü bulacaksın.
Önce şunu bil: numaralı dolaplar
Beş öğrencinin notunu tutacaksın. Bildiğin yöntemle:
int not1 = 70;
int not2 = 85;
int not3 = 90;
int not4 = 60;
int not5 = 75;
Çalışır. Ama "hepsinin ortalamasını al" dediğinde beş ismi tek tek yazacaksın. Otuz öğrenci olsa otuz isim. Ve Görev 6'daki for bunlara dokunamıyor — not + sayaç diye bir şey yok.
Spor salonundaki dolapları düşün. Hepsinin adı aynı: dolap. Farkı numarası. "3 numaralı dolap" dediğinde herkes hangisi olduğunu biliyor.
int notlar[5] = {70, 85, 90, 60, 75};
Tek ad, beş bölme. Köşeli parantez [5] kaç bölme olduğunu söylüyor. Süslü parantez içindekiler sırayla bölmelere giriyor.
Bir bölmeye ulaşmak: notlar[2]. İçinde ne var? 90. 85 değil.
Numaralar sıfırdan başlar.
notlar[0]ilk eleman,notlar[4]sonuncu. Beş elemanlı dizinin numaraları 0, 1, 2, 3, 4 — 5 yok.Görev 6'nın sonunda "kodda
i = 0vei < 5göreceksin" demiştik. Sebebi bu.
Kod
int notlar[5] = {70, 85, 90, 60, 75};
void setup() {
Serial.begin(9600);
for (int i = 0; i < 5; i++) {
Serial.print("notlar[");
Serial.print(i);
Serial.print("] = ");
Serial.println(notlar[i]);
}
}
void loop() {
}
Yükle:
notlar[0] = 70
notlar[1] = 85
notlar[2] = 90
notlar[3] = 60
notlar[4] = 75
Asıl güç burada: notlar[i]. Döngünün sayacı, dizinin numarası oluyor. Beş eleman için beş satır yazmadın; i döndükçe bölmeler sırayla açıldı. Otuz eleman olsa kod değişmezdi, sadece 5 yerine 30.
Diziyi setup'ın dışına, en üste yazdık. İçeride açsaydın setup bitince ölürdü (Görev 6'daki kural). Yukarıda açılan kutu program boyunca yaşıyor; loop da görebiliyor.
Şimdi hata yap — kapıyı olmayan dolap
setup'a şunu ekle:
Serial.print("notlar[5] = ");
Serial.println(notlar[5]);
Beş elemanlı dizi, altıncı elemanı istiyorsun. Yükle.
Hata yok. Derlendi. Ekranda bir sayı var — belki 0, belki 1023, belki bambaşka bir şey. Her yüklemede değişebilir.
Orası senin dolabın değil. Dizi bitti, sen duvarın ötesindeki hafızayı okuyorsun — orada başka bir değişken var, ya da hiçbir şey. Kod seni durdurmadı.
C dili seni korumaz. Bazı diller sınırın dışına çıkınca durur ve hata verir. Bu dil çıkarsan çıkarsın; ne okuduğun senin sorunun. Yazarsan daha kötü:
notlar[5] = 1;başka bir değişkenin içini bozar ve sen günlerce "bu sayı neden değişiyor" diye ararsın.Dizinin boyunu bilmek ve numaraları o boyun içinde tutmak senin işin. Bunun için
i < 5yazıyorsun,i <= 5değil.
Eklediğin iki satırı sil.
Şimdi sen yaz
Dizideki en büyük sayıyı bul ve yazdır. Sayıları elle karşılaştırma — döngüyle bul, dizi otuz eleman olsa da çalışsın.
int notlar[5] = {70, 85, 90, 60, 75};
void setup() {
Serial.begin(9600);
int enBuyuk = notlar[0]; // ilk elemani basla, gerisi yarissin
// ŞİMDİ SEN YAZ: 1'den 4'e kadar bir dongu kur
// her turda: notlar[i], enBuyuk'ten buyuk mu?
// buyukse enBuyuk kutusuna onu koy
Serial.print("En buyuk: ");
Serial.println(enBuyuk);
}
void loop() {
}
🔍 İpucu 1
enBuyuk şu an 70. Döngü 85'e gelince "85, 70'ten büyük mü?" — evet — enBuyuk 85 olsun. 90'a gelince yine değişsin. 60'a gelince değişmesin. Görev 4'teki if ile Görev 6'daki for birlikte.
🔍 İpucu 2
for (int i = 1; i < 5; i++) { if (notlar[i] > enBuyuk) { enBuyuk = notlar[i]; } }
✅ Cevap
for (int i = 1; i < 5; i++) {
if (notlar[i] > enBuyuk) {
enBuyuk = notlar[i];
}
}
Ekranda En buyuk: 90.
Neden enBuyuk'ü 0'dan değil notlar[0]'dan başlattık? Dizide bütün sayılar eksi olsaydı 0 hepsinden büyük kalırdı ve "en büyük 0" derdi — dizide olmayan bir sayı. İlk elemandan başlamak güvenli: en büyük, en kötü ihtimalle ilk elemandır.
Bu kalıbı ezberle, çok göreceksin: bir kutu aç, döngüyle gez, her elemanı kutudakiyle karşılaştır, gerekirse değiştir. "En küçük", "toplam", "kaç tane 80'den büyük" — hepsi aynı iskelet.
📄 Görevin tam kodu
int notlar[5] = {70, 85, 90, 60, 75};
void setup() {
Serial.begin(9600);
int enBuyuk = notlar[0];
for (int i = 1; i < 5; i++) {
if (notlar[i] > enBuyuk) {
enBuyuk = notlar[i];
}
}
Serial.print("En buyuk: ");
Serial.println(enBuyuk);
}
void loop() {
}
Olmadıysa
| Ne görüyorsun | Ne yap |
|---|---|
En buyuk: 70 |
Döngü hiç değiştirmemiş. if içinde enBuyuk = notlar[i] var mı, ve > doğru yönde mi? |
En buyuk: 60 |
Karşılaştırmada > yerine < yazmışsın — en küçüğü buldun |
| Anlamsız büyük bir sayı | i < 5 yerine i <= 5 — dizinin dışına çıkıp çöp okudun |
expected ']' |
Köşeli parantez kapanmamış: notlar[i |
'notlar' was not declared |
Dizi kullanıldığı yerden önce tanımlanmalı — setup'ın üstüne yaz. Ya da adı farklı yazmışsın: Notlar ile notlar aynı değil |
Kendini test et
Soru: int notlar[5]; yazıp süslü parantezle değer vermedin. notlar[2] içinde ne var?
Cevabı gör
Belli değil.
setup'ın üstünde, yani programın en dışında açtıysan kart hepsini 0 yapar. Ama bir fonksiyonun içinde açtıysan içinde o hafızada daha önce ne kaldıysa o var — bir önceki işlemin artığı. Rastgele bir sayı görebilirsin.
Bu da sessiz bir hata kaynağı. Diziyi açarken değer ver, ya da bir döngüyle hepsini 0 yap. "Boş dizi" diye bir şey yok; her bölmede bir şey var, sen koymadıysan kim koydu bilmiyorsun.
Ev Güvenlik kitinde yetkili kartlar tam böyle bir dizide duruyor. Kart okuttuğunda for ile listeyi geziyor, if ile karşılaştırıyor. Bu görevde yazdığın "en büyüğü bul" ile "listede var mı" aynı iskelet — sadece if'in içi farklı.
Takıldın, hata tablosu da yetmedi mi?
WhatsApp'tan sor — hangi görevdesin, ekranda ne yazıyor, devrenin fotoğrafı.