using System;
using System.Collections.Generic;
using System.IO;
namespace ATMSystem
{
// الفئة الأساسية للحساب (Base Account Class)
class Account
{
// رقم الحساب
public int AccountNumber { get; set; }
// رصيد الحساب
public double Balance { get; set; }
// مُنشئ الحساب (Constructor)
public Account(int accountNumber, double initialBalance)
{
AccountNumber = accountNumber;
Balance = initialBalance;
}
// عملية الإيداع (Deposit) - قابلة للتجاوز
public virtual void Deposit(double amount)
{
Balance += amount; // تحديث الرصيد بعد الإيداع
Console.WriteLine($"تم الإيداع بنجاح! الرصيد الجديد: {Balance}");
}
// عملية السحب (Withdraw) - قابلة للتجاوز
public virtual void Withdraw(double amount)
{
// التحقق من وجود رصيد كافٍ
if (amount > Balance)
{
Console.WriteLine("الرصيد غير كافٍ.");
}
else
{
Balance -= amount; // تحديث الرصيد بعد السحب
Console.WriteLine($"تم السحب بنجاح! الرصيد الجديد: {Balance}");
}
}
// عرض الرصيد الحالي (Display Balance)
public void DisplayBalance()
{
Console.WriteLine($"رقم الحساب: {AccountNumber}, الرصيد الحالي: {Balance}");
}
}
// فئة حساب التوفير (Saving Account Class) - ترث من الفئة الأساسية
class SavingAccount : Account
{
// مُنشئ حساب التوفير
public SavingAccount(int accountNumber, double initialBalance)
: base(accountNumber, initialBalance) { }
// تجاوز طريقة الإيداع مع تطبيق رسوم (Deposit)
public override void Deposit(double amount)
{
double fee = amount * 0.0005; // رسوم الإيداع (0.05%)
base.Deposit(amount - fee); // خصم الرسوم من المبلغ المودع
Console.WriteLine($"تم تطبيق رسوم الإيداع: {fee}");
}
}
// فئة الحساب الجاري (Checking Account Class) - ترث من الفئة الأساسية
class CheckingAccount : Account
{
// مُنشئ الحساب الجاري
public CheckingAccount(int accountNumber, double initialBalance)
: base(accountNumber, initialBalance) { }
// تجاوز طريقة السحب مع تطبيق رسوم المعاملة (Withdraw)
public override void Withdraw(double amount)
{
const double fee = 1.0; // رسوم السحب الثابتة ($1)
// التحقق من كفاية الرصيد بعد إضافة الرسوم
if (amount + fee > Balance)
{
Console.WriteLine("الرصيد غير كافٍ.");
}
else
{
base.Withdraw(amount + fee); // خصم المبلغ بالإضافة إلى الرسوم
Console.WriteLine($"تم تطبيق رسوم السحب: {fee}");
}
}
}
// الفئة الرئيسية لنظام الصراف الآلي (ATM System Class)
class ATM
{
// قائمة لتخزين الحسابات
static List<Account> accounts = new List<Account>();
// مسار ملف تخزين الحسابات
const string filePath = "accounts.txt";
// الوظيفة الرئيسية (Main)
static void Main(string[] args)
{
LoadAccounts(); // تحميل الحسابات من الملف إذا كانت متوفرة
bool exit = false; // متغير لإنهاء البرنامج
while (!exit)
{
// عرض قائمة الخيارات للمستخدم
Console.WriteLine("\n=== نظام الصراف الآلي ===");
Console.WriteLine("1. إنشاء حساب جديد");
Console.WriteLine("2. إيداع الأموال");
Console.WriteLine("3. سحب الأموال");
Console.WriteLine("4. عرض الرصيد");
Console.WriteLine("5. إنهاء البرنامج");
Console.Write("اختر خياراً: ");
int choice = int.Parse(Console.ReadLine());
// تنفيذ الخيار المختار
switch (choice)
{
case 1:
CreateAccount(); // إنشاء حساب جديد
break;
case 2:
PerformTransaction("deposit"); // تنفيذ عملية إيداع
break;
case 3:
PerformTransaction("withdraw"); // تنفيذ عملية سحب
break;
case 4:
DisplayAccountBalance(); // عرض الرصيد
break;
case 5:
exit = true; // إنهاء البرنامج
SaveAccounts(); // حفظ الحسابات إلى الملف
Console.WriteLine("شكراً لاستخدام نظام الصراف الآلي. وداعاً!");
break;
default:
Console.WriteLine("خيار غير صالح. حاول مرة أخرى.");
break;
}
}
}
// إنشاء حساب جديد (Create a new account)
static void CreateAccount()
{
Console.Write("أدخل رقم الحساب: ");
int accountNumber = int.Parse(Console.ReadLine());
Console.Write("أدخل الرصيد الابتدائي: ");
double initialBalance = double.Parse(Console.ReadLine());
Console.WriteLine("اختر نوع الحساب:");
Console.WriteLine("1. حساب توفير");
Console.WriteLine("2. حساب جاري");
int accountType = int.Parse(Console.ReadLine());
Account account;
if (accountType == 1)
{
account = new SavingAccount(accountNumber, initialBalance); // إنشاء حساب توفير
}
else if (accountType == 2)
{
account = new CheckingAccount(accountNumber, initialBalance); // إنشاء حساب جاري
}
else
{
Console.WriteLine("نوع الحساب غير صالح.");
return;
}
accounts.Add(account); // إضافة الحساب إلى القائمة
Console.WriteLine("تم إنشاء الحساب بنجاح!");
}
// تنفيذ عملية إيداع أو سحب (Perform deposit or withdrawal)
static void PerformTransaction(string transactionType)
{
Console.Write("أدخل رقم الحساب: ");
int accountNumber = int.Parse(Console.ReadLine());
Account account = FindAccount(accountNumber); // البحث عن الحساب
if (account == null)
{
Console.WriteLine("الحساب غير موجود.");
return;
}
Console.Write($"أدخل المبلغ المراد {transactionType}: ");
double amount = double.Parse(Console.ReadLine());
if (transactionType == "deposit")
{
account.Deposit(amount); // تنفيذ الإيداع
}
else if (transactionType == "withdraw")
{
account.Withdraw(amount); // تنفيذ السحب
}
}
// عرض رصيد الحساب (Display account balance)
static void DisplayAccountBalance()
{
Console.Write("أدخل رقم الحساب: ");
int accountNumber = int.Parse(Console.ReadLine());
Account account = FindAccount(accountNumber); // البحث عن الحساب
if (account != null)
{
account.DisplayBalance(); // عرض الرصيد
}
else
{
Console.WriteLine("الحساب غير موجود.");
}
}
// البحث عن الحساب باستخدام رقم الحساب (Find an account by account number)
static Account FindAccount(int accountNumber)
{
foreach (Account account in accounts)
{
if (account.AccountNumber == accountNumber)
{
return account; // إعادة الحساب إذا وُجد
}
}
return null; // إعادة null إذا لم يتم العثور على الحساب
}
// حفظ بيانات الحسابات إلى ملف (Save account data to a file)
static void SaveAccounts()
{
using (StreamWriter writer = new StreamWriter(filePath))
{
foreach (Account account in accounts)
{
string accountType = account is SavingAccount ? "Saving" : "Checking";
writer.WriteLine($"{accountType},{account.AccountNumber},{account.Balance}"); // كتابة بيانات الحساب
}
}
Console.WriteLine("تم حفظ الحسابات بنجاح.");
}
// تحميل بيانات الحسابات من ملف (Load account data from a file)
static void LoadAccounts()
{
if (!File.Exists(filePath)) return; // التحقق من وجود الملف
using (StreamReader reader = new StreamReader(filePath))
{
string line;
while ((line = reader.ReadLine()) != null)
{
string[] data = line.Split(','); // تقسيم البيانات
string accountType = data[0];
int accountNumber = int.Parse(data[1]);
double balance = double.Parse(data[2]);
Account account;
if (accountType == "Saving")
{
account = new SavingAccount(accountNumber, balance); // إنشاء حساب توفير
}
else // حساب جاري
{
account = new CheckingAccount(accountNumber, balance);
}
accounts.Add(account); // إضافة الحساب إلى القائمة
}
}
Console.WriteLine("تم تحميل الحسابات بنجاح.");
}
}
}