EPREUVE GU : SM4 PM , UE : 412 IP INFO
Exercice 1
Donnez le résultat des suites d'instructions Maple :
> x:=sqrt(7);x:=4*x^2+3;
> solve(x^2-6*x+8);
> op(1,op(2,x*y+z*t));
> L1:=[[1,2],8];L2:=[[1,3],[5,[4,7]],9];[op(L1),op(1,L2),op(3..nops(L2),L2)];
Exercice 2
Soit la procédure
>
mystere1:=proc(x,y)
local c,ytmp;
c:=0;
ytmp:=0;
while ytmp<=y do
ytmp:=ytmp+x;
c:=c+1
od;
RETURN(c)
end;
Donner le résultat de mystere1(3,13). On expliquera le déroulement de la procédure.
> mystere1(3,13);
A l'intérieur de la procédure x=3 et y=13. Au début c=0 et ytmp=0. Puis on entre dans la boucle tant que.
1 - ytmp<=y donc ytmp=3 et c=1
2 - ytmp<=y donc ytmp=7 et c=2
3 - ytmp<=y donc ytmp=10 et c=3
4 - ytmp<=y donc ytmp=13 et c=4
5 - ytmp<=y donc ytmp=16 et c=5
5 - ytmp>y donc on sort de la boucle.
La procédure retourne la valeur de c soit 5
Pour deux paramètres entiers x et y quelconques, que calcule la procédure mystere1 ?
La procédure mystere1 calcule la partie entière de y/x plus 1.
Exercice 3
Soit la procédure
>
mystere2:=proc(x)
if x<3 then 0
else RETURN(mystere2(floor(x/3))+1)
fi
end;
Donner le résultat de mystere2(11). On expliquera le déroulement de la procédure.
> mystere2(11);
Cette procédure est récursive.
Appel 1 : x=11 donc x>=3 donc la fonction s'appelle avec la valeur floor(x/3) soit 3.
Appel 2 : x=3 donc x>=3 donc la fonction s'appelle avec la valeur floor(x/3) soit 1.
Appel 3 : x=1 donc x<33 donc on retourne 0
donc on retourne 0+1 soit 1
donc on retourne 1+1 soit 2.
L'option trace permet de voir cette exécution.
>
mystere2:=proc(x)
option trace;
if x<3 then 0
else RETURN(mystere2(floor(x/3))+1)
fi
end;
> mystere2(11);
{--> enter mystere2, args = 11
{--> enter mystere2, args = 3
{--> enter mystere2, args = 1
<-- exit mystere2 (now in mystere2) = 0}
<-- exit mystere2 (now in mystere2) = 1}
<-- exit mystere2 (now at top level) = 2}
Pour un paramètre entier x quelconque, que calcule la procédure mystere2 ?
La procédure mystere2 calcule l'exposant de la plus grande puissance de 3 inférieure à x.
Exercice 4
Soit le polynôme
Ecrire une procédure calculef qui a pour résultat la valeur de ce polynôme pour une valeur de x donnée.
>
calculef:=proc(x)
RETURN(x^4-3*x^3+11*x-8)
end:
> calculef(5);
Ecrire une procédure remplitT qui remplit un tableau T de dimension n de manière à ce que
T[i]=f(i)
>
remplitT:=proc(n)
local T,i;
T:=array(1..n);
for i from 1 to n do
T[i]:=calculef(i)
od:
RETURN(copy(T))
end:
Pour mieux comprendre voici une exécution
> k:=10;
> hT:=remplitT(k);
Ecrire une procédure remplitU qui remplit un tableau U de dimension n de manière à ce que
>
remplitU:=proc(T,n)
local U,i;
U:=array(1..n);
U[1]:=T[1];
for i from 2 to n do
U[i]:=U[i-1]+T[i]
od:
RETURN(copy(U))
end:
Pour mieux comprendre voici une exécution
> hU:=remplitU(hT,k);
Ecrire une procédure carre qui teste si un nombre est le carré d'un nombre entier.
>
carre:=proc(x)
if x>0 then RETURN(evalb(floor(sqrt(x))^2=x))
else false
fi
end:
> carre(4);
> carre(5);
> carre(-1);
Ecrire une procédure chercheCarreT qui retourne la liste des indices i compris entre 1 et n tels que T[i] est le carré d'un nombre entier.
>
chercheCarreT:=proc(T,n)
local liste,i;
liste:=NULL;
for i from 1 to n do
if carre(T[i]) then
liste:=liste,i
fi
od:
RETURN([liste])
end:
> chercheCarreT(hT,k);