Lycée Pilote de Sousse
Devoir de Synthèse N° 2
Année scolaire : 2011/2012
Matière : Informatique Durée : 1H30Min
Mr. Med Abdallah Mani Classe : 4 Tech
Nom & Prénom : ……….
Note : ……. / 20
Exercice 1. (4.5 pts)
Critiquez le choix de la structure itérative à chaque cas, proposez une boucle plus convenable et développez votre solution
Cas Proposition
Saisie d’un entier n positif : N=[] Tantque (n<0) faire
N=donnée (’’Donner un entier positif :’’) Fin Tantque
Critiques :
Pas de valeur pour N pour la comparaison
Structure itératives proposées :
Répéter jusqu’à
Développement de la boucle :
N=[]Répéter
N=Donnée(’’Donner un entier positif :’’) Jusqu’à (N>0)
Effacement des chiffres dans une chaine : Ch=[] Pour i de 1 à long(ch) faire
[] Si ch[i] dans [‘’0’’..’’9’’] alors Efface (ch,i,1)
FinSi FinPour
Critiques :
Ne supprime pas les chiffres successifs
Structure itératives proposées :
Répéter jusqu’à
Développement de la boucle :
i:=1;
repeat
if ch[i] in ['0'..'9'] then begin
delete(ch,i,1) ; i:=i-1;
end;
i:=i+1;
until(i>length(ch));
Calcul du maximum dans un tableau : Max=[i1, maxt[1]]Répéter
[] Si t[i]>max alors Max t[i]
FinSI ii+1 jusqu'à (i=n)
Critiques :
Ne vérifie pas la dernière case du tableau
Structure itératives proposées :
Répéter jusqu’à ou Pour
Développement de la boucle :
Max=[i1, maxt[1]]Répéter
[] Si t[i]>max alors Max t[i]
FinSI ii+1 jusqu'à (i=n)
Exercice 2. (1.5pts)
Rôle Déclaration Pascal (TYPE, CONST,
VAR) Un type Mois contenant tous les numéros des
mois
Type
Mois=1..12 ;
Un type Voy contenant les six voyelles de l’alphabet
Type
Voy=(a,e,i,o,y,u) ;
Un objet Newton contenant la constante de newton de valeur 9.8
Const
Newton=9.8 ;
Un Variable contenant une chaine de 10 caractères
Var
Ch :string[10] ;
Un type Tab tableau contenant des entiers ayant pour indices les caractères de l’alphabet
Type
Tab=array[‘A’..’Z’] of integer ;
Un objet contenant le texte PASCAL
Const
Chc=’PASCAL’ ; Problème. (3 pts)
Cryptage de Hauffman
Le chiffrement, aussi appelé cryptage, est le procédé grâce auquel on souhaite rendre la compréhension d'un document impossible à toute personne qui n'a pas la clé de chiffrement.
Le principe de l’algorithme de cryptage selon la clé de chiffrement de Hauffman est le suivant :
1. L’utilisateur saisie une chaine contenant que des caractères alphabétiques (minuscules et majuscules) et des espaces.
2. Sauvegarder les positions des espaces pour pouvoir les insérer après le cryptage.
3. Convertir chaque caractère en sa représentation binaire sur 8 bits
4. Sur chaque représentation binaire de chaque caractère effectuer K rotation à gauche (le nombre de rotation K représente le nombre de 1 dans la représentation binaire du caractère).
5. Convertir le nouveau chiffre binaire en caractère
6. Réinsérer les espaces dans la chaine 7. Afficher la nouvelle chaine cryptée.
Exemple :
Le caractère ‘’z’’ minuscule a la représentation binaire suivante :01111010
12 2
2
Le code binaire se lit de bas en haut
Le nombre de rotation k à faire est 5
Après rotation le code binaire devient : 01001111
Pour convertir en code ASCII = 26+23+22+21+20=79
0 1 0 0 1 1 1 1
27 26 25 24 23 22 21 20
Le caractère ‘’z’’ après cryptage devient ‘’O’’
La Chaine ‘’Bac Tech’’ devient ‘’’’.
0 6
1 2
1 3
0 2
0 1
5 2
1 7 2
1 3 2
1 1 2
1 0
program devoir;
uses wincrt;
type
tab= array [1..256] of string[8];
tabs= array[1..256] of byte;
var
ch,chrr:string;
n,ne:integer;
e:tabs;
b:tab;
procedure saisie(var fch:string;var fn:integer);
var
test:boolean;
i:integer;
begin repeat
writeln('Donner une chaine :');
readln(fch);
test:=true;
for i:=1 to length(fch) do
if not (fch[i] in [' ','A'..'Z','a'..'z']) then test:=false;
until (test);
fn:=length(fch);
end;
procedure espace(var fch:string;var fe:tabs;var fne:integer);
var
i,j:integer;
begin j:=1;
for i:=1 to length(fch) do if(fch[i]=' ')then begin
fe[j]:=i;
j:=j+1;
end;
fne:=j-1;
while(pos(' ',fch)<>0) do
begin
delete(fch,pos(' ',fch),1);
end;
end;
procedure binair(fch:string;var fb:tab;var fn:integer);
var
di,i,j,asc:integer;
x,chx:string;
begin
for i:=1 to fn do begin
asc:=ord(fch[i]);
chx:='';
di:=asc;
repeat asc:=di;
di:=asc div 2;
str(asc mod 2,x);
chx:=x+chx;
until (di=0);
for j:=1 to 8-length(chx) do chx:='0'+chx;
fb[i]:=chx;
end;
end;
procedure rotation(var fb:tab;fn:integer);
var
j,i,k:integer;
chx,chxx:string[8];
begin
for i:=1 to fn do begin
chx:=fb[i];
k:=0;
for j:=1 to 8 do if chx[j]='1' then k:=k+1;
chxx:=copy(chx,1,k);
delete(chx,1,k);
chx:=chx+chxx;
fb[i]:=chx;
end;
end;
function exp(fx:byte):byte;
var
i,x:integer;
begin x:=1;
for i:=1 to fx do x:=x*2;
exp:=x;
end;
procedure asci(fb:tab;fn:integer;var fchrr:string);
var
c,i,j:integer;
chx:string[8];
begin fchrr:='';
for i:=1 to fn do begin
chx:=fb[i] ; c:=0;
for j:=1 to 8 do if chx[j]='1' then c:=c+exp(8-j);
fchrr:=fchrr+chr(c);
end;
end;
procedure inser(fe:tabs;fne:integer;var fchrr:string);
var
i:integer;
begin
for i:=1 to fne do insert(' ',fchrr,fe[i]);
end;
begin saisie(ch,n);
writeln('La chaine d''origine est :',ch);
espace(ch,e,ne);
n:=n-ne;
binair(ch,b,n);
rotation(b,n);
asci(b,n,chrr);
inser(e,ne,chrr);
writeln('La chaine cryptée est :',chrr);
end.