Dart Programlama Dili Eğitimi
Ogr.Gor Keyvan Arasteh İstinye Üniversitesi Bilişim Güvenliği Teknolojisi Bölümü
Dart Nedir?
Dart, Google tarafından geliştirilen, modern ve nesne yönelimli bir programlama dilidir. Flutter framework'ünün temel dili olarak kullanılan Dart, hem web hem de mobil uygulama geliştirmede kullanılır. Özellikle:
- Hızlı derleme ve yürütme
- Güçlü tip sistemi
- Zengin standart kütüphane
- Cross-platform geliştirme desteği
özellikleriyle öne çıkar.
Değişkenler
Dart'ta değişkenler, veri depolamak için kullanılan temel yapı taşlarıdır.
// Temel veri tipleri
String isim = "Ahmet"; // Metin
int yas = 25; // Tam sayı
double boy = 1.78; // Ondalıklı sayı
bool ogrenciMi = true; // Mantıksal değer
// var kullanımı - tip çıkarımı
var sehir = "İstanbul"; // String olarak çıkarım yapar
// final ve const
final dogumTarihi = "2000"; // Değeri bir kez atanır
const PI = 3.14; // Derleme zamanında sabit
// Gerçek hayat örneği:
var ogrenciNumarasi = "2024001";
final mezuniyetYili = 2024;
Listeler
Listeler, sıralı veri koleksiyonlarıdır.
// Liste tanımlama
List<String> dersler = ["Matematik", "Fizik", "Kimya"];
var notlar = [85, 90, 75];
// Liste işlemleri
dersler.add("Biyoloji"); // Eleman ekleme
dersler.remove("Fizik"); // Eleman silme
var ilkDers = dersler[0]; // Elemana erişim
// Gerçek hayat örneği: Öğrenci notları takibi
List<Map<String, dynamic>> ogrenciNotlari = [
{"ders": "Siber Güvenlik", "vize": 85, "final": 90},
{"ders": "Ağ Temelleri", "vize": 75, "final": 85}
];
Setler
Setler, benzersiz elemanlardan oluşan koleksiyonlardır.
// Set tanımlama
Set<String> renkler = {"kırmızı", "mavi", "yeşil"};
var sayilar = <int>{1, 2, 3, 3}; // 3 sadece bir kez eklenir
// Set işlemleri
renkler.add("sarı"); // Eleman ekleme
renkler.remove("mavi"); // Eleman silme
print(renkler.contains("yeşil")); // Eleman kontrolü
// Gerçek hayat örneği: Unique kullanıcı ID'leri
Set<String> aktifKullanicilar = {"user123", "admin456", "guest789"};
Map
Map, anahtar-değer çiftlerinden oluşan koleksiyonlardır.
// Map tanımlama
Map<String, String> kullaniciBilgileri = {
"ad": "Mehmet",
"soyad": "Yılmaz",
"email": "[email protected]"
};
// Map işlemleri
kullaniciBilgileri["telefon"] = "5551234567"; // Eleman ekleme
kullaniciBilgileri.remove("email"); // Eleman silme
// Gerçek hayat örneği: Ürün kataloğu
Map<String, Map<String, dynamic>> urunKatalogu = {
"laptop1": {
"marka": "TechPro",
"fiyat": 15000,
"stok": 10
},
"telefon1": {
"marka": "SmartX",
"fiyat": 8000,
"stok": 15
}
};
Fonksiyonlar
Fonksiyonlar, tekrar kullanılabilir kod bloklarıdır.
// Temel fonksiyon
int topla(int a, int b) {
return a + b;
}
// Ok fonksiyonu (Lambda)
var carp = (int a, int b) => a * b;
// Opsiyonel parametreli fonksiyon
String selamla([String isim = "Misafir"]) {
return "Merhaba $isim";
}
// Named parametreli fonksiyon
void ogrenciKayit({
required String ad,
required String soyad,
int? yas
}) {
print("$ad $soyad kaydedildi");
}
// Gerçek hayat örneği: Sipariş toplam hesaplama
double siparisToplamHesapla(List<double> urunFiyatlari, {double vergiOrani = 0.18}) {
var toplam = urunFiyatlari.reduce((a, b) => a + b);
return toplam * (1 + vergiOrani);
}
Döngüler
Döngüler, tekrarlı işlemleri gerçekleştirmek için kullanılır.
// for döngüsü
for (var i = 0; i < 5; i++) {
print(i);
}
// for-in döngüsü
var meyveler = ["elma", "armut", "muz"];
for (var meyve in meyveler) {
print(meyve);
}
// while döngüsü
var sayac = 0;
while (sayac < 3) {
print(sayac);
sayac++;
}
// Gerçek hayat örneği: Stok kontrolü
List<Map<String, dynamic>> urunler = [
{"ad": "Laptop", "stok": 5},
{"ad": "Mouse", "stok": 10},
{"ad": "Klavye", "stok": 3}
];
for (var urun in urunler) {
if (urun["stok"] < 5) {
print("${urun["ad"]} için stok uyarısı!");
}
}
Şartlar
Şart ifadeleri, programın akışını kontrol etmek için kullanılır.
// if-else kullanımı
var not = 75;
if (not >= 90) {
print("AA");
} else if (not >= 85) {
print("BA");
} else {
print("BB");
}
// switch-case kullanımı
var gun = "Pazartesi";
switch (gun) {
case "Pazartesi":
print("Haftanın ilk günü");
break;
case "Cuma":
print("Haftanın son iş günü");
break;
default:
print("Diğer gün");
}
// Gerçek hayat örneği: Kullanıcı yetki kontrolü
void yetkiKontrol(String kullaniciTipi) {
if (kullaniciTipi == "admin") {
print("Tüm yetkilere sahipsiniz");
} else if (kullaniciTipi == "editor") {
print("Düzenleme yetkilerine sahipsiniz");
} else {
print("Sınırlı yetkilere sahipsiniz");
}
}
Dart'ın Güvenlik Uygulamalarında Kullanımı
Bilişim güvenliği alanında Dart'ın kullanım örnekleri:
// Basit şifre kontrolü
bool sifreKontrol(String sifre) {
if (sifre.length < 8) return false;
if (!sifre.contains(RegExp(r'[A-Z]'))) return false;
if (!sifre.contains(RegExp(r'[0-9]'))) return false;
if (!sifre.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]'))) return false;
return true;
}
// Basit veri şifreleme örneği
String basitSifrele(String metin, int anahtar) {
return metin.split('').map((char) {
var kod = char.codeUnitAt(0) + anahtar;
return String.fromCharCode(kod);
}).join('');
}
// Güvenli veri saklama örneği
class GuvenliVeri {
final Map<String, String> _veri = {};
void veriEkle(String anahtar, String deger) {
if (anahtar.isEmpty || deger.isEmpty) {
throw Exception("Boş değer kabul edilmez");
}
_veri[anahtar] = basitSifrele(deger, 3);
}
}
Dart Programlama Ödevleri
Hazırlayan: Ogr.Gor Keyvan Arasteh İstinye Üniversitesi Bilişim Güvenliği Teknolojisi Bölümü
Ödev 1: Temel Değişkenler ve Operatörler
Güvenli Şifre Oluşturucu
Amaç: Kullanıcıdan alınan bilgilerle güvenli bir şifre oluşturma uygulaması geliştirmek.
Gereksinimler:
Kullanıcıdan ad, soyad ve doğum yılı bilgilerini alın
Bu bilgileri kullanarak aşağıdaki kurallara uygun bir şifre oluşturun:
- En az 8 karakter uzunluğunda
- En az 1 büyük harf
- En az 1 özel karakter
- Doğum yılının son iki rakamı
Oluşturulan şifrenin güvenlik seviyesini kontrol eden bir fonksiyon yazın
Sonucu ekrana yazdırın
Öğrenme Hedefleri:
- String manipülasyonu
- Değişken tipleri
- Temel operatörler
- print() fonksiyonu kullanımı
Ödev 2: Listeler ve Döngüler
Öğrenci Not Takip Sistemi
Amaç: Bir sınıftaki öğrencilerin notlarını takip eden ve analiz eden bir sistem geliştirmek.
Gereksinimler:
En az 5 öğrencinin bilgilerini içeren bir liste oluşturun:
- Ad
- Soyad
- Vize notu
- Final notu
Her öğrenci için:
- Ortalama hesaplayın (Vize %40, Final %60)
- Harf notu belirleyin
Sınıf için:
- En yüksek notu bulun
- En düşük notu bulun
- Sınıf ortalamasını hesaplayın
Sonuçları düzenli bir şekilde ekrana yazdırın
Öğrenme Hedefleri:
- Liste oluşturma ve manipülasyonu
- For döngüleri
- If-else yapıları
- Fonksiyon yazımı
Ödev 3: Map ve Set Yapıları
Kütüphane Yönetim Sistemi
Amaç: Basit bir kütüphane yönetim sistemi geliştirmek.
Gereksinimler:
Kitapları tutan bir Map yapısı oluşturun:
- ISBN numarası (anahtar)
- Kitap bilgileri (değer: başlık, yazar, yayın yılı, kopya sayısı)
Aşağıdaki işlemleri yapan fonksiyonlar yazın:
- Yeni kitap ekleme
- Kitap silme
- Kitap arama (ISBN ile)
- Kitap güncelleme
- Ödünç verme/iade işlemleri
Ödünç alınan kitapları takip etmek için bir Set yapısı kullanın
Menü bazlı bir arayüz oluşturun
Öğrenme Hedefleri:
- Map kullanımı
- Set kullanımı
- Switch-case yapısı
- Fonksiyon yazımı
Ödev 4: Nesne Yönelimli Programlama
Banka Hesap Yönetimi
Amaç: Basit bir banka hesap yönetim sistemi geliştirmek.
Gereksinimler:
Hesap sınıfı oluşturun:
- Hesap numarası
- Hesap sahibi
- Bakiye
- İşlem geçmişi
Aşağıdaki metodları implement edin:
- Para yatırma
- Para çekme
- Bakiye sorgulama
- Hesap özeti
İşlem limitleri ve güvenlik kontrolleri ekleyin
İşlem geçmişini kaydedin ve raporlayın
Öğrenme Hedefleri:
- Sınıf oluşturma
- Constructor kullanımı
- Metod yazımı
- Exception handling
Ödev 5: Asenkron Programlama
Dosya Şifreleme Uygulaması
Amaç: Dosyaları şifreleyen ve çözen bir uygulama geliştirmek.
Gereksinimler:
Dosya okuma ve yazma işlemleri için asenkron fonksiyonlar yazın
Basit bir şifreleme algoritması implement edin
Aşağıdaki özellikleri ekleyin:
- Dosya seçme
- Şifreleme
- Şifre çözme
- İlerleme durumu gösterme
Hata kontrolü ve raporlama ekleyin
Öğrenme Hedefleri:
- async/await kullanımı
- Future sınıfı
- Hata yakalama
- Dosya işlemleri
Ödev 6: Final Projesi
Güvenlik Denetim Uygulaması
Amaç: Bir sistemin güvenlik durumunu analiz eden ve raporlayan bir uygulama geliştirmek.
Gereksinimler:
Aşağıdaki kontrolleri yapan bir sistem geliştirin:
- Şifre güvenliği kontrolü
- Dosya bütünlük kontrolü
- Log analizi
- Ağ bağlantı kontrolü
Her kontrol için ayrı bir sınıf oluşturun
Sonuçları JSON formatında kaydedin
Detaylı bir rapor oluşturun
Kullanıcı dostu bir arayüz ekleyin
Öğrenme Hedefleri:
- Tüm Dart kavramlarının entegrasyonu
- JSON işleme
- Nesne yönelimli programlama
- Güvenlik konseptleri
Yardımcı Kaynaklar
- Dart resmi dokümantasyonu
- Flutter.dev
- Dart packages (pub.dev)
- GitHub örnek projeleri
- Stack Overflow
Dart Programlama Ödevleri – Örnek Çözümler
Hazırlayan: Ogr.Gor Keyvan Arasteh İstinye Üniversitesi Bilişim Güvenliği Teknolojisi Bölümü
Ödev 1: Güvenli Şifre Oluşturucu – Çözüm
import 'dart:io';
import 'dart:math';
class SifreOlusturucu {
// Kullanıcı bilgilerini saklayacak değişkenler
String ad;
String soyad;
String dogumYili;
// Constructor
SifreOlusturucu(this.ad, this.soyad, this.dogumYili);
// Özel karakterler listesi
final List<String> ozelKarakterler = ['!', '@', '#', '$', '%', '&', '*'];
// Şifre oluşturma metodu
String sifreOlustur() {
// Ad ve soyadın ilk harflerini büyük harfe çeviriyoruz
String adIlkHarf = ad[0].toUpperCase();
String soyadIlkHarf = soyad[0].toUpperCase();
// Doğum yılının son iki rakamını alıyoruz
String yilSon = dogumYili.substring(dogumYili.length - 2);
// Random bir özel karakter seçiyoruz
Random random = Random();
String ozelKarakter = ozelKarakterler[random.nextInt(ozelKarakterler.length)];
// Şifreyi oluşturuyoruz
String sifre = adIlkHarf + soyad.toLowerCase() + ozelKarakter + yilSon +
soyadIlkHarf + ad.toLowerCase();
return sifre;
}
// Şifre güvenlik kontrolü
Map<String, dynamic> sifreGuvenlikKontrol(String sifre) {
int puan = 0;
List<String> yorumlar = [];
// Uzunluk kontrolü
if (sifre.length >= 8) {
puan += 25;
yorumlar.add("✓ Şifre uzunluğu yeterli");
} else {
yorumlar.add("✗ Şifre en az 8 karakter olmalı");
}
// Büyük harf kontrolü
if (sifre.contains(RegExp(r'[A-Z]'))) {
puan += 25;
yorumlar.add("✓ Büyük harf içeriyor");
} else {
yorumlar.add("✗ Büyük harf içermeli");
}
// Özel karakter kontrolü
if (ozelKarakterler.any((karakter) => sifre.contains(karakter))) {
puan += 25;
yorumlar.add("✓ Özel karakter içeriyor");
} else {
yorumlar.add("✗ Özel karakter içermeli");
}
// Sayı kontrolü
if (sifre.contains(RegExp(r'[0-9]'))) {
puan += 25;
yorumlar.add("✓ Sayı içeriyor");
} else {
yorumlar.add("✗ Sayı içermeli");
}
return {
'puan': puan,
'yorumlar': yorumlar,
'seviye': puan < 50 ? 'Zayıf' : puan < 75 ? 'Orta' : 'Güçlü'
};
}
}
void main() {
// Kullanıcıdan bilgileri alıyoruz
print("Adınızı giriniz:");
String ad = stdin.readLineSync() ?? "";
print("Soyadınızı giriniz:");
String soyad = stdin.readLineSync() ?? "";
print("Doğum yılınızı giriniz:");
String dogumYili = stdin.readLineSync() ?? "";
// Şifre oluşturucu nesnesini oluşturuyoruz
var sifreOlusturucu = SifreOlusturucu(ad, soyad, dogumYili);
// Şifreyi oluşturuyoruz
String sifre = sifreOlusturucu.sifreOlustur();
// Şifre güvenliğini kontrol ediyoruz
var guvenlikSonuc = sifreOlusturucu.sifreGuvenlikKontrol(sifre);
// Sonuçları ekrana yazdırıyoruz
print("\n=== Şifre Analizi ===");
print("Oluşturulan şifre: $sifre");
print("Güvenlik puanı: ${guvenlikSonuc['puan']}/100");
print("Güvenlik seviyesi: ${guvenlikSonuc['seviye']}");
print("\nKontrol listesi:");
for (var yorum in guvenlikSonuc['yorumlar']) {
print(yorum);
}
}
Ödev 2: Öğrenci Not Takip Sistemi – Çözüm
class Ogrenci {
String ad;
String soyad;
double vizeNotu;
double finalNotu;
Ogrenci(this.ad, this.soyad, this.vizeNotu, this.finalNotu);
// Ortalama hesaplama metodu
double ortalamaHesapla() {
return (vizeNotu * 0.4) + (finalNotu * 0.6);
}
// Harf notu hesaplama metodu
String harfNotuHesapla() {
double ortalama = ortalamaHesapla();
if (ortalama >= 90) return 'AA';
if (ortalama >= 85) return 'BA';
if (ortalama >= 80) return 'BB';
if (ortalama >= 75) return 'CB';
if (ortalama >= 70) return 'CC';
if (ortalama >= 65) return 'DC';
if (ortalama >= 60) return 'DD';
return 'FF';
}
}
class SinifYonetimi {
List<Ogrenci> ogrenciler = [];
// Öğrenci ekleme metodu
void ogrenciEkle(Ogrenci ogrenci) {
ogrenciler.add(ogrenci);
}
// Sınıf ortalaması hesaplama
double sinifOrtalamasi() {
if (ogrenciler.isEmpty) return 0;
double toplam = ogrenciler.fold(0, (sum, ogrenci) => sum + ogrenci.ortalamaHesapla());
return toplam / ogrenciler.length;
}
// En yüksek notu bulma
Map<String, dynamic> enYuksekNot() {
if (ogrenciler.isEmpty) return {'ogrenci': null, 'ortalama': 0};
Ogrenci enYuksek = ogrenciler[0];
for (var ogrenci in ogrenciler) {
if (ogrenci.ortalamaHesapla() > enYuksek.ortalamaHesapla()) {
enYuksek = ogrenci;
}
}
return {
'ogrenci': '${enYuksek.ad} ${enYuksek.soyad}',
'ortalama': enYuksek.ortalamaHesapla()
};
}
// En düşük notu bulma
Map<String, dynamic> enDusukNot() {
if (ogrenciler.isEmpty) return {'ogrenci': null, 'ortalama': 0};
Ogrenci enDusuk = ogrenciler[0];
for (var ogrenci in ogrenciler) {
if (ogrenci.ortalamaHesapla() < enDusuk.ortalamaHesapla()) {
enDusuk = ogrenci;
}
}
return {
'ogrenci': '${enDusuk.ad} ${enDusuk.soyad}',
'ortalama': enDusuk.ortalamaHesapla()
};
}
// Sınıf durumu raporu
void sinifRaporuYazdir() {
print('\n=== SINIF RAPORU ===\n');
print('Toplam öğrenci sayısı: ${ogrenciler.length}');
print('Sınıf ortalaması: ${sinifOrtalamasi().toStringAsFixed(2)}');
var enYuksek = enYuksekNot();
var enDusuk = enDusukNot();
print('En yüksek not: ${enYuksek['ogrenci']} - ${enYuksek['ortalama'].toStringAsFixed(2)}');
print('En düşük not: ${enDusuk['ogrenci']} - ${enDusuk['ortalama'].toStringAsFixed(2)}\n');
print('ÖĞRENCI LISTESI:');
print('Ad Soyad'.padRight(20) + 'Vize'.padRight(8) + 'Final'.padRight(8) +
'Ortalama'.padRight(10) + 'Harf Notu');
print('-' * 55);
for (var ogrenci in ogrenciler) {
print(
'${ogrenci.ad} ${ogrenci.soyad}'.padRight(20) +
'${ogrenci.vizeNotu}'.padRight(8) +
'${ogrenci.finalNotu}'.padRight(8) +
'${ogrenci.ortalamaHesapla().toStringAsFixed(2)}'.padRight(10) +
'${ogrenci.harfNotuHesapla()}'
);
}
}
}
void main() {
var sinifYonetimi = SinifYonetimi();
// Örnek öğrenciler ekliyoruz
sinifYonetimi.ogrenciEkle(Ogrenci('Ali', 'Yılmaz', 85, 90));
sinifYonetimi.ogrenciEkle(Ogrenci('Ayşe', 'Demir', 90, 95));
sinifYonetimi.ogrenciEkle(Ogrenci('Mehmet', 'Kaya', 75, 80));
sinifYonetimi.ogrenciEkle(Ogrenci('Zeynep', 'Çelik', 95, 85));
sinifYonetimi.ogrenciEkle(Ogrenci('Can', 'Öztürk', 70, 75));
// Sınıf raporunu yazdırıyoruz
sinifYonetimi.sinifRaporuYazdir();
}
Dart Programlama Ödevleri – Örnek Çözümler
[Previous solutions for Ödev 1 and 2 remain the same…]
Ödev 3: Kütüphane Yönetim Sistemi – Çözüm
class Kitap {
String baslik;
String yazar;
int yayinYili;
int kopyaSayisi;
Kitap(this.baslik, this.yazar, this.yayinYili, this.kopyaSayisi);
Map<String, dynamic> toJson() {
return {
'baslik': baslik,
'yazar': yazar,
'yayinYili': yayinYili,
'kopyaSayisi': kopyaSayisi
};
}
}
class KutuphaneYonetimi {
Map<String, Kitap> kitaplar = {};
Set<String> oduncKitaplar = {};
// Kitap ekleme metodu
void kitapEkle(String isbn, Kitap kitap) {
if (kitaplar.containsKey(isbn)) {
throw Exception('Bu ISBN numarası zaten mevcut!');
}
kitaplar[isbn] = kitap;
print('${kitap.baslik} başarıyla eklendi.');
}
// Kitap silme metodu
void kitapSil(String isbn) {
if (!kitaplar.containsKey(isbn)) {
throw Exception('Kitap bulunamadı!');
}
if (oduncKitaplar.contains(isbn)) {
throw Exception('Bu kitap şu anda ödünç verilmiş durumda!');
}
kitaplar.remove(isbn);
print('Kitap başarıyla silindi.');
}
// Kitap arama metodu
Kitap? kitapAra(String isbn) {
return kitaplar[isbn];
}
// Kitap güncelleme metodu
void kitapGuncelle(String isbn, Kitap yeniKitap) {
if (!kitaplar.containsKey(isbn)) {
throw Exception('Güncellenecek kitap bulunamadı!');
}
kitaplar[isbn] = yeniKitap;
print('${yeniKitap.baslik} başarıyla güncellendi.');
}
// Kitap ödünç verme metodu
void oduncVer(String isbn) {
if (!kitaplar.containsKey(isbn)) {
throw Exception('Kitap bulunamadı!');
}
if (oduncKitaplar.contains(isbn)) {
throw Exception('Bu kitap zaten ödünç verilmiş!');
}
if (kitaplar[isbn]!.kopyaSayisi <= 0) {
throw Exception('Bu kitabın müsait kopyası kalmamış!');
}
kitaplar[isbn]!.kopyaSayisi--;
oduncKitaplar.add(isbn);
print('${kitaplar[isbn]!.baslik} başarıyla ödünç verildi.');
}
// Kitap iade metodu
void kitapIade(String isbn) {
if (!kitaplar.containsKey(isbn)) {
throw Exception('Kitap bulunamadı!');
}
if (!oduncKitaplar.contains(isbn)) {
throw Exception('Bu kitap zaten kütüphanede!');
}
kitaplar[isbn]!.kopyaSayisi++;
oduncKitaplar.remove(isbn);
print('${kitaplar[isbn]!.baslik} başarıyla iade edildi.');
}
// Kütüphane durumunu görüntüleme
void durumGoster() {
print('\n=== KÜTÜPHANE DURUMU ===');
print('Toplam kitap sayısı: ${kitaplar.length}');
print('Ödünç verilen kitap sayısı: ${oduncKitaplar.length}\n');
print('KITAP LISTESI:');
print('ISBN'.padRight(15) + 'Başlık'.padRight(30) + 'Yazar'.padRight(20) +
'Yayın Yılı'.padRight(12) + 'Kopya Sayısı');
print('-' * 80);
kitaplar.forEach((isbn, kitap) {
print(isbn.padRight(15) +
kitap.baslik.padRight(30) +
kitap.yazar.padRight(20) +
kitap.yayinYili.toString().padRight(12) +
kitap.kopyaSayisi.toString());
});
}
}
void main() {
var kutuphane = KutuphaneYonetimi();
// Örnek kitaplar ekliyoruz
try {
kutuphane.kitapEkle('978-0-123456-1',
Kitap('Siber Güvenlik Temelleri', 'Ahmet Yılmaz', 2023, 3));
kutuphane.kitapEkle('978-0-123456-2',
Kitap('Ağ Programlama', 'Mehmet Demir', 2022, 2));
kutuphane.kitapEkle('978-0-123456-3',
Kitap('Veri Yapıları', 'Ayşe Kaya', 2024, 5));
// Kitap ödünç verme ve iade işlemleri
kutuphane.oduncVer('978-0-123456-1');
kutuphane.oduncVer('978-0-123456-2');
kutuphane.kitapIade('978-0-123456-1');
// Kütüphane durumunu görüntüleme
kutuphane.durumGoster();
} catch (e) {
print('Hata: $e');
}
}
Ödev 4: Banka Hesap Yönetimi – Çözüm
class IslemKaydi {
DateTime tarih;
String islemTipi;
double miktar;
double bakiye;
IslemKaydi(this.tarih, this.islemTipi, this.miktar, this.bakiye);
@override
String toString() {
return '${tarih.toString().substring(0, 19)} - $islemTipi: $miktar TL - Bakiye: $bakiye TL';
}
}
class BankaHesabi {
final String hesapNo;
final String hesapSahibi;
double _bakiye;
List<IslemKaydi> islemGecmisi = [];
// Günlük para çekme limiti
static const double GUNLUK_LIMIT = 5000;
Map<String, double> gunlukCekimler = {};
BankaHesabi(this.hesapNo, this.hesapSahibi, [this._bakiye = 0]) {
islemKaydiEkle('Hesap Açılış', _bakiye);
}
// Getter method for bakiye
double get bakiye => _bakiye;
// İşlem kaydı ekleme yardımcı metodu
void islemKaydiEkle(String islemTipi, double miktar) {
islemGecmisi.add(IslemKaydi(DateTime.now(), islemTipi, miktar, _bakiye));
}
// Günlük limit kontrolü
bool gunlukLimitKontrol(double miktar) {
String bugun = DateTime.now().toString().substring(0, 10);
double gunlukToplam = gunlukCekimler[bugun] ?? 0;
return (gunlukToplam + miktar) <= GUNLUK_LIMIT;
}
// Para yatırma işlemi
void paraYatir(double miktar) {
if (miktar <= 0) {
throw Exception('Geçersiz miktar!');
}
_bakiye += miktar;
islemKaydiEkle('Para Yatırma', miktar);
print('İşlem başarılı. Yeni bakiye: $_bakiye TL');
}
// Para çekme işlemi
void paraCek(double miktar) {
if (miktar <= 0) {
throw Exception('Geçersiz miktar!');
}
if (miktar > _bakiye) {
throw Exception('Yetersiz bakiye!');
}
if (!gunlukLimitKontrol(miktar)) {
throw Exception('Günlük para çekme limiti aşıldı!');
}
_bakiye -= miktar;
// Günlük çekim miktarını güncelle
String bugun = DateTime.now().toString().substring(0, 10);
gunlukCekimler[bugun] = (gunlukCekimler[bugun] ?? 0) + miktar;
islemKaydiEkle('Para Çekme', -miktar);
print('İşlem başarılı. Yeni bakiye: $_bakiye TL');
}
// Hesap özeti görüntüleme
void hesapOzetiGoster([int sonIslemSayisi = 5]) {
print('\n=== HESAP ÖZETİ ===');
print('Hesap No: $hesapNo');
print('Hesap Sahibi: $hesapSahibi');
print('Güncel Bakiye: $_bakiye TL\n');
print('SON $sonIslemSayisi İŞLEM:');
var sonIslemler = islemGecmisi.reversed.take(sonIslemSayisi).toList();
for (var islem in sonIslemler) {
print(islem);
}
}
}
void main() {
try {
// Yeni hesap oluştur
var hesap = BankaHesabi('1234567890', 'Ali Yılmaz', 1000);
// Çeşitli işlemler gerçekleştir
hesap.paraYatir(500);
hesap.paraCek(200);
hesap.paraYatir(1000);
hesap.paraCek(300);
// Hesap özetini görüntüle
hesap.hesapOzetiGoster();
} catch (e) {
print('Hata: $e');
}
}
Ödev 5: Dosya Şifreleme Uygulaması – Çözüm
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
class SifrelemeAraci {
// Basit bir şifreleme anahtarı (gerçek uygulamalarda daha güvenli yöntemler kullanılmalı)
final List<int> _anahtar;
SifrelemeAraci(String anahtar)
: _anahtar = utf8.encode(anahtar);
// Veriyi şifrele
Future<Uint8List> sifrele(Uint8List veri) async {
List<int> sifrelenmis = [];
for (var i = 0; i < veri.length; i++) {
sifrelenmis.add(veri[i] ^ _anahtar[i % _anahtar.length]);
}
return Uint8List.fromList(sifrelenmis);
}
// Şifreyi çöz (XOR işlemi simetrik olduğu için aynı metodu kullanabiliriz)
Future<Uint8List> sifreCoz(Uint8List sifrelenmisVeri) async {
return sifrele(sifrelenmisVeri);
}
}
class DosyaIslemleri {
final SifrelemeAraci _sifrelemeAraci;
DosyaIslemleri(this._sifrelemeAraci);
// Dosya şifreleme
Future<void> dosyaSifrele(String kaynak, String hedef) async {
try {
// Dosyayı oku
var dosya = File(kaynak);
var veri = await dosya.readAsBytes();
print('Dosya okundu: ${veri.length} bytes');
// Veriyi şifrele
print('Şifreleme işlemi başladı...');
var sifrelenmisVeri = await _sifrelemeAraci.sifrele(veri);
// Şifrelenmiş veriyi yaz
await File(hedef).writeAsBytes(sifrelenmisVeri);
print('Şifreleme tamamlandı: $hedef');
} catch (e) {
throw Exception('Dosya şifreleme hatası: $e');
}
}
// Dosya şifre çözme
Future<void> dosyaSifreCoz(String kaynak, String hedef) async {
try {
// Şifrelenmiş dosyayı oku
var dosya = File(kaynak);
var sifrelenmisVeri = await dosya.readAsBytes();
print('Şifrelenmiş dosya okundu: ${sifrelenmisVeri.length} bytes');
// Şifreyi çöz
print('Şifre çözme işlemi başladı...');
var cozulmusVeri = await _sifrelemeAraci.sifreCoz(sifrelenmisVeri);
// Çözülmüş veriyi yaz
await File(hedef).writeAsBytes(cozulmusVeri);
print('Şifre çözme tamamlandı: $hedef');
} catch (e) {
throw Exception('Dosya şifre çözme hatası: $e');
}
}
}
// Completing Ödev 5's solution
void main() async {
try {
var sifrelemeAraci = SifrelemeAraci('GizliAnahtar123');
var dosyaIslemleri = DosyaIslemleri(sifrelemeAraci);
// Örnek dosya işlemleri
await dosyaIslemleri.dosyaSifrele(
'gizli_dosya.txt',
'sifrelenmis_dosya.enc'
);
await dosyaIslemleri.dosyaSifreCoz(
'sifrelenmis_dosya.enc',
'cozulmus_dosya.txt'
);
print('Tüm işlemler başarıyla tamamlandı.');
} catch (e) {
print('Hata oluştu: $e');
}
}
Ödev 6: Güvenlik Denetim Uygulaması – Çözüm
import 'dart:convert';
import 'dart:io';
// Güvenlik denetimi sonuçlarını temsil eden sınıf
class DenetimSonucu {
final String kategori;
final bool basarili;
final String aciklama;
final int riskSeviyesi; // 1-5 arası (5 en yüksek risk)
final List<String> oneriler;
DenetimSonucu({
required this.kategori,
required this.basarili,
required this.aciklama,
required this.riskSeviyesi,
required this.oneriler,
});
Map<String, dynamic> toJson() => {
'kategori': kategori,
'basarili': basarili,
'aciklama': aciklama,
'riskSeviyesi': riskSeviyesi,
'oneriler': oneriler,
};
}
// Şifre güvenliği denetimi sınıfı
class SifreGuvenlikDenetimi {
static DenetimSonucu sifreKontrol(String sifre) {
int puan = 100;
List<String> oneriler = [];
// Uzunluk kontrolü
if (sifre.length < 8) {
puan -= 20;
oneriler.add('Şifre en az 8 karakter olmalıdır');
}
// Büyük harf kontrolü
if (!sifre.contains(RegExp(r'[A-Z]'))) {
puan -= 20;
oneriler.add('Şifre en az bir büyük harf içermelidir');
}
// Küçük harf kontrolü
if (!sifre.contains(RegExp(r'[a-z]'))) {
puan -= 20;
oneriler.add('Şifre en az bir küçük harf içermelidir');
}
// Sayı kontrolü
if (!sifre.contains(RegExp(r'[0-9]'))) {
puan -= 20;
oneriler.add('Şifre en az bir sayı içermelidir');
}
// Özel karakter kontrolü
if (!sifre.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]'))) {
puan -= 20;
oneriler.add('Şifre en az bir özel karakter içermelidir');
}
return DenetimSonucu(
kategori: 'Şifre Güvenliği',
basarili: puan >= 80,
aciklama: 'Şifre güvenlik puanı: $puan/100',
riskSeviyesi: _riskSeviyesiHesapla(puan),
oneriler: oneriler,
);
}
static int _riskSeviyesiHesapla(int puan) {
if (puan >= 90) return 1;
if (puan >= 80) return 2;
if (puan >= 70) return 3;
if (puan >= 60) return 4;
return 5;
}
}
// Dosya bütünlük kontrolü sınıfı
class DosyaButunlukDenetimi {
static Future<DenetimSonucu> dosyaKontrol(String dosyaYolu) async {
try {
var dosya = File(dosyaYolu);
if (!await dosya.exists()) {
return DenetimSonucu(
kategori: 'Dosya Bütünlüğü',
basarili: false,
aciklama: 'Dosya bulunamadı',
riskSeviyesi: 5,
oneriler: ['Dosyanın varlığını kontrol edin'],
);
}
var stat = await dosya.stat();
var sonDegisiklik = stat.modified;
var boyut = stat.size;
var oneriler = <String>[];
if (DateTime.now().difference(sonDegisiklik).inDays > 30) {
oneriler.add('Dosya 30 günden uzun süredir güncellenmemiş');
}
return DenetimSonucu(
kategori: 'Dosya Bütünlüğü',
basarili: true,
aciklama: 'Son değişiklik: $sonDegisiklik, Boyut: $boyut bytes',
riskSeviyesi: oneriler.isEmpty ? 1 : 2,
oneriler: oneriler,
);
} catch (e) {
return DenetimSonucu(
kategori: 'Dosya Bütünlüğü',
basarili: false,
aciklama: 'Hata: $e',
riskSeviyesi: 5,
oneriler: ['Dosya erişim izinlerini kontrol edin'],
);
}
}
}
// Log analizi sınıfı
class LogAnalizi {
static DenetimSonucu logKontrol(List<String> loglar) {
var hataSayisi = 0;
var uyariSayisi = 0;
var kritikHatalar = <String>{};
var oneriler = <String>[];
for (var log in loglar) {
if (log.contains('ERROR')) {
hataSayisi++;
kritikHatalar.add(log);
} else if (log.contains('WARNING')) {
uyariSayisi++;
}
}
if (hataSayisi > 0) {
oneriler.add('$hataSayisi adet kritik hata tespit edildi');
}
if (uyariSayisi > 0) {
oneriler.add('$uyariSayisi adet uyarı mevcut');
}
return DenetimSonucu(
kategori: 'Log Analizi',
basarili: hataSayisi == 0,
aciklama: 'Toplam ${loglar.length} log analiz edildi',
riskSeviyesi: hataSayisi > 0 ? 4 : uyariSayisi > 0 ? 2 : 1,
oneriler: oneriler,
);
}
}
// Ağ bağlantı kontrolü sınıfı
class AgBaglantiKontrol {
static Future<DenetimSonucu> baglantiKontrol(String hedef) async {
try {
var sonuc = await Process.run('ping', ['-c', '4', hedef]);
var basarili = sonuc.exitCode == 0;
var oneriler = <String>[];
if (!basarili) {
oneriler.add('Ağ bağlantısını kontrol edin');
oneriler.add('Firewall ayarlarını kontrol edin');
}
return DenetimSonucu(
kategori: 'Ağ Bağlantısı',
basarili: basarili,
aciklama: basarili ? 'Bağlantı başarılı' : 'Bağlantı başarısız',
riskSeviyesi: basarili ? 1 : 4,
oneriler: oneriler,
);
} catch (e) {
return DenetimSonucu(
kategori: 'Ağ Bağlantısı',
basarili: false,
aciklama: 'Hata: $e',
riskSeviyesi: 5,
oneriler: ['Sistem ağ ayarlarını kontrol edin'],
);
}
}
}
// Güvenlik denetimi rapor sınıfı
class GuvenlikDenetimRaporu {
final List<DenetimSonucu> sonuclar;
final DateTime tarih;
GuvenlikDenetimRaporu(this.sonuclar) : tarih = DateTime.now();
// JSON formatında rapor oluştur
Future<void> jsonRaporOlustur(String dosyaAdi) async {
var rapor = {
'tarih': tarih.toIso8601String(),
'sonuclar': sonuclar.map((s) => s.toJson()).toList(),
'ozet': {
'toplamTest': sonuclar.length,
'basarili': sonuclar.where((s) => s.basarili).length,
'basarisiz': sonuclar.where((s) => !s.basarili).length,
'ortalamaRisk': sonuclar.map((s) => s.riskSeviyesi).reduce((a, b) => a + b) / sonuclar.length,
}
};
var dosya = File(dosyaAdi);
await dosya.writeAsString(JsonEncoder.withIndent(' ').convert(rapor));
}
// Konsola rapor yazdır
void raporYazdir() {
print('\n=== GÜVENLİK DENETİM RAPORU ===');
print('Tarih: $tarih\n');
for (var sonuc in sonuclar) {
print('${sonuc.kategori}:');
print(' Durum: ${sonuc.basarili ? "✓ Başarılı" : "✗ Başarısız"}');
print(' Risk Seviyesi: ${"🔴" * sonuc.riskSeviyesi}${"⚪" * (5 - sonuc.riskSeviyesi)}');
print(' Açıklama: ${sonuc.aciklama}');
if (sonuc.oneriler.isNotEmpty) {
print(' Öneriler:');
for (var oneri in sonuc.oneriler) {
print(' - $oneri');
}
}
print('');
}
var basariliTestSayisi = sonuclar.where((s) => s.basarili).length;
var toplamTest = sonuclar.length;
print('ÖZET:');
print('Toplam Test: $toplamTest');
print('Başarılı: $basariliTestSayisi');
print('Başarısız: ${toplamTest - basariliTestSayisi}');
print('Başarı Oranı: ${(basariliTestSayisi / toplamTest * 100).toStringAsFixed(2)}%');
}
}
// Ana uygulama
void main() async {
try {
// Örnek denetimler
var sifreSonuc = SifreGuvenlikDenetimi.sifreKontrol('Zayif123');
var dosyaSonuc = await DosyaButunlukDenetimi.dosyaKontrol('test.txt');
var logSonuc = LogAnalizi.logKontrol([
'2024-01-26 10:00:00 INFO: Sistem başlatıldı',
'2024-01-26 10:01:23 WARNING: Disk kullanımı %80',
'2024-01-26 10:02:45 ERROR: Bağlantı hatası'
]);
var agSonuc = await AgBaglantiKontrol.baglantiKontrol('localhost');
// Rapor oluştur
var rapor = GuvenlikDenetimRaporu([
sifreSonuc,
dosyaSonuc,
logSonuc,
agSonuc
]);
// Raporu yazdır ve kaydet
rapor.raporYazdir();
await rapor.jsonRaporOlustur('guvenlik_raporu.json');
} catch (e) {
print('Hata: $e');
}
}
Bu çözümler, Dart programlama dilinin temel ve ileri düzey özelliklerini kullanarak gerçek dünya problemlerine çözümler sunmaktadır. Her bir ödev, öğrencilerin farklı programlama kavramlarını öğrenmelerini ve uygulamalarını sağlar:
- Ödev 1: Temel veri tipleri ve string manipülasyonu
- Ödev 2: Sınıflar, listeler ve temel algoritmalar
- Ödev 3: Map ve Set veri yapıları, dosya işlemleri
- Ödev 4: Nesne yönelimli programlama, exception handling
- Ödev 5: Asenkron programlama, dosya işlemleri
- Ödev 6: Güvenlik konseptleri, raporlama, JSON işleme
Her ödev çözümünde, kodun okunabilirliği ve maintainability'si için:
- Açıklayıcı değişken ve fonksiyon isimleri
- Kapsamlı hata kontrolü
- Detaylı kod yorumları
- Modüler ve yeniden kullanılabilir kod yapısı kullanılmıştır.
Öğrenciler bu çözümleri inceleyerek:
- Dart syntax'ını
- Nesne yönelimli programlama prensiplerini
- Veri yapılarının kullanımını
- Hata yönetimini
- Asenkron programlamayı
- Güvenlik konseptlerini pratik olarak öğrenebilirler.