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

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

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

السلام عليكم

 

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

 

الهدف من هذه الحلقة هو كتابة فئة تسمح بالتعامل مع كثيرات الحدود (Polynomial).

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

  • دالة بناء تستقبل الـ coefficients على شكل مصفوفة من double.
  • الدالة degre التي تُعيد درجة كثيرة الحدود.
  • getCoeff تستقبل رقم الحد و تُعيد درجته. (إذا تم تمرير رقم حد غير موجود تتم إعادة الصفر)
  • setCoeff تستقبل رقم الحد و القيمة الجديدة للمعامل و تقوم بتحديث مصفوفة المعاملات. (إذا كان رقم الحد أكبر من عدد الحدود, يتم إنشاء حد جديد بالمعامل المُحدد.)
  • derivee : تُعيد كائن جديد من Polynome يُمثل مشتقة كثيرة الحدود الحالية.
  • evalue : لحساب صورة عدد معين من خلال دالة كثيرة الحدود.
  • toString : هي نفسها الدالة الموجودة في الفئة الأم Object لكن مُعادة التعريف, تقوم بإعادة كثيرة الحدود على شكل قابل للقراءة (انظر المُخرجات في آخر المشاركة)
  • سؤال جانبي : قم بكتابة دالة تستقبل جملة و حرفين و تُعيد true إذا وُجد الحرفان داخل الجملة بحيث تفصلهما مسافة و false في الحالة المعاكسة.
    المحرف الذي يفصل الحرفين, إما أن يكون عدد غير محدود من space أو tab, فقط.
    (يُمنع الاستعانة بالدوال الجاهزة أياً كانت ..)

 

مثال على استخدام الفئة Polynome :

public static void main(String... args) {
    Polynome p = new Polynome(new double[]{-2, 3, 9, 4});
    System.out.println(p.toString());
    System.out.println(p.degre());
    System.out.println(p.derivee().toString());
    System.out.println(p.getCoeff(2));
    p.setCoeff(4, 6);
    System.out.println(p.toString());
    System.out.println(p.evalue(3.5));
    System.out.println(p.toString());
}

و هذا مثال على المُخرجات :

-2.0 + 3.0*x + 9.0*x ^ 2 + 4.0*x ^ 3
3
3.0 + 18.0*x + 12.0*x ^ 2
9.0
-2.0 + 3.0*x + 9.0*x ^ 2 + 4.0*x ^ 3 + 6.0*x ^ 4
1190.625
-2.0 + 3.0*x + 9.0*x ^ 2 + 4.0*x ^ 3 + 6.0*x ^ 4

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

 

 

تحياتي.

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

2
#2

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

import java.util.Map.Entry;import java.util.TreeMap;public class Sixth {    public static void main(String[] args) {        Polynome p = new Polynome(new double[]{-2, 3, 9, 4});        System.out.println(p.toString());        System.out.println(p.degre());        System.out.println(p.derivee().toString());        System.out.println(p.getCoeff(2));        p.setCoeff(4, 6);        System.out.println(p.toString());        System.out.println(p.evalue(3.5));        System.out.println(p.toString());            }}class Polynome {    private TreeMap<Integer,Double>coefficients;    private Polynome (){        coefficients=new TreeMap<Integer,Double>();    }    public Polynome (double[]coefficients){        this.coefficients=new TreeMap<Integer, Double>();        for(int i=0;i<coefficients.length;i++)            this.coefficients.put(i,coefficients);    }        public     int degre(){        return coefficients.size()-1;    }    public double getCoeff (int n){        return coefficients.get(n);    }    public void setCoeff (int n,double co){        coefficients.put(n,co);    }    public Polynome derivee(){        Polynome DerivedPoly            =new Polynome();        for(Entry<Integer,Double> x:coefficients.entrySet())            DerivedPoly.setCoeff(x.getKey()-1, x.getValue()*x.getKey());//:D i got it        if(DerivedPoly.coefficients.containsKey(-1))            DerivedPoly.coefficients.remove(-1);        return DerivedPoly;            }    public double evalue(double x){        double value=0;        for(Entry<Integer,Double> x1:coefficients.entrySet())            value+=x1.getValue()*Math.pow(x,x1.getKey());//الحمد لله عرفتها كمان :)        return value;    }    @Override    public String toString() {        StringBuilder string=new StringBuilder();        boolean start=false;        for(Entry<Integer,Double> x1:coefficients.entrySet())            if(Math.abs(x1.getValue())>0.0001)            {                if(start)                    string.append(" + ");                start=true;                string.append(x1.getValue());                if(x1.getKey()!=0)                    string.append("*x ");                if(x1.getKey()>1)                    string.append("^ "+x1.getKey());            }        return new String(string);    }    }

ملاحظاتي :

  • ما دام Sixth يُمثل فئة اختبار لـ Polynome فقط, فمن الأفضل دمجهما في فئة واحدة.
  • مالحاجة إلى TreeMap ؟ أظن أن HashMap تكفي. (ماذا ستستفيد من تخزين البيانات على شكل شجري ؟)
  • أرقام الحدود يُمكنك الحصول عليها من خلال loop لذا لا أرى فائدة في تخزينها في TreeMap.
  • بالنسبة للدالة getCoeff, إذا تم تمرير رقم حد غير موجود ستحصل على استثناء من نوع NullPointerException.
  • أعجبتني الطريقة التي اتبعتها في الدالة evalue.
  • المنطق الذي اتبعته في الدالة toString يحتاج إلى تبسيط.

 

السؤال الجانبي :

import java.util.Scanner;

public class SentenceAndTwoLetters {  
    public static boolean getSentence(){
        //start input
        Scanner scanner=new Scanner(System.in);
        System.out.println("Enter Sentence");
        String Sentence = scanner.nextLine();
        System.out.println("Enter Letter1");
        char letter1=scanner.next().charAt(0);
        System.out.println("Enter Letter2");
        char letter2=scanner.next().charAt(0);
        scanner.close();
        //start logic
        
        for(int i=0;i<Sentence.length();i++){
            if(Sentence.charAt(i)==letter1)
            {
                if(i+1<Sentence.length())
                if(Sentence.charAt(i+1)==' '||Sentence.charAt(i+1)=='\t')
                {
                    for(i++;i<Sentence.length()&&
                            (Sentence.charAt(i)==' '||Sentence.charAt(i)=='\t')
                            ;i++);
                    if(i==Sentence.length())
                        return false;
                    if(Sentence.charAt(i)==letter2)
                        return true;
                    else
                        i--;
                }
            }
            else if(Sentence.charAt(i)==letter2)
            {
                if(i+1<Sentence.length())
                if(Sentence.charAt(i+1)==' '||Sentence.charAt(i+1)=='\t')
                {
                    for(i++;i<Sentence.length()&&
                            (Sentence.charAt(i)==' '||Sentence.charAt(i)=='\t')
                            ;i++);
                    if(i==Sentence.length())
                        return false;
                    if(Sentence.charAt(i)==letter1)
                        return true;
                    else
                        i--;
                }
            }
        }
        return false;
    }
    public static void main(String[] args) {
        System.out.println("Result is"+
        getSentence()
        );
    }

}

ملاحظاتي :

  • انظر إلى محاولتي في حل السؤال الجانبي و لاحظ الفرق.

 

محاولتي :

public class Polynome {    private double[] coefficients;    private final String var = "x";    public Polynome(double[] coefficients) {        this.coefficients = new double[coefficients.length];        System.arraycopy(coefficients, 0, this.coefficients, 0, coefficients.length);    }    public int degre() {        for (int i = coefficients.length - 1; i > 0; i--)            if (coefficients != 0)                return i;        return 0;    }    public double getCoeff(int i) {        if (i >= coefficients.length)            return 0.;        return coefficients;    }    public void setCoeff(int i, double c) {        if (i >= coefficients.length) {            double[] tmp = new double[i + 1];            for (int j = 0; j < coefficients.length; j++)                tmp[j] = coefficients[j];            coefficients = tmp;        }        coefficients = c;    }    @Override    public String toString() {        StringBuilder res = new StringBuilder();        for (int i = 0; i <= degre(); i++)            res.append(coefficients).append(i == 0 ? "" : (i == 1 ? "*x" : "*" + var + "^" + i))                    .append(i != degre() && coefficients[i + 1] > 0 ? " + " : " ");        return res.toString();    }    public Polynome derivee() {        double[] coefDer = new double[degre()];        for (int i = 0; i < coefDer.length; i++)            coefDer = (i + 1) * coefficients[i + 1];        return new Polynome(coefDer);    }    public double evalue(double x) {        double result = 0;        for (int i = coefficients.length - 1; i >= 0; i--)            result = coefficients + (x * result);        return result;    }    public static void main(String... args) {        Polynome p = new Polynome(new double[]{-2, 3, 9, 4});        System.out.println(p.toString());        System.out.println(p.degre());        System.out.println(p.derivee().toString());        System.out.println(p.getCoeff(2));        p.setCoeff(4, 6);        System.out.println(p.toString());        System.out.println(p.evalue(3.5));        System.out.println(p.toString());    }}
  • دالة البناء تأخذ جدولا من double كوسيط و تُسند قيمه إلى الجدول coefficients الموجود داخل الفئة.
  • الدالة degre تقوم بالمرور على عناصر coefficients من الخلف, درجة كثيرة الحدود عبارة عن رقم أول معامل غير معدوم لذا قمنا بإعادة i إذا تحقق الشرط و 0 في الحالة المعاكسة.
  • getCoeff : إذا كان i أكبر من عدد الحدود فهذا يعني أن المعامل المراد البحث عنه غير موجود أصلا, لذا قمنا بإعادة الصفر و إلا فالمعامل عبارة عن العنصر رقم i من الجدول coefficients.
  • setCoeff : إذا كان i أصغر من عدد الحدود نُسند قيمة c إلى العنصر رقم i من الجدول coefficients, في الحالة المعاكسة, نقوم بزيادة طول الجدول و إضافة المعامل الجديد و تحديث الجدول.
  • toString : بسيطة و لا تحتاج إلى شرح.
  • derivee : جدول المعاملات الجديد سيكون بحجم درجة كثيرة الحدود المشتقة, و من خلال الحلقة for, نُطبق قاعدة الاشتقاق الخاصة بالدوال الأسية.
  • بالنسبة للدالة evalue فاستخدمتُ خوارزمية Horner المعروفة.

 

السؤال الجانبي :

public class Separation {

    public static boolean separatedBySpacesOrTabs(String str, char c1, char c2) {
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == c1) {
                do
                    i++;
                while (str.charAt(i) == 9 || str.charAt(i) == 32);
                if (str.charAt(i) == c2)
                    return true;
            }
        }
        return false;
    }

    public static void main(String... args) {
        System.out.println(separatedBySpacesOrTabs("A    O      B YA          B", 'A', 'B'));
    }
}
  • الفكرة بسيطة جداً و هي كالتالي :
    نقوم بالمرور على كافة أحرف الجملة str, إذا كان الحرف الحالي يُساوي c1, ندخل في حلقة do while لتجاهل الـ spaces و الـ tabs الموجودة بعده, بعد الخروج من الحلقة نتأكد من أن الحرف الموالي هو c2, إذا تحقق الشرط تتم إعادة true و ينتهي الأمر و إلا نعود إلى الحلقة for من جديد و هكذا دواليك .. إذا انتهت الحلقة for دون تحقق الشرطين فهذا يعني أن الجملة str لا تحتوي على الحرفين c1 و c1 تفصلهما مسافات و بالتالي تتم إعادة false.

تم تعديل هذه المشاركة بواسطة Snack3r في 28 نوفمبر 2013 في 19:08

#3

بالنسبة للاسم Sixth فهو خاص برقم السؤال ..

اقتباس

مالحاجة إلى TreeMap ؟ أظن أن HashMap تكفي. (ماذا ستستفيد من تخزين البيانات على شكل شجري ؟)

لأنني أحتاج الترتيب عندما أقوم بعرض الحدود .. حتى أوفّر عمليّة البحث عن الحد المناسب ..

اقتباس

بالنسبة للدالة getCoeff, إذا تم تمرير رقم حد غير موجود ستحصل على استثناء من نوع NullPointerException.

أتذكّر أنها تعيد null بشكل طبيعي عندما لا تعثر على العنصر ... تأكد منها :)

 

بالنسبة للسؤال الجانبي :)

حلك غير صحيح ... جرب وضع الحرفين بدون مسافة بينهما ... جرب وضع الحرف الثاني قبل الحرف الأول ..

بالتوفيق :)

#4
اقتباس

لأنني أحتاج الترتيب عندما أقوم بعرض الحدود .. حتى أوفّر عمليّة البحث عن الحد المناسب ..

 

 

كما أخبرتك سابقاً, لا حاجة إلى استخدام الـ Hash أصلا لأن المفاتيح عبارة عن أرقام متالية و تبدأ من الصفر و بالتالي لا حاجة في تخزينها لأنه يُمكنك الحصول عليها عن طريق loop.

 

اقتباس
أتذكّر أنها تعيد null بشكل طبيعي عندما لا تعثر على العنصر ... تأكد منها

 

 

عفواً, كنت أقصد أنها تُصدر NullPointerException إذا تم تمرير جدول فارغ (في الحقيقة, التمرين لم يُحدد شيئا بخصوص هذه المسألة لكن أنا جربتها من باب التسلية فقط :D )

 

اقتباس
جرب وضع الحرفين بدون مسافة بينهما

 

 

لا داعي للتجريب, ستكون النتيجة true بالتأكيد :)

 

اقتباس
جرب وضع الحرف الثاني قبل الحرف الأول

 

 

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

public static boolean test(String str, char c1, char c2) {
        return separatedBySpacesOrTabs(str, c1, c2) || separatedBySpacesOrTabs(str, c2, c1);
}

تم تعديل هذه المشاركة بواسطة Snack3r في 30 نوفمبر 2013 في 01:52

#5
اقتباس

لا داعي للتجريب, ستكون النتيجة true بالتأكيد smile.png

وهذا يعني أن الحل خاطئ ! فالمطلوب أن يفصل بينهما فاصل وإلا فلن يتحقق المطلوب ..

اقتباس

التمرين لم ينص على أن عملية البحث تتم في الاتجاهين

ولم ينص أيضاً على أنها باتجاه واحد .. وبذلك يكون الحل المطلوب هو الذي يحقق الاتجاهين ..

اقتباس

يُمكن ببساطة كتابة دالة جديدة

وضعت &&  والصحيح هو ||

 

إذا حلّي صحيح ويمكن تحسينه أما حلّك فهو خاطئ :D

#6
اقتباس

وهذا يعني أن الحل خاطئ ! فالمطلوب أن يفصل بينهما فاصل وإلا فلن يتحقق المطلوب ..

 

 

التمرين ينص على أن الحرفين يفصلهما عدد غير محدد من الـ space أو tab و أعتقد أن الصفر يدخل في هذه الحالة :)

 

اقتباس
ولم ينص أيضاً على أنها باتجاه واحد .. وبذلك يكون الحل المطلوب هو الذي يحقق الاتجاهين ..

 

 

أوكي, ماشي الحال, الدالة test تتولى المهمة ..

 

اقتباس
وضعت &&  والصحيح هو ||

 

 

عفواً, تم التصحيح (الواحد لما يكتب كود و هو يفكر في " الـحَـلَـنْـتَـبِـيـسْ " سيقع بالتأكيد في أخطاء كهذه :D )

تم تعديل هذه المشاركة بواسطة Snack3r في 30 نوفمبر 2013 في 01:56

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

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

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

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

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

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