# 6. Hafta — Operatörler ve Kullanıcı Girdisi

## Bu hafta ne yapacağız?

Boy ve kilo girdilerinden vücut kitle indeksini hesaplayan bir uygulama geliştireceğiz. Bu uygulamada aritmetik, karşılaştırma ve mantıksal operatörleri gerçek veriler üzerinde kullanacağız. Ardından hesap tutarına servis oranı ekleyip kişi sayısına bölen özgün bir proje yapacağız.

## Kazanımlar

- `TextField` verisini güvenli biçimde sayıya dönüştürme
- `+`, `-`, `*`, `/` operatörleriyle işlem sırası kurma
- `<`, `>`, `<=`, `>=` ile sınır kontrolü yapma
- `||` ve `&&` ile birden fazla koşulu birleştirme
- Hesap sonucunu anlamlı bir kullanıcı geri bildirimine dönüştürme

## Uygulama 06 — Vücut Kitle İndeksi

### 1. Girdileri alma

Boy santimetre, kilo kilogram olarak alınır. İki alan yatay olarak eşit genişlikte yerleştirilir:

```dart
Row(
  children: [
    Expanded(child: TextField(controller: boyController)),
    const SizedBox(width: 12),
    Expanded(child: TextField(controller: kiloController)),
  ],
)
```

### 2. Geçersiz değerleri engelleme

```dart
if (boyCm == null ||
    kilo == null ||
    boyCm < 100 ||
    boyCm > 230 ||
    kilo < 25 ||
    kilo > 250) {
  hata = 'Boy 100–230 cm, kilo 25–250 kg arasında olmalıdır.';
}
```

`||` operatörü koşullardan herhangi biri doğru olduğunda hata üretir. Böylece sıfıra bölme, anlamsız ve eksik veri hesaplamaya ulaşmaz.

### 3. Formülü uygulama

VKİ formülü `kilo / boy²` biçimindedir. Önce santimetre metreye çevrilir:

```dart
final metre = boyCm / 100;
vki = kilo / (metre * metre);
```

Parantez, işlem sırasını açık hâle getirir. `170 cm` ve `65 kg` için sonuç `22.5` olur.

### 4. Sonucu sınıflandırma

```dart
durum = vki! < 18.5
    ? 'Düşük'
    : vki! < 25
        ? 'Normal aralık'
        : vki! < 30
            ? 'Yüksek'
            : 'Çok yüksek';
```

Uygulamadaki açıklama bunun yalnızca eğitim amaçlı genel bir gösterge olduğunu açıkça belirtir. Test, örnek veride hem `22.5` sonucunu hem “Normal aralık” sınıfını doğruladı.

![170 cm ve 65 kg için hesaplanmış VKİ ekranı](../../screenshots/week-06-adapted.png)

## Özgün proje — Servis Ücreti Hesabı

Bir kafe hesabını arkadaşlar arasında paylaşacağız. Toplam tutara seçilen yüzde eklenecek, ardından kişi sayısına bölünecek.

### Servis oranını seçme

```dart
SegmentedButton<int>(
  segments: const [
    ButtonSegment(value: 0, label: Text('%0')),
    ButtonSegment(value: 10, label: Text('%10')),
    ButtonSegment(value: 15, label: Text('%15')),
  ],
  selected: {servis},
  onSelectionChanged: (secim) => setState(() => servis = secim.first),
)
```

### Toplam ve kişi başı pay

```dart
toplam = tutar * (1 + servis / 100);
kisiBasi = toplam! / kisi;
```

`600 TL` hesaba `%10` servis eklendiğinde toplam `660 TL`; üç kişiye bölündüğünde kişi başı `220 TL` olur. Kişi azaltma düğmesi, sıfıra bölmeyi önlemek için 1’in altında çalışmaz.

![600 TL hesabın üç kişiye bölündüğü Servis Ücreti ekranı](../../screenshots/week-06-original.png)

## Sıra sende

1. Kolay: VKİ uygulamasındaki başlangıç boy ve kilo değerlerini değiştir.
2. Orta: Servis hesabına `%5` ve `%20` seçenekleri ekle.
3. İleri: Kullanıcının ödediği tutarı girip para üstünü kişi başına dağıtan yeni bir sonuç alanı oluştur.

Çözümünü gönderdikten ve geri bildirim aldıktan sonra Servis Ücreti Hesabı’nın gerçek `lib/main.dart` kodu ve çalışan proje paketi açılacaktır. İpucu formülün kurulmasına yardım edecek; çözüm düğmesi eksiksiz Dart kodunu gösterecektir.

## Kontrol listesi

- Kullanıcı girdileri `tryParse` ile dönüştürüldü.
- Boy, kilo, tutar ve kişi sayısında geçersiz sınırlar engellendi.
- Formüllerde işlem sırası parantezlerle açıklandı.
- Sonuçlar iki ondalık basamakla gösterildi.
- Her iki proje Flutter widget testinden geçti ve gerçek ekran çıktıları görsel olarak doğrulandı.
