← Kodun diligörev 7 / 10
7 / 10 tamamlandı
görev 7 · ~30 dk

Liste tutmak — dizi

Numaralı dolaplar, sıfırdan sayma — ve dolabın dışına çıkınca ne olur

hedef

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:

kod · .ino
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.

kod · .ino
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 = 0 ve i < 5 göreceksin" demiştik. Sebebi bu.

Kod

kod · .ino
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:

kod
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:

kod · .ino
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 < 5 yazıyorsun, i <= 5 değ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.

kod · .ino
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
kod · .ino
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
kod · .ino
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ı.