Partage
  • Partager sur Facebook
  • Partager sur Twitter

Traduction d'un algorithme

    28 mars 2022 à 16:37:13

    Bonjour, j'ai un exercice de traduction d'algo en c. Cependant je ne trouve pas mon erreur..

    Voici l'algo à  traduire : 

    Voici ce que j'ai fait :

    #include <stdio.h>
    #include <stdlib.h>
    
    unsigned int exercice(int n)
    {
    
        const int d = 42;
        unsigned int i;
        int r;
        r = d;
    
        for ( i = 1; i <= n; i++)
        {
            r = r - i;
    
            if (r == 0)
                r = d;
    
            printf("%d", r);
        }
        return r = r + (1+n)*n/2;
    }
    
    int main(int argc, char *argv[])
    {
        printf("%d", exercice(4));
        return 0;
    
    }



    J'obtiens le bon résultat pour exercice(4) mais pas pour exercice(9)..

    Merci pour votre aide :)

    -
    Edité par RomainBed 10 avril 2022 à 17:25:52

    • Partager sur Facebook
    • Partager sur Twitter
      28 mars 2022 à 16:54:21

      La seconde question, c'est ce que renvoie la fonction, pas ce qu'elle affiche.


      int foo()
      {
          printf("%d", 12);
          return 34;
      }



      -
      Edité par michelbillaud 29 mars 2022 à 7:15:40

      • Partager sur Facebook
      • Partager sur Twitter
        28 mars 2022 à 17:11:51

        Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).
        • Partager sur Facebook
        • Partager sur Twitter
        ...
          28 mars 2022 à 17:51:52

          Bonjour, Merci d'écrire un titre de sujet en fonction de votre problématique.

          Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
          Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

          Pour plus d'informations, nous vous invitons à lire les règles générales du forum

          Merci de colorer votre code à l'aide du bouton Code

          Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

          Merci de modifier votre message d'origine en fonction. En image cela donne :

          Mauvais titre

          Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

          Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

          De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

          Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

          Pour modifier votre titre, éditez le premier message de votre sujet.

          (titre originel : Exercice en c)

          Liens conseillés

          • Partager sur Facebook
          • Partager sur Twitter
            10 avril 2022 à 15:33:34

            michelbillaud a écrit:

            La seconde question, c'est ce que renvoie la fonction, pas ce qu'elle affiche.


            int foo()
            {
                printf("%d", 12);
                return 34;
            }

            -
            Edité par michelbillaud 29 mars 2022 à 7:15:40

            Comment je dois procéder pour trouver ce que renvoie exercice(9) ? A quoi correspond le code que vous avez envoyé ? 

            Merci

            -
            Edité par RomainBed 10 avril 2022 à 15:50:54

            • Partager sur Facebook
            • Partager sur Twitter
              10 avril 2022 à 15:52:42

              Si je peux me permettre une suggestion : essaie pour voir ce que ça donne.

              Parce que bon, je suis flatté de l'intérêt que tu portes à mon avis, mais c'est quand même mieux que tu vérifies tes idées par toi-même. 

              • Partager sur Facebook
              • Partager sur Twitter
                10 avril 2022 à 15:58:37

                michelbillaud a écrit:

                Si je peux me permettre une suggestion : essaie pour voir ce que ça donne.

                Parce que bon, je suis flatté de l'intérêt que tu portes à mon avis, mais c'est quand même mieux que tu vérifies tes idées par toi-même. 


                Je te remercie, mais c'est le principe du forum de donner des conseils non ? Je ne comprends pas la différence entre afficher et renvoyer dans l'exercice demandé.. :)
                • Partager sur Facebook
                • Partager sur Twitter
                  10 avril 2022 à 16:05:20

                  RomainBedouret a écrit:

                  Comment je dois procéder pour trouver ce que renvoie exercice(9) ?

                  Tu sais ce que veux dire "que renvoie" dans ce contexte ? Que renvoie cette fonction ? Valeur renvoyé par la fonction ? ...

                  C'est la valeur retournée par le return. La fonction de Michel renvoie la valeur 34 et elle affiche la valeur 12. 

                  C'est la valeur affichée par le printf de la fonction main de ton code originel, ligne 26.



                  • Partager sur Facebook
                  • Partager sur Twitter
                  ...
                    10 avril 2022 à 17:00:50

                    @RomainBedouret Bonjour, merci de modifier le titre de votre sujet comme demandé.

                    La modération

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 avril 2022 à 17:41:32

                      RomainBedouret a écrit:
                      > Je te remercie, mais c'est le principe du forum de donner des conseils non ?
                      michelbillaud t'a donné le conseil d'essayer par toi-même, non ?
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        10 avril 2022 à 17:53:26

                        PierrotLeFou a écrit:

                        RomainBedouret a écrit:
                        > Je te remercie, mais c'est le principe du forum de donner des conseils non ?
                        michelbillaud t'a donné le conseil d'essayer par toi-même, non ?

                        Bonjour Pierrot, la politesse tout de même.
                        Très bien, merci pour l'accueil.. Je ne savais pas qu'un forum d'aide pouvais nous dire de se débrouiller tout seul.. je vais suivre ce conseil alors.

                        Merci d'avoir au moins lu mes messages. Bonne fin de journée. 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 avril 2022 à 17:57:56

                          RomainBedouret a écrit:

                          je vais suivre ce conseil alors.

                          Et mon explication ne te convient pas non plus ? Si tu n'as pas compris, il faut le dire ! j’essaierais de le formuler autrement !

                          • Partager sur Facebook
                          • Partager sur Twitter
                          ...
                            10 avril 2022 à 18:12:24

                            rouIoude a écrit:

                            RomainBedouret a écrit:

                            je vais suivre ce conseil alors.

                            Et mon explication ne te convient pas non plus ? Si tu n'as pas compris, il faut le dire ! j’essaierais de le formuler autrement !

                            Excuse moi rouloude, je n'avais pas vu ton message. Donc si j'ai bien compris, si je veux return seulement une valeur il ne faut pas utiliser le printf ? Comment afficher la valeur alors ? Je ne comprends pas comment exercice(9) retourne 42..

                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 avril 2022 à 22:00:49

                              RomainBed a écrit:

                              Donc si j'ai bien compris, si je veux return seulement une valeur il ne faut pas utiliser le printf ? 

                              Je ne veux pas t’offenser, mais il serait peut-être nécessaire de suivre un cours sur le C.

                              Pour information printf sert à afficher du texte (ou des valeurs numériques) à l'écran. Son fonctionnement de base est expliqué dans tous les cours sur le C.

                              Quand on parle de retourner des valeurs, ça a rapport aux fonctions, si tu ne connais pas les fonctions, c'est aussi expliqué dans les cours sur le C.

                              Ce qui retourne la valeur c'est l'instruction return on la trouve dans les fonctions, cette instruction met fin à la fonction et retourne une valeur le cas échéant. Dans la fonction foo de Michel, elle retourne 34. dans la tienne elle retourne la valeur de la variable . Tu sais ce qu'est une variable ?

                              En dehors de cette fonction tu peux récupérer la valeur retournée en affectant l'appel de la fonction à une variable par exemple. Avec la fonction de Michel ça donne : 

                              int resultat = foo();

                              Après cette instruction resultat vaudra 34.





                              • Partager sur Facebook
                              • Partager sur Twitter
                              ...
                                11 avril 2022 à 1:20:37

                                RomainBed a écrit:
                                > Très bien, merci pour l'accueil.. Je ne savais pas qu'un forum d'aide pouvais nous dire de se débrouiller tout seul.. je vais suivre ce conseil alors.
                                Il ne s'agit pas de se débrouiller tout seul mais d'essayer les exemples qu'on te suggère parce qu'on croit que tu vas comprendre un peu plus de cette façon.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Le Tout est souvent plus grand que la somme de ses parties.

                                  11 avril 2022 à 9:00:19

                                  rouIoude a écrit:

                                  En dehors de cette fonction tu peux récupérer la valeur retournée en affectant l'appel de la fonction à une variable par exemple. Avec la fonction de Michel ça donne : 

                                  int resultat = foo();

                                  Après cette instruction resultat vaudra 34.

                                  Et si il s'agit d'afficher le résultat,  on fera

                                  printf("Le résultat vaut %d", foo());


                                  (Évitons d'induire l'idée qu'on récupère le résultat d'une fonction en passant par une variable. L'appel d'une fonction est une expression, qui retourne une valeur, dont on fait ce qu'on veut).

                                  Pour répondre a une autre question :  on est là pour aider à apprendre à programmer, activité consistant à se débrouiller à faire des trucs. On peut donner des conseils sur la manière de nager, mais celui qui veut apprendre doit se mettre à la flotte et bouger les bras.

                                  -
                                  Edité par michelbillaud 11 avril 2022 à 9:01:43

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    11 avril 2022 à 15:33:40

                                    Le programme codé en C ne fait pas ce qu'il est sensé faire, c'est à dire écrire (à l'écran) : "41, 39, 36, 32" lorsque l'on passe 4 en argument à la fonction.

                                    A l'exécution, le programme affiche "4139363242", dont les 8 premiers chiffres proviennent de l'exécution de la fonction exercice() et les deux derniers proviennent du main().

                                    Les types choisis ne sont pas bons non plus. Si mes souvenirs sont exacts :

                                    • les entiers naturels (ou ℕ) sont l'ensemble des entiers positifs ou nul, ce qui pourrait correspondre à unsigned int
                                    • et les entiers relatifs (ou ℤ) l'ensemble des entiers positifs ou négatifs ou nul, ce qui pourrait correspondre à int

                                    L'incohérence des types choisis génère d'ailleurs un avertissement à la compilation avec les options adéquates :

                                    $ gcc -Wall -Wextra 20220411.c
                                    20220411.c: In function ‘exercice’:
                                    20220411.c:12:20: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]
                                         for ( i = 1; i ﹤= n; i++)
                                                        ^~
                                    

                                    Une traduction littérale de l'algorithme aboutit aussi à quelque chose de difficile à tester en mélangeant dans une seule fonction ce qui est en charge d'effectuer le calcul, et ce qui est interaction avec l'utilisateur (affichage à l'écran). En traduisant moins littéralement, on pourrait créer une fonction permettant de tester ce qui est envoyé à l'affichage sur l'écran en vérifiant qu'il s'agit bien du contenu exactement attendu.

                                    #include <stdio.h>
                                    #include <string.h>
                                    #include <assert.h>
                                    
                                    #define MAX_STR 256
                                    
                                    /**
                                     * valeurs_de_r() - calcul des valeurs de r
                                     * @st:   chaîne où seront stockées les valeurs successives de r
                                     *        séparées par des virgules
                                     * @iter: nombre d'itérations
                                     *
                                     * return: valeur finale de r
                                     */
                                    int valeurs_de_r(char * st, unsigned int iter) {
                                            const unsigned int d = 42;
                                            int r = d;
                                            char temp_st[MAX_STR];
                                    
                                            for (unsigned int i = 1; i <= iter; i++) {
                                                    r = r - i;
                                                    if (r == 0)
                                                            r = d;
                                                    sprintf(temp_st, "%d", r);
                                                    strcat(st, temp_st);
                                                    if (i != iter) {
                                                            sprintf(temp_st, ", ");
                                                            strcat(st, temp_st);
                                                    }
                                            }
                                            return r;
                                    }
                                    
                                    int exercice(unsigned int n) {
                                            char st[MAX_STR] = "";
                                    
                                            int r = valeurs_de_r(st, n);
                                            printf("Les valeurs successives de r, pour n = %d sont : %s\n", 
                                                    n, st);
                                            return r = r + (1+n)*n/2;
                                    }
                                    
                                    int main(void) {
                                            { /* test 1 */
                                            unsigned int iter = 4;
                                            char st[MAX_STR] = "";
                                            valeurs_de_r(st, iter);
                                            assert(strcmp(st, "41, 39, 36, 32") == 0
                                                    && "Pour un argument de 4 les valeurs successives de r sont 41, 39, 36, 32");
                                            }
                                    
                                            { /* test 2 */
                                            unsigned int iter = 9;
                                            assert(exercice(iter) == 42
                                                    && "Pour un argument de 9 l'algorithme retourne 42");
                                            }
                                    
                                            return 0;
                                    }
                                    

                                    Edit : typos

                                    Note : le code ne vérifie pas le débordement de capacité de la chaîne

                                    -
                                    Edité par Dlks 11 avril 2022 à 16:49:06

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      11 avril 2022 à 18:31:52

                                      On ne connait pas le niveau d'exigence voulu, pour l'adéquation du programme et de l'algorithme.

                                      On peut dire que (unsigned) int et représentent les entiers (naturels), mais d'un autre côté ils ne les représentent pas tous. Ca se fait dans le cadre de limites d'implémentation.

                                      Alors, l'algorithme est censé prendre comme paramètre un entier naturel, est-ce que pour autant il doit être représenté par un type non signé, faut voir.

                                      Les joies des exercices à la con.

                                      -
                                      Edité par michelbillaud 11 avril 2022 à 18:33:14

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        11 avril 2022 à 19:44:22

                                        Salut Michel,

                                        > Alors, l'algorithme est censé prendre comme paramètre un entier naturel, est-ce que pour autant il doit être représenté par un type non signé, faut voir.

                                        RomainBed semble vouloir suivre les indications sur les types mentionnés dans son "algorithme" (si on peut appeler cela comme çà), en affectant à certaines données un type int et à d'autres un type unsigned int ... sauf qu'il le fait à l'envers dans la plupart des cas. A titre d'exemple, puisque tu parles de la signature de la fonction, selon l'énoncé son paramètre est de "type" ℕ et la fonction retourne un "type" ℤ, toujours selon le même énoncé, alors que RomainBed propose une fonction unsigned int exercice(int n).

                                        Il y a manifestement un problème de cohérence dans son code, quelque soit le degré d'adéquation attendu du programme et de l'algorithme.

                                        Le code que je propose vise aussi à mettre en évidence, par une approche par les tests, qu'une conception du code plus découplée, permet de tester les comportements attendus dans les 2 tests, qui testent des choses différentes.

                                        C'est juste une illustration imparfaite, probablement surdimensionnée pour un exercice à la con :-)

                                        -
                                        Edité par Dlks 11 avril 2022 à 19:50:02

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          12 avril 2022 à 7:15:23

                                          Je dirais que l'histoire de Z vs N, c'est essentiellement un distracteur par rapport aux points principaux de l'exercice

                                          • Traduire bêtement boucles, affectation etc
                                          • Différencier affichage et valeur de retour

                                          Mettre des entiers signés partout, ca fait une fonction qui calcule la même chose en pratique.  Comme on ne fait pas de trucs chelous avec des grands nombres / les negatifs, c'est juste qu'on se passe du controle de type à la compilation.

                                          Bref, on peut aussi considérer que la distinction N Z dans l'algorithme est un élément de documentation.

                                          Après, les problèmes dans son code, c'est normal pour un débutant, surtout si il laisse traîner 15 jours son exercice, qu'il ne lit pas ce qu'on écrit et qu'il râle quand on lui dit, horreur, qu'il doit se prendre par la main et tester lui même ses propositions. 

                                          -
                                          Edité par michelbillaud 12 avril 2022 à 7:23:25

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            13 avril 2022 à 21:49:33

                                            Bonsoir, 

                                            Merci pour votre aide.

                                            En effet, je débute dans ce langage.. grâce à vos conseils, j'ai pu obtenir le résultat voulu. 

                                            Je m'excuse si j'ai eu les mots un peu déplacés.

                                            Bonne soirée.

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Traduction d'un algorithme

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown