\begin{filecontents*}{RoueCesar.mp}

%input newcourbes;
%input couleur;
input geometriesyr16;
%input TEX;
%input latexmp;



verbatimtex
%&latex
\documentclass{article}
\usepackage[upright]{fourier}
\usepackage{preambule}
\begin{document}
etex

beginfig(1);

  vardef Cesar(expr d) =
    
  
  
  pair o;
  o:=(-5cm,0);
  path c;
  c:=fullcircle  scaled 5cm shifted(-5cm,0);
  draw c withpen pencircle scaled 1.3bp withcolor blue ;

  for i=0 upto 25 :
    numeric r;
    r:=(i+d) mod 26;
   label(char(65+i),pointarc(c,90-i*360/26)) rotatedaround(pointarc(c,90-i*360/26),-i*360/26) shifted 0.1(pointarc(c,90-i*360/26)-o);
   label(char(65+r ),pointarc(c,90-i*360/26)) rotatedaround(pointarc(c,90-i*360/26),-i*360/26) shifted -0.1(pointarc(c,90-i*360/26)-o) withcolor green;
  endfor;
  


  enddef;

  Cesar(3);
  
endfig;


end



\end{filecontents*}



\documentclass[10pt,a4paper]{report}
\usepackage[height=250mm,width=183mm]{geometry}
\usepackage{preambule}
\usepackage[upright]{fourier}



\usepackage{keystroke}

\entete{Programmation XCAS 2- \NomLecon }{\thesec - \NomSection}{Lycée Jean Perrin -
 Atelier de programmation}

\graphicspath{{/home/moi/Photos/Tehessin/}{/home/moi/Figures/FigSTI/}}



\usepackage{listings}

\lstloadlanguages{XCAS}
\lstset{numbers=none,language=XCAS,%
keywordstyle =\color{0.4white}\bfseries,%basicstyle=\sffamily,%\small,
    backgroundcolor=\color{0.9white}}
   




\setlength{\parindent}{0mm}

\begin{document}

\thispagestyle{empty}

\setcounter{NumLecon}{1}

\TITRE{}{Programmation }{Manipulation de }{chaînes de caractères}{}{notice.eps}





\vspace{1cm}







\section{Que voulons-nous que l'ordinateur fasse~?}

Nous  voudrions créer  une chaîne  de caractères  à partir  des éléments
d'une autre chaîne en vu de coder/décoder des messages.


\subsection{Qu'est-ce qu'une chaîne de caractère}

C'est un ensemble ordonné, écrit entre guillemets et contenant un certain nombre d'éléments.

Par exemple, on crée la chaîne C1

\begin{lstlisting}
C1:="wxcvbn12345* !+#-"
\end{lstlisting}

\begin{figure}
              \begin{DANGER}
               Notez que les éléments de la chaîne peuvent être tout à fait quelconques et sont considérés
par l'ordinateur comme des sigles sans significations particulière.
               \end{DANGER}
               \end{figure}

On peut créer également une chaîne vide


\begin{lstlisting}
V:=""
\end{lstlisting}

à ne pas confondre avec la chaîne contenant un espace

\begin{lstlisting}
W:=" "
\end{lstlisting}

\begin{figure}
              \begin{DANGER}
  Une espace n'est pas le vide...
 \end{DANGER}
               \end{figure}



\subsection{Opérations sur les chaînes}

Comme une chaîne est ordonnée, ses éléments ont chacun un rang.

Regardez par exemple ce que donne~:

\begin{lstlisting}
C1[2];
C1[1];
W[0];
\end{lstlisting}

\begin{figure}
              \begin{DANGER}
  XCAS commence à compter à partir de zéro~!
 \end{DANGER}
               \end{figure}



% \begin{lstlisting}
% V[0]
% \end{lstlisting}




On peut obtenir la taille d'une chaîne avec la commande \code{size} qui donne le nombre d'éléments 
de la chaîne

\begin{lstlisting}
size(C1)
\end{lstlisting}

\begin{lstlisting}
size(V)
\end{lstlisting}


\begin{lstlisting}
size(W)
\end{lstlisting}

Si on a oublié un terme, on peut le rajouter à la fin de la liste avec la commande \code{concat(chaîne,élément)}


\begin{lstlisting}
concat(C1,u)
\end{lstlisting}

On dit qu'on \emph{concatène} la chaîne C1 avec la chaîne ``u''.










\section{Reste de la division euclidienne}

Nous allons bientôt traiter abondamment la division, mais vous savez déjà que, par exemple, le
reste de la division euclidienne de 37 par 5 est...

\begin{lstlisting}
irem(37,5)
\end{lstlisting}


\section{Pour...allant de...à...faire...}

On veut calculer la somme des  entiers naturels de 0 à 50\footnote{Il existe une fonction
  XCAS qui le fait directement, mais là n'est pas le problème...}.

En fait, nous voulons calculer $1+2+3+4+\cdots+49+50$

Nous allons pour cela créer une \emph{boucle}, mécanisme essentiel en informatique.

Nous allons ainsi comprendre le fonctionnement des «~cases mémoire~».

Notons S notre somme. Au départ elle est nulle.

\begin{lstlisting}
S:=0
\end{lstlisting}

Cette ligne signifie qu'une case-mémoire est appelée S et qu'elle contient pour l'instant 0.


Il faut commencer par ajouter 1. S devient $S+1$. 

En fait, la case-mémoire S contient maintenant 1 et non plus 0.

On ajoute alors 2. S devient $S+2$. 

La case-mémoire S contient maintenant 3 et non plus 1.

On ajoute alors 3. S devient $S+3$. 

La case-mémoire S contient maintenant 6 et non plus 3.

On ajoute alors 4. S devient $S+4$. 

La case-mémoire S contient maintenant 10 et non plus 6.

\sm

Bon, ça risque d'être un peu long... Alors on va expliquer à l'ordinateur que 

\begin{itemize}
\item au départ S vaut 0
\item POUR j ALLANT DE 1 À 50 FAIRE S:=S+j
\item on s'arrête quand j vaut 50.
\end{itemize}


en XCAS, ça s'écrit

\begin{lstlisting}
S:=0;
for(j:=0;j<=50;j:=j+1){S:=S+j}
\end{lstlisting}







\section{Code ASCII}


La mémoire de l'ordinateur conserve toute donnée sous forme numérique. Pour coder chaque touche du
clavier, on utilise depuis les années 60 le code ASCII (American Standard Code for Information
Interchange). 

On dit que c'est un code 7 bits, c'est-à-dire que chaque caractère est codé par une liste de 7
chiffres égaux à 0 ou 1~:~combien de caractères différents peut-on ainsi coder~?...

Par exemple les codes 65 à 90 représentent les majuscules, les codes 97 à 122 représentent les
minuscules.

Une fonction XCAS donne ces nombres : \code{asc("caractère")}

\begin{lstlisting}
asc("a")
\end{lstlisting}


\begin{lstlisting}
asc("Where is Brian ?")
\end{lstlisting}


\sm

On peut également revenir au caractère en partant du code avec \code{char(codes)}


\begin{lstlisting}
char(85)
\end{lstlisting}


\begin{lstlisting}
char(66,114,105,97,110,32,105,115,32,105,110,32,116,104,101,32,107,105,99,104,101,110)
\end{lstlisting}



\section{Le programme...}

On dispose d'une chaîne~:

\begin{lstlisting}
c1:="abcdefgh";
\end{lstlisting}

Le but de notre jeu passionnant est  de créer une chaîne comprenant ces mêmes lettres mais en majuscules~!

Décomposons l'action au ralenti~:

\begin{itemize}

\item On ouvre une fenêtre de programmation en tapant simultanément sur \Alt et \keystroke{P}

\item Une ligne pour introduire le programme
\begin{lstlisting}
majuscule(c):={ 
\end{lstlisting}

On l'appelle \code{majuscule} et il dépend de la donnée d'une variable \code{c} qui
sera pour nous une chaîne de caractère en minuscules.


\item une ligne pour introduire les variables locales.

Comme on ne les connaît pas a priori, on laisse un vide qu'on remplira au fur et à mesure~:



\begin{lstlisting}
local ;
\end{lstlisting}

\item une ligne pour créer notre chaîne des majuscules. 

Pour l'instant elle est vide car on n'a pas analysé la chaîne entrante~:



\begin{lstlisting}
C:="";
\end{lstlisting}


\item le c\oe ur du programme~:



\begin{lstlisting}
for(j:=0;j<size(c);j:=j+1){  C:=concat(C,char( asc(c[j])-32 ))  };
\end{lstlisting}

Expliquez ce que l'ordinateur va faire.

\item on ferme



\begin{lstlisting}
}
\end{lstlisting}


\end{itemize}




\section{Comment l'utiliser ?}

Pour obtenir "maman" en majuscule tapez 

\begin{lstlisting}
majuscule("maman")
\end{lstlisting}





\section{Sans parachute...}

À vous d'imaginer une procédure \textbf{minuscule("chaîne")} qui transforme un texte majuscule en
minuscule.

Vous pouvez même aller jusqu'à créer une procédure qui laisse en majuscule la première lettre.



La prochaine étape sera de mettre un espace puis une majuscule après un point...




\section{Morituri te salutant}

Nous sommes maintenant armés informatiquement pour affronter la programmation
du chiffrement de César.

\subsection{Un peu d'histoire}

Comme le disait Suétone (70-127) dans La vie des 12 Césars~:


  \begin{quote}
    On possède enfin de César des lettres à Cicéron, et sa correspondance avec ses amis 
sur ses affaires domestiques. Il y employait, pour les choses tout à fait secrètes, une espèce de chiffre qui en rendait le sens inintelligible (les  lettres étant disposées de manière à ne pouvoir jamais former un mot), et qui consistait, je le dis pour ceux qui voudront les déchiffrer, à changer le rang des lettres dans l'alphabet, en écrivant la quatrième pour la première, c'est-à-dire le D pour l'A, et ainsi de suite.
  \end{quote}



\subsection{Un peu de bricolage}
Que vous inspire ce dessin~:
\begin{center}
  \includegraphics{RoueCesar.1}
\end{center}
\subsection{Un peu de mathématiques}


Codons chaque lettre par un nombre~: $A\longmapsto 0$, $B\longmapsto 1$, etc. 

 

  Comment modéliser la chiffrement de César~?




  Y a-t-il un problème~?



  Qu'ont en commun 29 et 3~?

\subsection{Un peu d'informatique}

  Les américains ont mis au point le code ASCII : ils ont donc oublié de coder nos lettres
  accentuées...


De plus, parmi toutes les touches codées, seules celles contenant un certains nombre de caractères
nous intéressent. Que fait cette procédure~:



  \begin{lstlisting}
  code:= (c)->{ 
  if (c==''é'') return(100) ;  
  if (c==''è'') return(99) ;  
  if (c==''à'') return(98) ;  
  if (c==''ç'') return(97) ;  
  if (c==''ù'') return(96) ;  
  if (c==''ê'') return(95) ;  
  .
  .
  .
 return(asc(c)-32);  
};
\end{lstlisting}


À vous de terminer cette procédure en vous occupant des majuscule puis d'imaginer la procédure \texttt{decode}...

Il  faudra ensuite  créer  une  procédure codant  et  décodant selon  le
chiffre de César. En voici le c\oe ur~:

\begin{lstlisting}
messcode:=concat(messcode,decode(irem(cle+code(message[j]),106)));
\end{lstlisting}


À vous de reconstituer le reste...



\end{document}









