الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اختبر قدراتك في الجافا - الحلقة الأولى

مغلق
بدأه Snack3r في 21 نوفمبر 2013 · 3 رد · 3,196 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

 

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

تتكون هذه السلسلة من مجموعة تمارين تطبيقية (كتبتُ حتى الآن أكثر من 50 تمرين) بحيث تُغطي كافة مواضيع المبتدئين وصولا إلى مواضيع متقدمة أكثر مثل threads, collections, swing الخ .. ( ما زلتُ مُصراً على إعادة نشاط هذا القسم بأي طريقة .. ^_^ )

 

عندما بدأتَ تعلم الجافا, كان أول برنامج تكتبه في هذه اللغة يحتوي على public static void main(String[] args)l و تكرر نفس السطر في كافة الأكواد التي كتبتها فيما بعد .. لكن هل سألتك نفسك يوماً : ما فائدة وسائط الدالة main ؟ و هل سبق و ان استخدمتها ؟ :)

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

  1. اكتب برنامج يقوم بقراءة عددين صحيحن من الـ command Line و يُظهر ناتج الجمع على الشاشة.
  2. يتم تنبيه المستخدم إذا أدخل حروفاً بدلا من أرقام و يطلب البرنامج منه إدخال الأرقام من جديد.
  3. إذا قام المستخدم بإدخال بيانات غير صحيحة خمس مرات متتالية, يتم إظهار رسالة تُوضح انتهاء عدد المحاولات المُتاحة و تتم مغادرة البرنامج.

 

تُرسل الإجابة على الخاص حتى لا يتم حرق السؤال.

 

 

تحياتي.

 

= إضافة =

فهرس الحلقات.

تم تعديل هذه المشاركة بواسطة Snack3r في 22 نوفمبر 2013 في 23:28 — السبب: إضافة رابط الفهرس.

5
#2

محاولة العضو Abd Allatif :

import java.util.InputMismatchException;
import java.util.Scanner;

public class CommandReader
{

    public static void main(String... args)
    {
        int int1 = 0, int2 = 0;
        boolean success = false;
        try
        {
            int1 = Integer.parseInt(args[0]);
            int2 = Integer.parseInt(args[1]);
            success = true;
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
            System.err.println("please use command line arguments");
        }
        catch (NumberFormatException ee)
        {
            System.err.println("please use ONLY integer arguments");
        }
        if(!success)
        {
        Scanner in;
            int trys = 0;
            System.err.print("Please Enter two Integers :");
            while (trys < 5)
            {
                in = new Scanner(System.in);
                try
                {
                    int1 = in.nextInt();
                    int2 = in.nextInt();
                    break;
                } catch (InputMismatchException eee) //eee :p
                {
                    if (trys != 4)
                    {
                        System.err.print("Enter ONLY Integers: ");
                    }
                    trys++;
                }
            }
            if (trys == 5)
            {
                System.err.println("Terminating program :(");
                System.exit(1);
            }
        }
        System.out.println("The first integer is: " + int1);
        System.out.println("The second integer is: " + int2);
    }
}

محاولة العضو مصطفى 36a2 :

import java.util.Scanner;

public class First {
    public static void main(String[]args)
    {
        try{
            System.out.println(Integer.parseInt(args[0])+Integer.parseInt(args[1]));
            System.out.println("Thanks For using this program");
        }catch(Exception e){
            Scanner scanner=new Scanner(System.in);
            for(int control=0;control<5;control++){
                System.out.println("Please Enter Numbers Only !");
                String a,b;
                a=scanner.next();
                b=scanner.next();
                try{
                System.out.println(Integer.parseInt(a)+Integer.parseInt(b));
                System.out.println("Thanks For using this program");
                System.exit(0);
                }catch(Exception e2){
                }    
            }
                System.out.println("Sorry .. This is useless :p");
        }
    }
}

محاولة العضو rahmony :

public class NewClass 
{

    public static void main(String[] args) 
    {
        java.util.Scanner scan = new java.util.Scanner(System.in);
        int num = 0;
        int sum = 0;
        int wrong = 0;
        int correct = 0;

        while (correct < 2) {
            System.out.print("Plz Enter an number : ");
            String input = scan.nextLine();
            if (input.matches("[a-z]")) 
            {
                if(wrong == 4)
                {
                  System.out.println("Unfortunately, you took all available attempts , try again later !! ");
                  System.exit(0);
                  
                }
                else
                {
                System.out.println("Plz enter correct number ");
                wrong++;
                continue;
                }
            } 
            else 
            {

                num = Integer.parseInt(input);
                sum += num;
                correct++;

            }

        }

        System.out.println("The sum of numbers is : " + sum);
    }
}

محاولة العضو أحمد أبو عبد البر :

public static void main ( String a[] )
      {
            int cnt = 0;
            Scanner in = new Scanner ( System.in );
            boolean isvalide = false;
            do {
                  cnt ++;
                  if( cnt > 1 ) {
                        System.out.println ( "أعد المحاولة" );
                        a[0] = in.next ();
                        a[1] = in.next ();

                  }
                  if( ( a.length < 2 ) | ( a.length > 2 ) )
                        System.out.println ( "يجب عليك إدخال عددين صحيحين فاصلا بينهما  بمسافة" );
                  else if(  ! a[0].matches ( "[0-9]+" ) |  ! a[1].matches ( "[0-9]+" ) )
                        System.out.println ( "لا بد أن تكون المدخلات أعدادا" );
                  else {
                        System.out.println ( Integer.parseInt ( a[0] ) + Integer.parseInt ( a[1] ) );
                        isvalide = true;
                  }


            } while( ( cnt < 5 ) &   !isvalide );
            if (!isvalide) 
                System.out.println("انتهت فرصك في المحاولة إلى اللقاء");
      }

محاولتي :

import java.util.InputMismatchException;
import java.util.Scanner;

public class Somme {

    public static void main(String[] args) {
        int x, y, errorsCounter = 0;
        Scanner src = new Scanner(System.in);

        if (args.length == 2) {
            try {
                System.out.println("la somme = " + (Integer.parseInt(args[0]) + Integer.parseInt(args[1])));
                System.exit(0);
            } catch (NumberFormatException nfe) {
                System.out.println("Format incorrect - Recommencez !");
                errorsCounter++;
            }

            while (errorsCounter < 5) {
                try {
                    System.out.print("Tapez le premier nombre : ");
                    x = src.nextInt();
                    System.out.print("Tapez le second nombre : ");
                    y = src.nextInt();
                    System.out.println(x + " + " + y + " = " + (x + y));
                    System.exit(0);
                } catch (InputMismatchException ime) {
                    System.out.println("Erreur de saisie - Recommencez !");
                    errorsCounter++;
                    src.nextLine();//pour vider le buffer
                }
            }

        } else {
            System.out.println("Erreur, le nombre d'arguments"+ args.length < 2 ? " < 2" : " > 2");
        }
    }
}

يُمكن تنفيذ الكود من خلال سطر الأوامر, هكذا :

javac Somme.javajava Somme 12 34

أو من خلال الـ IDE, في NetBeans مثلا :

اذهب إلى خصائص المشروع و اختر Exécuter يسار النافذة ثم اكتب وسائط الدالة main في خانة الـ Arguments (هكذا مثلا : 34 12).

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

بالنسبة لسؤال الحلقة فيمكن مثلا حدوث الـ constraints :

  1. يُمكن للمستخدم إدخال أقل أو أكثر من وسيطين.
  2. عند تحويل الوسائط المُدخلة إلى int, قد يتم إصدر استثناء من نوع NumberFormatException.
  3. عند تحويل مُدخلات Scanner إلى int, قد يتم إصدر استثناء من نوع InputMismatchException.
  4. إذا أدخل المستخدم بيانات غير صحيحة, يجب إفراغ الـ buffer.

هل لديكم مُداخلات أو اقتراحات قبل إغلاق الموضوع ؟ :)

تم تعديل هذه المشاركة بواسطة Snack3r في 22 نوفمبر 2013 في 23:07

#3

أنا لدي :)

:) هل يمكنك التعليق عند كل كود ما هي النواقص فيه .. حتى نتنبّه لها .. يعني تعليق سطرين ثلاثة عند كل كود ..

وجزاك الله خيراً ..

#4

سأعلق على بعض الملاحظات و ليست أخطاء لأن معظم الحلول تُؤدي المطلوب بشكل مقبول.

 

@Abd Allatif

  1. لا حاجة لتخزين وسائط main في متغيرات int, يُمكن استخدام System.out.println مباشرة لأنه بمجرد الحصول على الوسائط يُمكننا إظهار الناتج.
  2. لا أدري لماذا استخدمت ArrayIndexOutOfBoundsException !
  3. كان من الأفضل أن لا تسمح للمستخدم بإدخال أقل أو أكثر من وسيطين.
  4. ما دام الكود سيُنفذ في بيئة الـ console فلا أرى داعيا لاستخدام System.err لأن التلوين الأحمر لن يكون له تأثير في الشاشة السوداء.
  5. استخدامك لـ NumberFormatException مع وسائط main و InputMismatchException مع Scanner كان مُوفقاً جداً.
  6. أعجبني جداً إعلانك عن كائن Scanner داخل while لأنك لن تحتاجه قبل ذلك + جعلك تتجنب إفراغ الـ buffer.
  7. لكن في نفس الوقت إنشاء كائن من Scanner خمس مرات عند كل عملية تنفيذ قد يكون مُكلفاً ..
  8. من الأفضل أن تُعلن عن المتغير trys في الأعلى و تحذف المتغير success لأن trys وحده يكفي.
  9. كان من الأولى أن تستخدم nextLine بدلا من next.
  10. أعتقد أن محاولتك كانت الأقرب إلى الحل الصحيح (حسب وجهة نظري)

 

@مصطفى36a2

  1. كان من الأفضل أن لا تسمح للمستخدم بإدخال أقل أو أكثر من وسيطين.
  2. الاستثناء الأب : Exception يُستخدم فقط عندما تجهل نوعية الاستثناءات التي قد تحدث أثناء تنفيذ الكود (لو كتبتَ الكود في NetBeans مثلا لاقترح عليك خيار Use specific type in catch)
  3. كان من الأحسن أن تستخدم NumberFormatException مع وسائط main و InputMismatchException مع Scanner.
  4. تجنبك لإفراغ الـ buffer جعلك تستخدم String لـ a و b ثم تقوم بتحويلهما إلى int لاحقاً ؟ (لماذا لم تستخدم int من البداية)
  5. استخدامك لـ for جميل حيث جعلتَ عداد الحلقة هو نفسه عداد الأخطاء.

 

@rahmony

  1. لا أدري لماذا استخدمتَ 4 متغيرات int !
  2. بافتراض أنك ستحتاج إلى المتغيرات السابقة, كان من الأفضل أن تُعلن عنهم هكذا : int num, sum, wrong, correct ثم تستخدم الإسناد المتسلسل لتعيين قيمة لكافة المتغيرات في خطوة واحدة.
  3. لم تستقبل البيانات كوسائط للدالة main.
  4. wrong و correct يُمكن جمعهما في متغير واحد يُمثل عدد المحاولات و عند تجاوزه القيمة 5 تتم مغادرة البرنامج.
  5. أعجبتني الطريق التي ضمنت بها Scanner دون استخدام import.
  6. لا داعي لاستخدام continue في else.
  7. استخدام الـ regex جيد لكنه لا يكفي لأن المستخدم إذا أدخل بيانات غير صحيحة سيتنم إصدار NumberFormatException و إن لم تضع catch سيتم استدعاء الـ printStackTrace بشكل افتراضي. (المشكلة ناتجة من الشرط الذي أرسلتَه لـ matches)
  8. بالإضافة إلى استخدام الـ Exceptions يجب عليك إفراغ الـ buffer من المُدخلات العالقة.

 

@أحمد أبو عبد البر

الأخ أحمد لم يُتعب نفسه حتى في كتابة كود كلاس مكتمل, لا أدري لماذا ؟ :)

  1. المنطق يقول أن وسائط الدالة الرئيسية تُمرر في الـ command Line و في الـ command Line فقط ! و بالتالي قراءتها من Scanner لا أعتقد أنها مناسبة.
  2. ما دام الكود سيُنفذ في بيئة الـ console فيجب عليك كتابة رسائل الأخطاء بغير العربية حتى تظهر بشكل مقروء.
  3. أعجبني جداً تحققك من وسائط الدالة main بحيث لا تتعدى 2.
  4. المعامل | يُستخدم مع الأعداد الثنائية, مع الـ boolean استخدم ||.
  5. استخدامك لـ regex كان مُوفقا حيث أغناك عن استخدام الـ Exceptions لكن من ناحية المنطق أعتقد أن استخدام الاستثناءات أفضل لأنها ستُفيدك جداً عندما يكبر الكود. (ممكن تنشئ استثناء خاص بك على شكل فئة و تضع فيه رسائل الخطأ بشكل منظم)
  6. cnt و isvalide يُمكن جمعما في متغير واحد.
  7. الشرط a.length < 2 | a.length > 2 يكون له معنى فقط خارج while لأنك داخل الحلقة تقوم بإعادة قراءة الوسيط الأول و الثاني فقط.
  8. كان من الأولى أن تستخدم nextLine بدلا من next.
  9. المنطق تبع الـ if-else في while "متخرمز" جداً :D يُمكن تبسيطه ليُصبح هكذا :
    while (cnt < 5) {
                if (!a[0].matches("[0-9]+") || !a[1].matches("[0-9]+")) {
                    cnt++;
                    a[0] = in.nextLine();
                    a[1] = in.nextLine();
                } else {
                    System.out.println(Integer.parseInt(a[0]) + Integer.parseInt(a[1]));
                    break;
                }
            }

تم تعديل هذه المشاركة بواسطة Snack3r في 23 نوفمبر 2013 في 00:32

2

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…