سؤال

خلال الأسبوعين الماضيين قرأت من خلال الكتاب ترميز التحكم في الأخطاء: الأساسيات والتطبيقات من أجل التعرف على رموز BCH (Bose ، Chaudhuri ، Hocquenghem) لدور البرمجة الصغار في شركة اتصالات.

يغطي هذا الكتاب في الغالب الرياضيات والنظرية وراء هذا الموضوع ، لكنني أكافح من أجل تنفيذ بعض المفاهيم ؛ في المقام الأول الحصول على التالي ن CodeWords.i لدي واجهة مستخدم (تنفيذها من خلال NetBeans ، لذلك لن أقوم بنشر الرمز لأن الملف ضخم) الذي يمرر رمزًا للحصول على التالي ن أعداد:

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

لقد كان هذا يدفعني إلى الجنون لعدة أيام الآن لأنه من السهل إنشاء 0000000000 من المدخلات ، لكنني ضائع بشأن أين أذهب من هناك مع الكود الخاص بي. ماذا أفعل بعد ذلك لإنشاء رقم العمل التالي؟

أي مساعدة في إنشاء الرمز أعلاه سيكون موضع تقدير.

هل كانت مفيدة؟

المحلول

(تحرير كبير ...) اللعب مع الكود أكثر قليلاً يبدو أن هذا يعمل:

import java.util.ArrayList;
import java.util.List;


public class Main
{
    public static void main(final String[] argv)
    {
        final int startValue;
        final int iterations;
        final List<String> list;

        startValue = Integer.parseInt(argv[0]);
        iterations = Integer.parseInt(argv[1]);
        list = encodeAll(startValue, iterations);
        System.out.println(list);
    }

    private static List<String> encodeAll(final int startValue, final int iterations)
    {
        final List<String> allEncodings;

        allEncodings = new ArrayList<String>();

        for(int i = 0; i < iterations; i++)
        {
            try
            {
                final int    value;
                final String str;
                final String encoding;

                value = i + startValue;
                str = String.format("%06d", value);
                encoding = encoding(str);
                allEncodings.add(encoding);
            }
            catch(final BadNumberException ex)
            {
                // do nothing
            }
        }

        return allEncodings;
    }

    public static String encoding(String str)
        throws BadNumberException
    {
        final int[]         digit;
        final StringBuilder s;

        digit = new int[10];

        for(int i = 0; i < 6; i++)
        {
            digit[i] = Integer.parseInt(String.valueOf(str.charAt(i)));
        }

        digit[6] = ((4*digit[0])+(10*digit[1])+(9*digit[2])+(2*digit[3])+(digit[4])+(7*digit[5])) % 11;
        digit[7] = ((7*digit[0])+(8*digit[1])+(7*digit[2])+(digit[3])+(9*digit[4])+(6*digit[5])) % 11;
        digit[8] = ((9*digit[0])+(digit[1])+(7*digit[2])+(8*digit[3])+(7*digit[4])+(7*digit[5])) % 11;
        digit[9] = ((digit[0])+(2*digit[1])+(9*digit[2])+(10*digit[3])+(4*digit[4])+(digit[5])) % 11;

        // Insert Parity Checking method (Vandermonde Matrix)
        s = new StringBuilder();

        for(int i = 0; i < 9; i++)
        {
            s.append(Integer.toString(digit[i]));
        }

        if(digit[6] == 10 || digit[7] == 10 || digit[8] == 10 || digit[9] == 10)
        {
            throw new BadNumberException(str);
        }

        return (s.toString());
    }
}

class BadNumberException
    extends Exception
{
    public BadNumberException(final String str)
    {
        super(str + " cannot be encoded");
    }
}

أفضل رمي الاستثناء بدلاً من إرجاع سلسلة خاصة. في هذه الحالة ، أتجاهل الاستثناء الذي أقوله عادةً أنه ممارسة سيئة ، لكن في هذه الحالة ، أعتقد أن هذا ما تريده.

نصائح أخرى

من الصعب معرفة ذلك ، إذا حصلت على مشكلتك ، ولكن بعد قراءة سؤالك عدة مرات ، ربما هذا ما تبحث عنه:

public List<String> encodeAll() {
  List<String> allEncodings = new ArrayList<String>();
  for (int i = 0; i < 1000000 ; i++) { 
    String encoding = encoding(Integer.toString(i));
    allEncodings.add(encoding);
  }
  return allEncodings;
}

هناك عيب واحد في المحلول ، فإن نتائج toctalsstring ليست 0 متآملة. إذا كان هذا ما تريده ، أقترح استخدامه String.format("<something>", i) في مكالمة الترميز.

تحديث

لاستخدامها في مكالمتك الحالية ، استبدل مكالمة إلى الترميز (String Str) مع استدعاء لهذه الطريقة. ستتلقى قائمة مرتبة مع جميع الترميزات.

لقد كنت مهتمًا ، كنت مهتمًا فقط بالقيم الثمانية - خطأي ، وأعتقد الآن أنك نسيت الترميز مقابل القيمة 000009 في مثالك ، وبالتالي أزالت الأشياء الثمانية المزعجة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top