Exercice d'algorithmique

Exemples inclassables dans les sous-forums précédents...
... et des trucs et astuces à connaitre.
Règles du forum
ATTENTION ! Il est demandé de ne déposer dans ce forum que des exemples en langage Asymptote
  • finalisés
  • que l'on pense intéressants et optimisés
  • et qui se rapportent au thème du forum.
Si certains exemples déposés donnent lieu à de nombreuses modifications, ils seront déplacés et remplacés par un nouveau sujet dans ce forum avec la ou les meilleures propositions.
Pour les demandes d'aide ... il y a un forum spécifique !
mumblee
Messages : 48
Enregistré le : jeu. 11 mars 2010, 10:29
Localisation : Lille

Exercice d'algorithmique

Message non lu par mumblee » lun. 22 avr. 2024, 11:09

Bonjour,

Pour un sujet de BTS SIO 1re année, j'ai pris un exercice dans le manuel Dunod 2015, Mathématiques pour l'informatique et refait les figures avec asymptote. Le trajet d'une bille dans un quadrillage est codé par un nombre binaire où le 0 et le 1 codent chacun une direction. Ci-dessous, le code complet de l'exercice (il me semblait qu'il y avait une rubrique "exercice complet" auparavant mais comme je viens ici ponctuellement, elle a peut-être été renommée ou fusionnée avec une autre).
  • Code LaTeX de l'exercice

    Code : Tout sélectionner

    \documentclass[12pt,french,fleqn]{article}%
    
    \usepackage[paper=a4paper, portrait=true, twoside=false, left=1.5cm,
    top=1.5cm, noheadfoot, includeall, nomarginpar,
    centering=true]{geometry}%
    
    \usepackage{babel}%
    \usepackage{datenumber}%
    
    \usepackage[utf8]{inputenc}%
    \usepackage[T1]{fontenc}%
    \usepackage[largesmallcaps,frenchstyle]{kpfonts}%%
    
    \usepackage{enumitem}%
    \usepackage{graphicx}%
    
    \begin{document}
    \setlength{\parindent}{0mm}%
    \setlength{\mathindent}{1em}%
    \pagestyle{empty}%
    
    \newlength{\vertical}%
    \settoheight{\vertical}{2ex}%
    
    \setdate{2024}{04}{22}%
    
    % Manuel BTS SIO, Dunod 2015%
    % Chapitre 1 Arithmétique%
    % Exercice 1.26 pp 18-19 %
    \textbf{Exercice}
    
    On crée un jeu simple sur un ordinateur : une bille est installée au
    \og départ\fg{}, en bas à gauche, d'une grille représentée ci-dessous
    dans la figure \no 1. On doit la faire rejoindre \og l'arrivée\fg{},
    en haut à droite, en utilisant uniquement des déplacements vers la
    droite et vers le haut.
    
    \begin{center}
      \begin{tabular}{c@{\hspace{1cm}}c}
        \includegraphics{ExerciceBille_fig1}
        &
        \includegraphics{ExerciceBille_fig2}
        \\
        Figure \no 1 : grille à parcourir
        &
        Figure \no 2 : exemple de trajet
      \end{tabular}
    \end{center}
    
    Pour programmer ce jeu, on associe à chaque parcours un nombre entier
    de la manière suivante :
    \begin{itemize}[leftmargin=*,nosep]
    \item Chaque déplacement vers le haut est noté 0 et chaque déplacement
      vers la droite est noté 1.
    \item On obtient alors un nombre de 8 chiffres écrit en binaire.
    \item On convertit ensuite ce nombre en base 10.
    \end{itemize}
    
    Par exemple, pour le parcours représentée sur la figure \no 2
    ci-dessus, on obtient le nombre entier 105. En effet, les déplacements
    sont : haut, droite, droite, haut, droite, haut, haut, droite. Ce qui
    donne le nombre binaire $(01101001)_2$ qui est égal au nombre décimal
    $(105)_{10}$.  \vspace{\vertical}
    
    \begin{enumerate}
    \item On considère le parcours de la figure \no 3 ci-dessous.
      \begin{enumerate}[nosep]
      \item Donner le nombre en base 2 associé à ce parcours. % 10011001
      \item Donner l'écriture en base 10 de ce nombre. % 153
      \end{enumerate}
    \item
      \begin{enumerate}[nosep]
      \item Écrire en base 2 le nombre entier $(85)_{10}$. % 01010101
      \item Représenter le parcours correspondant à ce nombre sur la
        figure \no 4 ci-dessous.
      \end{enumerate}
      \begin{center}
        \begin{tabular}{c@{\hspace{1cm}}c}
          \includegraphics{ExerciceBille_fig3}
          &
          \includegraphics{ExerciceBille_fig4}
          \\
          Figure \no 3 : parcours à coder.
          &
          Figure \no 4 : parcours à tracer.
        \end{tabular}
      \end{center}
    \item On considère un parcours sur cette grille et on note $N$ le
      nombre associé écrit en base 10.
      \begin{enumerate}[nosep]
      \item Est-il possible d'avoir $N=31$
        ? % Non, 31=00011111. Cela correspond à 5 déplacement vers la droite.
      \item Quelle est la plus petite valeur possible pour $N$
        ? % 00001111=15
      \item Quelle est la plus grande valeur possible pour $N$
        ? % 11110000=240
      \end{enumerate}
    \end{enumerate}
    
    \end{document}
    
  • Code asymptote des figures respectives ExerciceBille_fig1, ExerciceBille_fig2, ExerciceBille_fig3, ExerciceBille_fig4. Une seule aurait suffit : de l'une à l'autre les changements sont le tracé ou non du trajet, ainsi que son codage à l'aide du tableau d'entiers t.

    Code : Tout sélectionner

    import fabrice;
    defaultpen(fontsize(12pt));
    usepackage("kpfonts",options="largesmallcaps,frenchstyle");
    unitsize(1cm);
    
    // Dimensions
    int n=4;
    real ecart=0.1, epaisseur=0.2;
    
    // Carrés intérieurs
    for (int i=0; i<n; ++i){
      for (int j=0; j<n; ++j){
        filldraw(shift((i,j)+(ecart,ecart))*scale(1-2*ecart)*unitsquare,heavygray,black);
      }
    }
    
    // Bords
    filldraw(shift((ecart,-ecart-epaisseur))*xscale(n+epaisseur)*yscale(epaisseur)*unitsquare,heavygray,black); // Bas
    filldraw(shift((n+ecart,-ecart))*xscale(epaisseur)*yscale(n)*unitsquare,heavygray,black); // Droite
    filldraw(shift((-ecart-epaisseur,ecart))*xscale(epaisseur)*yscale(n+epaisseur)*unitsquare,heavygray,black); // Gauche
    filldraw(shift((-ecart,n+ecart))*xscale(n)*yscale(epaisseur)*unitsquare,heavygray,black); // Haut
    
    // Départ et arrivée
    label("Départ",(0,0),SW);
    label("Arrivée",(n,n),NE);
    
    // Bille
    filldraw(scale(ecart/2)*unitcircle,heavygray,black);
    
    // defaultpen(linewidth(1pt));
    
    // // Déplacements
    // int[] t={0,1,1,0,1,0,0,1};
    // pair depart=(0,0), haut=(0,1), droite=(1,0);
    // for (int i; i<t.length; ++i){
    //   if (t[i]==0){
    //     draw(depart--(depart+haut),Arrow(1.5mm));
    //     depart=depart+haut;
    //       } else {
    //     draw(depart--(depart+droite),Arrow(1.5mm));
    //     depart=depart+droite;
    //       }
    // }
    

    Code : Tout sélectionner

    defaultpen(fontsize(12pt));
    usepackage("kpfonts",options="largesmallcaps,frenchstyle");
    unitsize(1cm);
    
    // Dimensions
    int n=4;
    real ecart=0.1, epaisseur=0.2;
    
    // Carrés intérieurs
    for (int i=0; i<n; ++i){
      for (int j=0; j<n; ++j){
        filldraw(shift((i,j)+(ecart,ecart))*scale(1-2*ecart)*unitsquare,heavygray,black);
      }
    }
    
    // Bords
    filldraw(shift((ecart,-ecart-epaisseur))*xscale(n+epaisseur)*yscale(epaisseur)*unitsquare,heavygray,black); // Bas
    filldraw(shift((n+ecart,-ecart))*xscale(epaisseur)*yscale(n)*unitsquare,heavygray,black); // Droite
    filldraw(shift((-ecart-epaisseur,ecart))*xscale(epaisseur)*yscale(n+epaisseur)*unitsquare,heavygray,black); // Gauche
    filldraw(shift((-ecart,n+ecart))*xscale(n)*yscale(epaisseur)*unitsquare,heavygray,black); // Haut
    
    // Départ et arrivée
    label("Départ",(0,0),SW);
    label("Arrivée",(n,n),NE);
    
    // Bille
    filldraw(scale(ecart/2)*unitcircle,heavygray,black);
    
    defaultpen(linewidth(1pt));
    
    // Déplacements
    int[] t={0,1,1,0,1,0,0,1};
    pair depart=(0,0), haut=(0,1), droite=(1,0);
    for (int i; i<t.length; ++i){
      if (t[i]==0){
        draw(depart--(depart+haut),Arrow(1.5mm));
        depart=depart+haut;
          } else {
        draw(depart--(depart+droite),Arrow(1.5mm));
        depart=depart+droite;
          }
    }
    

    Code : Tout sélectionner

    defaultpen(fontsize(12pt));
    usepackage("kpfonts",options="largesmallcaps,frenchstyle");
    unitsize(1cm);
    
    // Dimensions
    int n=4;
    real ecart=0.1, epaisseur=0.2;
    
    // Carrés intérieurs
    for (int i=0; i<n; ++i){
      for (int j=0; j<n; ++j){
        filldraw(shift((i,j)+(ecart,ecart))*scale(1-2*ecart)*unitsquare,heavygray,black);
      }
    }
    
    // Bords
    filldraw(shift((ecart,-ecart-epaisseur))*xscale(n+epaisseur)*yscale(epaisseur)*unitsquare,heavygray,black); // Bas
    filldraw(shift((n+ecart,-ecart))*xscale(epaisseur)*yscale(n)*unitsquare,heavygray,black); // Droite
    filldraw(shift((-ecart-epaisseur,ecart))*xscale(epaisseur)*yscale(n+epaisseur)*unitsquare,heavygray,black); // Gauche
    filldraw(shift((-ecart,n+ecart))*xscale(n)*yscale(epaisseur)*unitsquare,heavygray,black); // Haut
    
    // Départ et arrivée
    label("Départ",(0,0),SW);
    label("Arrivée",(n,n),NE);
    
    // Bille
    filldraw(scale(ecart/2)*unitcircle,heavygray,black);
    
    defaultpen(linewidth(1pt));
    
    // Déplacements
    int[] t={1,0,0,1,1,0,0,1};
    pair depart=(0,0), haut=(0,1), droite=(1,0);
    for (int i; i<t.length; ++i){
      if (t[i]==0){
        draw(depart--(depart+haut),Arrow(1.5mm));
        depart=depart+haut;
          } else {
        draw(depart--(depart+droite),Arrow(1.5mm));
        depart=depart+droite;
          }
    }
    

    Code : Tout sélectionner

    defaultpen(fontsize(12pt));
    usepackage("kpfonts",options="largesmallcaps,frenchstyle");
    unitsize(1cm);
    
    // Dimensions
    int n=4;
    real ecart=0.1, epaisseur=0.2;
    
    // Carrés intérieurs
    for (int i=0; i<n; ++i){
      for (int j=0; j<n; ++j){
        filldraw(shift((i,j)+(ecart,ecart))*scale(1-2*ecart)*unitsquare,heavygray,black);
      }
    }
    
    // Bords
    filldraw(shift((ecart,-ecart-epaisseur))*xscale(n+epaisseur)*yscale(epaisseur)*unitsquare,heavygray,black); // Bas
    filldraw(shift((n+ecart,-ecart))*xscale(epaisseur)*yscale(n)*unitsquare,heavygray,black); // Droite
    filldraw(shift((-ecart-epaisseur,ecart))*xscale(epaisseur)*yscale(n+epaisseur)*unitsquare,heavygray,black); // Gauche
    filldraw(shift((-ecart,n+ecart))*xscale(n)*yscale(epaisseur)*unitsquare,heavygray,black); // Haut
    
    // Départ et arrivée
    label("Départ",(0,0),SW);
    label("Arrivée",(n,n),NE);
    
    // Bille
    filldraw(scale(ecart/2)*unitcircle,heavygray,black);
    
    // // Déplacements
    // int[] t={1,1,1,1,0,0,0,0}; // Plus grande valeur
    // int[] t={0,0,0,0,1,1,1,1}; // Plus petite valeur
    // pair depart=(0,0), haut=(0,1), droite=(1,0);
    // for (int i; i<t.length; ++i){
    //   if (t[i]==0){
    //     draw(depart--(depart+haut),Arrow(1mm));
    //     depart=depart+haut;
    //       } else {
    //     draw(depart--(depart+droite),Arrow(1mm));
    //     depart=depart+droite;
    //       }
    // }
    
ExerciceBille.pdf
Le résultat obtenu.
(35.41 Kio) Téléchargé 4 fois
Je suis preneur de toute remarque sur le code :-)
Fabrice Eudes
Debian Bullseye 11.4, Asymptote 2.79, texlive 2022, Emacs 27.1

Répondre