C#: تمرين: المصفوفات والطرق مجتمعة

1. الفرز الفقاعي

الهدف: تنفيذ خوارزمية الفرز الفقاعي لفرز مصفوفة من الأعداد الصحيحة بترتيب تصاعدي، مع عرض النتائج قبل الفرز وبعده.

المتطلبات:

▶ مثال

CSHARP
int[] numbers = { 64, 34, 25, 12, 22, 11, 90, 5 };

Console.WriteLine("Before sorting: " + string.Join(", ", numbers));

int swapCount = 0;

for (int i = 0; i < numbers.Length - 1; i++)
{
    bool swapped = false;
    for (int j = 0; j < numbers.Length - 1 - i; j++)
    {
        if (numbers[j] > numbers[j + 1])
        {
            (numbers[j], numbers[j + 1]) = (numbers[j + 1], numbers[j]);
            swapped = true;
            swapCount++;
        }
    }
    if (!swapped) break;
}

Console.WriteLine("After sorting: " + string.Join(", ", numbers));
Console.WriteLine($"Swap count: {swapCount}");
▶ جرّب الكود
TEXT 📖 للعرض فقط
Before sorting: 64, 34, 25, 12, 22, 11, 90, 5
After sorting: 5, 11, 12, 22, 25, 34, 64, 90
Swap count: 20

2. إحصائيات درجات الطلاب

الهدف: استخدام مصفوفة لتخزين درجات الطلاب، وحساب المتوسط، وأعلى درجة، وأدنى درجة، وعدد الطلاب الذين تجاوزوا المتوسط، وذلك باستخدام الطرق.

المتطلبات:

▶ مثال

CSHARP
int[] scores = { 85, 92, 78, 60, 95, 88, 72, 66, 91, 83 };

double average = CalcAverage(scores);
int max = CalcMax(scores);
int min = CalcMin(scores);
int aboveAvg = CountAbove(scores, average);

Console.WriteLine($"Score list: {string.Join(", ", scores)}");
Console.WriteLine($"Average: {average:F1}");
Console.WriteLine($"Highest: {max}");
Console.WriteLine($"Lowest: {min}");
Console.WriteLine($"Above average count: {aboveAvg}");

double CalcAverage(int[] arr)
{
    double sum = 0;
    foreach (int s in arr) sum += s;
    return sum / arr.Length;
}

int CalcMax(int[] arr)
{
    int max = arr[0];
    foreach (int s in arr) if (s > max) max = s;
    return max;
}

int CalcMin(int[] arr)
{
    int min = arr[0];
    foreach (int s in arr) if (s < min) min = s;
    return min;
}

int CountAbove(int[] arr, double threshold)
{
    int count = 0;
    foreach (int s in arr) if (s > threshold) count++;
    return count;
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Score list: 85, 92, 78, 60, 95, 88, 72, 66, 91, 83
Average: 81.0
Highest: 95
Lowest: 60
Above average count: 5

3. قائمة المهام

الهدف: تنفيذ قائمة مهام بسيطة باستخدام مصفوفة سلاسل، تدعم عمليات الإضافة والحذف والعرض.

المتطلبات:

▶ مثال

CSHARP 📖 للعرض فقط
string[] todos = new string[10];
int count = 0;

AddItem("Learn C# arrays");
AddItem("Complete exercises");
AddItem("Review methods and parameters");
ListAll();
RemoveItem(1);
ListAll();

void AddItem(string item)
{
    if (count >= todos.Length)
    {
        Console.WriteLine("⚠️ To-do list is full, cannot add.");
        return;
    }
    todos[count] = item;
    count++;
    Console.WriteLine($"Added: {item}");
}

void RemoveItem(int index)
{
    if (index < 0 || index >= count)
    {
        Console.WriteLine("⚠️ Invalid index, removal failed.");
        return;
    }
    string removed = todos[index];
    for (int i = index; i < count - 1; i++)
    {
        todos[i] = todos[i + 1];
    }
    todos[count - 1] = null;
    count--;
    Console.WriteLine($"Removed: {removed}");
}

void ListAll()
{
    Console.WriteLine("--- To-Do List ---");
    if (count == 0)
    {
        Console.WriteLine("(empty)");
        return;
    }
    for (int i = 0; i < count; i++)
    {
        Console.WriteLine($"{i}. {todos[i]}");
    }
}
48 سطر من الكود المنطقي (تجاوز الحد 40, للعرض فقط)
TEXT 📖 للعرض فقط
Added: Learn C# arrays
Added: Complete exercises
Added: Review methods and parameters
--- To-Do List ---
0. Learn C# arrays
1. Complete exercises
2. Review methods and parameters
Removed: Complete exercises
--- To-Do List ---
0. Learn C# arrays
1. Review methods and parameters

4. محلل النصوص البسيط

الهدف: إجراء تحليل لتكرار الكلمات في النص المدخل، واستخدام StringBuilder لتجميع النتائج، وتغليف وظائف التحليل في طرق.

المتطلبات:

▶ مثال

CSHARP
string text = "CSharp is a powerful programming language and programming is fun";

int wordCount = CountWords(text);
int charCount = CountChars(text);
string longest = FindLongestWord(text);

var report = BuildReport(text, wordCount, charCount, longest);
Console.WriteLine(report);

int CountWords(string input)
{
    if (string.IsNullOrWhiteSpace(input)) return 0;
    string[] words = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
    return words.Length;
}

int CountChars(string input)
{
    return input.Length;
}

string FindLongestWord(string input)
{
    if (string.IsNullOrWhiteSpace(input)) return "";
    string[] words = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
    string longest = words[0];
    foreach (string w in words)
    {
        if (w.Length > longest.Length) longest = w;
    }
    return longest;
}

StringBuilder BuildReport(string input, int words, int chars, string longestWord)
{
    var sb = new StringBuilder();
    sb.AppendLine("===== Text Analysis Report =====");
    sb.AppendLine($"Original: {input}");
    sb.AppendLine($"Word count: {words}");
    sb.AppendLine($"Character count: {chars}");
    sb.AppendLine($"Longest word: {longestWord} ({longestWord.Length} chars)");
    sb.Append("===== Analysis Complete =====");
    return sb;
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
===== Text Analysis Report =====
Original: CSharp is a powerful programming language and programming is fun
Word count: 10
Character count: 60
Longest word: programming (11 chars)
===== Analysis Complete =====

❓ أسئلة شائعة

س ما دور if (!swapped) break في خوارزمية الفرز الفقاعي؟
ج إذا لم تحدث أي عمليات تبديل خلال إحدى المرات، فهذا يعني أن المصفوفة قد تم فرزها بالفعل. ويؤدي الإنهاء المبكر إلى توفير الوقت من خلال تجنب التكرارات غير الضرورية.
س لماذا نحتاج إلى إزاحة المصفوفة إلى الأمام بعد حذف عنصر من قائمة المهام؟
ج يتم تخزين المصفوفات بشكل متجاور. بعد حذف عنصر من المنتصف، يجب إزاحة العناصر التالية إلى الأمام لملء الفراغ، وإلا ستظهر فراغات فارغة.
س ما الفرق بين StringBuilder وتسلسل السلاسل باستخدام +؟
ج يعيد StringBuilder استخدام نفس المخزن المؤقت في الذاكرة، مما يتجنب إنشاء كائن سلسلة جديد عند كل عملية تسلسل. ويقدم أداءً أفضل عند إجراء عدد كبير من عمليات التسلسل.
س ما وظيفة StringSplitOptions.RemoveEmptyEntries؟
ج بشكل افتراضي، تحتفظ أداة Split بالمدخلات التي تحتوي على سلاسل فارغة. وإضافة هذا الخيار تؤدي تلقائيًا إلى إزالة العناصر الفارغة الناتجة عن الفواصل المتتالية.

📖 ملخص

📝 تمارين

  1. قم بتعديل خوارزمية الفرز بالفقاعات بحيث يتم الفرز بترتيب تنازلي، مع عرض النتائج المرحلية بعد كل جولة
  2. أضف دالة إلى إحصائيات درجات الطلاب تعرض قائمة بالمؤشرات الخاصة بجميع الدرجات غير الناجحة (أقل من 60)
  3. إضافة ميزة «وضع علامة "مكتمل"» إلى قائمة المهام؛ وينبغي أن تظهر العناصر المكتملة مسبوقة بالرمز [✓]
  4. إضافة ميزة حساب تكرار الكلمات إلى محلل النص، بحيث يُظهر عدد مرات ظهور كل كلمة
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%