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. قائمة المهام
الهدف: تنفيذ قائمة مهام بسيطة باستخدام مصفوفة سلاسل، تدعم عمليات الإضافة والحذف والعرض.
المتطلبات:
- السعة القصوى للمصفوفة هي 10 عناصر
- التحقق من أن القائمة ممتلئة عند الإضافة، والتحقق من صحة الفهرس عند الحذف
- تضمين منطق الإضافة والحذف والعرض في الطرق
▶ مثال
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]}");
}
}
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 لتجميع النتائج، وتغليف وظائف التحليل في طرق.
المتطلبات:
- حساب إجمالي عدد الكلمات وإجمالي عدد الأحرف
- ابحث عن أطول كلمة
- استخدم 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 بالمدخلات التي تحتوي على سلاسل فارغة. وإضافة هذا الخيار تؤدي تلقائيًا إلى إزالة العناصر الفارغة الناتجة عن الفواصل المتتالية.
📖 ملخص
- يحقق ترتيب الفقاعات الترتيب التصاعدي من خلال الحلقات المتداخلة وعمليات التبديل في كل دورة؛ ويقلل تحسين الخروج المبكر من عمليات المسح غير الضرورية
- يتيح تمرير المصفوفات كمعلمات للطرق إمكانية تصفحها وإجراء العمليات الحسابية داخل الطرق، مما يحافظ على وضوح المنطق الرئيسي
- تتطلب قائمة المهام القائمة على المصفوفات إدارة يدوية لعدد العناصر وترتيبها، مما يوضح طبيعة المصفوفات ذات الحجم الثابت
- يُعد StringBuilder مناسبًا لعمليات ربط السلاسل المتكررة؛ كما أن تقسيم العمليات إلى طرق يُسهّل صيانة منطق تحليل النص وإعادة استخدامه
📝 تمارين
- قم بتعديل خوارزمية الفرز بالفقاعات بحيث يتم الفرز بترتيب تنازلي، مع عرض النتائج المرحلية بعد كل جولة
- أضف دالة إلى إحصائيات درجات الطلاب تعرض قائمة بالمؤشرات الخاصة بجميع الدرجات غير الناجحة (أقل من 60)
- إضافة ميزة «وضع علامة "مكتمل"» إلى قائمة المهام؛ وينبغي أن تظهر العناصر المكتملة مسبوقة بالرمز
[✓] - إضافة ميزة حساب تكرار الكلمات إلى محلل النص، بحيث يُظهر عدد مرات ظهور كل كلمة