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

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

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

السلام عليكم

 

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

 

ملاحظة : لا يُسمح باستخدام الدوال التي تحل محل الخوارزمية, يُمكن الاستعانة بالدوال الأساسية مثل chatAt و length و ما شابه ..

 

الهدف من هذه الحلقة هو محاكاة بعض الدوال الموجودة في الواجهة Set من خلال كتابة فئة تسمح بالتعامل مع مجموعة من الأعداد الطبيعية. (المطلوب هو كتابة الفئة دون استخدام إحدى فئات الـ Collections)

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

  • مصفوفة تُخزن عناصر المجموعة.
  • دالة بناء تسمح بإنشاء مجموعة من الأعداد الطبيعة انطلاقا من قيم مصفوفة يتم تمريرها كوسيط بالإضافة إلى دالة بناء أخرى تسمح بإنشاء مجموعة فارغة.
  • add : تسمح بإضافة عنصر جديد إلى المجموعة.
  • toString : تُظهر عناصر المجموعة بين معكوفين. (مثال : {4, 3, 2, 1})
  • contains : تُعيد true إذا كانت المجموعة الحالية تحوي المجموعة المُمررة كوسيط و false في الحالة المعاكسة.
  • sort : تقوم بترتيب عناصر المجموعة.
  • union : تُعيد كائناً من Ensemble يحوي اتحاد المجموعة الحالية مع المجموعة المُمررة كوسيط.
  • intersection : تُعيد العناصر المشتركة بين المجموعة الحالية و المجموعة المُمررة كوسيط.
  • powerSet : تقوم بإظهار مجموعة المجموعات الجزئية (Power set) للمجموعة الحالية.
  • سؤال إضافي : اكتب دالة تستقبل جملة و تُعيد عدد كلماتها. (عدد الكلمات هنا بالمفهوم العام لأن الـ separator يُمكن أن يكون مسافة أو أي محرف آخر لذا يُستحسن تمريره كوسيط للدالة)

 

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

 

تحياتي.

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

1
#2

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

public class Seventh {    public static void main(String[] args) {        int x[] = new int[]{1, 2, 3, 4, 5};        Ensemble w = new Ensemble(x);        System.out.println(w);        w.sort();        System.out.println(w);        System.out.println(w.contains(new int[]{4, 6}));        System.out.println(w.union(new int[]{4, 3, 6}));        System.out.println(w.intersection(new int[]{4, 3, 7, 6}));        Ensemble.PrintPowerSet(                (new Ensemble(new int[]{1, 2, 3, 6})).powerSet()        );    }}class Ensemble {    private int x[];    Ensemble() {        x = new int[0];    }    Ensemble(int[] y) {        x = new int[y.length];        x = y.clone();    }    void add(int a) {        int[] y = new int[x.length + 1];        for (int i = 0; i < x.length; i++) {            y = x;        }        y[y.length - 1] = a;        x = y;    }    @Override    public String toString() {        StringBuilder string = new StringBuilder();        for (int i = 0; i < x.length; i++) {            string.append((i == 0 ? "{" : ",") + x + (i == x.length - 1 ? "}" : ""));        }        return string.toString();    }    public void sort() {        for (int tmp, max, i = 0; i < x.length; i++)//insertion sort i think        {            max = i;            for (int j = i + 1; j < x.length; j++) {                if (x[j] > x[max]) {                    max = j;                }            }            tmp = x;            x = x[max];            x[max] = tmp;        }    }    public boolean contains(int[] c) {        for (int i = 0; i < c.length; i++) {            boolean flag = false;            for (int j = 0; j < x.length; j++) {                if (c == x[j]) {                    flag = true;                }            }            if (!flag) {                return false;            }        }        return true;    }    public Ensemble union(int[] c) {        int Union[] = new int[x.length + c.length];        int index = 0;        for (int a : c) {            boolean exist = false;            for (int b : Union) {                if (a == b) {                    exist = true;                }            }            if (!exist) {                Union[index++] = a;            }        }        for (int a : x) {            boolean exist = false;            for (int b : Union) {                if (a == b) {                    exist = true;                }            }            if (!exist) {                Union[index++] = a;            }        }        int[] U = new int[index];        for (int i = 0; i < index; i++) {            U = Union;        }        return new Ensemble(U);    }    public Ensemble intersection(int[] c) {        int Union[] = new int[x.length];        int index = 0;        for (int a : c) {            for (int b : x) {                if (a == b) {                    Union[index++] = a;                }            }        }        int[] U = new int[index];        for (int i = 0; i < index; i++) {            U = Union;        }        return new Ensemble(U);    }    public Ensemble[][] powerSet() {        Ensemble[][] ps = new Ensemble[x.length + 1][];        for (int i = 0; i < ps.length; i++) {            ps = new Ensemble[Choose(x.length, i)];            int z[] = new int;            index = 0;            SubSet(z, 0, 0, i, ps);        }        return ps;    }    private int index;    public void SubSet(int[] z, int s0, int s1, int end, Ensemble[] ps) {        if (s0 == end) {            ps[index++] = new Ensemble(z);        } else {            for (int i = s1; i < x.length; i++) {                z[s0] = x;                SubSet(z, s0 + 1, i + 1, end, ps);            }        }    }    private int Choose(int n, int k) {        return n == 0 || k == 0 || n == k ? 1 : (Choose(n - 1, k - 1) + Choose(n - 1, k));    }    public static void PrintPowerSet(Ensemble X[][]) {        for (int i = 0; i < X.length; i++) {            System.out.print((i != 0 ? "," : "") + "{");            for (int j = 0; j < X.length; j++) {                System.out.print((j != 0 ? "," : "") + X[j]);            }            System.out.println("}");        }    }}
  • الأخ مصطفى أرسل لي بالأمس محاولة باستخدام Set و أخرى باستخدام HashSet ثم أرسل لي البارحة هذه المحاولة الجيدة التي تعتمد على مصفوفات int فقط.

 

محاولتي :

بالنسبة للدالة powerSet فقد كتبتها سابقا بالسي :

#include <stdio.h>#define N 4void afficher(int etat[], char *t[]){  int i;  printf("{");  for (i = 0; i < N; i++)	 if (etat)		printf("%s, ", t);  printf("\b\b}");  puts("");}void partie(int h, int etat[], char *t[]){  enum { ABSENT, PRESENT };  if (h < 0)	 afficher(etat, t);  else	 {		etat[h] = ABSENT;		partie(h - 1, etat, t);		etat[h] = PRESENT;		partie(h - 1, etat, t);	 }}int main(){  char *t[N] = { "a", "b", "c", "d" };  int etat[N];  printf("{");  partie(N - 1, etat, t);  return 0;}

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

بالنسبة لبقية الدوال فقد كتبتها باستخدام مصفوفات int فقط :

import java.util.ArrayList;public class Ensemble {    public int[] elements;    public Ensemble() {        this.elements = new int[]{};    }    public Ensemble(int elements[]) {        boolean state;        StringBuilder tmp = new StringBuilder();        for (int i = 0; i < elements.length; i++) {            state = false;            for (int j = 0; j < tmp.length(); j++)                if (elements == Character.getNumericValue(tmp.charAt(j)))                    state = true;            if (!state)                tmp.append(elements);        }        this.elements = new int[tmp.length()];        for (int i = 0; i < this.elements.length; i++)            this.elements = Character.getNumericValue(tmp.charAt(i));    }    public void add(int x) {        for (int i = 0; i < this.elements.length; i++) {            if (x == this.elements) {                return;            }        }        int[] tmp = new int[elements.length + 1];        System.arraycopy(this.elements, 0, tmp, 0, this.elements.length);        tmp[elements.length] = x;        this.elements = tmp;    }    @Override    public String toString() {        if (this.elements.length == 0) {            return "Vide";        }        StringBuilder result = new StringBuilder();        result.append('{');        for (int count = 0; count < this.elements.length; count++) {            result.append(this.elements[count]);            if (count != this.elements.length - 1) {                result.append(',');            }        }        result.append('}');        return result.toString();    }    public boolean contains(Ensemble obj) {        if (obj.elements.length > this.elements.length) {            return false;        }        boolean state = false;        for (int i = 0; i < obj.elements.length; i++) {            for (int j = 0; j < this.elements.length; j++) {                state = false;                if (obj.elements == this.elements[j]) {                    state = true;                    break;                }            }            if (!state) {                return false;            }        }        return true;    }    public void sort() {        int tmp;        for (int i = this.elements.length - 1; i >= 0; i--) {            for (int j = 0; j < i; j++) {                if (this.elements[j] > this.elements[j + 1]) {                    tmp = this.elements[j];                    this.elements[j] = this.elements[j + 1];                    this.elements[j + 1] = tmp;                }            }        }    }    public Ensemble union(Ensemble e) {        if (this.elements.length == 0 && e.elements.length == 0) {            return null;        }        Ensemble obj = new Ensemble();        obj.elements = new int[this.elements.length + e.elements.length];        int count = 0;        for (int i = 0; i < this.elements.length; i++) {            obj.elements[count++] = this.elements;        }        for (int i = 0; i < e.elements.length; i++) {            obj.elements[count++] = e.elements;        }        return obj;    }    public boolean find(int x) {        for (int i = 0; i < this.elements.length; i++) {            if (x == this.elements) {                return true;            }        }        return false;    }    public Ensemble intersection(Ensemble e) {        this.sort();        e.sort();        int i = 0, j = 0;        StringBuilder tmp = new StringBuilder();        while (i < this.elements.length && j < e.elements.length) {            if (this.elements == e.elements[j]) {                tmp.append(this.elements);                i++;                j++;            } else if (this.elements < e.elements[j]) {                i++;            } else {                j++;            }        }        Ensemble obj = new Ensemble();        obj.elements = new int[tmp.length()];        for (int count = 0; count < tmp.length(); count++) {            obj.elements[count] = Character.getNumericValue(tmp.charAt(count));        }        return obj;    }    //http://rosettacode.org/wiki/Power_set#Java    public ArrayList<String> powerSet(int a[], int n, ArrayList<String> ps) {        if (n < 0) {            return null;        }        if (n == 0) {            if (ps == null) {                ps = new ArrayList<>();            }            ps.add(" ");            return ps;        }        ps = powerSet(a, n - 1, ps);        ArrayList<String> tmp = new ArrayList<>();        for (String s : ps) {            if (s.equals(",")) {                tmp.add("" + a[n - 1]);            } else {                tmp.add(s + a[n - 1]);            }        }        ps.addAll(tmp);        return ps;    }    public static void main(String args[]) {        int array[] = {1, 4, 3, 3, 3, 2};        Ensemble A = new Ensemble(array);        A.sort();        System.out.println(A.toString());        Ensemble B = new Ensemble();        B.add(8);        B.add(4);        B.add(4);        B.add(6);        System.out.println(B.toString());        Ensemble C = A.intersection(B);        System.out.println(C.toString());        ArrayList<String> al = new ArrayList<>();        System.out.println(A.powerSet(A.elements, A.elements.length, al));        Ensemble D = A.union(B);        System.out.println(D.toString());    }}

عند تمرير مصفوفة تحتوي على أعداد مكررة يجب حذف التكرار قبل إضافة المحتوى إلى عناصر المجموعة (أعتقد أن هذه هي الملاحظة الوحيدة التي تنقص كود الأخ مصطفى)

المخرجات :

{1,2,3,4}
{8,4,6}
{4}
[ , 1, 2, 12, 3, 13, 23, 123, 4, 14, 24, 124, 34, 134, 234, 1234]
{1,2,3,4,4,6,8}

الدالة union تنقصها حلقة for داخلية للتأكد من عدم وجود العنصر سابقا في المصفوفة (سأترك هذه المهمة لك أخي القارئ :P )


بالنسبة للسؤال الإضافي, لم يُرسل لي الأخ مصطفى أي محاولة بخصوصه.
و هذه محاولتي :

public class Separator {

    static boolean separ(String str, char ch) {
        for (int i = 0; i < str.length(); i++)
            if (ch == str.charAt(i))
                return true;
        return false;
    }

    static public int NumberOfWords(String chaine, String separateurs) {
        int count = 0, isSepar = 1;
        for (int i = 0; i < chaine.length(); i++) {
            if (separ(separateurs, chaine.charAt(i))) {
                isSepar = 1;
            } else {
                count += isSepar;
                isSepar = 0;
            }
        }
        return count;
    }

    public static void main(String args[]) {
        String phrase = "oooxoooxooxooxooooox";
        System.out.println("La phrase " + phrase + " contient "
                + NumberOfWords(phrase, "o") + " mot(s)");
    }
}

المتغير count يُخزن عدد الكلمات و الهدف من المتغير isSepar هو معرفة هل المحرف الحالي عبارة عن separator أم لا.

تم تعديل هذه المشاركة بواسطة Snack3r في 1 ديسمبر 2013 في 11:42

#3

السلام عليكم ..

في الدالة : 

 Ensemble(int[] y) {
        x = new int[y.length];
        x = y.clone();
    }

 لا داعي للسطر :

        x = new int[y.length];

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#4

أهلا أستاذ حسام :)

بصراحة, لم أدقق النظر في محاولة مصطفى سطراً بسطر (كما كنتُ أفعل سابقاً) لكن من خلال "النظرة العامة" أعتقد أنها جيدة.



حسام الشامي كتب:

السلام عليكم ..
في الدالة :

 Ensemble(int[] y) {
        x = new int[y.length];
        x = y.clone();
    }
لا داعي للسطر :
        x = new int[y.length];

صحيح, أنا أفضل استخدام الدالة System.arraycopy لنسخ المصفوفات.
أيضاً, الدالة clone تُعيد كائن من نوع Object لذا من الأفضل دائما عمل casting (في النسخ القديمة قد تحصل على استثناء بسبب الـ incompatibles types)

تم تعديل هذه المشاركة بواسطة Snack3r في 1 ديسمبر 2013 في 12:14

#5

بخصوص السؤال الإضافي سامحني قمت بحلّه ولكن لكثرة الرسائل نسيت إرساله .. (كان من المفترض إرساله مع أجوبة السؤال الثامن :p )

public class Extra7 {

    public static void main(String[] args) {
        System.out.println(ExtraS7("HelloWorldHowAreYouToday?",'o'));
        System.out.println(ExtraS7("ooooooooooooooooooooooooox",'o'));
        System.out.println(ExtraS7("xooooooooooooooooooooooooox",'o'));
        System.out.println(ExtraS7("xoooxoooooooooooooooxooox",'o'));
    }

    private static int ExtraS7(String string, char c) {
        int x=0,i=0;
        while(i<string.length())
        {
            if(string.charAt(i)==c){
                while(i<string.length()&&string.charAt(i)==c)
                    i++;
            }
            if(i<string.length()&&string.charAt(i)!=c){
                x++;
                while(i<string.length()&&string.charAt(i)!=c)
                    i++;
            }
        }
        return x;
    }

}

شكرا لك .. (وتحية للأخ حسام :) )

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

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

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

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

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

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