L2 SI-PC Outils numériques – Juin 2019 – 2 heures - Correction
Exercice 1 - Algorithmique
1 – Déterminer la puissance entière de 10 la plus proche de 347,234 , 2
ainsi que celle la plus proche de 0,2478, -1
puis compléter la fonction suivante, écrite sous Scilab, dont l’objet est de calculer la
puissance entière de 10 la plus proche de la valeur absolue d’un nombre x donné.
function [ m ]=Puissance10 (x ) % Ligne 1
y=abs(x) ; % Ligne 2
m=0 ; % Ligne 3
if y < 1 % Ligne 4
while y<10^(m-1), % Ligne 5
m=m-1 % Ligne 6
end ; % Ligne 7
if abs(y-10^m)>abs(y-10^(m-1)) % Ligne 8
m=m-1 % Ligne 9
end % Ligne 10
else % Ligne 11
while y>10^(m+1), % Ligne 12
m=m+1 % Ligne 13
end ; % Ligne 14
if abs(y-10^m)>abs(y-10^(m+1)) % Ligne 15
m=m+1 % Ligne 16
end % Ligne 17
end % Ligne 18
endfunction % Ligne 19
Exercice 2
on veut élaborer une fonction Scilab nommée maximat dont
les deux arguments d'entrée sont dans l'ordre :
- une matrice M mi , j 1i p , à composantes mi, j réelles
1 j q
- un entier d ,
les deux arguments de sortie de maximat sont dans l'ordre :
- un vecteur v vi , à composantes vi réelles,
1i p ou q
- un vecteur c ci , à composantes ci entières,
1i p ou q
et qui doit effectuer la recherche suivante :
Si d 1 , on recherche le long de chaque colonne n° j de M , l'élément de plus grande
valeur que l' on place comme composante n° j du vecteur v . v sera alors un vecteur ligne.
La composante n° j du vecteur c est remplie avec le numéro de ligne où se situe l'élément
maximal de colonne n° j de M . c sera alors également un vecteur ligne de composantes à
valeur entière.
Par contre si d 1 , on recherche le long de chaque ligne n° i de M , l'élément de plus
grande valeur que l' on place comme composante n° i du vecteur v . v sera alors un vecteur
colonne. La composante n° i du vecteur c est remplie avec le numéro de colonne où se situe
l'élément maximal de ligne n° i de M . c sera alors également un vecteur colonne.
2.a. En supposant que vous disposez de la fonction maximat déjà écrite (correctement),
que contiennent les variables v et c après exécution du script ?
M=[1 2 3 4;-1 -4 -3 -2;103 10 104 11;-21. 300.15 100 -29];
d=1;
[v,c]=maximat(M,d)
c =[3. 4. 3. 3.]
v =[103. 300.15 104. 11.]
2.b. On vous propose ci-dessous une version de la fonction maximat incomplète et remplie
d'erreurs:
function [victor, compo,nini]=maximat(Matr, dimens)//Ligne 1
dimM=size(Matr);//Ligne 2
if dimens==1//Ligne 3
victor=zeros(dimM(1),1);//Ligne 4
compo=victor;//Ligne 5
for j=[Link]imM(2)//Ligne 6
victor(j)=Matr(1,j);//Ligne 7
compo(j)=1;//Ligne 8
for i=[Link]imM(1)//Ligne 9
if Matr(i,j)>vector(j)//Ligne 10
victor(j)=Matr(i,j);//Ligne 11
compo(i)=i;//Ligne 12
//Ligne 13
end//Ligne 14
end//Ligne 15
else//Ligne 16
...
end //Ligne 29
endunction//Ligne 30
Indiquer les 7 erreurs (en tenant compte du cahier des charges concernant la fonction
maximat).
Erreur 1 Ligne 1 : paramètre de sortie nini excédentaire.
Erreur 2 Ligne 4 : on explore la matrice le long de chaque colonne donc victor devrait être un vecteur
ligne d'après le cahier des charges. De plus, ...
Erreur 3 Ligne 4 : ...la plus grand dimension de victor devrait être égale au nombre de colonnes,
soit dimM(2). au finish,
victor=zeros(1,dimM(2));//Ligne 4
Erreur 4 Ligne 10 : victor(j) et non vector(j)
Erreur 5 Ligne 12: compo(j)=i;//Ligne 12
Erreur 6 Ligne 13: il manque end de fin de structure 'if'
Erreur 7 endfunction//Ligne 30
2.c. Compléter la fonction maximat précédente entre les lignes 16 et 29 de façon à ce que
la totalité des tâches que l'énoncé décrit soit bien effectuée.
else//Ligne 16
victor=zeros(dimM(1),1);//Ligne 17
compo=victor;//Ligne 18
for i=[Link]imM(1)//Ligne 19
victor(i)=Matr(i,1);//Ligne 20
compo(i)=1;//Ligne 21
for j=[Link]imM(2)//Ligne 22
if Matr(i,j)>victor(i)//Ligne 23
victor(i)=Matr(i,j);//Ligne 24
compo(i)=j;//Ligne 25
end//Ligne 26
end//Ligne 27
end//Ligne 28
end //Ligne 29