Dart Uygulama Sınavı: Pardus ETAP 23 Kurulum Otomasyonu

Pardus ETAP 23 kurulum sürecini bir yazılım senaryosuna dönüştürmek, Dart dilinin temel mantığını (değişkenler, döngüler, fonksiyonlar ve OOP) pekiştirmek için çok etkili bir yöntem.

Senaryo: Bir okulun BT koordinatörüsünüz. Okuldaki etkileşimli tahtalara Pardus ETAP 23 kurulumunu yönetmek, sistem gereksinimlerini kontrol etmek ve kullanıcı hesaplarını oluşturmak için bir komut satırı aracı geliştiriyorsunuz.


Bölüm 1: Değişkenler, Operatörler ve Veri Tipleri

Soru 1: Aşağıdaki değişkenleri uygun veri tipleriyle tanımlayın ve ekrana anlamlı bir cümle olarak yazdırın:

  • İşletim sistemi adı (Pardus ETAP)

  • Sürüm numarası (23.4)

  • Kurulum yapılacak tahta sayısı (Örn: 24)

  • Kurulumun başarıyla tamamlanıp tamamlanmadığı bilgisi (bool)

Soru 2: Bir akıllı tahtanın toplam disk alanı 240 GB'tır. Pardus ETAP kurulumu 40 GB yer kaplamaktadır. Kalan alanı hesaplayan ve ekrana yazdıran kodu aritmetik operatörler kullanarak yazın.


Bölüm 2: Kullanıcı Etkileşimi ve String İşlemleri

Soru 3: stdin.readLineSync() kullanarak kullanıcıdan (öğretmenden) ismini ve branşını alın.

  • Girilen ismi tamamen büyük harfe çevirin.

  • Branş ismindeki boşlukları temizleyin (trim).

  • String interpolation kullanarak: "Sayın [İsim], [Branş] sınıfı için ETAP 23 kurulumu başlıyor..." mesajını yazdırın.


Bölüm 3: Kontrol Akışı (If-Else & Switch-Case)

Soru 4: Bir sistem gereksinim kontrolü yapın.

  • Eğer RAM 4GB'dan düşükse "Yetersiz RAM, ETAP 23 kurulamaz" yazdırın.

  • Eğer RAM 4GB ve üzeri ise "Kurulum başlatılıyor..." yazdırın.

Soru 5: switch-case kullanarak kurulum modunu seçin:

  • 1 ise "Hızlı Kurulum"

  • 2 ise "Gelişmiş Kurulum"

  • 3 ise "Sistem Onarma"

  • Diğer durumlarda "Geçersiz Seçim" mesajını verin.


Bölüm 4: Döngüler (Loops)

Soru 6: Okulda 1'den 10'a kadar numaralandırılmış sınıflar var. for döngüsü kullanarak her bir sınıf için "Sınıf-[no] tahtasına imaj yükleniyor..." yazdırın.

Soru 7: Bir tahta şifresi belirlenene kadar kullanıcıdan giriş isteyen bir do-while döngüsü yazın. (Şifre en az 6 karakter olmalıdır).


Bölüm 5: Fonksiyonlar ve Null Safety

Soru 8: ipAdresiOlustur adında bir fonksiyon yazın.

  • Bu fonksiyon odaNo (int) ve tahtaNo (int) parametrelerini alsın.

  • Geriye 192.168.[odaNo].[tahtaNo] formatında bir String döndürsün.

Soru 9 (Null Safety): Kurulum sırasında "Ek Dosya" yolu null olabilir. String? ekDosyaYolu değişkeni tanımlayın. Eğer bu değişken null ise varsayılan olarak "/home/etap/indirilenler" yolunu atayan (?? operatörü ile) kodu yazın.


Bölüm 6: Nesne Yönelimli Programlama (OOP)

Soru 10: Aşağıdaki özelliklere sahip bir AkilliTahta sınıfı oluşturun:

  • Özellikler: seriNo (String), islemci (String), aktifMi (bool).

  • Metot: bilgileriGoster() (Tahta bilgilerini ekrana yazdıracak).

Soru 11 (Kalıtım): AkilliTahta sınıfından türeyen bir VestelFaz3 sınıfı oluşturun.

  • Ek olarak dokunmatikHassasiyeti (int) özelliği ekleyin.

  • bilgileriGoster metodunu override ederek yeni özelliği de ekranda gösterin.


Sınav Kriterleri

  1. Koleksiyon yapılarını (List, Map vb.) kullanmayın.

  2. Kodlarınızı main.dart dosyası içinde yapılandırın.

  3. Değişken isimlendirmelerinde Dart standartlarına (camelCase) uyun.

Bu haliyle sınav, temel programlama yeteneklerini ve OOP mantığını ölçmek için oldukça kapsamlı oldu. 


Pardus ETAP 23 Kurulum Otomasyonu (Çözüm Anahtarı)

Bu kod yapısı, hem soruların cevaplarını içeriyor hem de bir programın nasıl inşa edilmesi gerektiğini gösteriyor.

Aşağıdaki kodu bir main.dart dosyasına yapıştırarak sonuçları görebilirsiniz:

Dart:
import 'dart:io';

// --- Bölüm 6: Nesne Yönelimli Programlama (OOP) ---
class AkilliTahta {
  String seriNo;
  String islemci;
  bool aktifMi;

  AkilliTahta(this.seriNo, this.islemci, this.aktifMi);

  void bilgileriGoster() {
    print("--- Tahta Bilgileri ---");
    print("Seri No: $seriNo");
    print("İşlemci: $islemci");
    print("Durum: ${aktifMi ? 'Aktif' : 'Pasif'}");
  }
}

// Bölüm 6.1: Kalıtım (Inheritance)
class VestelFaz3 extends AkilliTahta {
  int dokunmatikHassasiyeti;

  VestelFaz3(String seriNo, String islemci, bool aktifMi, this.dokunmatikHassasiyeti)
      : super(seriNo, islemci, aktifMi);

  @override
  void bilgileriGoster() {
    super.bilgileriGoster();
    print("Dokunmatik Hassasiyeti: $dokunmatikHassasiyeti/10");
  }
}

// --- Bölüm 5: Fonksiyonlar ---
String ipAdresiOlustur(int odaNo, int tahtaNo) {
  return "192.168.$odaNo.$tahtaNo";
}

void main() {
  // --- Bölüm 1: Değişkenler ve Operatörler ---
  String isletimSistemi = "Pardus ETAP";
  double surum = 23.4;
  int tahtaSayisi = 24;
  bool kurulumBasarili = true;

  int toplamDisk = 240;
  int etapBoyut = 40;
  int kalanDisk = toplamDisk - etapBoyut;

  print("Sistem: $isletimSistemi $surum | Tahta Sayısı: $tahtaSayisi");
  print("Kurulum sonrası kalan disk alanı: $kalanDisk GB\n");

  // --- Bölüm 2: Kullanıcı Etkileşimi ---
  print("Lütfen adınızı giriniz:");
  String? isim = stdin.readLineSync();
  print("Branşınızı giriniz:");
  String? brans = stdin.readLineSync();

  String formatliIsim = isim?.toUpperCase() ?? "BİLİNMEYEN";
  String formatliBrans = brans?.trim() ?? "GENEL";

  print("Sayın $formatliIsim, $formatliBrans sınıfı için kurulum başlıyor...\n");

  // --- Bölüm 3: Kontrol Akışı (If & Switch) ---
  int ram = 8; // Örnek RAM miktarı
  if (ram < 4) {
    print("HATA: Yetersiz RAM, ETAP 23 kurulamaz.");
    return; // Programı sonlandır
  } else {
    print("Sistem kontrolü başarılı: Kurulum başlatılıyor...");
  }

  print("\nKurulum Modu Seçin (1: Hızlı, 2: Gelişmiş, 3: Onarma):");
  String? secim = stdin.readLineSync();
  switch (secim) {
    case '1':
      print("Mod: Hızlı Kurulum seçildi.");
      break;
    case '2':
      print("Mod: Gelişmiş Kurulum seçildi.");
      break;
    case '3':
      print("Mod: Sistem Onarma seçildi.");
      break;
    default:
      print("Geçersiz seçim yapıldı.");
  }

  // --- Bölüm 4: Döngüler ---
  print("\n--- Sınıf İmaj Yükleme İşlemi ---");
  for (int i = 1; i <= 5; i++) {
    print("Sınıf-$i tahtasına imaj yükleniyor...");
  }

  String sifre = "";
  do {
    print("\nLütfen yeni bir tahta şifresi belirleyin (min 6 karakter):");
    sifre = stdin.readLineSync() ?? "";
  } while (sifre.length < 6);
  print("Şifre başarıyla kaydedildi.");

  // --- Bölüm 5: Null Safety ---
  String? ekDosyaYolu; 
  // ekDosyaYolu null olduğu için varsayılan değeri atayalım
  String finalYol = ekDosyaYolu ?? "/home/etap/indirilenler";
  print("\nEk dosyalar şu konuma kontrol edilecek: $finalYol");

  // Fonksiyon kullanımı
  String ip = ipAdresiOlustur(101, 5);
  print("Tahta için atanan IP: $ip\n");

  // --- Bölüm 6: OOP Uygulaması ---
  var yeniTahta = VestelFaz3("VT-2026-X", "Intel i5", true, 9);
  yeniTahta.bilgileriGoster();

  print("\n--- KURULUM TAMAMLANDI: $kurulumBasarili ---");
}

Bu Sınav Neleri Test Etti?

  1. Değişkenler: Veri tiplerini (int, double, String, bool) doğru kullanma.

  2. Null Safety: ?, ?? ve null kontrolü ile güvenli kod yazma.

  3. Mantıksal Döngüler: for ile tekrarlı işler, do-while ile veri doğrulama.

  4. OOP: Sınıf yapısı, miras alma ve metot ezme (override) yeteneği.

  5. Giriş/Çıkış: Kullanıcıdan veri alma ve veriyi formatlayarak sunma.


Dart Uygulama Sınavı: B GRUBU

B Grubu için soruları ve değerleri değiştirerek, aynı zorluk seviyesinde ama farklı mantıksal kurgular içeren yeni bir sınav hazırladım. Bu sürümde senaryo yine Pardus ETAP 23 üzerine kurulu ancak kontrol kriterleri ve sınıf yapıları farklılaştırıldı.

Senaryo: Okulunuzdaki Pardus ETAP 23 sistemlerini denetlemek ve konfigüre etmek için bir "Sistem Denetim Aracı" kodluyorsunuz.


1. BÖLÜM: Sorular

Soru 1 (Değişkenler): Aşağıdaki bilgileri tutan değişkenleri tanımlayın:

  • Okul Adı (String)

  • Mevcut SSD Kapasitesi (int - Örn: 120)

  • ETAP Güncelleme Versiyonu (double - Örn: 23.1)

  • Sistemin "Etkileşimli" modda olup olmadığı (bool)

Soru 2 (Operatörler): Bir akıllı tahtada 120 GB SSD bulunmaktadır. İşletim sistemi 30 GB, yedekleme dosyaları ise 15 GB yer kaplamaktadır. Kalan boş alanı hesaplayıp ekrana yazdıran kodu yazın.

Soru 3 (String & Input): Kullanıcıdan "Okulun Bulunduğu İlçe" ve "Teknisyen Adı" bilgilerini alın.

  • Teknisyen adının başına "Sn. " ifadesini ekleyin.

  • İlçe isminin içindeki 'a' harflerini 'e' ile değiştirin (replace).

  • Hepsini büyük harf yaparak ekrana yazdırın.

Soru 4 (Kontrol Yapıları): * If-Else: SSD kapasitesi 100 GB'dan küçükse "Düşük Kapasite: Disk Değişimi Önerilir", değilse "Disk Alanı Yeterli" yazdırın.

  • Switch-Case: Kullanıcıdan bir dil seçeneği (TR, EN, FR) alın ve seçilen dile göre "Sistem dili [Dil] olarak ayarlandı" mesajını verin.

Soru 5 (Döngüler): * while döngüsü kullanarak %0'dan %100'e kadar 20'şer 20'şer artan bir "Güncelleme Yükleniyor" simülasyonu yapın.

  • for döngüsü ile 10'dan geriye doğru (10, 9, 8...) sayan bir sistem kapanış sayacı hazırlayın.

Soru 6 (Fonksiyonlar & Null Safety):

  • tarihFormatla isimli bir fonksiyon yazın. gun, ay, yil (int) alıp gun/ay/yil şeklinde bir String döndürsün.

  • String? teknikNot değişkeni tanımlayın. Eğer kullanıcı not girmediyse (null ise) "Not girilmedi" yazdırın.

Soru 7 (OOP - Nesne Yönelimli Programlama):

  • SistemBirimi adında bir sınıf oluşturun. Özellikler: islemci, ram, depolama.

  • Bu sınıftan türeyen EtapTahta sınıfı oluşturun. Ek özellik: fazNumarasi (int).

  • sistemBilgisi() isimli bir metodu override ederek tüm özellikleri ekrana yazdırın.


2. BÖLÜM: Çözüm Anahtarı (B Grubu)

Dart:
import 'dart:io';

// --- Bölüm 7: OOP Yapısı ---
class SistemBirimi {
  String islemci;
  int ram;
  int depolama;

  SistemBirimi(this.islemci, this.ram, this.depolama);

  void sistemBilgisi() {
    print("İşlemci: $islemci | RAM: ${ram}GB | Depolama: ${depolama}GB");
  }
}

class EtapTahta extends SistemBirimi {
  int fazNumarasi;

  EtapTahta(String islemci, int ram, int depolama, this.fazNumarasi)
      : super(islemci, ram, depolama);

  @override
  void sistemBilgisi() {
    print("--- ETAP TAHTA SİSTEM RAPORU ---");
    super.sistemBilgisi();
    print("Faz Durumu: Faz $fazNumarasi");
  }
}

// --- Bölüm 6: Fonksiyon ---
String tarihFormatla(int gun, int ay, int yil) {
  return "$gun/$ay/$yil";
}

void main() {
  // Soru 1 & 2: Değişkenler ve Operatörler
  String okulAdi = "Atatürk Mesleki ve Teknik Anadolu Lisesi";
  int ssdKapasite = 120;
  double etapVersiyon = 23.1;
  bool etkilesimliMod = true;

  int osBoyut = 30;
  int yedekBoyut = 15;
  int kalanAlan = ssdKapasite - (osBoyut + yedekBoyut);

  print("Okul: $okulAdi | Versiyon: $etapVersiyon");
  print("Kalan SSD Alanı: $kalanAlan GB\n");

  // Soru 3: String İşlemleri
  print("Lütfen ilçe giriniz:");
  String ilce = stdin.readLineSync() ?? "";
  print("Teknisyen adı:");
  String teknisyen = stdin.readLineSync() ?? "";

  String yeniIlce = ilce.replaceAll('a', 'e').toUpperCase();
  String yeniTeknisyen = "Sn. ${teknisyen.toUpperCase()}";

  print("Görevli: $yeniTeknisyen | Bölge: $yeniIlce\n");

  // Soru 4: Kontrol Yapıları
  if (ssdKapasite < 100) {
    print("UYARI: Düşük Kapasite: Disk Değişimi Önerilir.");
  } else {
    print("DURUM: Disk Alanı Yeterli.");
  }

  print("Dil Seçin (TR, EN, FR):");
  String? dil = stdin.readLineSync()?.toUpperCase();
  switch (dil) {
    case "TR":
      print("Sistem dili Türkçe olarak ayarlandı.");
      break;
    case "EN":
      print("Sistem dili İngilizce olarak ayarlandı.");
      break;
    default:
      print("Desteklenmeyen dil, varsayılan dile dönülüyor.");
  }

  // Soru 5: Döngüler
  print("\n--- Güncelleme Denetleniyor ---");
  int yukleme = 0;
  while (yukleme <= 100) {
    print("Yükleniyor: %$yukleme");
    yukleme += 20;
  }

  print("\n--- Sistem Yeniden Başlatılıyor ---");
  for (int i = 5; i >= 1; i--) {
    print("Kapanışa kalan: $i saniye...");
  }

  // Soru 6: Null Safety & Fonksiyon
  String? teknikNot; // Veri tabanından null geldiğini varsayalım
  print("\nTeknik Not: ${teknikNot ?? "Not girilmedi."}");

  String guncelTarih = tarihFormatla(24, 05, 2024);
  print("İşlem Tarihi: $guncelTarih\n");

  // Soru 7: OOP Uygulaması
  EtapTahta tahta = EtapTahta("Intel i3", 4, 120, 2);
  tahta.sistemBilgisi();
}

B Grubu Sınav Notları:

  1. Operatör Farkı: A grubunda sadece çıkarma varken, burada parantez içi işlem ve toplama-çıkarma kombinasyonu kullanıldı.

  2. String Farkı: trim yerine replaceAll kullanılarak farklı bir String metodu test edildi.

  3. Döngü Farkı: for döngüsü ileri değil, geriye doğru çalıştırıldı. while döngüsü belirli bir artış oranıyla kullanıldı.

  4. OOP Farkı: Sınıf isimleri ve hiyerarşisi değiştirildi, super anahtar kelimesinin kullanımı pekiştirildi.

Bu sınav, bir öğrencinin veya geliştiricinin temel Dart yeteneklerini ölçmek için idealdir. B

Yorumlar

Bu blogdaki popüler yayınlar

Dart Programlama Dil Uygulama Sınavı Çalışma Soruları

Pardus ETAP 23 İçin Flutter ile Dijital "Öğrenci Seçici" Uygulaması