{"id":25658450,"url":"https://github.com/deryaxacar/42-cpp_05","last_synced_at":"2025-02-24T00:21:31.640Z","repository":{"id":269584483,"uuid":"905248205","full_name":"deryaxacar/42-Cpp_05","owner":"deryaxacar","description":"This module teaches the fundamentals of object-oriented programming (OOP), focusing on class relationships, dynamic object management, inheritance, virtual functions, and method overriding. Students also learn to improve program reliability using try-catch blocks and handling exceptions.","archived":false,"fork":false,"pushed_at":"2025-02-21T17:57:38.000Z","size":57,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-21T18:34:38.778Z","etag":null,"topics":["42born2code","42cursus","42ecole","42projects","42school","cpp","cpp-modules","cpp-programming","cpp-programming-language","cpp-programming-project","cpp-project","cpp98","oop","oop-cpp","oop-examples","oops-in-cpp","project"],"latest_commit_sha":null,"homepage":"https://github.com/deryaxacar/42-Cpp_05","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deryaxacar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-18T12:57:37.000Z","updated_at":"2025-02-21T17:57:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"476a6bae-c999-47a2-b2ef-236043724166","html_url":"https://github.com/deryaxacar/42-Cpp_05","commit_stats":null,"previous_names":["deryaxacar/42-cpp_05"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-Cpp_05","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-Cpp_05/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-Cpp_05/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-Cpp_05/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deryaxacar","download_url":"https://codeload.github.com/deryaxacar/42-Cpp_05/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240396800,"owners_count":19794731,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["42born2code","42cursus","42ecole","42projects","42school","cpp","cpp-modules","cpp-programming","cpp-programming-language","cpp-programming-project","cpp-project","cpp98","oop","oop-cpp","oop-examples","oops-in-cpp","project"],"created_at":"2025-02-24T00:21:31.005Z","updated_at":"2025-02-24T00:21:31.622Z","avatar_url":"https://github.com/deryaxacar.png","language":"C++","readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eC++ Module 05\u003c/h1\u003e \u003cimg src=\"https://cdn-icons-png.flaticon.com/512/6132/6132222.png\" alt=\"C++ Logo\" width=\"65\"\u003e\u003c/br\u003e\u003c/br\u003e\n\u003c/div\u003e\n\u003cp align=\"center\"\u003e\nC++ dilinde nesne yönelimli programlama (OOP) yaklaşımını istisnalar (exceptions) ve farklı senaryolar üzerinden derinlemesine işlemektedir. Projede; bürokratik hiyerarşi ve formlar teması kullanılarak, sınıflar arasında kalıtım, soyut sınıflar (abstract class), çok biçimlilik (polymorphism), istisnaların kullanımı ve hata yakalama mekanizmaları gösterilmektedir.\n\u003c/p\u003e\n\n\n### İçindekiler 📚\n\n- [Ex00 - Bureaucrat](#ex00-bureaucrat)\n  - [Try, Throw ve Exception Kullanımı](#try-throw-ve-exception-kullanımı)\n- [Ex01 - Form](#ex01-form)\n- [Ex02 - AForm ve Alt Sınıfları](#ex02-aform-ve-alt-siniflari)\n- [Ex03 - Intern](#ex03-intern)\n  - [Switch-case Kullanımı](#switch-case-kullanımı)\n\n---\n\n\u003ca name=\"ex00-bureaucrat\"\u003e\u003c/a\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ch2\u003eEx00 - Bureaucrat\u003c/h2\u003e\n\u003c/div\u003e\n\n- Sabit bir `name` ve 1 ile 150 arasında olabilecek bir `grade` üyesi bulunur.\n- `grade` aralığı geçersiz olduğunda istisna fırlatır (GradeTooHighException, GradeTooLowException).\n- Derece yükseltme ve düşürme fonksiyonları da aynı şekilde geçersiz sınırda istisna yakalamayı öğretir.\n- `operator\u003c\u003c` aşırı yüklenerek, bürokratın bilgilerini yazdırmayı sağlar.\n\n\u003ca name=\"try-throw-ve-exception-kullanımı\"\u003e\u003c/a\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ch3\u003eTry, Throw ve Exception Kullanımı\u003c/h3\u003e\n\u003c/div\u003e\n\nC++’ta hatalı durumları yönetmek için `try`, `throw` ve `catch` blokları kullanılır:\n\n- **try**\n  - Hata oluşturma ihtimali olan kodlar burada yer alır.\n- **throw**\n  - Hatalı bir durum tespit edildiğinde, `throw` ile bir istisna fırlatılır.\n- **catch**\n  - `throw` ile fırlatılan istisna, uygun türdeki `catch` bloklarında yakalanır ve işlenir.\n\n**Exception (İstisna) Nedir?**\n\nC++’ta exception (istisna), program çalışırken beklenmeyen veya olağan dışı bir durumla karşılaşıldığında (örneğin geçersiz girdi, belli bir sınıra ulaşma, kaynak yetersizliği vb.) akışın kesilerek bu hatanın özel bir şekilde ele alınmasını sağlayan mekanizmadır. Bu sayede normal akış içinde hataların takibi yerine, hatalı durumlar ayrı bir blokta yönetilir ve kodun temizliği korunur.\n\n\n```cpp\ntry {\n    // Hata oluşturabilecek kod\n    if (someCondition)\n        throw std::runtime_error(\"Bir hata oluştu!\");\n    // ...\n} catch (const std::runtime_error\u0026 e) {\n    std::cerr \u003c\u003c \"Hata mesajı: \" \u003c\u003c e.what() \u003c\u003c std::endl;\n} catch (...) {\n    std::cerr \u003c\u003c \"Bilinmeyen bir hata oluştu!\" \u003c\u003c std::endl;\n}\n\n```\n\nBu mekanizma sayesinde hatalar normal akıştan ayrı yönetilir ve kod daha temiz, anlaşılır hale gelir. Özellikle throw ve catch mekanizması kullanarak hataları türlerine göre (örneğin `GradeTooHighException`, `GradeTooLowException`) farklı şekillerde ele alabilirsiniz.\n\n\n---\n\n\u003ca name=\"ex01-form\"\u003e\u003c/a\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ch2\u003eEx01 - Form\u003c/h2\u003e\n\u003c/div\u003e\n\n- Form, ad (name), imzalanma durumu (signed), imza için gereken derece (grade to sign) ve uygulama için gereken derece (grade to execute) gibi sabit ve/veya özel alanlara sahiptir.\n- Form’un imzalanması için gerekli grade sağlanmadığında istisna fırlatır (Form::GradeTooHighException, Form::GradeTooLowException).\n- Bureaucrat tarafından `signForm()` fonksiyonuyla imzalanma aşaması ve ilgili mesajların yönetimi ele alınır.\n\n---\n\n\u003ca name=\"ex02-aform-ve-alt-siniflari\"\u003e\u003c/a\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ch2\u003eEx02 - AForm ve Alt Sınıfları\u003c/h2\u003e\n\u003c/div\u003e\n\n- `Form` soyut sınıfa (AForm) dönüştürülür; artık nesne oluşturulamaz fakat kalıtım için temel görevi görür.\n- `ShrubberyCreationForm`, `RobotomyRequestForm`, `PresidentialPardonForm` gibi somut sınıflar, AForm’dan türetilir ve kendi özel işlemlerini (`execute()`) uygular.\n- Form’un imza ve yürütme (execute) koşulları kontrol edilerek, gerekiyorsa istisnalar (örneğin “Form is not signed” veya “Grade too low”) fırlatılır.\n\n---\n\n\u003ca name=\"ex03-intern\"\u003e\u003c/a\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ch2\u003eEx03 - Intern\u003c/h2\u003e\n\u003c/div\u003e\n\n- `Intern` sınıfı, form oluşturma işini (makeForm) üstlenir.\n- Parametre olarak aldığı form ismi ve hedef (target) bilgisini kullanarak doğru formu döndürür. Yanlış form ismi gelirse uyarı verir.\n- Böylece, bürokratların sürekli form üretmesi yerine, `Intern` nesnesi bu görevi üstlenip bürokratik akışı kolaylaştırır.\n\n---\n\n\u003ca name=\"switch-case-kullanımı\"\u003e\u003c/a\u003e\n\u003cdiv align=\"center\"\u003e \n  \u003ch3\u003eSwitch-case Kullanımı\u003c/h3\u003e \n\u003c/div\u003e\n\n**Switch-case Nedir?**\n\nswitch-case, bir değişkenin değerine göre belirlenmiş kod bloklarını seçerek çalıştırmayı sağlayan karar yapısıdır. Genellikle if-else if dizisini daha okunabilir hâle getirmek için tercih edilir. Yalnızca tam sayılar (int), karakterler (char) ve bazı derleyiciye özgü durumlarda da enum gibi türlerle kullanılabilir. Mantık olarak “değişkenin değeri neyse, ona karşılık gelen case bloğunu çalıştır” şeklinde özetlenebilir.\nAşağıdaki örnekte, switch yapısını kullanarak farklı grade (derece) değerleri için farklı işlem yapılmasını sağlıyoruz:\n\n```cpp\n#include \u003ciostream\u003e\n\nint main() {\n    int grade = 2; // Bu değer, kullanıcı girişi ya da başka bir fonksiyondan gelebilir\n    \n    switch (grade) {\n        case 1:\n            std::cout \u003c\u003c \"Grade = 1 (En yüksek derece)\" \u003c\u003c std::endl;\n            // GradeTooHighException atılabilir\n            break;\n        case 150:\n            std::cout \u003c\u003c \"Grade = 150 (En düşük derece)\" \u003c\u003c std::endl;\n            // GradeTooLowException atılabilir\n            break;\n        default:\n            std::cout \u003c\u003c \"Grade = \" \u003c\u003c grade \u003c\u003c \" (Geçerli aralıkta)\" \u003c\u003c std::endl;\n            break;\n    }\n\n    return 0;\n}\n\n```\n- `switch (grade`) ile değeri grade olan değişkene bakılır.\n- `case 1` bloğu, gradein değeri `1` ise çalışır ve ardından break ile `switch` yapısından çıkılır.\n- `case 150` bloğu, gradein değeri `150` ise çalışır ve ardından break ile `switch` yapısından çıkılır.\n- `default` bloğu ise hiçbir `case` ile eşleşmeyen durumlarda devreye girer.\n\n`switch-case`, bir değere göre dallanma yapmak istediğinizde `if-else-if` yapısını sadeleştirmeye yardımcı olur. Buradaki `default` bloğu, herhangi bir `case` ile eşleşmeyen durumlar için kullanılır.\n\n\n---\n\nBu aşamalar boyunca, C++’ın istisna mekanizması (try/catch ve switch/case blokları), sınıf hiyerarşisi, kurucu/destructor kuralları, fonksiyon aşırı yükleme (overloading) ve çok biçimlilik gibi temel OOP prensipleri pratik örneklerle gösterilmektedir. Kodlama adımları sonunda ise öğrencilerin, sınıflar arası etkileşimi (özellikle hata yakalama ve kontrol mekanizmalarıyla) doğru şekilde yönetmeyi öğrenmeleri hedeflenir.\n\n---\n\n\u003cp align=\"center\"\u003e© 2025 This project was created by Derya ACAR.\u003c/p\u003e\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderyaxacar%2F42-cpp_05","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fderyaxacar%2F42-cpp_05","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderyaxacar%2F42-cpp_05/lists"}