Mobil Menü

C# İle Öğrenci Yönetim Sistemi

Genel Bakış:

Verilen C# kodu, bir öğrenci yönetim sistemi için tasarlanmıştır. Bu sistem, öğrenci bilgilerini saklamak, listelemek ve çeşitli işlemler yapmak için iki farklı veri yapısı kullanır: Bağlı Liste ve İkili Arama Ağacı.

  • Bağlı Liste: Öğrencileri sıralı bir şekilde tutmak için kullanılır. Öğrencileri başa, sona veya belirli bir konuma ekleme, silme ve listeleme gibi işlemler yapabiliriz. Ayrıca, öğrencileri ad soyad veya not ortalamasına göre sıralama gibi ek özellikler de sunar.
  • İkili Arama Ağacı: Öğrencileri okul numaralarına göre sıralı bir şekilde tutmak için kullanılır. Bu sayede öğrencileri hızlı bir şekilde arama, ekleme ve silme işlemleri yapabiliriz. Ayrıca, ağacın yüksekliği, düğüm sayısı ve sınıf ortalaması gibi bilgileri de hesaplayabiliriz.

Kodun Temel Bileşenleri:

  • Ogrenci Sınıfı: Bir öğrencinin tüm bilgilerini (okul numarası, ad, soyad, notlar, ortalama vb.) tutan bir nesnedir.
  • Bağlı Liste Sınıfı: Bağlı liste veri yapısını temsil eder. Öğrenci nesnelerini liste halinde tutar ve çeşitli liste işlemlerini gerçekleştirir.
  • İkili Arama Ağacı Sınıfı: İkili arama ağacı veri yapısını temsil eder. Öğrenci nesnelerini ağaç yapısında tutar ve arama, ekleme, silme gibi işlemleri gerçekleştirir.
  • Program Sınıfı: Kullanıcı arayüzünü yönetir ve kullanıcının seçimlerine göre ilgili işlemleri yapar.

Kodun İşleyişi:

  1. Program Başlatılır: Kullanıcıya bağlı liste veya ikili arama ağacı işlemleri seçimi sunulur.
  2. Kullanıcı Seçim Yapar: Kullanıcı seçtiği veri yapısı için ilgili işlemleri yapar (örneğin, öğrenci ekleme, silme, sıralama vb.).
  3. İşlemler Gerçekleştirilir: Seçilen işlemlere göre ilgili sınıfların metotları çağrılır ve işlemler gerçekleştirilir.
  4. Sonuçlar Ekrana Yazdırılır: İşlemlerin sonuçları ekranda gösterilir.

Kodun Özellikleri:

  • Modülerlik: Kod farklı sınıflara bölünerek okunabilirliği ve yönetilebilirliği artırılmıştır.
  • Nesne Yönelimli Programlama: Kod, nesne yönelimli programlama prensiplerine uygun olarak yazılmıştır.
  • Veri Yapıları: Bağlı liste ve ikili arama ağacı gibi önemli veri yapıları kullanılmıştır.
  • Sıralama Algoritmaları: Bubble Sort ve Quick Sort gibi sıralama algoritmaları kullanılmıştır.
  • Kullanıcı Arayüzü: Konsol üzerinden basit bir kullanıcı arayüzü sağlanmıştır.
using System;
using System.Diagnostics;

public class Ogrenci
{
public int okulnumarasi { get; set; }
public string isim { get; set; }
public string soyisim { get; set; }
public double vize { get; set; }
public double final { get; set; }
public double notortalamasi => (vize * 0.4) + (final * 0.6);
public bool gecmenotu => notortalamasi >= 60;

public Ogrenci(int number, string name, string surname, double midterm, double final)
{
okulnumarasi = number;
isim = name;
soyisim = surname;
vize = midterm;
this.final = final;
}

public void Display()
{
Console.WriteLine($"No: {okulnumarasi}, İsim: {isim}, Soyisim: {soyisim}, Ortalama: {notortalamasi}, Durum: {(gecmenotu ? "Geçti" : "Kaldı")}");
}
}

public class LinkedList
{
private class Node
{
public Ogrenci Data;
public Node Next;

public Node(Ogrenci data)
{
Data = data;
Next = null;
}
}

private Node head;
private bool OgrenciNumarasiKontrol(int number)
{
Node current = head;
while (current != null)
{
if (current.Data.okulnumarasi == number)
{
Console.WriteLine("Aynı numaraya sahip bir öğrenci zaten var. Lütfen farklı bir numara girin.");
return false;
}
current = current.Next;
}
return true;
}

public void BasaEkle(Ogrenci student)
{
if (!OgrenciNumarasiKontrol(student.okulnumarasi)) return;
var newNode = new Node(student) { Next = head };
head = newNode;
student.Display();
Console.WriteLine("-----------------------------------");
Console.WriteLine("Öğrenci başa eklendi. Güncel liste:");
Yazdir();
}

public void SonaEkle(Ogrenci student)
{
if (!OgrenciNumarasiKontrol(student.okulnumarasi)) return;
var newNode = new Node(student);
if (head == null)
{
head = newNode;
}
else
{
Node current = head;
while (current.Next != null)
{
current = current.Next;
}
current.Next = newNode;
}
student.Display();
Console.WriteLine("-----------------------------------");
Console.WriteLine("Öğrenci sona eklendi. Güncel liste:");
Yazdir();
}

public void ArayaEkle(int position, Ogrenci student)
{
if (!OgrenciNumarasiKontrol(student.okulnumarasi)) return;
if (position == 0)
{
BasaEkle(student);
return;
}

Node current = head;
int index = 0;

while (current != null && index < position - 1)
{
current = current.Next;
index++;
}

if (current == null)
{
Console.WriteLine("Geçersiz pozisyon.");
}
else
{
Node newNode = new Node(student) { Next = current.Next };
current.Next = newNode;
}
student.Display();
Console.WriteLine("-----------------------------------");
Console.WriteLine("Öğrenci araya eklendi. Güncel liste:");
Yazdir();
}

public void NumarayaGoreSil(int number)
{
if (head == null) return;

if (head.Data.okulnumarasi == number)
{
head = head.Next;
return;
}

Node current = head;
while (current.Next != null && current.Next.Data.okulnumarasi != number)
{
current = current.Next;
}

if (current.Next == null)
{
Console.WriteLine("Öğrenci bulunamadı.");
}
else
{
current.Next = current.Next.Next;
Console.WriteLine("Öğrenci silindi.");
}
Console.WriteLine("-----------------------------------");
Console.WriteLine("Öğrenci başa eklendi. Güncel liste:");
Yazdir();
}

public void Yazdir()
{
Node current = head;
while (current != null)
{
current.Data.Display();
current = current.Next;
}
}

public void AdSoyadaGoreSirala(bool useBubbleSort)
{
Stopwatch stopwatch = Stopwatch.StartNew();
if (useBubbleSort)
{
BubbleSortAdSoyad();
}
else
{
QuickSortAdSoyad();
}
stopwatch.Stop();
Console.WriteLine($"{(useBubbleSort ? "Bubble Sort" : "Quick Sort")} süresi: {stopwatch.Elapsed.TotalMilliseconds} ms");
Console.WriteLine("Ad Soyad sırasına göre sıralı liste:");
Yazdir();
}

private void BubbleSortAdSoyad()
{
Node end = null;
while (end != head)
{
Node current = head;
Node next = head.Next;
while (next != end)
{
if (string.Compare(current.Data.isim + current.Data.soyisim, next.Data.isim + next.Data.soyisim) > 0)
{
var temp = current.Data;
current.Data = next.Data;
next.Data = temp;
}
current = next;
next = next.Next;
}
end = current;
}
}

private void QuickSortAdSoyad()
{
head = QuickSortRecursive(head);
}
private Node QuickSortRecursive(Node node)
{
if (node == null || node.Next == null) return node;

Node pivot = node;
Node less = null, greater = null;

Node current = node.Next;
pivot.Next = null;

while (current != null)
{
Node next = current.Next;
current.Next = null;

if (string.Compare(current.Data.isim + current.Data.soyisim, pivot.Data.isim + pivot.Data.soyisim) < 0)
{
current.Next = less;
less = current;
}
else
{
current.Next = greater;
greater = current;
}
current = next;
}

less = QuickSortRecursive(less);
greater = QuickSortRecursive(greater);

return Concatenate(less, pivot, greater);
}

private Node Concatenate(Node less, Node pivot, Node greater)
{
Node head = less ?? pivot;
Node current = head;

while (current.Next != null)
{
current = current.Next;
}
current.Next = pivot;

pivot.Next = greater;

return head;
}

public void OrtalamaSirala()
{
BubbleSortOrtalama();
Console.WriteLine("Ortalama sırasına göre sıralı liste:");
Yazdir();
}

private void BubbleSortOrtalama()
{
Node end = null;
while (end != head)
{
Node current = head;
Node next = head.Next;
while (next != end)
{
if (current.Data.notortalamasi > next.Data.notortalamasi)
{
var temp = current.Data;
current.Data = next.Data;
next.Data = temp;
}
current = next;
next = next.Next;
}
end = current;
}
}
public void SinifDurumu()
{
Node current = head;
int passedCount = 0, total = 0;
double totalGrade = 0;

while (current != null)
{
total++;
totalGrade += current.Data.notortalamasi;
if (current.Data.gecmenotu) passedCount++;
current = current.Next;
}

double avg = total == 0 ? 0 : totalGrade / total;
Console.WriteLine($"Geçenler: {passedCount}, Kalanlar: {total - passedCount}, Ortalama: {avg:F2}");
}
}

public class BinarySearchTree
{
private class TreeNode
{
public Ogrenci Data;
public TreeNode Left;
public TreeNode Right;

public TreeNode(Ogrenci data)
{
Data = data;
Left = null;
Right = null;
}
}

private TreeNode root;
public void Ekle(Ogrenci student)
{
if (root == null)
{
root = new TreeNode(student);
}
else
{
EkleRecursive(root, student);
}
student.Display();
}

private void EkleRecursive(TreeNode node, Ogrenci student)
{
if (student.okulnumarasi < node.Data.okulnumarasi)
{
if (node.Left == null)
node.Left = new TreeNode(student);
else
EkleRecursive(node.Left, student);
}
else if (student.okulnumarasi > node.Data.okulnumarasi)
{
if (node.Right == null)
node.Right = new TreeNode(student);
else
EkleRecursive(node.Right, student);
}
else
{
Console.WriteLine("Bu numaraya sahip bir öğrenci zaten mevcut.");
}
}

public void Sil(int number)
{
root = SilRecursive(root, number);
}

private TreeNode SilRecursive(TreeNode node, int number)
{
if (node == null) return node;

if (number < node.Data.okulnumarasi)
{
node.Left = SilRecursive(node.Left, number);
}
else if (number > node.Data.okulnumarasi)
{
node.Right = SilRecursive(node.Right, number);
}
else
{
if (node.Left == null) return node.Right;
if (node.Right == null) return node.Left;

node.Data = MinValue(node.Right);
node.Right = SilRecursive(node.Right, node.Data.okulnumarasi);
}
return node;
}

private Ogrenci MinValue(TreeNode node)
{
var current = node;
while (current.Left != null)
{
current = current.Left;
}
return current.Data;
}

public void InOrderSirala()
{
InOrderSiralaRecursive(root);
}

private void InOrderSiralaRecursive(TreeNode node)
{
if (node != null)
{
InOrderSiralaRecursive(node.Left);
node.Data.Display();
InOrderSiralaRecursive(node.Right);
}
}

public int Yukseklik()
{
return YukseklikRecursive(root);
}

private int YukseklikRecursive(TreeNode node)
{
if (node == null) return 0;
return 1 + Math.Max(YukseklikRecursive(node.Left), YukseklikRecursive(node.Right));
}

public int DugumSayisi()
{
return DugumSayisiRecursive(root);
}

private int DugumSayisiRecursive(TreeNode node)
{
if (node == null) return 0;
return 1 + DugumSayisiRecursive(node.Left) + DugumSayisiRecursive(node.Right);
}

public double Ortalama()
{
double toplamNot = 0;
int sayac = 0;
OrtalamaRecursive(root, ref toplamNot, ref sayac);
return sayac == 0 ? 0 : toplamNot / sayac;
}

private void OrtalamaRecursive(TreeNode node, ref double toplamNot, ref int sayac)
{
if (node != null)
{
toplamNot += node.Data.notortalamasi;
sayac++;
OrtalamaRecursive(node.Left, ref toplamNot, ref sayac);
OrtalamaRecursive(node.Right, ref toplamNot, ref sayac);
}
}
public void SinifDurumu()
{
int gecenSayisi = 0, kalanSayisi = 0;
double toplamNot = 0;
int ogrenciSayisi = 0;

SinifDurumuRecursive(root, ref gecenSayisi, ref kalanSayisi, ref toplamNot, ref ogrenciSayisi);

double sinifOrtalamasi = ogrenciSayisi == 0 ? 0 : toplamNot / ogrenciSayisi;

Console.WriteLine($"\n--- Sınıfın Genel Durumu ---");
Console.WriteLine($"Geçen Öğrenci Sayısı: {gecenSayisi}");
Console.WriteLine($"Kalan Öğrenci Sayısı: {kalanSayisi}");
Console.WriteLine($"Sınıf Ortalaması: {sinifOrtalamasi:F2}");
}

private void SinifDurumuRecursive(TreeNode node, ref int gecenSayisi, ref int kalanSayisi, ref double toplamNot, ref int ogrenciSayisi)
{
if (node != null)
{
double ogrenciOrtalamasi = node.Data.notortalamasi;
toplamNot += ogrenciOrtalamasi;
ogrenciSayisi++;

if (ogrenciOrtalamasi >= 50)
gecenSayisi++;
else
kalanSayisi++;

SinifDurumuRecursive(node.Left, ref gecenSayisi, ref kalanSayisi, ref toplamNot, ref ogrenciSayisi);
SinifDurumuRecursive(node.Right, ref gecenSayisi, ref kalanSayisi, ref toplamNot, ref ogrenciSayisi);
}
}


}

public class Program
{
public static void Main(string[] args)
{
var linkedList = new LinkedList();
var bst = new BinarySearchTree();

while (true)
{
Console.WriteLine("\n---- Öğrenci Programı ----");
Console.WriteLine("1. Tek Yönlü Bağlı Liste İşlemleri");
Console.WriteLine("2. Binary Search Tree İşlemleri");
Console.WriteLine("3. Çıkış");
Console.Write("Seçiminizi yapın: ");
int secim = int.Parse(Console.ReadLine());

if (secim == 1)
{
LinkedListMenu(linkedList);
}
else if (secim == 2)
{
BSTMenu(bst);
}
else if (secim == 3)
{
break;
}
else
{
Console.WriteLine("Geçersiz seçim.");
}
}
}

private static void LinkedListMenu(LinkedList linkedList)
{
while (true)
{
Console.WriteLine("\n--- Bağlı Liste Menüsü ---");
Console.WriteLine("a. Başa Ekle");
Console.WriteLine("b. Sona Ekle");
Console.WriteLine("c. Araya Ekle");
Console.WriteLine("d. Numaraya Göre Sil");
Console.WriteLine("e. Yazdır");
Console.WriteLine("f. Ad Soyada Göre Sırala");
Console.WriteLine("g. Ortalamaya Göre Sırala");
Console.WriteLine("h. Sınıfın Genel Durumu");
Console.WriteLine("i. Önceki Menüye Dön");
Console.WriteLine("--------------------------");
Console.Write("Seçiminizi yapın: ");
char secim = Console.ReadLine()[0];

if (secim == 'i') break;

switch (secim)
{
case 'a':
linkedList.BasaEkle(OgrenciBilgisiAl());
break;
case 'b':
linkedList.SonaEkle(OgrenciBilgisiAl());
break;
case 'c':
Console.Write("Pozisyon girin: ");
int pozisyon = int.Parse(Console.ReadLine());
linkedList.ArayaEkle(pozisyon, OgrenciBilgisiAl());
break;
case 'd':
Console.Write("Silinecek öğrenci numarasını girin: ");
int numara = int.Parse(Console.ReadLine());
linkedList.NumarayaGoreSil(numara);
break;
case 'e':
linkedList.Yazdir();
break;
case 'f':
Console.Write("Sıralama Algoritması (1: Bubble Sort, 2: Quick Sort): ");
bool useBubbleSort = Console.ReadLine() == "1";
linkedList.AdSoyadaGoreSirala(useBubbleSort);
break;
case 'g':
linkedList.OrtalamaSirala();
break;
case 'h':
linkedList.SinifDurumu();
break;
default:
Console.WriteLine("Geçersiz seçim.");
break;
}
}
}
private static void BSTMenu(BinarySearchTree bst)
{
while (true)
{
Console.WriteLine("\n--- Binary Search Tree Menüsü ---");
Console.WriteLine("a. Ekle");
Console.WriteLine("b. Sil");
Console.WriteLine("c. Sırala (Inorder)");
Console.WriteLine("d. Ağaç Yüksekliği");
Console.WriteLine("e. Düğüm Sayısı");
Console.WriteLine("f. Sınıf Ortalaması");
Console.WriteLine("g. Sınıfın Genel Durumu");
Console.WriteLine("i. Önceki Menüye Dön");
Console.WriteLine("------------------------");
Console.Write("Seçiminizi yapın: ");
char secim = Console.ReadLine()[0];

if (secim == 'i') break;

switch (secim)
{
case 'a':
bst.Ekle(OgrenciBilgisiAl());
break;
case 'b':
Console.Write("Silinecek öğrenci numarasını girin: ");
int numara = int.Parse(Console.ReadLine());
bst.Sil(numara);
break;
case 'c':
bst.InOrderSirala();
break;
case 'd':
Console.WriteLine($"Ağaç Yüksekliği: {bst.Yukseklik()}");
break;
case 'e':
Console.WriteLine($"Düğüm Sayısı: {bst.DugumSayisi()}");
break;
case 'f':
Console.WriteLine($"Sınıf Ortalaması: {bst.Ortalama():F2}");
break;
case 'g':
bst.SinifDurumu();
break;
default:
Console.WriteLine("Geçersiz seçim.");
break;
}
}
}
private static Ogrenci OgrenciBilgisiAl()
{
Console.Write("Numara: ");
int number = int.Parse(Console.ReadLine());

Console.Write("Ad: ");
string name = Console.ReadLine();

Console.Write("Soyad: ");
string surname = Console.ReadLine();

double midterm;
do
{
Console.Write("Vize Notu (0-100 arası): ");
if (!double.TryParse(Console.ReadLine(), out midterm) || midterm < 0 || midterm > 100)
{
Console.WriteLine("Geçersiz vize notu. Lütfen 0 ile 100 arasında bir sayı girin.");
}
} while (midterm < 0 || midterm > 100);

double final;
do
{
Console.Write("Final Notu (0-100 arası): ");
if (!double.TryParse(Console.ReadLine(), out final) || final < 0 || final > 100)
{
Console.WriteLine("Geçersiz final notu. Lütfen 0 ile 100 arasında bir sayı girin.");
}
} while (final < 0 || final > 100);

return new Ogrenci(number, name, surname, midterm, final);
}

}
Osman Bayrak
Osman Bayrak

Yazılım Mühendisiyim. Teknoloji ve yazılıma meraklıyım.

Articles: 154