Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Candidat au Club
    Identifiez la clé de contrôle d’un nombre entier n
    Bonjour , je sollicite votre aide pour une correction de mon code , car il ne compile pas Merci .

    Identifiez la clé de contrôle d’un nombre entier n. La clé de contrôle sera calculée en ajoutant chaque chiffre de n de manière répétitive et en remplaçant n par la somme calculée de manière répétitive.

    Input : un nombre entier n > 0.
    Output : un nombre entier result. La sortie doit être formattée avec un caractère de retour à la ligne (ou retour-chariot) en fin de ligne (voir le code déjà donné).

    Exemple :
    Pour n = 3429 la somme des chiffres est 18, pour 18 la somme est 9, et 9 est la clé de contrôle de 3429.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.util.Arrays;
    public class Main {
        /* The name of the class has to be Main. */
        public static void main(String[] args) {
            BufferedReader in;
            try {
                in = new BufferedReader(new FileReader(new File(args[0])));
                String line = null;
                int i = 0;
                int result = -1;
                line = in.readLine();
                int n = Integer.valueOf(line);
     
                System.out.println(result);
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }

  2. #2
    Modérateur

    Salut,

    Quel est le message d'erreur de compilation ? Le fichier source s'appelle-t-il bien Main.java ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Candidat au Club
    Determiner la clé de contrôle d'un nombre entier n
    bonjour et merci pour votre message , en effet le but de l'exercices est : La clé de contrôle sera calculée en ajoutant chaque chiffre de n de manière répétitive et en remplaçant n par la somme calculée de manière répétitive.

    Input : un nombre entier n > 0.
    Output : un nombre entier result. La sortie doit être formattée avec un caractère de retour à la ligne (ou retour-chariot) en fin de ligne (voir le code déjà donné).

    par Exemple :
    Pour n = 3429 la somme des chiffres est 18, pour 18 la somme est 9, et 9 est la clé de contrôle de 3429

    oui mon fichier source est bien la class Main

    et apres compilation jai les données ci :


  4. #4
    Modérateur

    Si tu as des données en résultat, c'est que ton programme compile. Alors, pourquoi tu dis :

    Citation Envoyé par doudou1234 Voir le message
    car il ne compile pas


    Après c'est sûr que vu le code que tu nous montres ça ne fait pas ce que l'énoncé demande qu'il fasse, vu que le code en question ne fait que lire un nombre dans un fichier, le convertir en int, et afficher la valeur -1 ! Et cela correspond bien au résultat de test que tu montres dans ton dernier message !

    Qu'attends-tu de nous ? Nous on veut bien t'aider à résoudre les problèmes que tu peux rencontrer lors de l'implémentation du code que tu as à faire. Mais commence par faire quelque chose. A commencer par essayer d'appliquer ce qui est indiqué assez explicitement dans l'énoncé : boucles et tests.

    Après si c'est pour parcourir les chiffres d'un nombre que tu bloques, il y a deux méthodes principales :
    1. faire des divisions successives par 10, et récupérer le reste. Donc opérateur modulo.
    2. Transformer le nombre en chaîne de caractères et parcourir les caractères. Dans la mesure où au début, tu commences à lire le nombre de départ depuis une chaîne de caractères, ça me semlbe l'approche la plus logique et la plus simple.
      Dans ton code tu commence par transformer la valeur d'entrée (input) en int : à la place de ça, part directement de la chaîne de caractères, parcours ses différents caractères dans une boucle, et transforme chaque caractère en int, ce qui te permettra d'en faire la somme.
    3. autre évidence explicite de l'énoncé : l'aspect récursif. Lorsqu'on a calculé la somme de tous les chiffres, on réapplique l'algo sur cette somme... Donc la première question à se poser : quelle est la condition d'arrêt de la récursivité ? Comment la mettre en évidence par rapport à la façon de traiter une entrée (donc une chaîne de caractères)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Candidat au Club
    Determiner la clé de contrôle d'un nombre entier n
    Bonsoir , j'essai d'appliquer le cas d'exemple de l'énoncé à savoir
    entrée un nombre n>0 , exemple : n = 3429 , la somme des chiffres est 18, pour 18 la somme est 9, et 9 est la clé de contrôle de 3429

    mais je ne sais pas comment m'y prendre

  6. #6
    Modérateur

    Ignorons d'abord la problématique de l'entrée (si la donnée vient d'un fichier, ou si faut la saisir au clavier ou autre, peu importe).

    Donc, en dur :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    String n = "3429";


    Tu dois calculer la somme des chiffres de n. Je t'ai dit qu'il fallait faire une boucle sur tous les caractères. Commence par écrire cette boucle, à récupérer un à un les caractères, les convertir en int, et en faire la somme :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int somme = 0;
    for(int i=0; i<n.length(); i++) {
       int chiffre = n.charAt(i)-'0'; // prendre la valeur numérique du caractère à la position i 
       somme += chiffre; // l'ajouter à la somme
    }
    // somme vaut la somme des chiffres de n 
    System.out.println(somme); // affiche 18

    Ce n'est pas très compliqué, si ?

    Et bien maintenant, tu dois recommencer ça tel que n prenne la valeur String qui représente la valeur somme... et un certain nombre de fois. Jusqu'à atteindre une conditiond d'arrêt. Je t'ai demandé laquelle, à ton avis, sous-entendu, dans mon dernier message...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Candidat au Club
    Determiner la clé de contrôle d'un nombre entier n
    Bonsoir Joel et merci de vouloir m'aider mais je n'arrive pas à comprendre les éléménts de reponses que tu as posé:
    dans mon code j'ai déja initialisé une variable n ( int n = Integer.valueOf(line) ; je ne vois pas l'interêt de rentrer et initiliser n en dure " (String n = "3429");

    et en plus lors de mes tests sur eclipse j'ai un code erreur ;" error encoding int chiffre = n.charAt(i)-'0';

    voila

  8. #8
    Modérateur

    Citation Envoyé par doudou1234 Voir le message
    je n'arrive pas à comprendre les éléménts de reponses que tu as posé:
    dans mon code j'ai déja initialisé une variable n ( int n = Integer.valueOf(line) ; je ne vois pas l'interêt de rentrer et initiliser n en dure "
    Il faut lire attentivement ce que j'ai écrit :

    Citation Envoyé par joel.drigo Voir le message
    Ignorons d'abord la problématique de l'entrée (si la donnée vient d'un fichier, ou si faut la saisir au clavier ou autre, peu importe).
    L'intérêt c'est de ce concentrer sur la partie que tu n'arrives pas à faire, le calcul qu'on te demande. La lecture de la donnée d'entrée dans le fichier j'ai bien vu que tu savais la faire. Mais on s'en fout de comment tu la lis. Ce qui est important c'est faire le calcul pour arriver au résultat qu'on te demande de calculer !

    Ensuite je te donne on ne peut plus explicitement la première itération de l'algorithme et je t'ai écrit en toutes lettres que tu dois recommencer le calcul autant de fois que nécessaire. Et je te pose une question pour la seconde fois. A la quelle tu ne réponds toujours pas. A partir de là, je ne vois pas moi l'intérêt de continuer à chercher à te mettre sur la voie si tu ne daignes pas répondre à une question que je te pose et qui est cruciale à l'établissement de l'algorithme final.

    Citation Envoyé par doudou1234 Voir le message

    et en plus lors de mes tests sur eclipse j'ai un code erreur ;" error encoding int chiffre = n.charAt(i)-'0';
    Forcément si tu continues à déclarer n en int, n.charAt(i) ça ne peut pas fonctionner ! (Maintenant, "error encoding", je ne vois pas le rapport. Probablement un truc avec l'encoding de ton fichier et l'éditeur que tu utilises.)

    Je t'ai pourtant écrit :

    Citation Envoyé par joel.drigo Voir le message

    Dans ton code tu commence par transformer la valeur d'entrée (input) en int : à la place de ça, part directement de la chaîne de caractères, parcours ses différents caractères dans une boucle, et transforme chaque caractère en int, ce qui te permettra d'en faire la somme.
    et
    Citation Envoyé par joel.drigo Voir le message
    Je t'ai dit qu'il fallait faire une boucle sur tous les caractères.
    L'intérêt il est là : partir d'un int ce n'est pas la bonne manière de faire. Parce que tu dois faire la somme de tous les chiffres du nombre ! Tu lis un String depuis le fichier. Ne le convertis pas en int. Utilise le String directement ! Et applique ce que je t'ai donné comme code.

    Je ne vois pas ce que je peux dire de plus pour t'aider. Je t'ai tout donné pour résoudre le problème. Sauf la réponse à la question que je t'ai posée, parce que je n'ai pas l'intention de tout faire à ta place. La réponse n'est pas compliquée à trouver : elle est implicitement dans l'énoncé du problème, déductible du résultat qu'on te donne à calculer (9).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Candidat au Club
    Determiner la clé de contrôle d'un nombre entier n
    Bonjour et merci pour votre aide et vos explications , je n'y arrive vraiment pas , je vais réviser mes cours et faire d'autres exercices , en espérant pouvoir compenser certaines de mes lacunes .
    merci beaucoup et bonne journée

  10. #10
    Membre habitué
    Bonjour,

    @doudou1234 : Etant en apprentissage de Java pour un usage personnel, j'ai trouvé cet exercice intéressant. J'ai l'ai donc réalisé et tout fonctionne correctement : j'ouvre un fichier passé en argument, je lis chaque ligne du fichier, et, pour chaque valeur lue, je calcule la clé de contrôle en utilisant la récursivité. J'ai mis moins de 45 minutes pour réaliser l'exercice (analyse, algo, écriture du code Java) ... et ce, sans avoir tes cours !!! Mon code n'est sûrement pas optimisé et professionnel mais il fonctionne parfaitement et répond au besoin initial de l'exercie. Je ne comprends donc vraiment pas ce que tu n'arrives pas à faire Relis bien tout ce que joel.drigo t'as répondu : tu as toute la solution ... je m'en suis d'ailleurs très fortement inspiré pour ne pas dire que je l'ai carrément copiée

    @joel.drigo : malgré quelques recherches (que je n'ai sûrement pas réalisées correctement), je n'ai pas trouvé d'explications sur :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    int chiffre = n.charAt(i)-'0';


    A quoi correspond -'0' ? Est-ce dû à une histoire d'encodage de caractères ? ... J'ai remarqué que sans cela, le charAt ne renvoyait pas une valeur correcte ...

    @+

  11. #11
    Modérateur

    Citation Envoyé par inforock Voir le message

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    int chiffre = n.charAt(i)-'0';


    A quoi correspond -'0' ? Est-ce dû à une histoire d'encodage de caractères ? ... J'ai remarqué que sans cela, le charAt ne renvoyait pas une valeur correcte ...

    n.charAt(i) retourne le caractère situé à la position i dans la chaîne n. La chaîne n ne contenant que des chiffres, on obtient donc un caractère parmi, '0', '1', '2', '3'...'9'. Un char est en réalité stocké en mémoire (ici dans la variable) sous la forme d'un int, qui est un code (code faisant partie de l'encodage utilisé par Java pour stocker les caractères en interne, l'encodage UTF-16. Pour les chiffres, on peut se limiter au code ASCII, sous-ensemble de l'UTF-16).
    On peut voir facilement ces codes par :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char[] digits= {'0','1','2','3','4','5','6','7','8','9'};
    for(char c :  digits) {
        System.out.println(c+": "+(int)c);
    }

    0: 48
    1: 49
    2: 50
    3: 51
    4: 52
    5: 53
    6: 54
    7: 55
    8: 56
    9: 57
    Lorsqu'on écrit c-'0' (avec c un char), Java calcule la différence entre les valeurs int des deux caractères. Donc si c vaut '0', on obtient '0'-'0', soit 48-48, soit 0. '1'-'0', donc 49-48, soit 1. '2'-'0' donne 2, etc. On obtient donc la valeur du chiffre représenté par le char.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char[] digits= {'0','1','2','3','4','5','6','7','8','9'};
    for(char c :  digits) {
        System.out.println(c+": "+(c-'0'));
    }

    0: 0
    1: 1
    2: 2
    3: 3
    4: 4
    5: 5
    6: 6
    7: 7
    8: 8
    9: 9

    Ce qu'on cherche bien à connaître pour faire la somme des chiffres du nombre en entrée (sous forme de la chaîne de caractères).

    PS: A noter que la récursivité est l'approche logique déduite du fait que chaque résultat (de somme des chiffres) devient une entrée pour un nouveau calcul identique, jusqu'à ce qu'on ait atteint une condition d'arrêt. Toute fonction récursive peut être mise à plat (sous forme de boucle itérative), avec plus ou moins de difficulté selon la fonction. Ici, elle est très simple à mettre en place. L'étape donc finale est de transformer la fonction récursive en boucle itérative.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Membre habitué
    Bonsoir Joël,

    Un grand merci pour ces explications claires et précises. Je comprends mieux maintenant l'histoire du -'0'

    Ah les appels récursifs de fonctions : la 1ère que j'ai mise en oeuvre est le calcul d'une factorielle durant mes études (bac H et IUT) il y a disons ... quelques décennies (presque 35 ans déjà !) .

    Ce serait bien que doudou1234 donne sa solution de cet exercice ...

    Encore merci et bonne soirée.

    @+