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

اختبر قدراتك في الجافا - الحلقة الخامسة

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

السلام عليكم

 

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

 

الهدف من هذه الحلقة هو كتابة فئة تسمح باستخراج مجموعة بيانات من String معينة.

الفئة StringsManipulation يجب أن تحتوي على :

  • الدالة long[] calculFactoriel(String str)l التي تُعيد مصفوفة من long تحتوي على factoriel كل رقم ظهر في الجملة str.
  • verifierAlphabetFrancais : تستقبل كائن من String و تُعيد true إذا كانت الجملة تحتوي فقط على أحرف فرنسية و false في الحالة المعاكسة.
  • بالإضافة إلى دالة تُمكن من إظهار نتائج الدالة calculFactoriel.
  • للتبسيط سنعتبر أن الأحرف الفرنسية هي :
    a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, à, â, é, è, ê, ç, î, ô, û

    مع العلم أنه توجد أحرف أخرى كثيرة ...

 

أمثلة على المُخرجات :

verifierAlphabetFrancais :
Input/Output : Pourquoi t'étais-tu tu quand tout était éteint / true
Input/Output : الفريق العربي للبرمجة2000 / false
----------------------------
calculFactoriel :
Input : AD38D0L4D
Output : [6, 40320, 1, 24]

تُرسل الإجابة على الخاص + سيتم الإعلان عن الحل في حدود 24 ساعة.

 

 

تحياتي.

تم تعديل هذه المشاركة بواسطة Snack3r في 26 نوفمبر 2013 في 02:55

#2

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

import java.util.ArrayList;
import java.util.Arrays;

public class StringsManipulation
{
    private long[] array;
    
    public boolean verifierAlphabetFrancais(String string)  // string ^ 2 :p
    {
        return string.matches("[a-zA-Zàâéèêçîôû ]+");
    }
    
    public long[] calculFactoriel(String string)    //same joke :|
    {
        ArrayList<Long> array = new ArrayList<Long>();
        
        for(int i = 0; i < string.length(); i++)
        {
            if(Character.isDigit(string.charAt(i)))
            {
              array.add(Factoriel(Character.getNumericValue(string.charAt(i))));
            }
        }
        long[] result = convertArray(array);
        this.array = result;
        return result;
    }
    
    private long[] convertArray(ArrayList<Long> array)
    {
        long result[] = new long[array.size()];
        for(int c = 0; c < array.size(); c++)
        {
            result[c] = array.get(c);
        }
        return result;
    }
    
    public void outputFactoriel()
    {   //useless method :(
        if(array == null)
        {
            System.out.println("please call 'calculFactoriel' first");
        }
        else
        {
            System.out.println(Arrays.toString(array));
        }
    }
    
    private long Factoriel(int Int)
    {
        if(Int == 1 | Int == 0)
        {
            return 1;
        }
        return (long) Int * (Factoriel(Int - 1));
    }
    
    public static void main(String... args)
    {
        StringsManipulation m = new StringsManipulation();
        System.out.println("verifierAlphabetFrancais :");
        System.out.println("Hellô World / " +
                m.verifierAlphabetFrancais("Hellô World"));
        System.out.println("الفريق العربي للبرمجة / " + 
                m.verifierAlphabetFrancais("الفريق العربي للبرمجة"));
        m.calculFactoriel("AD38D0L4D");
        System.out.print("-----------------------------\ncalculFactoriel :\n"
                + "Input: AD38D0L4D\nOutput: ");
        m.outputFactoriel();
    }
}

ملاحظاتي :

  • لا أرى خوارزمية في الدالة verifierAlphabetFrancais للتعليق عليها.
  • المصفوفة array في الدالة calculFactoriel كان من الأفضل أن تكون من short أو int. (لا داعي لـ long لأتك تتعامل مع أرقام فقط و ليس أعداد)
  • لا داعي لاستخدام الـ casting في الدالة Factoriel.
  • لا أرى فائدة في استخدام convertArray مع outputFactoriel, كان من الأفضل أن تستخدم array.toString مباشرة.
  • لا يُستحسن استخدام نفس أسماء متغيرات الكائن داخل الدوال. (توجد array من long و array من ArrayList)
  • في مثل هذه الحالات, من الأفضل أن تجعل الدالة static بدلا من الإعلان عن متغيرات داخل الفئة.

 

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

import java.util.ArrayList;public class StringsManipulation{      public static long fac ( int n )      {            if( n == 0 ) return 1;            else return n * fac ( n - 1 );      }      public static long[] calculFactoriel ( String str )      {            ArrayList<Long> array = new ArrayList<Long> ();            for( char c : str.toCharArray () )                  if( Character.isDigit ( c ) )                        array.add ( fac ( Character.digit ( c , 10 ) ) );            long[] temp = new long[ array.size () ];            for( int i = 0 ; i < temp.length ; i ++ )                  temp = array.get ( i );            return temp;      }      public static boolean verifierAlphabetFrancais ( String str )      {            boolean temp = true;            for( char c : str.toCharArray () )                  if(  ! Character.isLetter ( c ) ) {                        temp = false;                        break;                  }            return temp;      }      public static void imprimeCalculFactoriel ( String str )      {            for( long x : calculFactoriel ( str ) )                  System.out.print ( x + " , " );      }      public static void main ( String[] arg )      {            System.out.println ( verifierAlphabetFrancais ( "sgdgsgsdgs,gsdgsgsgsdgs" ) );            System.out.println ( verifierAlphabetFrancais ( "verifierAlphabetFrancaiss" ) );            imprimeCalculFactoriel ( "sg : سلام عليكم5sdsd4sdfs6sdf4ff" );      }}

ملاحظاتي :

  • الدالة digit تقوم بتحويل الحرف إلى القاعدة radix المُحددة في الوسيط الثاني, مالفائدة من استخدامها هنا ؟
  • أعتقد أنه كان من الأفضل أن تستخدم getNumericValue مع charAt لتحويل char إلى int.
  • لا داعي لتكرار نوع ArrayList في الدالة calculFactoriel, الـ diamond operator يضمن إنشاء كائن بنفس المواصفات المحددة في الجانب الأيسر.
  • استخدامك للدالة isLetter مثل استخدام الأخ عبد اللطيف للدالة matches, لا تعليق لدي :)

 

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

public class Fifth {    public static void main(String[] args) {        StringsManipulation2.verifierFrancais("Pourquoi t'étais-tu tu quand tout était éteint");        StringsManipulation2.verifierFrancais("الفريق العربي للبرمجة2000 ");                StringsManipulation2.calculFact("AD38D0L4D");    }}class StringsManipulation2 {    static private String AlphabetFrancais="abcdefghijklmnopqrstuvwxyzàâéèêçîôû";        static public long[] calculFactoriel(String str){        //low level manipulating :p        int size=0;        for(int i=0;i<str.length();i++)            if(str.charAt(i)>='0'&&str.charAt(i)<='9')                size++;        long fact[]=new long[size];        int index=0;        for(int i=0;i<str.length();i++)            if(str.charAt(i)>='0'&&str.charAt(i)<='9')                fact[index++]=factorial((int)(str.charAt(i)-'0'));        return fact;    }    static private long factorial(int i) {        //some Shortening :D        return i<2?1:i*factorial(i-1);    }    static private boolean verifierAlphabetFrancais(String str){    //low level code again :p        for(int i=0;i<str.length();i++)            for(int j=0;j<AlphabetFrancais.length();j++)                if(str.charAt(i)==AlphabetFrancais.charAt(j))                    return true;        return false;    }    static public void verifierFrancais(String str){        System.out.println("Input/Output : "+str+"/ "+(verifierAlphabetFrancais(str)?"true":"false"));    }    static public void calculFact(String str){        System.out.println("Input "+str);        System.out.print("Output : [");        long []x=calculFactoriel(str);        for(int i=0;i<x.length;i++)            System.out.print(x+(i==x.length-1?"]":","));    }}

ملاحظاتي :

  • أعجبني استخدامك للمؤثر الثلاثي في الدالة factorial.
  • بالنسبة للدالة verifierAlphabetFrancais, لم تقم بتحويل أحرف الجملة إلى أحرف صغيرة و بالتالي نتيجة ABC ستكون false.
  • أيضاً, عندما تجد أحد حروف str داخل AlphabetFrancais, تقوم فوراً بإعادة true ! لماذا كل هذه العجلة يا رجل :D ؟ (بهذه الطريقة تعتبر أن 'aشخابيطbلخابيط' تتكون من الأحرف الفرنسية فقط :P )
  • لا داعي لاستخدام المؤثر الثلاثي في الدالة verifierFrancais, القيمة المُعادة سيتم إظهارها كـ true|flase.
  • بدلا من مصفوفة long كان من الأحسن أن تستخدم Vector من long في الدالة calculFactoriel و هكذا لن تحتاج إلى حلقتين من for.

 

محاولتي :

public class StringsManipulation {    public static boolean verifierAlphabetFrancais(String str) {        String validString = "abcdefghijklmnopqrstuvwxyzàâéèêçîôû -'";        str = str.toLowerCase();        boolean state = false;        for (int i = 0; i < str.length(); i++) {            for (int j = 0; j < validString.length(); j++) {                state = false;                if (str.charAt(i) == validString.charAt(j)) {                    state = true;                    break;                }            }            if (!state) {                return false;            }        }        return true;    }    public static int[] extraireChiffre(String str) {        StringBuilder tmp = new StringBuilder();        for (int i = 0; i < str.length(); i++) {            if (Character.isDigit(str.charAt(i))) {                tmp.append(str.charAt(i));            }        }        int tab[] = new int[tmp.length()];        for (int i = 0; i < tmp.length(); i++) {            tab = Integer.parseInt(Character.toString(tmp.charAt(i)));        }        return tab;    }    public static long fact(int k) {        long f = 1;        for (int i = 2; i <= k; i++) {            f *= i;        }        return f;    }    public static long[] calculFactoriel(int[] tab) {        long[] res = new long[tab.length];        for (int i = 0; i < res.length; i++) {            res = fact(tab);        }        return res;    }    public static void affiche(long l[]) {        for (int i = 0; i < l.length; i++) {            System.out.println(l);        }    }    public static void main(String agrs[]) {        System.out.println(verifierAlphabetFrancais ("Pourquoi t'étais-tu tu quand tout était éteint"));        affiche(calculFactoriel(extraireChiffre("AD38D0L4D")));    }}
  • فكرة الدالة verifierAlphabetFrancais كالتالي :
    1. في البداية, نـُـخزن الأحرف المسموح بها داخل المتغير validString ثم نقوم بتحويل أحرف الجملة إلى أحرف صغيرة.
    2. الهدف من المتغير state هو معرفة ما إذا كانت الجملة str تحتوي على الأحرف المسموح بها أم لا.
    3. نقوم بالمرور على كافة عناصر الجملة str و في كل مرة نتأكد من وجود المحرف الحالي داخل الجملة validString.
    4. إذا وجدنا الحرف الحالي ضمن الأحرف المسموح بها نُسند القيمة true إلى state و نخرج من الحلقة الداخلية.
    5. إعادة القيمة false إلى المتغير state في بداية الحلقة مهم جداً لأن الحالة الافتراضية تعني أن المحرف غير موجود.
    6. عند الخروج من الحلقة الداخلية, نتأكد من قيمة state, إذا كانت false فهذا يعني أنه يوجد حرف لا يقع ضمن الأحرف المسموح بها, لذا نقوم بإعادة false على الفور.
    7. إذا كانت state تساوي true فهذا لا يعني أن الجملة str تحتوي على أحرف فرنسية و إنما يعني فقط أن المحرف السابق يقع ضمن الأحرف الموجودة في validString.
    8. إذا انتهت الحلقة الأولى و المتغير state ما يزال يحمل القيمة true فهذا يعني أن جميع أحرف str تقع ضمن الأحرف الموجودة في validString لذا قمنا بإعادة true.
  • بدلا من تخزين محتوى الـ validString داخل String و التأكد في كل مرة, كان بإمكاني أن أعلن عن ArrayList من char و أستخدم الدالة contains مباشرة للتحقق من وجود الحرف الحالي داخل الـ validString.
  • لم أرد استخدام هذه الطريقة حتى أحافظ على تكامل الخوارزمية دون الاستعانة بالدوال الجاهزة.
  • طبعا, استخدام الدالة toLowerCase لا أعتبره ممنوعاً لأنه يُمكننا كتابتها ببساطة. (مجرد نقص 32 من الـ ASCII Code)
  • بالنسبة للدالة extraireChiffre :
    1. المتغير tmp سيحوي مجموعة الأرقام التي ظهرت في الجملة str.
    2. بعد الخروج من الحلقة for, قمنا بتحويل محتوى tmp إلى الجدول tab ثم قمنا بإعادته.
  • الدالة fact تستقبل رقماً و تُعيد الـ factoriel تبعو.
  • الدالة calculFactoriel تستقبل الجدول المُعاد من طرف الدالة extraireChiffre و تُطبق الدالة fact على مختلف عناصر الجدول و تُعيد جدول من long يحتوي على الـ factoriels.
  • الدالة affiche لا تحتاج لشرح.

تم تعديل هذه المشاركة بواسطة Snack3r في 27 نوفمبر 2013 في 18:55

1
#3

في ملاحظاتك على كود الأخ عبد اللطيف (string ^2 :D)

اقتباس

المصفوفة array في الدالة calculFactoriel كان من الأفضل أن تكون من short أو int. (لا داعي لـ long لأتك تتعامل مع أرقام فقط و ليس أعداد)

خطأ يا عيني :) .. المصفوفة بتحفظ ناتج الـfactorial  يعني لو عندنا 9 فلاظم تحفظ 362880 وهو ما لن ينفع فيه الـshort ولا الـ T shirt  :D

 

في ملاحظاتك على كود الأخ أحمد أبو عبد البر ..

اقتباس

لا داعي لتكرار نوع ArrayList في الدالة calculFactoriel, الـ diamond operator يضمن إنشاء كائن بنفس المواصفات المحددة في الجانب الأيسر.

eclipse يقول لي أن كلامك صحيح في النسخ 1.7 فما فوق :)

 

بالنسبة للكود الذي كتبه الأخ Sncak3r

tab = Integer.parseInt(Character.toString(tmp.charAt(i)));

ليه كل ده ! اطرح '0' وخلاص :)

عندي سؤال عن الفئة StringBuilder  الفرق بينها وبين String هو أن الأخيرة immutable أليس كذلك ؟

 

بالمناسبة : استمتعت  بقراءة الأكواد سأرجع لقراءة أكواد الحلقات السابقة ...

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

 

توكلنا على الله .. بالتوفيق للجميع

1
#4
اقتباس

خطأ يا عيني :) .. المصفوفة بتحفظ ناتج الـfactorial  يعني لو عندنا 9 فلاظم تحفظ 362880 وهو ما لن ينفع فيه الـshort ولا الـ T shirt  :D

 

 

صحيح, لم أر الدالة factorial :P

 

اقتباس
eclipse يقول لي أن كلامك صحيح في النسخ 1.7 فما فوق :)

 

 

عند كتابتي للملاحظات, أعتبر أن كل المشاركين يعملون على Java 7 أو 8, ليش لا ؟ :D (الهدف من الملاحظات هو نقد الكود مع ذكر الميزات الجديدة للجافا, التي قد يستفيد منها المشاركون ..)

 

اقتباس
ليه كل ده ! اطرح '0' وخلاص

 

 

قصدتُ استخدام تلك الدوال لأبين للقارئ فائدتها :)

 

 

اقتباس
أرى أن كتابة الكود باستخدام دوال جاهزة مفيد أيضاً .. فبذلك يتعرف من لا يعرفها عليها وعلى كيفية الاستفادة منها .. وكتابة الكود بطريقة يدوية بشكل كامل ,تفيد في التفكير ومعرفة كم تترك جافا للمبرمج من مساحة ليلعب ..

 

 

استخدام الدوال مهم جداً بشرط أن يكون جزئي و ليس كلي (يعني لو قمت بالاستعانة بمجموعة دوال في الكود لتصل إلى ما تريد فهذا جيد لكن أن تقتصر الخوارزمية في دالة واحد فهذا أعتبره ممنوعاً :P )

تم تعديل هذه المشاركة بواسطة Snack3r في 27 نوفمبر 2013 في 17:33

#5
اقتباس

أيضاً, عندما تجد أحد حروف str داخل AlphabetFrancais, تقوم فوراً بإعادة true !

عفواً عفواً عفواً ... كان الكود يّفترض أن يكون != في الشرط .. و return false ... وفي الآخ return true  اعذرني .. كان مخّي في الغرفة الأخرى ..

اقتباس

بالنسبة للدالة verifierAlphabetFrancais, لم تقم بتحويل أحرف الجملة إلى أحرف صغيرة

وأنا إيش بيعرّفني انو عندك أحرف كبيرة كمان :D  .. كان لازم توضّحها بالمسألة الرئيسية :)

 

شكرا جزيلاً لك ..

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

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

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

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

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

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