تمرين - إرجاع الصفائف من الأساليب

مكتمل

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

البحث عن عملات معدنية لإجراء التغيير

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

  1. في محرر Visual Studio Code، احذف أي تعليمة برمجية موجودة من التدريبات السابقة.

  2. أدخل التعليمات البرمجية التالية في محرر التعليمات البرمجية Visual Studio:

    int[] TwoCoins(int[] coins, int target) 
    {
        return  new int[0];
    }
    

    في حالة عدم العثور على عملتين معدنيتين، ترجع الطريقة صفيفا فارغا. خذ لحظة للنظر في بناء جملة النتيجة التي تم إرجاعها. بينما يمكنك إنشاء متغير لتخزين صفيف جديد int[] وإرجاع المتغير، تسمح لك العبارة return بإنشاء القيم وإرجاعها في وقت واحد.

  3. هناك العديد من الأساليب لحل هذه المشكلة. خذ لحظة للنظر في كيفية البحث عن رقمين في صفيف يكون مجموعه مساويا لقيمة معينة.

    في هذا التمرين، سيتم استخدام النهج التالي:

    1. اختر رقما واحدا من الصفيف
    2. تحقق من الأرقام الأخرى واحدا تلو الآخر لمعرفة ما إذا كانت تضيف ما يصل إلى القيمة الهدف
    3. إرجاع النتيجة بمجرد العثور على تطابق
  4. للتحقق من كل رقم في الصفيف، قم بتحديث 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 لمعرفة ما إذا كانت تساوي القيمة المستهدفة.

  5. بعد ذلك، أضف منطقا للتحقق من مجموع عملتين للقيمة المستهدفة. للقيام بذلك، قم بتحديث الحلقات السابقة 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 مساويا للقيمة الهدف. إذا كان المجموع متساويا، يمكنك إنشاء صفيف لتخزين هذه الفهارس وإعادتها. إذا لم تكن متساوية، يمكنك تجاهلها ومتابعة التدقيق.

اختبر الحل الخاص بك

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

  1. إنشاء سطر تعليمة برمجية TwoCoins فارغة جديد أعلى توقيع الأسلوب. ثم أدخل التعليمات البرمجية التالية:

    int target = 60;
    int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5};
    int[] result = TwoCoins(coins, target);
    

    تذكر أن TwoCoins الأسلوب يرجع صفيفا فارغا إذا لم يتم العثور على أي تغيير. ستحتاج إلى التحقق من حجم الصفيف قبل محاولة طباعة result الصفيف.

  2. أدخل سطر تعليمة برمجية فارغا جديدا. ثم أدخل التعليمات البرمجية التالية:

    if (result.Length == 0) 
    {
        Console.WriteLine("No two coins make change");
    } 
    else 
    {
        Console.WriteLine($"Change found at positions {result[0]} and {result[1]}");
    }
    
  3. إذا لزم الأمر، افتح لوحة المحطة الطرفية المتكاملة في Visual Studio Code.

  4. في موجه الأوامر Terminal، أدخل dotnet run. قارن الإخراج الخاص بك مع ما يلي:

    Change found at positions 2 and 5
    

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

العثور على أزواج متعددة من العملات التي تجعل التغيير

في هذه الخطوة، ستقوم بتوسيع TwoCoins الأسلوب للعثور على المزيد من أزواج العملات التي يكون مجموعها مساويا للقيمة المستهدفة. لهذا التمرين، ستجد خمسة أزواج كحد أقصى. وهذا يعني أن نوع الإرجاع سيكون صفيفا ثلاثي الأبعاد بدلا من صفيف 1D، وستحتاج إلى تعديل الطريقة التي ترجع بها التعليمات البرمجية النتائج. لنبدأ!

  1. قم بتغيير نوع الإرجاع في توقيع الأسلوب من int[] إلى int[,] عن طريق تحديث التعليمات البرمجية الخاصة بك إلى ما يلي:

    int[,] TwoCoins(int[] coins, int target)
    

    بعد ذلك، ستقوم بإنشاء int[,] صفيف لتخزين نتائجك وإرجاعها، ومتغير عداد لتتبع عدد الأزواج المضافة إلى الصفيف.

  2. TwoCoins تحديث الأسلوب بالتعليمات البرمجية التالية:

    int[,] TwoCoins(int[] coins, int target) 
    {
        int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
        int count = 0;
    

    لاحظ أنك قمت بتهيئة عناصر صفيف النتائج إلى -1. سيساعدك هذا لاحقا عندما تريد طباعة الأزواج التي تم العثور عليها.

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

  3. 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 الصفيف التي تمت تعبئتها.

  4. تحديث المنطق في 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;
        }
    }
    

    وأخيرا، ستحتاج إلى تحديث عبارة الإرجاع النهائية لإرجاع النتيجة الصحيحة إذا لم يتم العثور على أي تطابقات على الإطلاق، أو إذا تم العثور على أقل من خمس تطابقات.

  5. انتقل إلى العبارة return في TwoCoins الأسلوب . تعديل العبارة return لمطابقة التعليمات البرمجية التالية:

    if (count == 0) 
    {
        return new int[0,0];
    }
    return result;
    

    يمكنك أيضا تقصير رمز الإرجاع هذا باستخدام عامل التشغيل الثلاثي مثل ذلك:

    return (count == 0) ? new int[0,0] : result;
    

    هام

    تسمح لك مرونة return الكلمة الأساسية بإعادة قيمة تعبير، طالما أن النتيجة تطابق نوع الإرجاع المحدد للأسلوب.

  6. عند هذه النقطة، 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 قيمة.

  1. انتقل إلى بداية البرنامج حيث target يتم تعريف المتغير. تعديل التعليمات البرمجية الخاصة بك كما يلي:

    int target = 30;
    int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5};
    int[,] result = TwoCoins(coins, target);
    

    بعد ذلك، ستقوم بتحديث الاستدعاء إلى Console.WriteLine لطباعة result القيم بشكل صحيح.

  2. انتقل إلى 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 قيمة، يمكنك الخروج من الحلقة نظرا لعدم وجود أزواج تالية.

راجع عملك

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

  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;
    }
    
  2. احفظ عملك باستخدام Ctrl + S أو باستخدام قائمة Visual Studio Code File.

  3. إذا لزم الأمر، افتح لوحة المحطة الطرفية المتكاملة في Visual Studio Code.

    في لوحة EXPLORER، لفتح Terminal في موقع مجلد TestProject، انقر بزر الماوس الأيمن فوق TestProject، ثم حدد Open in Integrated Terminal.

  4. في موجه الأوامر Terminal، أدخل dotnet run

  5. تحقق من أن التعليمات البرمجية الخاصة بك تنتج الإخراج التالي:

    Change found at positions:
    0,3
    0,4
    1,3
    1,4
    3,6
    

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

  6. بعد ذلك، قم بتحديث قيمة target إلى قيمة 80:

    int target = 80;
    
  7. احفظ عملك ثم أدخل dotnet run في موجه أوامر Terminal

  8. للتحقق من أن التعليمات البرمجية الخاصة بك تعمل كما هو متوقع، قارن إخراج التطبيق الخاص بك مع الإخراج التالي:

    No two coins make change
    

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