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

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

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

السلام عليكم

 

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

 

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

  1. إذا كان الرقم يتكون من 9 أرقام, نُضيف إلى بدايته (33).
  2. إذا كان الرقم يتكون من 10 أرقام مع 0 في البداية, نقوم بحذف الصفر و نُضيف (33) إلى بداية الرقم.

أمثلة :

144553823    =>   (33)144553823
0144553823   =>   (33)144553823

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

  • دالة بناء تسمح بإنشاء كائن يحتوي على رقم الهاتف.
  • الدالة controls تتحقق من أن رقم الهاتف يتكون من أعداد فقط, في الحالة المعاكسة تطلب الدالة من المستخدم إدخال رقم هاتف جديد و تُعيد الطلب حتى يتم إدخال رقم هاتف يحتوي على أرقام فقط.
  • الدالة getNumeroNormalise تستقبل رقم الهاتف و تُعيده بالشكل القياسي.
  • الدالة imprime تقوم بإظهار رقم الهاتف القياسي على الشاشة.

 

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

 

 

تحياتي.

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

#2

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

import java.util.Scanner;

public class Third {

    public static void main(String[] args) {
        NumberTelNorm num1 = new NumberTelNorm("987654321");
        num1.controls();
        num1.getNumeroNormalise();
        num1.imprime();
        NumberTelNorm num2 = new NumberTelNorm("0987654321");
        num2.controls();
        num2.getNumeroNormalise();
        num2.imprime();
    }

}

class NumberTelNorm {

    private String nombre;
    boolean isStandard;

    NumberTelNorm(String nombre) {
        this.nombre = nombre;
    }

    void controls() {
        Scanner scanner = new Scanner(System.in);
        do {
            if (nombre == null) {
                nombre = scanner.next();
            }
            isStandard = true;
            for (int i = 0; i < nombre.length(); i++) {
                if (nombre.charAt(i) < '0' || nombre.charAt(i) > '9') {
                    isStandard = false;
                    System.out.println("Please Enter Numbers Only!");
                    break;
                }
            }
        } while (!isStandard);
    }

    String getNumeroNormalise() {
        nombre = getNumeroNormalise(this.nombre);
        return nombre;
    }

    String getNumeroNormalise(String nombre) {
        if ((nombre.length() == 9 && nombre.charAt(0) != '0')
                || (nombre.length() == 10 && nombre.charAt(0) == '0')) {
            if (nombre.charAt(0) == '0') {
                nombre = nombre.substring(1);
            }
            nombre = "(33)" + nombre;
            isStandard = true;
            return nombre;
        } else {
            System.out.println("Error .. number format unspecified!");
            return null;
        }
    }

    void imprime() {
        if (!isStandard) {
            getNumeroNormalise(nombre);
        }
        System.out.println(nombre);
    }
}

ملاحظاتي :

  • لا أرى حاجة في استخدام الشرط nombre == null لأن التحقق  من فراغ الرقم يجب أن يتم في الدالة getNumeroNormalise و ليست controls (هذه الأخيرة تفترض أن الرقم غير فارغ و يحتوي على مجموعة حروف أو أرقام حسب نص التمرين)
  • بدلا من التأكد من وجود الرقم بين 0 و 9 يُمكنك استخدام الدالة isDigit الموجودة في الفئة Character.
  • المنطق الذي اعتمدته في الـ if-else داخل الدالة getNumeroNormalise غير منظم, كان بإمكانك أن تجعله أكثر ترتيباً. (راجع الملاحظات التي أوردتها في محاولتي)
  • بدلا من فصل الدوال, كان بإمكانك أن تجعل الدوال متشابكة فيما بينها و كل ما على المستخدم فعله هو بناء كان من NumberTelNorm و استدعاء الدالة imprime لإظهار الرقم بشكل قياسي.

 

محاولتي :

import java.util.Scanner;

public class NumberTel {

    String tel;

    public NumberTel(String tel) {
        this.tel = tel;
    }

    String lire() {
        return new Scanner(System.in).nextLine();
    }

    boolean verif(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    String controls() {
        boolean state = verif(tel);
        while (!state) {
            System.err.println("Erreur de saisie - Recommencez !");
            tel = lire();
            state = verif(tel);
        }
        return tel;
    }

    String getNumeroNormalise(String num) {
        if (num.length() == 9) {
            return "33 " + num;
        }
        if (num.length() == 10 && num.startsWith("0")) {
            return "33 " + num.substring(1);
        }
        return null;
    }

    public void imprime() {
        String result = getNumeroNormalise(controls());
        if (result != null) {
            System.out.println(result);
        } else {
            System.err.println("Numéro inconnu !");
        }
    }

    public static void main(String args[]) {
        NumberTel obj = new NumberTel("1234567D989");
        obj.imprime();
    }
}
  • الدالة lire لا تستقبل أي وسيط, فقط تقوم بقراءة رقم الهاتف الذي أدخله المستخدم من خلال لوحة المفاتيح و تقوم بإعادته في متغير String.
  • verif تستقبل رقم الهاتف و تُعيد true إذا احتوى على أرقام فقط و false في الحالة المعاكسة.
  • controls تُمرر رقم الهاتف المُخزن في tel للدالة verif و تُخزن الناتج في المتغير state, إذا كان state يساوي false فهذا يعني أن الرقم لا يخضع للقواعد المُحددة و بالتالي سيتم الدخول في while, يتم طلب إدخال رقم هاتف جديد و يُخزن الناتج في المتغير tel و نستدعي من جديد الدالة verif, إذا كانت النتائج إيجابية نخرج من الحلقة while و نُعيد الرقم الجديد و إلا نطلب من المستخدم إدخال رقم آخر و هكذا دواليك ..
  • الدالة getNumeroNormalise تستقبل رقم الهاتف بعد التأكد من خضوعه للقواعد المُحددة و تُضيف إليه 33 إذا كان يتكون من 9 أرقام, تحذف الصفر و تُضيف 33 إذا كان يتكون من 10 أرقام و يبدأ بـ 0 و تُعيد null في الحالة المعاكسة.
  • imprime تُمرر رقم الهاتف المُخزن في tel إلى الدالة getNumeroNormalise, إذا كان يختلف عن null يتم إظهاره و إلا فهذا يعني أنه مُخالف و  بالتالي يتم إظهار رسالة الخطأ باللون الأحمر.
  • باختصار, كلما على المستخدم فعله هو إنشاء كائن من الفئة NumberTel و استدعاء الدالة imprime لإظهار الناتج, قد لا يعلم المستخدم بوجود دوال أخرى تعمل خلف الكواليس.
  • يتم التحقق من رقم الهاتف باتباع الخطوات التالية :
    1. يقوم المستخدم بإنشاء كائن من NumberTel, الآن أصبح رقم الهاتف مخزناً في المتغير tel ثم يقوم باستدعاء الدالة imprime لإظهار الرقم.
    2. الدالة imprime تستدعي بدورها الدالة getNumeroNormalise التي تستدعي الدالة controls التي تقوم بالتحقق من أن رقم الهاتف المُخزن في tel يخضع للقواعد المُحددة, إذا كان رقم الهاتف لا يخضع لتلك القواعد , تقوم controls باستدعاء lire و verif على التوالي و يظل الحال هكذا حتى يمل المستخدم و يُدخل عدد يُوافق الشروط :)
    3. الآن, تقوم الدالة verif بإعادة true لتقوم controls بإعادة رقم الهاتف الصحيح و يأتي دور getNumeroNormalise لإعادة رقم الهاتف بعد إضافة 33 (أو إعادة null) حيث يتم إسناد الناتج إلى المتغير result.
    4. إذا كانت القيمة المُعادة تختلف عن null يتم إظهارها و إلا فهذا يعني أنها مُخالفة و  بالتالي يتم إظهار رسالة الخطأ باللون الأحمر.
    5. صحيح أنني اختزلتُ عدة خطوات في خطوة واحدة و لكن الهدف الرئيسي من هذه الحلقة هو تعلم كيفية التعامل مع الـ Strings + كيفية كتابة مجموعة من الدوال تعمل كدالة واحدة دون أن يشعر المستخدم بوجود مهام أخرى يتم توزيعها خلف الكواليس.

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

#3

بارك الله فيك ..

ظننت انه يجب الالتزام بالدوال المطلوبة فقط .. :)

لا بأس .. سلسلة رائعة  .. أتمنى أن يستفيد منها أكبر عدد ممكن من المطوّرين ..

إلى السؤال الرابع ..

 

بالتوفيق

#4

أضحكك على شيء

أتعرف لماذا لم أستخدم Character.isDigit
جربت كتابة Character بحوالي 5-6 طرق وظننت أنني أخطأت تهجئتها لأنه لم يلوّنها بالأزرق ..
فتركتها وكتبت كود مختلف :D .. والان تذكرت أنه يلوّن الكلمات المفتاحية فقط O_o

بالتوفيق :)

1

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

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