0% ont trouvé ce document utile (0 vote)
48 vues7 pages

Exercice 1: (3 Points) : Enseignant

Ce document est un devoir de synthèse pour un cours de sciences de l'informatique, comprenant plusieurs exercices sur l'algorithmique et la programmation. Les exercices incluent des questions sur les algorithmes de tri, la suite de Fibonacci, la simplification de fractions, et un problème de chiffrement de messages. Chaque exercice est accompagné d'instructions détaillées et d'exemples pour guider les étudiants dans la rédaction de leurs solutions.

Transféré par

charfanet2016
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
48 vues7 pages

Exercice 1: (3 Points) : Enseignant

Ce document est un devoir de synthèse pour un cours de sciences de l'informatique, comprenant plusieurs exercices sur l'algorithmique et la programmation. Les exercices incluent des questions sur les algorithmes de tri, la suite de Fibonacci, la simplification de fractions, et un problème de chiffrement de messages. Chaque exercice est accompagné d'instructions détaillées et d'exemples pour guider les étudiants dans la rédaction de leurs solutions.

Transféré par

charfanet2016
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

REPUBLIQUE TUNISIENNE

MINISTERE DE L’EDUCATION
ENSEIGNANT DEVOIR DE SYNTHESE N°2
** LYCEE DOUZ ** BEN AMOR MOSBAH CLASSE : 4SI ** DATE : 25/02/2022 **

SECTION : SCIENCES DE L’INFORMATIQUE


EPREUVE : ALGORITHMIQUE ET PROGRAMMATION DURÉE : 3 H NOMBRE DE PAGES : 4 COEF : 2

Exercice 1 : (3 points)
Dans un contexte informatique et pour chacune des propositions citées ci-dessous, mettre dans chaque case,
la lettre V si la proposition est correcte ou la lettre F dans le cas contraire.
1. L’opération de décalage est utilisée dans le tri :
Rapide Insertion Shell
2. Le tri insertion est un cas particulier du tri :
Sélection Bulle Shell
3. Le pas du tri Shell noté P est déterminé en utilisant la suite :
𝑃0 = 0 𝑃0 = 1 𝑃0 = 0
{ { {
𝑃𝑛 = 3 + 𝑃𝑛−1 𝑃𝑛 = 2 ∗ 𝑃𝑛−1 𝑃𝑛 = 3 ∗ 𝑃𝑛−1 + 1

4. La fonction Verif permet de vérifier si les N entiers d’un tableau T sont triés en ordre croissant :
Fonction Verif (T : Tab, N : entier ) : Booléen
Début
Si N = 0 Alors
Retourner Faux
Sinon
Si T[N] < T[N-1] alors
Retourner Faux
Sinon
Retourner verif ( T , N-1)
Fin Si
Fin Si
Fin

Fonction Verif (T : Tab, N : entier ) : Booléen


Début
Si N = 0 Alors
Retourner Vrai
Sinon
Retourner (T[N] ≥ T[N-1]) ET verif ( T , N-1)
Fin Si
Fin
Fonction Verif (T : Tab, N : entier ) : Booléen
Début
Si N = 0 Alors
Retourner Faux
Sinon
Si T[N] < T[N-1] alors
Retourner Vrai
Sinon
Retourner verif ( T , N-1)
Fin Si
Fin Si
Fin

A.S. : 2021/2022 1
Exercice 2 :(3.75 points)
La suite de Fibonacci est définie comme suit : 𝐹0 = 0 𝑒𝑡 𝐹1 = 1
{
𝐹𝑛 = 𝐹𝑛−1 + 𝐹𝑛−2 ∀ 𝑛 ≥ 2
Le tableau suivant présente les 18 premiers termes de cette suite.
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584
Selon le théorème de Zeckendorf, tout entier K ≥ 2 peut-être représenté, de manière unique, comme la
somme de nombres de Fibonacci distincts inferieurs ou égaux à K, en employant les plus grands nombres
possibles.
Exemples : 10 = 8 + 2 → 10 = F6 + F3
50 = 34 + 13 + 3 → 50 = F9 + F7 + F4
Le codage de Fibonacci consiste à représenter un entier K ≥ 2 sous forme des 0 et des 1 selon sa somme de
nombres de Fiboncci en commençant par le terme F2 (1 pour les termes appartenant à la somme et 0 pour
les autres).
Exemples :
✓ Pour K = 10 : 10 = 8 + 2 = F6 + F3
Donc 0 pour F2, F4 et F5 et 1 pour F3 et F6
→ (10) 10 = (01001) Fibo
✓ Pour K = 50 : 50 = 34 + 13 + 3 = F9 + F7 + F4
Donc 0 pour F2, F3, F5, F6 et F8 et 1 pour F4, F7 et F9
→ (50) 10 = (00100101) Fibo
Questions :
1- Ecrire un algorithme récursif d’un module, nommé FIBO, qui retourne le terme de la suite pour un
entier n (n est passé en paramètre), en utilisant la suite F décrite précédemment.
2- En utilisant le module FIBO, écrire un algorithme d’un module qui retourne le codage de Fibonacci
d’un entier K ≥ 2 (K est passé en paramètre).

Exercice 3 :(4.25 pts)


𝑎
Une fraction de la forme est dite irréductible lorsqu’on ne peut plus la simplifier.
𝑏
𝑎
Mathématiquement, une fraction est irréductible si le PGCD (a, b) = 1.
𝑏
𝑎
Ainsi, pour rendre une fraction irréductible, on divise le numérateur et le dénominateur de cette fraction
𝑏
par le PGCD (a, b)
Soit "[Link]" un fichier d’enregistrements contenant des fractions représentée chacune par les deux
champs suivants :
- NUM : un entier représentant le numérateur de la fraction
- Denom : un entier représentant le dénominateur de la fraction.
On se propose de générer, un fichier d’enregistrements intitulé "[Link]" qui devra contenir pour
chaque fraction du fichier "[Link]" la fraction irréductible correspondante.

A.S. : 2021/2022 2
NB. :
✓ Le candidat n’est pas appelé à remplir le fichier "[Link]".
✓ Les fichiers "[Link]" et "[Link]" ont la même structure.
Travail demandé :
1- Tracer le tableau de déclaration des nouveaux types où vous déclarez un type qui simule
l’enregistrement utilisé dans les fichiers et un type pour les fichiers.
2- Ecrire un algorithme d’un module permettant de générer le fichier "[Link]" à partir du fichier
"[Link]" comme expliqué ci-dessus.

Problème : (9 points)
Parmi les méthodes de chiffrement utilisant un mot-clé, on cite celle décrite ci-après qui permet de crypter
un message msg ne dépassant pas 18 caractères et formé uniquement de lettres minuscules, de chiffres et
d’espaces :
Etape 1 :
Remplir aléatoirement une matrice carrée M1 de dimension 6x6 par toutes les lettres alphabétiques
minuscules ainsi que tous les chiffres.
Etape 2 :
Générer un message intermédiaire msgi, en concaténant les résultats du chiffrement de chaque caractère
du message msg. Le résultat du chiffrement d’un caractère est la concaténation de lettre majuscule dont
son ordre alphabétique est celui de l’indice de la ligne avec la lettre majuscule dont son ordre
alphabétique est celui de l’indice de la colonne de la case de la matrice M1 contenant le caractère à
chiffrer (l’ordre alphabétique des lettres majuscules commence par 0 jusqu’à 25).
N.B. :
✓ Le caractère espace ne sera pas chiffré.
✓ L’ordre alphabétique de « A » est 0, de « B » est 1, de « C » est 2 ……
Etape 3 :
Remplir une deuxième matrice M2 de taille 7x6 caractères en mettant dans :
✓ La première ligne, les lettres d’un mot-clé formé de 6 lettres majuscules,
✓ Le reste des lignes, le message msgi caractère par caractère en commençant par la première case
de la deuxième ligne.
N.B. :
Chaque case vide de la matrice M2 sera remplie par le caractère espace.
Etape4 :
Trier les éléments de la 1ère ligne de M2 selon un ordre alphabétique croissant, sachant que tout
déplacement d’un élément entraine le déplacement de tous les éléments de la colonne correspondante.
Etape5 :
Concaténer les lettres de la matrice M2, colonne par colonne en commençant par la 1ère colonne et sans
considérer les éléments de la 1ère ligne, pour obtenir le message chiffré final.

A.S. : 2021/2022 3
Exemple :
Pour msg = "promotion bac 2022" et le mot-clé "CHAISE"
Etape 1 : on suppose que la matrice M1 est remplie aléatoirement comme suit :
0 1 2 3 4 5
0 c 1 o f w j
1 y m t 5 b 4
2 i 7 a 2 8 s
3 p 3 0 q h x
4 k e u l 6 d
5 v r g z n 9
Etape 2 : le résultat du chiffrement du message msg, caractère par caractère donne :

Caractère à chiffrer p r o m o t i o n b a c 2 0 2 2

Résultat DA FB AC BB AC BC CA AC FE BE CC AA CD DC CD CD

D’où le message msgi est le suivant : "DAFBACBBACBCCAACFE BECCAA CDDCCDCD"


Etape 3 : Remplissage de la matrice M2 Etape 4 : Tri de la matrice M2
0 1 2 3 4 5 0 1 2 3 4 5
0 C H A I S E 0 A C E H I S
1 D A F B A C 1 F D C A B A
2 B B A C B C 2 A B C B C B
3 C A A C F E 3 A C E A C F
4 B E C C A 4 E A B C C
5 A C D D C 5 C A C D D
6 C D C D 6 C C D D
Etape 5 :
Le message chiffré final est "FAAECCDBC ACCCEAC ABAB DBCCCDDABFCD "

On se propose d’écrire un programme permettant :


✓ De saisir un message msg ne dépassant pas 18 caractères et formé uniquement de lettres minuscules,
de chiffres et d’espaces.
✓ De saisir un mot-clé formé de 6 lettres majuscules.
✓ De crypter le message msg selon la méthode de chiffrement décrite précédemment.
NB : On dispose d’un module Initialisation (M1) qui permet de remplir aléatoirement la matrice
carré M1 comme décrit dans l’étape 1 et que le candidat peut appeler dans sa solution sans le
développer.
✓ D’afficher le message chiffré final.
Questions :
1. Ecrire un algorithme modulaire solution au problème posé.
2. Ecrire les algorithmes des modules envisagés.

Bon Travail

A.S. : 2021/2022 4
Solutions en Python
Exercice 2 Exercice 3
def fibo(n): from pickle import *
if (n==0)or(n==1): def remplir(f1,n):
return n frac={}
else: for i in range(n):
return fibo(n-1)+fibo(n-2) frac['num']=int(input("Numérateur:"))
frac['denom']=int(input("Dénominateur:"))
def encodage(k): dump(frac,f1)
n=1 [Link]()
while fibo(n)<k:
n=n+1 def afficher(f2):
if fibo(n)>k: n=n-1 f2=open("[Link]","rb")
ch="" while True:
for i in range(n,1,-1): try:
f=fibo(i) f=load(f2)
ch=chr(k // f + 48)+ch except EOFError: break
k=k%f print(f['num'],"/",f['denom'])
return ch [Link]()

print(encodage(2)) def pgcd(a,b):


print(encodage(3)) if b==0:
print(encodage(50)) return a
else:
return pgcd(b, a%b)

def genere(f1,f2):
f1=open("[Link]","rb")
while True:
try:
frac=load(f1)
except EOFError: break
p=pgcd(frac['num'],frac['denom'])
frac['num']=frac['num']//p
frac['denom']=frac['denom']//p
dump(frac,f2)
[Link]()
[Link]()

f1=open("[Link]","wb")
f2=open("[Link]","wb")
remplir(f1,4)
genere(f1,f2)
afficher(f2)

Exercice 4
from random import *
from numpy import *

def verif_msg(ch):
i=0
while (i<len(ch)-1)and(("a"<=ch[i]<="z")or("0"<=ch[i]<="9")or(ch[i]==" ")):
i=i+1
return ("a"<=ch[i]<="z")or("0"<=ch[i]<="9")or(ch[i]==" ")

def verif_cle(ch):
i=0
while (i<len(ch)-1)and("A"<=ch[i]<="Z"):
i=i+1
return "A"<=ch[i]<="Z"

#///////////////////////////////////////////////////
def trouve(M1,a,b):
test=False
i=-1

A.S. : 2021/2022 5
while not test and (i<5):
i=i+1
j=-1
while not test and j<5:
j=j+1
test= (M1[a,b]==M1[i,j]) and (i!=a or j!=b)
return test

def init(M1):
for i in range(6):
for j in range(6):
while (M1[i,j]=="") or trouve(M1,i,j):
k=randint(48,90)
while (58<=k<=64):
k=randint(48,90)
if 65<=k<=90:k=k+32
M1[i,j]=chr(k)
#//////////////////////////////////////////////////

def recherche(c,M1):
test=False
i=-1
while not test and i<5:
i=i+1
j=-1
while not test and j<5:
j=j+1
test= c==M1[i,j]
return chr(i+65)+chr(j+65)

def genere(msg,M1):
ch=""
for i in range(len(msg)):
if msg[i]==" ":
ch=ch+msg[i]
else:
ch=ch+recherche(msg[i],M1)
return ch
def remplir(M2,cle,msgi):
for j in range(6):
M2[0,j]=cle[j]
while len(msgi)<36:
msgi=msgi+" "
k=-1
for i in range(1,7):
for j in range(6):
k=k+1
M2[i,j]=msgi[k]

def permut(M2,j,min):
for i in range(7):
M2[i,j],M2[i,min]=M2[i,min],M2[i,j]
def tri(M2):
for j in range(5):
min=j
for k in range(j+1,6):
if M2[0,k]<M2[0,min]:
min=k
permut(M2,j,min)

def crypter(msg,cle):
M1=array([[str()]*6]*6)
M2=array([[str()]*6]*7)
init(M1)
msgi=genere(msg,M1)
remplir(M2,cle,msgi)
tri(M2)
print(M2)
msg_chiffre=""
A.S. : 2021/2022 6
for j in range(6):
for i in range(1,7):
msg_chiffre=msg_chiffre+M2[i,j]
return msg_chiffre

msg=""
while (len(msg)>18)or(msg=="")or(msg[0]==" ")or not verif_msg(msg):
msg=input("Message à crypter:")

cle=""
while (len(cle)!=6) or not verif_cle(cle):
cle=input("Clé de cryptage:")

print(crypter(msg,cle))

A.S. : 2021/2022 7

Vous aimerez peut-être aussi