Cpp'da Nesne Yönelimli Programlama (OOP) Mantığı İle Sınav Uygulaması

machineLearningPredictionCode

Sınav Uygulaması

Blogda paylaşılmış olan Python dilinde yazılmış Sınav Uygulaması'nın C++ dilinde geliştirilmiş versiyonudur. Amacı ise fiziksel formattaki bilgiyi/uygulamayı dijitale dönüştürme çabası olarak değerlendirilebilir. Bu uygulama ile yapılmak istenen, Sınavın hazırlanmasında, uygulanmasında, sonucunun hesaplanmasındaki iş yükünü, hata payını ve işlemleri yürütmek için gerekli zamanı minimuma indirmektir.

Projede Kullanılan Dil: C++
Proje Hazırlanmasında Kullanılan IDE: Visual Studio Code
Projede Kullanılan OOP Konuları:

  • Header
  • Class
  • Private, Protected, Public erişim izinleri
  • Kalıtım
  • Scope Resolution Operator (Kapsam Çözümleme Operatörü)
  • Constructor (Yapıcı) Fonksiyon
  • Friend Fonksiyon
  • Çok Biçimlilik (Polymorphism)
  • Try - Catch
  • Dosya İşlemleri

Not1: Projedeki tüm koda gitHub adresimdeki ExamApplicationWithOOPLogicInCPP repository'den erişebilirsiniz.

Not 2: Fonksiyonların ne işlemeler yaptıkları üstlerinde yorum satırı olarak yazmakta, bu yüzden tüm fonksiyonları anlatmayacağım ancak detay bilgi vermem gerek noktaları tabiki anlatacağım.

Kütüphaneler

Kullanılan işletim sistemine göre uygun kütüphanenin dahil (include) edilmesi;

std ve kendi yazdığım header dosyasının include edilmesi;

Header Dosyasının İçeriği

Global Değişkenler Ve Yardımcı Fonksiyonlar

Burada trim(...) fonksiyonu, kullanıcıdan bilgi alınırken bilginin atandığı değişkene uygulayacağız. Bu sayede kullanıcı bilgi girişinde yanlışlıkla yapabileceği başta ve sondaki boşluklardan kurtulacağız.

toLowercase(...) fonksiyonu ise yine kullanıcı bilgi girişlerinde bilginin atandığı değişkene uygulayacağız. Bu fonksiyon, parametre olarak verilen değişkenin (string tipinde) içeriğindeki tüm büyük harfleri küçük harflere dönüştürme işlemi yapıyor. Bunun nedeni ise uygulama içerisinde bir çok sorgulama işlemleri yapılıyor bu işlemlerin daha sağlıklı yapılabilmesi için bu fonksiyona ihtiyaç duyuldu.

get_current_dir() fonksiyonu, bize kodun bulunduğu dizini yani adres yolunu döndürüyor. Bu fonksiyona ihtiyaç duymamızın nedeni ise, uygulamamız çalıştığında bir çok dosya işlemleri yapacak (dosya oluşturma, yazma, okuma) bu işlemlerde adres yollarını el ile yazsaydık, fonksiyonu başka bir dizine taşıdığımızda yada kodu siz alıp kullanmak istediğinizde tüm adres yollarını tek tek el ile değiştirmeniz gerekecekti (Kullanılan IDE'lere göre farklılık gösterebilir, tek tek elle yazmak yerine kısayollarla da kısa sürede değiştirilebilir ama yinede bir emek harcanması gerekecekti). Bunun önüne geçebilmek için yazılmış bir fonksiyondur.

isPathExist(...) fonksiyonu, parametre olarak verdiğimiz adres yolunda dosya yada klasör olup olmadığını kontrol eder, buna göre true yada false cevabı döndürür.

passwordCheck(...) fonksiyonu, parametre olarak iki adet parola değeri alıyor, bu değerlerin aynı olup olmadığını ölçüyor, 3 adet hakkımız bulunmakta üçünü de yanlış girdiğimizde bizi sistemden atıyor.

Questions Ve Lessons Sınıflarının İçeriği

Lessons sınıfının Constructor (Yapıcı) fonksiyonunda Polymorphism (Çok Biçimlilik) uygulandı. Parametrelerinde farklılık gösteren iki adet Constructor tanımlandı.

Lessons sınıfı içerisinde bir adet friend fonksiyonu tanımlandı. Bu fonksiyonun içeriği fonksiyona sıra geldiğinde açıklanacaktır.

Gerekli Prototip Tanımlaması

Quiz Sınıfının İçeriği

vector<...> yapısı bize içine yazdığımız tipde (type) bir dizi oluşturmamızı sağlar. vector kullanılmasının nedeni ise bir öğe eklendiğinde veya silindiğinde kendini otomatik olarak yeniden boyutlandırma yeteneğine sahip dinamik dizi olmalarıdır. Uygulama içerisinde kullanıcıdan bilgi alma yada dosyadan okuma işlemlerinde değerler bir diziye atanması gerekmekte ve bu dizinin boyutu dinamik olmak zorundadır. Bu durumda vector işimizi çok kolaylaştırmaktadır.

getline(...) fonksiyonu, ilk olarak disPlayQuestion(...) fonksiyonu içerisinde karşımıza gelen getline(...) fonksiyonu uygulamanın bir çok noktasında kullanılmıştır. Kullanıcıdan bilgi alma işleminde de kullandığım bu fonksiyon cin veya scanf fonksiyonlarından ayıran en büyük nokta kullanıcının bir cümle girmesine olanak sağlamasıdır. cin veya scanf fonksiyonları kullanıcının sadece bir kelime girmesine izin vermekte ancak ben bazı noktalarda kullanıcıdan bir kelimeden fazlasını girmesini istediğim için bu fonksiyonu kullandım.

Ancak bu kullanım sonucu uygulamamda bir bug oluştu bu bug'ı aşağıda belirttiğim şekilde çözdüm.

Bu bug'ın neden oluştuğu hakkında bazı tahminlerim olsada kesin olarak bilmemekteyim. Yaptığım bu çözümün ne kadar sağlıklı olduğu tartışılır ancak uygulamamı bu şekilde düzgün çalıştırıyor.

Scope Resolution Operator Kullanımı

Header dosyamda bulunan People sınıfının constructor fonksiyonuna main dosyası içerisinde scope resolution operator yapısı ile atama yapılıyor.

Users Sınıfının İçeriği

virtual yapısını kullanma nedenimiz Users sınıfını kalıtım olarak alacak sınıflarımızda da Users sınıfında bulunan signUp() fonksiyonu kullanacak olmamızdır.

Students Sınıfının İçeriği

Students sınıfımız Users sınıfını kalıtım olarak almaktadır. Bu sınıfda da signUp() fonksiyonunu kullanacağımızı söylemiştim. Ek olarak bu sınıfımızda dosya oluşturma sırasında oluşabilecek hatayı kullanıcıya belirtmek için try-catch yapısı kullandık.

Teachers Sınıfının İçeriği

Bu sınıfımızda Users sınıfını kalıtım olarak almakta ve signUp() fonksiyonunu kullanmaktadır. Students sınıfında olduğu gibi bu sınıfımız da dosya oluşturma bölümünde try-catch yapısından faydalandı. Ek olarak bu sınıfımızda şöyle bir mantık var;

Herhangi bir öğrenci, öğretmen ünvanında kullanıcı oluşturamaması için kodumuzda bir şifre bulunmaktadır.

Kullanıcı oluşturma esnasında öğretmen ünvanı seçilirse kullanıcıdan bir şifre istenecek, doğru şifreyi girdiğinde ancak öğretmen ünvanında kullanıcı oluşturabilecek.

isPassed(...) Fonksiyonu

friend fonksiyon yapısı ile Lessons sınıfımızın özelliklerine erişmesini sağladığımız isPassed(...) fonksiyonu, harf notumuza göre 'gecti', 'kosullu gecti' yada 'kaldi' sonuçlarından birini döndürmektedir.

findLessons(...) Fonksiyonları

Çok biçimlilik yapısı kullanılarak oluşturduğumuz iki adet fonksiyonlarımız bize, parametre olarak gönderilen bilgilere uygun olarak string tipinde ders listesi döndürmektedir.

createLessonObjects(...) Fonksiyonu

Bu fonksiyonumuz ise yukarıda bahsettiğim findLessons(...) fonksiyonlarında iki parametreli olan fonksiyonu kullanarak string tipinde oluşacak olan ders listesini, Lessons sınıfının nesnesi tipinde listeye çevirecektir.

questionAppend(...) Fonksiyonu

Bu fonksiyonumuz öğretmenin branşına uygun olan derslerden tercih ettiği derse soru eklemesini sağlamaktadır.

quizStart(...) Ve showQuizResult(...) Fonksiyonları

quizStart(...) fonksiyonu, öğrenci sınıfında bulunan derslerden tercih ettiği dersin sınavını olmak istediğinde bu fonksiyonumuz çalışacaktır.

showQuizResult(...) fonksiyonu, öğrenci sınav sonucunu görmek istediğinde bu fonksiyonumuz çalışacaktır. Bu noktada uygulamanın şu mantığını söylemek istiyorum:

Bir öğrenci aynı dersden birden fazla kez sınav olabilir. Burada olduğu ilk sınav orjinal/geçerli notudur, diğer yaptığı sınavlar ise dersi pekiştirmek için olduğu sınavlardır.

createMenu() Ve main() Fonksiyonları

createMenu() fonksiyonu, adından da anlaşılacağı üzere uygulamanın menüsünü oluşturmaktadır. Bu noktada uygulamanın şu mantığını söylemek istiyorum:

Kullanıcı oturum açtığında ünvanına göre farklı bir menü gözükmektedir. Yani kullanıcı öğretmen ise öğretmenin yapabileceği işlemleri gösteren farklı bir menü, kullanıcı öğrenci ise öğrencinin yapabileceği işlemleri gösteren farklı bir menü gösterilmektedir.

Son

Uygulama ve sunumu bu kadardı. Tabiki yapılan uygulamalar bitmez her zaman geliştirilecek noktaları olacaktır ama bu uygulamayı yapma nedenim daha çok OOP mantığını anlamak ve kullanmaktı. Bu yüzden daha fazla detaya inmedim.

Beni dinlediğiniz için (daha doğrusu yazılarımı okuduğunuz için :) ) çok teşekkür ederim. Yaptığım hataları, daha iyisinin yapılabileceği noktaları, yorumlarınızı yazmayı unutmayın, görüşleriniz benim için çok önemli. İyi günler dilerim.

Diğer uygulamalarımı görmek istiyorsanız, Projelerim sayfasına göz atabilirsiniz.

Popüler Yayınlar

Taş Oyunu

Makine Öğrenmesi Temel Bilgiler

Veri Görselleştirme Temel Bilgi

C Dili İle İlgili Örnek Sorular Ve Çözümleri

Machine Learning Tahmin (Prediction) Metotları

Python İle Nesne Yönelimli Programlama (OOP) Uygulamaları