2 votes

Codage des codes en Java

Au cours des deux dernières semaines, j'ai parcouru le livre Codage de contrôle d'erreur : Principes fondamentaux et applications afin d'apprendre les codes BCH (Bose, Chaudhuri, Hocquenghem) pour un poste de programmation junior dans une entreprise de télécommunications.

Ce livre couvre principalement les mathématiques et la théorie derrière le sujet, mais j'ai du mal à mettre en œuvre certains des concepts, principalement l'obtention de la prochaine n J'ai une interface graphique (mise en œuvre par NetBeans, je ne vais pas publier le code car le fichier est énorme) qui transmet un code afin d'obtenir le mot de passe suivant. n numéros :

C'est la génération de ces chiffres qui me pose problème. Si je pouvais passer par tous ces éléments dans la seule méthode d'encodage au lieu de tourner en boucle en utilisant l'interface graphique, ma vie serait dix fois plus facile.

Cela me rend fou depuis plusieurs jours maintenant, car il est assez facile de générer 0000000000 à partir de l'entrée, mais je ne sais plus où aller avec mon code. Que dois-je faire ensuite pour générer le prochain numéro de travail ?

Toute aide pour générer le code ci-dessus serait appréciée.

2voto

TofuBeer Points 32441

(grosse modification...) En jouant avec le code un peu plus, cela semble fonctionner :

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");
    }
}

Je préfère lancer l'exception plutôt que de renvoyer une chaîne spéciale. Dans ce cas, j'ignore l'exception, ce qui, normalement, serait une mauvaise pratique, mais dans ce cas, je pense que c'est ce que vous voulez.

1voto

Andreas_D Points 64111

Difficile à dire, si j'ai compris votre problème, mais après avoir lu votre question plusieurs fois, c'est peut-être ce que vous recherchez :

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;
}

Il y a un défaut dans la solution, les résultats de toOctalString n'ont pas d'espacement de 0. Si c'est ce que vous voulez, je suggère d'utiliser String.format("<something>", i) dans l'appel de codage.

Mise à jour

Pour l'utiliser dans votre appel actuel, remplacez un appel à encoding(String str) par un appel à cette méthode. Vous recevrez une liste ordonnée avec tous les encodages.

J'ai pensé que vous n'étiez intéressé que par les valeurs octales - mon erreur, maintenant je pense que vous avez juste oublié l'encodage de la valeur 000009 dans votre exemple et donc supprimé l'irrationalité de l'octal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X