Dernière mise à jour : 26/05/2016
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 :
Calculez l'ouverture (n
) au moyen de la formule suivante, avec toutes
les valeurs converties en centimètres :
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 :
#!/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";
© Sébastien Adam 1996 ~ 2024 - https://www.sebastienadam.be/ - .