تمرين - إرجاع الصفائف من الأساليب
عند تطوير التطبيقات، ستحتاج غالبا إلى إنشاء مجموعات من البيانات وتعديلها. تعد الأساليب مفيدة لتنفيذ العمليات على البيانات، وهي أدوات قوية بشكل خاص لبناء مجموعات البيانات نفسها. يساعد تطوير أساليب لإنشاء صفائف تمثل مجموعة البيانات الخاصة بك على الحفاظ على التعليمات البرمجية الخاصة بك قابلة لإعادة الاستخدام وتنظيمها وتبسيطها. في هذا التمرين، ستتدرب على إرجاع الصفائف من الأساليب.
البحث عن عملات معدنية لإجراء التغيير
لنفترض أن لديك العديد من العملات المعدنية من قيم مختلفة. يتم تكليفك بالعثور على عملتين معدنيتين يكون مجموعهما مساويا لقيمة الهدف. في هذا التمرين، يتم تمثيل القطع النقدية المتاحة في صفيف عدد صحيح. ستحتاج إلى إرجاع فهارس العملتين في صفيف جديد. لنبدأ!
في محرر Visual Studio Code، احذف أي تعليمة برمجية موجودة من التدريبات السابقة.
أدخل التعليمات البرمجية التالية في محرر التعليمات البرمجية Visual Studio:
int[] TwoCoins(int[] coins, int target) { return new int[0]; }في حالة عدم العثور على عملتين معدنيتين، ترجع الطريقة صفيفا فارغا. خذ لحظة للنظر في بناء جملة النتيجة التي تم إرجاعها. بينما يمكنك إنشاء متغير لتخزين صفيف جديد
int[]وإرجاع المتغير، تسمح لك العبارةreturnبإنشاء القيم وإرجاعها في وقت واحد.هناك العديد من الأساليب لحل هذه المشكلة. خذ لحظة للنظر في كيفية البحث عن رقمين في صفيف يكون مجموعه مساويا لقيمة معينة.
في هذا التمرين، سيتم استخدام النهج التالي:
- اختر رقما واحدا من الصفيف
- تحقق من الأرقام الأخرى واحدا تلو الآخر لمعرفة ما إذا كانت تضيف ما يصل إلى القيمة الهدف
- إرجاع النتيجة بمجرد العثور على تطابق
للتحقق من كل رقم في الصفيف، قم بتحديث
TwoCoinsالأسلوب بالتعليمات البرمجية التالية:int[] TwoCoins(int[] coins, int target) { for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { } } return new int[0]; }هنا،
currيمثل مؤشرnextعملة ثابتة واحدة ويمثل فهارس العملة اللاحقة. ستحاول إضافة كلnextعملة معدنية مع العملة الثابتةcurrلمعرفة ما إذا كانت تساوي القيمة المستهدفة.بعد ذلك، أضف منطقا للتحقق من مجموع عملتين للقيمة المستهدفة. للقيام بذلك، قم بتحديث الحلقات السابقة
forبالتعليمات البرمجية التالية:for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { return new int[]{curr, next}; } } }في هذه التعليمة البرمجية، تتحقق مما إذا كان مجموع القيم في
currالصفيف وفيهnextمساويا للقيمة الهدف. إذا كان المجموع متساويا، يمكنك إنشاء صفيف لتخزين هذه الفهارس وإعادتها. إذا لم تكن متساوية، يمكنك تجاهلها ومتابعة التدقيق.
اختبر الحل الخاص بك
في هذه الخطوة، ستختبر التعليمات البرمجية للتأكد من أنها تعمل بشكل صحيح. أولا ستقوم بتهيئة بعض المتغيرات لتخزين بيانات الإدخال، ثم ستستدعي الأسلوب وتطبع النتائج.
إنشاء سطر تعليمة برمجية
TwoCoinsفارغة جديد أعلى توقيع الأسلوب. ثم أدخل التعليمات البرمجية التالية:int target = 60; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[] result = TwoCoins(coins, target);تذكر أن
TwoCoinsالأسلوب يرجع صفيفا فارغا إذا لم يتم العثور على أي تغيير. ستحتاج إلى التحقق من حجم الصفيف قبل محاولة طباعةresultالصفيف.أدخل سطر تعليمة برمجية فارغا جديدا. ثم أدخل التعليمات البرمجية التالية:
if (result.Length == 0) { Console.WriteLine("No two coins make change"); } else { Console.WriteLine($"Change found at positions {result[0]} and {result[1]}"); }إذا لزم الأمر، افتح لوحة المحطة الطرفية المتكاملة في Visual Studio Code.
في موجه الأوامر Terminal، أدخل dotnet run. قارن الإخراج الخاص بك مع ما يلي:
Change found at positions 2 and 5إذا كانت التعليمات البرمجية تعرض نتائج غير متوقعة، فستحتاج إلى مراجعة التعليمات البرمجية للعثور على الخطأ وإجراء التحديثات. قم بتشغيل التعليمات البرمجية مرة أخرى لمعرفة ما إذا كنت قد أصلحت المشكلة. متابعة تحديث التعليمات البرمجية وتشغيلها حتى تنتج التعليمات البرمجية النتائج المتوقعة.
العثور على أزواج متعددة من العملات التي تجعل التغيير
في هذه الخطوة، ستقوم بتوسيع TwoCoins الأسلوب للعثور على المزيد من أزواج العملات التي يكون مجموعها مساويا للقيمة المستهدفة. لهذا التمرين، ستجد خمسة أزواج كحد أقصى. وهذا يعني أن نوع الإرجاع سيكون صفيفا ثلاثي الأبعاد بدلا من صفيف 1D، وستحتاج إلى تعديل الطريقة التي ترجع بها التعليمات البرمجية النتائج. لنبدأ!
قم بتغيير نوع الإرجاع في توقيع الأسلوب من
int[]إلىint[,]عن طريق تحديث التعليمات البرمجية الخاصة بك إلى ما يلي:int[,] TwoCoins(int[] coins, int target)بعد ذلك، ستقوم بإنشاء
int[,]صفيف لتخزين نتائجك وإرجاعها، ومتغير عداد لتتبع عدد الأزواج المضافة إلى الصفيف.TwoCoinsتحديث الأسلوب بالتعليمات البرمجية التالية:int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0;لاحظ أنك قمت بتهيئة عناصر صفيف النتائج إلى
-1. سيساعدك هذا لاحقا عندما تريد طباعة الأزواج التي تم العثور عليها.بعد ذلك، ستستخدم
resultالصفيف لتخزين كل زوج تم العثور عليه بدلا من إرجاع المطابقة الأولى.TwoCoinsتحديث الأسلوب بالتعليمات البرمجية التالية:int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0; for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { result[count, 0] = curr; result[count, 1] = next; count++; } } }لاحظ أنه
countيتم زيادة في كل مرة تتم فيها إضافة زوج إلى الصفيف. يمكن أن يؤدي هذا إلى حدوث خطأ في الفهرس خارج الحدود إذا كان هناك أكثر من خمسة أزواج تم العثور عليها. لمنع هذا الخطأ، يمكنك إضافة تعليمات برمجية للتحقق منcountقيمة وإرجاع نتيجةresultالصفيف التي تمت تعبئتها.تحديث المنطق في
TwoCoinsالأسلوب مع التعليمات البرمجية التالية:for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { result[count, 0] = curr; result[count, 1] = next; count++; } if (count == result.GetLength(0)) { return result; } }وأخيرا، ستحتاج إلى تحديث عبارة الإرجاع النهائية لإرجاع النتيجة الصحيحة إذا لم يتم العثور على أي تطابقات على الإطلاق، أو إذا تم العثور على أقل من خمس تطابقات.
انتقل إلى العبارة
returnفيTwoCoinsالأسلوب . تعديل العبارةreturnلمطابقة التعليمات البرمجية التالية:if (count == 0) { return new int[0,0]; } return result;يمكنك أيضا تقصير رمز الإرجاع هذا باستخدام عامل التشغيل الثلاثي مثل ذلك:
return (count == 0) ? new int[0,0] : result;هام
تسمح لك مرونة
returnالكلمة الأساسية بإعادة قيمة تعبير، طالما أن النتيجة تطابق نوع الإرجاع المحدد للأسلوب.عند هذه النقطة،
TwoCoinsيجب أن يتطابق الأسلوب مع التعليمات البرمجية التالية:int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0; for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { result[count, 0] = curr; result[count, 1] = next; count++; } if (count == result.GetLength(0)) { return result; } } } return (count == 0) ? new int[0,0] : result; }
التقاط صفيف الإرجاع الجديد
الآن بعد أن أعاد أسلوبك صفيفا ثلاثي الأبعاد، يمكنك تحديث التعليمات البرمجية لاسترداد النتائج وطباعتها. نظرا لأنه تمت تهيئة عناصر صفيف النتائج إلى -1، يمكنك إضافة فحص لطباعة كافة الأزواج حتى يتم العثور على -1 قيمة.
انتقل إلى بداية البرنامج حيث
targetيتم تعريف المتغير. تعديل التعليمات البرمجية الخاصة بك كما يلي:int target = 30; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[,] result = TwoCoins(coins, target);بعد ذلك، ستقوم بتحديث الاستدعاء إلى
Console.WriteLineلطباعةresultالقيم بشكل صحيح.انتقل إلى
Console.WriteLineالمكالمة. تحديث التعليمات البرمجية الخاصة بك لمطابقة ما يلي:if (result.Length == 0) { Console.WriteLine("No two coins make change"); } else { Console.WriteLine("Change found at positions:"); for (int i = 0; i < result.GetLength(0); i++) { if (result[i,0] == -1) { break; } Console.WriteLine($"{result[i,0]},{result[i,1]}"); } }هنا، يمكنك الاحتفاظ بالتحقق من وجود صفيف فارغ كما هو، وطباعة قيم الصفيف 2D في حلقة for-loop. عند العثور على
-1قيمة، يمكنك الخروج من الحلقة نظرا لعدم وجود أزواج تالية.
راجع عملك
في هذه المهمة، ستقوم بتشغيل التطبيق الخاص بك من الوحدة الطرفية المتكاملة والتحقق من أن التعليمات البرمجية تعمل بشكل صحيح. لنبدأ.
قارن التعليمات البرمجية بما يلي للتأكد من صحتها:
int target = 30; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[,] result = TwoCoins(coins, target); if (result.Length == 0) { Console.WriteLine("No two coins make change"); } else { Console.WriteLine("Change found at positions:"); for (int i = 0; i < result.GetLength(0); i++) { if (result[i,0] == -1) { break; } Console.WriteLine($"{result[i,0]},{result[i,1]}"); } } int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0; for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { result[count, 0] = curr; result[count, 1] = next; count++; } if (count == result.GetLength(0)) { return result; } } } return (count == 0) ? new int[0,0] : result; }احفظ عملك باستخدام Ctrl + S أو باستخدام قائمة Visual Studio Code File.
إذا لزم الأمر، افتح لوحة المحطة الطرفية المتكاملة في Visual Studio Code.
في لوحة EXPLORER، لفتح Terminal في موقع مجلد TestProject، انقر بزر الماوس الأيمن فوق TestProject، ثم حدد Open in Integrated Terminal.
في موجه الأوامر Terminal، أدخل dotnet run
تحقق من أن التعليمات البرمجية الخاصة بك تنتج الإخراج التالي:
Change found at positions: 0,3 0,4 1,3 1,4 3,6إذا كانت التعليمات البرمجية تعرض نتائج مختلفة، فستحتاج إلى مراجعة التعليمات البرمجية للعثور على الخطأ وإجراء التحديثات. قم بتشغيل التعليمات البرمجية مرة أخرى لمعرفة ما إذا كنت قد أصلحت المشكلة. متابعة تحديث التعليمات البرمجية وتشغيلها حتى تنتج التعليمات البرمجية النتائج المتوقعة.
بعد ذلك، قم بتحديث قيمة
targetإلى قيمة80:int target = 80;احفظ عملك ثم أدخل dotnet run في موجه أوامر Terminal
للتحقق من أن التعليمات البرمجية الخاصة بك تعمل كما هو متوقع، قارن إخراج التطبيق الخاص بك مع الإخراج التالي:
No two coins make changeإذا كانت التعليمات البرمجية تعرض نتائج مختلفة، فستحتاج إلى مراجعة التعليمات البرمجية للعثور على الخطأ وإجراء التحديثات. قم بتشغيل التعليمات البرمجية مرة أخرى لمعرفة ما إذا كنت قد أصلحت المشكلة. متابعة تحديث التعليمات البرمجية وتشغيلها حتى تنتج التعليمات البرمجية النتائج المتوقعة.