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
| İşlem | Ne 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 iile karşılaştırınca derleyici uyarı verebilir; indeks içinstd::size_tkullan.- 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
- Vektöre kendi 5 ölçümünü ekle ve ortalamayı hesapla.
- Eşiği geçen ölçümlerin sayısını bul (örn. 21'den büyük).
- Ölçümleri tersten yazdır (
forve indeks kullan). - Kullanıcıdan
cinile ö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.
Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.
İpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.