Scripts Perl

Dernière mise à jour : 26/05/2016

Calcul de focale

Énoncé

Ecrivez un script qui lit sur la ligne de commande une focale en millimètres (F), une distance minimum et maximum de netteté en mètres (Tv et Ta), et éventuellement une erreur admissible en millimètre (e). Si aucune erreur n'est introduite, prendre la valeur 1/30.

Calculez la distance de mise au point (T) au moyen de la formule suivante, avec toutes les valeurs converties en centimètres :

Formule de calcul de la distance de mise au point

Calculez l'ouverture (n) au moyen de la formule suivante, avec toutes les valeurs converties en centimètres :

Formule de calcul de l'ouverture

Il faudra retourner les valeurs des ouvertures standards directement inférieure (ns1) et directement supérieure (ns2) à l'ouverture calculée. Les ouvertures standards sont calculées au moyen de la formule ci-dessous, avec i commençant à 1/4 et étant multiplié par deux à chaque itération jusqu'à ce que ns1 et ns2 soient trouvés :

Formule de calcul des ouvertures standard

Solution

#!/usr/bin/perl

# (c) Sébastien Adam 1999
# Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage
# dans les Mêmes Conditions 2.0 Belgique.

sub tronc {
  if($_[0] < 10) {
    $tmp = int($_[0] * 10) / 10;
  } else {
    $tmp = int($_[0]);
  }
  return $tmp;
}

print "Calcul de mise au point :\n";
print "-------------------------\n";
print "Focale (en mm)                      : ";
$f = <STDIN>; chomp($f);
print "Distance minimale de nettete (en m) : ";
$tv = <STDIN>; chomp($tv);
print "Distance maximale de nettete (en m) : ";
$ta = <STDIN>; chomp($ta);
print "Erreur admise (en mm)               : ";
$e = <STDIN>; chomp($e);
if($e == 0) {
  $e = 1/30;
}
$f  = $f / 10;
$tv = $tv * 100;
$ta = $ta * 100;
$e  = $e / 10;
$t  = (2 * $tv * $ta) / ($tv + $ta);
$t  = $t / 100;
printf("Distance de mise au point : %.2fm\n", $t);
$n = (($ta - $tv) * $f * $f) / (2 * $tv * $ta * $e);
$n = &tronc($n);
$i = 1/4;
do {
  $i *= 2;
  $n2 = 2 * sqrt($i);
} while($n2 < $n);
$i /= 2;
$n1 = 2 * sqrt($i);
$n1 = &tronc($n1);
$n2 = &tronc($n2);
print "Ouverture                 : ", $n, "\n";
print "Ouvertures standards      : ", $n1, " - ", $n2, "\n";