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("تم تحميل الحسابات بنجاح.");}}}