۴

متدها و آرایه‌ها 🛠️📋

ابزارهای خفن برای دسته‌بندی کد و مدیریت لیست‌ها!

🛠️ متدها (Methods): ابزار قدرتمند برای سازماندهی کد

متد چیست؟

متد یا Method، مثل یک دستور العمل آشپزی است! تصور کن می‌خواهی کیک درست کنی. به جای اینکه هر بار تمام مراحل را از ابتدا بنویسی، یک دستور العمل آماده داری که فقط نامش را صدا می‌زنی و کیک آماده می‌شود.

در برنامه‌نویسی هم همینطور است. متد یک تیکه کد بسته‌بندی شده است که:

  • یک نام مشخص دارد
  • ممکن است ورودی (پارامتر) بگیرد
  • کاری انجام می‌دهد
  • ممکن است نتیجه‌ای برگرداند

ساختار کلی یک متد

ساختار متد
// ساختار کلی:
// [دسترسی] [static] [نوع برگشتی] [نام متد]([پارامترها])
// {
//     [بدنه متد]
//     [return مقدار;] // اختیاری
// }

static void SayHello()  // متد بدون پارامتر و بدون برگشت
{
    Console.WriteLine("سلام دنیا!");
}

static int AddNumbers(int a, int b)  // متد با پارامتر و با برگشت
{
    int result = a + b;
    return result;
}

مثال ساده: متد سلام کردن

متد ساده
using System;

class Program
{
    // تعریف یک متد ساده برای سلام کردن
    static void Greet(string name)
    {
        Console.WriteLine("سلام " + name + "! خوش آمدی!");
        Console.WriteLine("امیدوارم روز خوبی داشته باشی.");
    }
    
    static void Main()
    {
        // فراخوانی متد با نام‌های مختلف
        Greet("علی");     // خروجی: سلام علی! خوش آمدی!
        Greet("مریم");    // خروجی: سلام مریم! خوش آمدی!
        Greet("حسین");   // خروجی: سلام حسین! خوش آمدی!
        
        Console.ReadKey();
    }
}

تحلیل کد: در این مثال، متد Greet یک پارامتر از نوع string می‌گیرد و دو خط پیام چاپ می‌کند. به جای تکرار این دو خط برای هر نام، فقط متد را صدا می‌زنیم.

متدهای برگشت‌دهنده (Return Methods)

متد با return
using System;

class Program
{
    // متد جمع دو عدد
    static int Add(int num1, int num2)
    {
        int result = num1 + num2;
        return result;  // نتیجه را برمی‌گرداند
    }
    
    // متد محاسبه مساحت مستطیل
    static double CalculateRectangleArea(double width, double height)
    {
        return width * height;
    }
    
    // متد بررسی زوج یا فرد بودن
    static bool IsEven(int number)
    {
        return number % 2 == 0;
    }
    
    static void Main()
    {
        // استفاده از متدهای مختلف
        int sum = Add(15, 25);
        Console.WriteLine($"جمع: {sum}");  // خروجی: جمع: 40
        
        double area = CalculateRectangleArea(5.5, 3.2);
        Console.WriteLine($"مساحت: {area}");  // خروجی: مساحت: 17.6
        
        bool evenCheck = IsEven(8);
        Console.WriteLine($"آیا 8 زوج است؟ {evenCheck}");  // خروجی: True
        
        Console.ReadKey();
    }
}

مثال پیشرفته: سیستم امتیازدهی بازی

سیستم امتیازدهی
using System;

class Program
{
    // متد محاسبه امتیاز بر اساس سطح و زمان
    static int CalculateScore(int level, int timeSeconds, bool bonusCollected)
    {
        int baseScore = level * 100;
        int timeBonus = Math.Max(0, 60 - timeSeconds) * 10;  // هر ثانیه سریع‌تر = 10 امتیاز
        int bonusPoints = bonusCollected ? 500 : 0;
        
        return baseScore + timeBonus + bonusPoints;
    }
    
    // متد تعیین رتبه بازیکن
    static string GetPlayerRank(int score)
    {
        if (score >= 1000) return "🏆 استاد";
        else if (score >= 700) return "🥇 حرفه‌ای";
        else if (score >= 400) return "🥈 متوسط";
        else return "🥉 مبتدی";
    }
    
    // متد نمایش نتایج
    static void DisplayResults(string playerName, int score, string rank)
    {
        Console.WriteLine("=== نتایج بازی ===");
        Console.WriteLine($"بازیکن: {playerName}");
        Console.WriteLine($"امتیاز: {score}");
        Console.WriteLine($"رتبه: {rank}");
        Console.WriteLine("==================");
    }
    
    static void Main()
    {
        // شبیه‌سازی یک بازی
        string player = "علی";
        int level = 5;
        int time = 45;  // ثانیه
        bool hasBonus = true;
        
        // محاسبه امتیاز
        int finalScore = CalculateScore(level, time, hasBonus);
        
        // تعیین رتبه
        string playerRank = GetPlayerRank(finalScore);
        
        // نمایش نتایج
        DisplayResults(player, finalScore, playerRank);
        
        Console.ReadKey();
    }
}

نکات مهم درباره متدها:

  • static: یعنی متد به کلاس تعلق دارد، نه به شیء خاصی
  • void: یعنی متد چیزی برنمی‌گرداند
  • return: مقداری را به فراخوان‌کننده برمی‌گرداند
  • پارامتر: ورودی‌هایی که متد دریافت می‌کند
  • نام متدها باید با حرف بزرگ شروع شوند (PascalCase)

📋 آرایه‌ها (Arrays): مدیریت لیست‌های قدرتمند

آرایه چیست؟

آرایه مثل یک قفسه کتاب است! تصور کن یک قفسه کتاب داری که روی هر طبقه‌اش یک کتاب قرار می‌گیرد. هر طبقه یک شماره دارد (از 0 شروع می‌شود) و تو می‌توانی با گفتن شماره طبقه، کتاب آن طبقه را بگیری.

در برنامه‌نویسی، آرایه یک متغیر خاص است که:

  • چندین مقدار هم‌نوع را در خود نگه می‌دارد
  • هر عنصر یک شماره (ایندکس) دارد که از 0 شروع می‌شود
  • اندازه آن معمولاً ثابت است
  • دسترسی سریع به عناصر با استفاده از ایندکس

روش‌های تعریف آرایه

تعریف آرایه
using System;

class Program
{
    static void Main()
    {
        // روش 1: تعریف با مقادیر اولیه
        string[] fruits = {"سیب", "موز", "پرتقال"};
        
        // روش 2: تعریف با اندازه مشخص
        int[] numbers = new int[5];  // آرایه 5 عنصری از اعداد
        
        // روش 3: تعریف و مقداردهی همزمان
        double[] prices = new double[] {12.5, 8.3, 15.7, 22.1};
        
        // روش 4: استفاده از var (خودکار تشخیص نوع)
        var colors = new string[] {"قرمز", "آبی", "سبز"};
        
        Console.WriteLine($"تعداد میوه‌ها: {fruits.Length}");
        Console.WriteLine($"تعداد اعداد: {numbers.Length}");
        Console.WriteLine($"تعداد قیمت‌ها: {prices.Length}");
        Console.WriteLine($"تعداد رنگ‌ها: {colors.Length}");
    }
}

دسترسی و تغییر عناصر آرایه

کار با عناصر آرایه
using System;

class Program
{
    static void Main()
    {
        // ساخت آرایه نمرات
        int[] scores = {85, 92, 78, 95, 88};
        
        // دسترسی به عناصر (ایندکس از 0 شروع می‌شود)
        Console.WriteLine($"اولین نمره: {scores[0]}");     // خروجی: 85
        Console.WriteLine($"دومین نمره: {scores[1]}");     // خروجی: 92
        Console.WriteLine($"آخرین نمره: {scores[4]}");     // خروجی: 88
        
        // تغییر مقدار یک عنصر
        scores[2] = 80;  // نمره سوم را از 78 به 80 تغییر دادیم
        Console.WriteLine($"نمره سوم جدید: {scores[2]}");  // خروجی: 80
        
        // دسترسی به آخرین عنصر با استفاده از Length
        int lastIndex = scores.Length - 1;
        Console.WriteLine($"آخرین نمره: {scores[lastIndex]}");
        
        Console.ReadKey();
    }
}

هشدار: اگر سعی کنی به ایندکسی دسترسی پیدا کنی که وجود ندارد (مثل scores[10] در آرایه 5 عنصری)، برنامه خطا می‌دهد!

حلقه زدن روی آرایه

پیمایش آرایه
using System;

class Program
{
    static void Main()
    {
        string[] students = {"علی", "مریم", "حسن", "فاطمه", "رضا"};
        
        // روش 1: استفاده از حلقه for
        Console.WriteLine("=== لیست دانش‌آموزان (for) ===");
        for (int i = 0; i < students.Length; i++)
        {
            Console.WriteLine($"{i + 1}. {students[i]}");
        }
        
        Console.WriteLine();
        
        // روش 2: استفاده از حلقه foreach (راحت‌تر)
        Console.WriteLine("=== لیست دانش‌آموزان (foreach) ===");
        int counter = 1;
        foreach (string student in students)
        {
            Console.WriteLine($"{counter}. {student}");
            counter++;
        }
        
        Console.ReadKey();
    }
}

عملیات مفید روی آرایه‌ها

عملیات آرایه
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = {45, 23, 67, 12, 89, 34, 56};
        
        // پیدا کردن بزرگ‌ترین و کوچک‌ترین
        int max = numbers.Max();
        int min = numbers.Min();
        Console.WriteLine($"بزرگ‌ترین: {max}, کوچک‌ترین: {min}");
        
        // محاسبه میانگین
        double average = numbers.Average();
        Console.WriteLine($"میانگین: {average:F1}");
        
        // مرتب کردن آرایه
        Array.Sort(numbers);
        Console.WriteLine("آرایه مرتب شده: " + string.Join(", ", numbers));
        
        // جستجو در آرایه
        int searchValue = 67;
        int index = Array.IndexOf(numbers, searchValue);
        if (index >= 0)
        {
            Console.WriteLine($"عدد {searchValue} در ایندکس {index} پیدا شد.");
        }
        else
        {
            Console.WriteLine($"عدد {searchValue} پیدا نشد.");
        }
        
        // تغییر اندازه آرایه
        Array.Resize(ref numbers, numbers.Length + 2);
        numbers[numbers.Length - 2] = 100;
        numbers[numbers.Length - 1] = 200;
        Console.WriteLine("آرایه بعد از اضافه کردن: " + string.Join(", ", numbers));
        
        Console.ReadKey();
    }
}

مثال کاربردی: سیستم مدیریت نمرات کلاس

مدیریت نمرات
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        // آرایه نام دانش‌آموزان
        string[] studentNames = {"علی احمدی", "مریم رضایی", "حسن محمدی", "فاطمه کریمی", "رضا نوری"};
        
        // آرایه نمرات (هر دانش‌آموز 4 نمره دارد)
        double[,] grades = {
            {18.5, 17.0, 19.0, 16.5},  // نمرات علی
            {20.0, 18.5, 19.5, 17.5},  // نمرات مریم
            {15.0, 16.0, 14.5, 15.5},  // نمرات حسن
            {19.0, 18.0, 20.0, 19.5},  // نمرات فاطمه
            {17.5, 16.5, 18.0, 17.0}   // نمرات رضا
        };
        
        Console.WriteLine("=== گزارش نمرات کلاس ===");
        Console.WriteLine();
        
        // محاسبه و نمایش میانگین هر دانش‌آموز
        for (int i = 0; i < studentNames.Length; i++)
        {
            double sum = 0;
            for (int j = 0; j < 4; j++)
            {
                sum += grades[i, j];
            }
            double average = sum / 4;
            
            string status = average >= 17 ? "قبول" : "مردود";
            Console.WriteLine($"{studentNames[i]}: میانگین {average:F1} - {status}");
        }
        
        Console.WriteLine();
        
        // محاسبه میانگین کل کلاس
        double totalSum = 0;
        int totalGrades = studentNames.Length * 4;
        
        for (int i = 0; i < studentNames.Length; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                totalSum += grades[i, j];
            }
        }
        
        double classAverage = totalSum / totalGrades;
        Console.WriteLine($"میانگین کل کلاس: {classAverage:F1}");
        
        Console.ReadKey();
    }
}

نکات مهم درباره آرایه‌ها:

  • ایندکس: همیشه از 0 شروع می‌شود، نه از 1
  • Length: تعداد عناصر آرایه را نشان می‌دهد
  • نوع یکسان: همه عناصر آرایه باید از یک نوع باشند
  • اندازه ثابت: معمولاً بعد از تعریف، اندازه آرایه تغییر نمی‌کند
  • دسترسی سریع: با ایندکس می‌توان خیلی سریع به عناصر دسترسی پیدا کرد

🎯 تمرین‌های عملی: متدها و آرایه‌ها

حالا وقت آن رسیده که آنچه یاد گرفته‌ای را به کار بگیری! این تمرین‌ها به تو کمک می‌کنند تا مفاهیم متدها و آرایه‌ها را عمیق‌تر درک کنی.

تمرین ۱: ماشین حساب آرایه‌ای

یک کلاس ماشین حساب بساز که بتواند عملیات مختلف ریاضی را روی آرایه‌ای از اعداد انجام دهد.

متدهای مورد نیاز:

  • CalculateSum(int[] numbers) - محاسبه مجموع
  • CalculateAverage(int[] numbers) - محاسبه میانگین
  • FindMax(int[] numbers) - پیدا کردن بزرگ‌ترین
  • FindMin(int[] numbers) - پیدا کردن کوچک‌ترین
  • CountEvenNumbers(int[] numbers) - شمارش اعداد زوج
کد شروع تمرین ۱
using System;

class ArrayCalculator
{
    // متد محاسبه مجموع
    public static int CalculateSum(int[] numbers)
    {
        // کد خودت را اینجا بنویس
    }
    
    // متد محاسبه میانگین
    public static double CalculateAverage(int[] numbers)
    {
        // کد خودت را اینجا بنویس
    }
    
    // متد پیدا کردن بزرگ‌ترین
    public static int FindMax(int[] numbers)
    {
        // کد خودت را اینجا بنویس
    }
    
    // متد پیدا کردن کوچک‌ترین
    public static int FindMin(int[] numbers)
    {
        // کد خودت را اینجا بنویس
    }
    
    // متد شمارش اعداد زوج
    public static int CountEvenNumbers(int[] numbers)
    {
        // کد خودت را اینجا بنویس
    }
}

class Program
{
    static void Main()
    {
        int[] testNumbers = {12, 7, 23, 45, 8, 19, 34, 2, 56, 11};
        
        // تست متدهای خودت
        Console.WriteLine($"مجموع: {ArrayCalculator.CalculateSum(testNumbers)}");
        Console.WriteLine($"میانگین: {ArrayCalculator.CalculateAverage(testNumbers):F1}");
        Console.WriteLine($"بزرگ‌ترین: {ArrayCalculator.FindMax(testNumbers)}");
        Console.WriteLine($"کوچک‌ترین: {ArrayCalculator.FindMin(testNumbers)}");
        Console.WriteLine($"تعداد اعداد زوج: {ArrayCalculator.CountEvenNumbers(testNumbers)}");
        
        Console.ReadKey();
    }
}
پاسخ تمرین ۱
using System;

class ArrayCalculator
{
    // متد محاسبه مجموع
    public static int CalculateSum(int[] numbers)
    {
        if (numbers.Length == 0) return 0;
        
        int sum = 0;
        foreach (int number in numbers)
        {
            sum += number;
        }
        return sum;
    }
    
    // متد محاسبه میانگین
    public static double CalculateAverage(int[] numbers)
    {
        if (numbers.Length == 0) return 0;
        
        int sum = CalculateSum(numbers);
        return (double)sum / numbers.Length;
    }
    
    // متد پیدا کردن بزرگ‌ترین
    public static int FindMax(int[] numbers)
    {
        if (numbers.Length == 0) 
            throw new ArgumentException("آرایه نمی‌تواند خالی باشد");
        
        int max = numbers[0];
        for (int i = 1; i < numbers.Length; i++)
        {
            if (numbers[i] > max)
                max = numbers[i];
        }
        return max;
    }
    
    // متد پیدا کردن کوچک‌ترین
    public static int FindMin(int[] numbers)
    {
        if (numbers.Length == 0) 
            throw new ArgumentException("آرایه نمی‌تواند خالی باشد");
        
        int min = numbers[0];
        for (int i = 1; i < numbers.Length; i++)
        {
            if (numbers[i] < min)
                min = numbers[i];
        }
        return min;
    }
    
    // متد شمارش اعداد زوج
    public static int CountEvenNumbers(int[] numbers)
    {
        int count = 0;
        foreach (int number in numbers)
        {
            if (number % 2 == 0)
                count++;
        }
        return count;
    }
}

class Program
{
    static void Main()
    {
        int[] testNumbers = {12, 7, 23, 45, 8, 19, 34, 2, 56, 11};
        
        Console.WriteLine("=== نتایج محاسبات آرایه ===");
        Console.WriteLine($"آرایه: [{string.Join(", ", testNumbers)}]");
        Console.WriteLine();
        
        Console.WriteLine($"مجموع: {ArrayCalculator.CalculateSum(testNumbers)}");
        Console.WriteLine($"میانگین: {ArrayCalculator.CalculateAverage(testNumbers):F1}");
        Console.WriteLine($"بزرگ‌ترین: {ArrayCalculator.FindMax(testNumbers)}");
        Console.WriteLine($"کوچک‌ترین: {ArrayCalculator.FindMin(testNumbers)}");
        Console.WriteLine($"تعداد اعداد زوج: {ArrayCalculator.CountEvenNumbers(testNumbers)}");
        
        Console.ReadKey();
    }
}

تمرین ۲: مدیریت فهرست خرید

یک سیستم مدیریت فهرست خرید بساز که بتواند اقلام را اضافه کند، حذف کند و جستجو کند.

متدهای مورد نیاز:

  • AddItem(string[] list, string item) - اضافه کردن قلم
  • RemoveItem(string[] list, string item) - حذف قلم
  • SearchItem(string[] list, string item) - جستجوی قلم
  • DisplayList(string[] list) - نمایش فهرست
  • CountItems(string[] list) - شمارش اقلام
کد شروع تمرین ۲
using System;
using System.Linq;

class ShoppingListManager
{
    // اضافه کردن قلم جدید
    public static string[] AddItem(string[] list, string item)
    {
        // کد خودت را اینجا بنویس
        // راهنمایی: از Array.Resize استفاده کن
    }
    
    // حذف قلم
    public static string[] RemoveItem(string[] list, string item)
    {
        // کد خودت را اینجا بنویس
        // راهنمایی: آرایه جدید بساز بدون قلم مورد نظر
    }
    
    // جستجوی قلم
    public static bool SearchItem(string[] list, string item)
    {
        // کد خودت را اینجا بنویس
    }
    
    // نمایش فهرست
    public static void DisplayList(string[] list)
    {
        // کد خودت را اینجا بنویس
    }
    
    // شمارش اقلام غیر خالی
    public static int CountItems(string[] list)
    {
        // کد خودت را اینجا بنویس
    }
}

class Program
{
    static void Main()
    {
        string[] shoppingList = {"نان", "شیر", "تخم مرغ"};
        
        Console.WriteLine("فهرست اولیه:");
        ShoppingListManager.DisplayList(shoppingList);
        
        // تست متدهای خودت
        Console.ReadKey();
    }
}
پاسخ تمرین ۲
using System;
using System.Linq;

class ShoppingListManager
{
    // اضافه کردن قلم جدید
    public static string[] AddItem(string[] list, string item)
    {
        // بررسی اینکه قلم از قبل وجود دارد یا نه
        if (SearchItem(list, item))
        {
            Console.WriteLine($"'{item}' از قبل در فهرست موجود است.");
            return list;
        }
        
        // اضافه کردن قلم جدید
        Array.Resize(ref list, list.Length + 1);
        list[list.Length - 1] = item;
        Console.WriteLine($"'{item}' به فهرست اضافه شد.");
        return list;
    }
    
    // حذف قلم
    public static string[] RemoveItem(string[] list, string item)
    {
        if (!SearchItem(list, item))
        {
            Console.WriteLine($"'{item}' در فهرست پیدا نشد.");
            return list;
        }
        
        // ساخت آرایه جدید بدون قلم مورد نظر
        string[] newList = new string[list.Length - 1];
        int newIndex = 0;
        
        for (int i = 0; i < list.Length; i++)
        {
            if (list[i] != item)
            {
                newList[newIndex] = list[i];
                newIndex++;
            }
        }
        
        Console.WriteLine($"'{item}' از فهرست حذف شد.");
        return newList;
    }
    
    // جستجوی قلم
    public static bool SearchItem(string[] list, string item)
    {
        foreach (string listItem in list)
        {
            if (listItem.Equals(item, StringComparison.OrdinalIgnoreCase))
                return true;
        }
        return false;
    }
    
    // نمایش فهرست
    public static void DisplayList(string[] list)
    {
        if (list.Length == 0)
        {
            Console.WriteLine("فهرست خرید خالی است.");
            return;
        }
        
        Console.WriteLine("=== فهرست خرید ===");
        for (int i = 0; i < list.Length; i++)
        {
            Console.WriteLine($"{i + 1}. {list[i]}");
        }
        Console.WriteLine($"تعداد کل اقلام: {list.Length}");
        Console.WriteLine();
    }
    
    // شمارش اقلام غیر خالی
    public static int CountItems(string[] list)
    {
        int count = 0;
        foreach (string item in list)
        {
            if (!string.IsNullOrEmpty(item))
                count++;
        }
        return count;
    }
}

class Program
{
    static void Main()
    {
        string[] shoppingList = {"نان", "شیر", "تخم مرغ"};
        
        Console.WriteLine("فهرست اولیه:");
        ShoppingListManager.DisplayList(shoppingList);
        
        // اضافه کردن قلم جدید
        shoppingList = ShoppingListManager.AddItem(shoppingList, "پنیر");
        shoppingList = ShoppingListManager.AddItem(shoppingList, "گوجه فرنگی");
        ShoppingListManager.DisplayList(shoppingList);
        
        // جستجو
        Console.WriteLine($"آیا 'شیر' در فهرست هست? {ShoppingListManager.SearchItem(shoppingList, "شیر")}");
        Console.WriteLine($"آیا 'گوشت' در فهرست هست? {ShoppingListManager.SearchItem(shoppingList, "گوشت")}");
        Console.WriteLine();
        
        // حذف قلم
        shoppingList = ShoppingListManager.RemoveItem(shoppingList, "تخم مرغ");
        ShoppingListManager.DisplayList(shoppingList);
        
        Console.ReadKey();
    }
}

تمرین ۳: سیستم مدیریت دانش‌آموزان

یک سیستم کامل برای مدیریت اطلاعات دانش‌آموزان و نمرات آن‌ها بساز.

ویژگی‌های سیستم:

  • محاسبه میانگین نمرات هر دانش‌آموز
  • تعیین وضعیت قبولی (بالای 12 قبول)
  • پیدا کردن بهترین و ضعیف‌ترین دانش‌آموز
  • محاسبه میانگین کل کلاس
  • شمارش دانش‌آموزان قبول و مردود
کد شروع تمرین ۳
using System;

class StudentManager
{
    // محاسبه میانگین نمرات یک دانش‌آموز
    public static double CalculateStudentAverage(double[] grades)
    {
        // کد خودت را اینجا بنویس
    }
    
    // تعیین وضعیت قبولی
    public static string GetPassStatus(double average)
    {
        // کد خودت را اینجا بنویس (بالای 12 قبول)
    }
    
    // پیدا کردن بهترین دانش‌آموز
    public static int FindTopStudent(string[] names, double[,] allGrades)
    {
        // کد خودت را اینجا بنویس
        // باید ایندکس دانش‌آموز با بالاترین میانگین را برگردانی
    }
    
    // محاسبه میانگین کل کلاس
    public static double CalculateClassAverage(double[,] allGrades)
    {
        // کد خودت را اینجا بنویس
    }
    
    // شمارش دانش‌آموزان قبول
    public static int CountPassedStudents(double[,] allGrades)
    {
        // کد خودت را اینجا بنویس
    }
}

class Program
{
    static void Main()
    {
        string[] studentNames = {"علی احمدی", "مریم رضایی", "حسن محمدی", "فاطمه کریمی"};
        double[,] grades = {
            {18.5, 17.0, 19.0, 16.5},  // نمرات علی
            {20.0, 18.5, 19.5, 17.5},  // نمرات مریم  
            {10.0, 11.0, 9.5, 12.5},   // نمرات حسن
            {19.0, 18.0, 20.0, 19.5}   // نمرات فاطمه
        };
        
        // تست متدهای خودت
        Console.ReadKey();
    }
}
پاسخ تمرین ۳
using System;

class StudentManager
{
    // محاسبه میانگین نمرات یک دانش‌آموز
    public static double CalculateStudentAverage(double[] grades)
    {
        if (grades.Length == 0) return 0;
        
        double sum = 0;
        foreach (double grade in grades)
        {
            sum += grade;
        }
        return sum / grades.Length;
    }
    
    // تعیین وضعیت قبولی
    public static string GetPassStatus(double average)
    {
        return average >= 12 ? "قبول" : "مردود";
    }
    
    // پیدا کردن بهترین دانش‌آموز
    public static int FindTopStudent(string[] names, double[,] allGrades)
    {
        int topStudentIndex = 0;
        double highestAverage = 0;
        
        for (int i = 0; i < names.Length; i++)
        {
            // استخراج نمرات دانش‌آموز i
            double[] studentGrades = new double[allGrades.GetLength(1)];
            for (int j = 0; j < allGrades.GetLength(1); j++)
            {
                studentGrades[j] = allGrades[i, j];
            }
            
            double average = CalculateStudentAverage(studentGrades);
            if (average > highestAverage)
            {
                highestAverage = average;
                topStudentIndex = i;
            }
        }
        
        return topStudentIndex;
    }
    
    // محاسبه میانگین کل کلاس
    public static double CalculateClassAverage(double[,] allGrades)
    {
        double totalSum = 0;
        int totalGrades = 0;
        
        for (int i = 0; i < allGrades.GetLength(0); i++)
        {
            for (int j = 0; j < allGrades.GetLength(1); j++)
            {
                totalSum += allGrades[i, j];
                totalGrades++;
            }
        }
        
        return totalGrades > 0 ? totalSum / totalGrades : 0;
    }
    
    // شمارش دانش‌آموزان قبول
    public static int CountPassedStudents(double[,] allGrades)
    {
        int passedCount = 0;
        
        for (int i = 0; i < allGrades.GetLength(0); i++)
        {
            // استخراج نمرات دانش‌آموز i
            double[] studentGrades = new double[allGrades.GetLength(1)];
            for (int j = 0; j < allGrades.GetLength(1); j++)
            {
                studentGrades[j] = allGrades[i, j];
            }
            
            double average = CalculateStudentAverage(studentGrades);
            if (average >= 12)
                passedCount++;
        }
        
        return passedCount;
    }
}

class Program
{
    static void Main()
    {
        string[] studentNames = {"علی احمدی", "مریم رضایی", "حسن محمدی", "فاطمه کریمی"};
        double[,] grades = {
            {18.5, 17.0, 19.0, 16.5},  // نمرات علی
            {20.0, 18.5, 19.5, 17.5},  // نمرات مریم  
            {10.0, 11.0, 9.5, 12.5},   // نمرات حسن
            {19.0, 18.0, 20.0, 19.5}   // نمرات فاطمه
        };
        
        Console.WriteLine("=== گزارش کامل کلاس ===");
        Console.WriteLine();
        
        // نمایش اطلاعات هر دانش‌آموز
        for (int i = 0; i < studentNames.Length; i++)
        {
            // استخراج نمرات دانش‌آموز
            double[] studentGrades = new double[grades.GetLength(1)];
            for (int j = 0; j < grades.GetLength(1); j++)
            {
                studentGrades[j] = grades[i, j];
            }
            
            double average = StudentManager.CalculateStudentAverage(studentGrades);
            string status = StudentManager.GetPassStatus(average);
            
            Console.WriteLine($"{studentNames[i]}: میانگین {average:F1} - {status}");
        }
        
        Console.WriteLine();
        
        // آمار کلی
        int topStudentIndex = StudentManager.FindTopStudent(studentNames, grades);
        double classAverage = StudentManager.CalculateClassAverage(grades);
        int passedCount = StudentManager.CountPassedStudents(grades);
        
        Console.WriteLine("=== آمار کلی ===");
        Console.WriteLine($"بهترین دانش‌آموز: {studentNames[topStudentIndex]}");
        Console.WriteLine($"میانگین کل کلاس: {classAverage:F1}");
        Console.WriteLine($"تعداد دانش‌آموزان قبول: {passedCount} از {studentNames.Length}");
        Console.WriteLine($"تعداد دانش‌آموزان مردود: {studentNames.Length - passedCount} از {studentNames.Length}");
        
        Console.ReadKey();
    }
}

💡 نکات مهم برای حل تمرین‌ها:

  • تقسیم مسئله: هر تمرین بزرگ را به قسمت‌های کوچک‌تر تقسیم کن
  • تست مرحله‌ای: هر متد را جداگانه تست کن
  • مدیریت خطا: حالت‌های خاص مثل آرایه خالی را در نظر بگیر
  • کد تمیز: از نام‌های معنادار برای متغیرها استفاده کن
  • کامنت‌گذاری: قسمت‌های پیچیده را توضیح بده