🚀 C# ile Programlamaya Giriş: Kodlamaya İlk Adımını At, Kendi Projelerini Geliştirmeye Başla!
00ANASAYFA 01YAZILAR 02EĞİTİM 03ELEKTRİK_ENERJİ 04OTOMOTİV_MÜHENDİSLİĞİ 05ARAÇLAR 06LAB 07SÖZLÜK 08ETİKETLER ♡OKUMA LİSTEM ⌕ARA
TRENG

Diziler ve std::vector

Birden çok değeri tek isim altında tut: C dizileri, std::vector, aralık tabanlı for ve sensör verisi ortalaması.

Bir sensörden 100 ölçüm aldığında 100 ayrı değişken tanımlamak mantıksız. Aynı tipten çok sayıda değeri tek isim altında tutmak için dizi kullanırız. C++'ta ham diziler (C'den miras) ve modern karşılığı std::vector vardır. Başlangıç için std::vector kullanmanı öneririm.

Ham diziler

int dizi[5] = {10, 20, 30, 40, 50};
std::cout << dizi[0] << ' ' << dizi[4] << '\n';   // 10 50

Boyut derleme anında sabit olmalıdır ve dizi kendi uzunluğunu bilmez. Üstelik sınır denetimi yoktur: dizi[7] yazarsan program çökmeyebilir, sadece başka bir bellek bölgesini okur ya da bozar. Tanımsız davranış hatalarının büyük bölümü buradan çıkar.

std::vector

std::vector büyüyebilen bir dizidir. Başlığı #include <vector>. Tip köşeli parantez içinde belirtilir.

#include <iomanip>
#include <iostream>
#include <vector>

int main() {
    std::vector<double> olcumler = {20.5, 21.0, 19.8, 22.1, 20.6};
    olcumler.push_back(21.4);          // sona eleman ekle

    double toplam = 0.0;
    double enKucuk = olcumler[0];
    double enBuyuk = olcumler[0];
    for (double x : olcumler) {        // aralik tabanli for
        toplam += x;
        if (x < enKucuk) enKucuk = x;
        if (x > enBuyuk) enBuyuk = x;
    }
    double ortalama = toplam / olcumler.size();

    std::cout << std::fixed << std::setprecision(1);
    std::cout << "Olcum sayisi: " << olcumler.size() << '\n';
    std::cout << "Ortalama: " << ortalama << '\n';
    std::cout << "En kucuk: " << enKucuk << '\n';
    std::cout << "En buyuk: " << enBuyuk << '\n';
    return 0;
}
Olcum sayisi: 6
Ortalama: 20.9
En kucuk: 19.8
En buyuk: 22.1

Toplam 125.4, eleman sayısı 6 olduğundan ortalama 20.9 çıkar.

Sık kullanılan işlemler

İşlemNe yapar?
v.push_back(x)Sona eleman ekler
v.pop_back()Son elemanı siler
v.size()Eleman sayısını verir
v.empty()Boş mu diye sorar
v[i]i. elemana erişir (sınır denetimi yok)
v.at(i)i. elemana erişir, sınır dışıysa istisna fırlatır
v.clear()Hepsini siler

Aralık tabanlı for

for (double x : olcumler) biçimi, "olcumler içindeki her x için" diye okunur. İndeks tutmana gerek kalmaz. Elemanları değiştirmek istiyorsan for (double& x : olcumler) biçiminde referans al; sadece okuyorsan const double& ile kopyayı önleyebilirsin. Referansları iki ders sonra göreceğiz.

Dikkat edilecekler

  • size() işaretsiz bir tam sayı döndürür. int i ile karşılaştırınca derleyici uyarı verebilir; indeks için std::size_t kullan.
  • Boş bir vektörün ortalamasını hesaplamaya çalışma: sıfıra bölme olur. Önce empty() kontrol et.
  • Elemanlar bellekte ardışık durur; bu önbellek (cache) açısından çok hızlıdır.

Gömülü sistem notu: std::vector yığın (heap) belleği kullanır ve büyüdükçe belleği yeniden tahsis eder. Küçük mikrodenetleyicilerde bu bellek parçalanmasına ve öngörülemeyen gecikmeye yol açabilir. Eleman sayısı önceden belliyse std::array<double, 8> (başlık: <array>) ya da olcumler.reserve(100) ile önceden yer ayırmak daha güvenlidir.

Dizilerin indeksi 0'dan başlar. 6 elemanlı bir vektörün geçerli indeksleri 0-5'tir. Son elemana erişmek için v[v.size() - 1] ya da v.back() kullan.

Kendin dene

  1. Vektöre kendi 5 ölçümünü ekle ve ortalamayı hesapla.
  2. Eşiği geçen ölçümlerin sayısını bul (örn. 21'den büyük).
  3. Ölçümleri tersten yazdır (for ve indeks kullan).
  4. Kullanıcıdan cin ile ölçüm iste; 0 girilene kadar vektöre ekle.

// Mini sınav

Bir seçeneğe tıkla; doğru mu yanlış mı, anında ve nedeniyle birlikte göreceksin.

1. Altı elemanlı bir vektörün son elemanının indeksi nedir?
2. v.at(10) ile v[10] arasındaki temel fark nedir?
3. std::vector sınıfı için gömülü sistemlerde dikkat edilmesi gereken nokta nedir?

Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.

İpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.