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

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

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

السلام عليكم

 

 

لتكن لدينا الواجهة Affichable التي تسمح بإظهار قيم الـ primitive types.

public interface Affichable {void affiche();}

انطلاقا من الواجهة Affichable قم بتعريف فئتين, الأولى باسم Entier و الثانية Flottant.

كل فئة تحتوي على constructor لإنشاء عدد صحيح أو حقيقي و حقل : valeur بالإضافة إلى دالة : affiche تسمح بإظهار قيمة العدد الصحيح أو الحقيقي.

قم بإنشاء فئة باسم HertPoly تحتوي على :

  • جدول من نوع Affichable لتخزين مجموعة من الأعداد الصحيحة أو الحقيقية.
  • متغير static يُمثل الطول الحالي للجدول.
  • دالة public void ajoutValeur (Affichable a)l تسمح بإضافة عدد إلى الجدول.
  • دالة void affiche ( )l تُمكن من إظهار عناصر الجدول.

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

public static void main(String[] args) {
        HertPoly h = new HertPoly(3);
        h.ajoutValeur(new Entier(25));
        h.ajoutValeur(new Flottant(1.25f));
        h.ajoutValeur(new Entier(42));
        h.affiche();
}

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

Sortie du programme : 
 Entier de valeur 25
 Float de valeur 1.25
 Entier de valeur 42

تُرسل الإجابة على الخاص.

 

 

تحياتي.

 

= إضافة =

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

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

1
#2

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

public class Entier implements Affichable
{

      private int valeur;

      public Entier ( int i )
      {
            this.valeur = i;
      }

      @Override
      public void affiche ()
      {
            System.out.println ( "Entier de valeur " + valeur );
      }

}
public class Flottant implements Affichable
{

      private final float valeur;

      public Flottant ( float i )
      {
            this.valeur = i;
      }

      @Override
      public void affiche ()
      {
            System.out.println ( "Float de valeur " + valeur );
      }

}
public class HertPoly
{

      private Affichable[] list;
      private static int count;

      public HertPoly ( int l )
      {
            list = new Affichable[ l ];
            HertPoly.count = 0;
      }

      public void ajoutValeur ( Affichable a )
      {
            list[count] = a;
            count ++;
      }

      public void affiche ()
      {
            for( Affichable a : list )
                  a.affiche ();
      }

}

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

import java.util.Vector;

public class second {

    public static void main(String[] args) {
        HertPoly h = new HertPoly(3);
        h.ajoutValeur(new Entier(25));
        h.ajoutValeur(new Flottant(1.25f));
        h.ajoutValeur(new Entier(42));
        h.affiche();
    }
}

interface Affichable {//I love Interfaces :)

    void affiche();
}

class Entier implements Affichable {

    Integer valeur;

    Entier(int i) {
        valeur = i;
    }

    @Override
    public void affiche() {
        // TODO Auto-generated method stub
        System.out.println("Entier nombre " + valeur);
    }
}

class Flottant implements Affichable {

    Float valeur;

    Flottant(float f) {
        valeur = f;
    }

    @Override
    public void affiche() {
        // TODO Auto-generated method stub
        System.out.println("Floattant nombre " + valeur);
    }
}

class HertPoly {

    Vector table = new Vector();
    static int length = 0;
    static int max;

    public HertPoly(int i) {
        max = i;
    }

    public void ajoutValeur(Affichable a) {
        if (length == max) {
            System.out.println("Error Table is Full!");
        } else {
            table.add(a);
            length++;
        }
    }

    void affiche() {
        System.out.println("Sortie du programme : (French stuff :p )");
        for (Affichable x : table) {
            x.affiche();
        }
    }
}

محاولتي :

public class Entier implements Affichable {

    int valeur;

    public Entier(int valeur) {
        this.valeur = valeur;
    }

    @Override
    public void affiche() {
        System.out.println("Entier de valuer " + valeur);
    }
}
public class Flottant implements Affichable {

    float valeur;

    public Flottant(float valeur) {
        this.valeur = valeur;
    }

    @Override
    public void affiche() {
        System.out.println("Float de valuer " + valeur);
    }
}
public class HertPoly implements Affichable {    Affichable tab[];    static int index;    public HertPoly(int size) {        tab = new Affichable[size];//instaciation d'un tableau d'interface     }    public void ajoutValeur(Affichable a) {        tab[index] = a;        index++;    }    @Override    public void affiche() {        for (int i = 0; i < tab.length; i++) {            tab.affiche();//la méthode de type effective càd de la classe Enier ou bien Flottabt        }    }    public static void main(String[] args) {        HertPoly h = new HertPoly(3);        h.ajoutValeur(new Entier(25));        h.ajoutValeur(new Flottant(1.25f));        h.ajoutValeur(new Entier(42));        h.affiche();    }}

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

#3

بالنسبة لملاحظاتي حول محاولات الإخوة فهي كالتالي :

 

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

  • لا حاجة لاستخدام final مع المتغير valeur لأن التمرين لم ينص على أن المتغير ثابت.
  • ما دمت اخترت المتغير valeur كـ private فمن الأحسن أن تضع له get و set لأن منطق الـ encapsulation يقول أن المتغيرات المحمية يجب أن تكون مُرفقة بـ get & set إذا كان سيتم استخدامها في فئات أخرى. (هذا ليس خطأ لكن ذكرتُه فقط من باب تحسين منطقية الكود)
  • يكون استخدام  this ضرورياً فقط عندما يكون وسيط الـ constructor يحمل نفس اسم المتغير المُراد إسناد القيمة له.
  • لا داعي لإسناد القيمة 0 إلى المتغير count لأن متغيرات الـ static تحمل القيمة صفر بشكل تلقائي.
  • أعجبني استخدامك لـ for-loop في الدالة affiche.

 

@مصطفى 36a2

  • يُستحسن أن يتدأ أسماء الفئات في الجافا بـ uppercase character.
  • لا أدري لماذا الحاجة إلى Integer ؟ يكفي int يا رااجل :P
  • الفئة HertPoly يجب أن تقوم بعمل implements للواجهة Affichable حيث ستتتم إعادة تعريف الدالة affiche.
  • قمت باستخدام جدول من نوع Vector و التمرين ينص على استخدام مصفوفة من Affichable.
  • أعجبني استخدامك للمتغير max للتأكد من طول الجدول.
  • استخدامك لـ for-loop غير صحيح لأن table من نوع Vector و x من نوع Affichable.
  • كان من الأفضل أن تُعلن عن table كمصفوفة ديناميكية من Affichable, هكذا :
    Vector<Affichable> table = new Vector<>();
    و تستخدم forEach لإظهار النتائج :
    void affiche() {
            table.stream().forEach((a) -> {
                a.affiche();
            });
        }
1
#4

شكرا لك ..فهمت أن علي الإعلان عن الجدول كمصفوفة ديناميكية ولكن

لم أفهم الكود التالي :

void affiche() {
table.stream().forEach((a) -> {
a.affiche();
});
}

هل تقصد شرح المبدأ .. ام أن الدوال السابقة موجودة بالفعل ! لم أجد الدالة stream بين دوال Vector

ولا أعرف استخدام forEach .. أستخدم عوضا عنها حلقة for  المحسنة ..

شكرا لك

#5

stream عبارة عن default method (و هو أحد المفاهيم الجديدة التي تم إدخالها في Java 8).

stream هي إحدى دوال الواجهة java.util.Collection حيث تم عمل implements لها من طرف java.util.Vector لهذا السبب يُمكن استخدامها مع المصفوفات الديناميكية. تقوم stream بإعادة java.util.Stream و forEach هي إحدى دوال تلك الواجهة حيث تسمح بتطبيق دالة معينة على مختلف العناصر.

للمزيد, راجع الـ Lambda Expressions.

يُمكنك تحميل JDK 8 لتجريب الميزات الجديدة في الجافا مع العلم أن النسخة الثامنة لا تزال beta draft.

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

#6

خربت بيتنا Oracle ..

:D

طيب ما هذه العملية ->

جافا تتمتع بمقروئية علية .. أنا فهمت الكود , ولكن الفكرة أن إضافة عمليات جديدة أمر مزعج جداً .. هل <- عملية جديدة أم انني مخطئ !

#7

يُمكنك قراءة الكود كالتالي :

forEach('élément' ->  'opération à exécuter')
#8

إذا هي lmbda expression بكل ما تعني الكلمة من معنى ... ظننتها anonynous class في البداية .. ( هي عملية جديدة -> أليس كذلك ؟ قيّم الرد  بـ + إذا كانت نعم و - إن كانت لا :] )

شكرا لك

#9
اقتباس
هي عملية جديدة -> أليس كذلك ؟

 

نعم هي كذلك :)

 

اقتباس

 

قيّم الرد  بـ + إذا كانت نعم و - إن كانت لا :]

 

لا يا رااجل .. حرام عليك ! :D

#10

السلام عليكم

 

الصنف vector قرأت عنه ولست اذكر أنه تم تجاوزه واستبدل بفئات أكثر تطورا مثل ArrayList

 

هل نا مخطئ

تم تعديل هذه المشاركة بواسطة أحمد أبو عبد البر في 25 نوفمبر 2013 في 19:55

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

#11

إن كنت تقصد أن Vector أصبح deprecated فهذا غير صحيح, كل ما في الأمر أن ArrayList قد تحتوي على دوال أكثر, فقط :)

الفرق بينهما هو أن كافة دوال Vector تتمتع بخاصية الـ synchronization على عكس ArrayList.

للتأكد, يُمكنك مراجعة صفحة Vector في Java 7.

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

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

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