Bash second degré shell linux

Fermé
antrax34130 - 30 mars 2009 à 15:04
 antrax34130 - 30 mars 2009 à 15:53
Bonjour,

pouvez m'aidez pour le script second degré de shell linux avec les indications suivantes;

bc=calculette basique
val=$(echo'1+1+1'|BC)
#Réalise l'opération 1+1+1 et met
#le résultat dans val
#sachant que l'on utilise
# + - / sqrt(...)

Ecrire un script qui calcule les solutions d'une solution du second degré
A voir également:

2 réponses

antrax34130
30 mars 2009 à 15:12
personne ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
30 mars 2009 à 15:33
0
antrax34130
30 mars 2009 à 15:53
ouais tu me passes ca car tu ne sais pas le faire toi meme, j'ai cherché:

#!/bin/sh
# Programme de résolution de polynome du second degré (Ax2 + Bx + C = 0)
# Usage: prog [-h] [-v] [--] A B C
#
Option "-h": Pour avoir l'aide sur l'utilisation de ce programme
#
Option "-v": Affichage des étapes
# Fonction affichant la façon d'utiliser ce programme
# Paramètres entrée : texte à afficher (facultatif)
# Valeur sortie : aucune
usage()
{
# Création d'un sous-shell pour isoler le contexte
(
# Affichage des messages particuliers
test -n "$*" && echo "`basename $0`: $*"
# Affichage du message d'aide
echo "Usage: `basename $0` [-h] [-v] [--] A B C"
)
}
# Fonction de vérification de tous ses arguments numériques
# Paramètres entrée : arguments à vérifier (…)
# Valeur sortie :
#
tous arguments corrects (0)
#
au-moins un argument non-correct (not 0)
numeric()
{
# Création d'un sous-shell pour isoler le contexte
(
# Boucle sur chaque argument
for nb in $*
do
# Suppression de chaque chiffre et du "." et du signe
nb=`echo $nb |sed -e "s/[0-9]//g" |sed -e "s/\.//" |sed -e "s/^-//"`
# Vérification => nb non vide => pas un nombre
test -n "$nb" && return 1
done
# Renvoi OK
return 0
)
}
# Fonction réduisant un nombre à son écriture la plus courte
# Paramètres entrée : nombre à réduire (facultatif)
# Valeur sortie : aucune
reduce()
{
# Création d'un sous-shell pour isoler le contexte
(
# Le nombre est pris dans l'argument s'il existe ou dans stdin
test -n "$1" && nb="$1" || nb="`cat`"
# Si le nombre commence par "-"
if test "`echo $nb |cut -c1`" = "-"
then
nb=`echo $nb |cut -c2-`
fl_neg="true"
fi
# Suppression des zéros non significatifs à gauche
nb=`echo $nb |sed -e "s/^0\{1,\}//g"`
# Si le nombre est vide ou réduit à "." il vaut 0
test -z "$nb" -o "$nb" = "." && echo 0 && return
# Si le nombre est décimal
if echo $nb |fgrep "." 1>/dev/null
then
# Décomposition du nombre en parties entières et fractionnelles
ent=`echo $nb |cut -f1 -d.`
frc=`echo $nb |cut -f2 -d.`
# Suppression des zéros non significatifs à droite de la fraction
frc=`echo $frc |sed -e "s/0\{1,\}$//g"`
# Réécriture du nombre
nb=${ent:-0}${frc:+".$frc"}
fi
echo ${fl_neg:+"-"}$nb
)
}
# Fonction recherchant la racine carrée d'un nombre
# Paramètres entrée : nombre dont on veut la racine
# Valeur sortie : aucune
racine()
{
# Création d'un sous-shell pour isoler le contexte
(
# Cas particulier (mais ça marche même sans ça)
if test `expr "$1" = 0` -eq 1 -o `expr "$1" = 1` -eq 1
then
echo $1
return 0
fi
# Calcul
echo "sqrt($1)" |bc -l
)
}
# Programme principal
# Gestion des options (on utilise l'instruction "getopts" plus souple que la commande "getopt")
while getopts hv opt
do
case $opt in
h) # Aide demandée
usage; exit 0
;;
v) # Demande volubilité
opt_verb="true";;
*) # Autre option
usage; exit 1
esac
done
shift `expr $OPTIND - 1`
# Vérification assez d'arguments
test $# -lt 3 && usage "Pas assez d'argument" && exit 1
# Vérifications arguments 1, 2 et 3 sont des nombres
numeric $1 $2 $3
test $? -ne 0 && echo "Une de ces valeurs '$1', '$2' ou '$3' n'est pas un nombre" && exit 2
# Récupération coefficients
A=`reduce $1`
B=`reduce $2`
C=`reduce $3`
test -n "$opt_verb" && echo "Coeff: $A $B $C"
# A nul => Solution = -C/B
if test $A -eq 0
then
test -n "$opt_verb" && echo "Solution=-$C / $B"
sol=`echo "-$C / $B" |bc -l |reduce`
echo "A nul - Une solution classique pour $A $B $C: $sol"
exit 0
fi
# Calcul du déterminant B2 - 4AC
delta=`echo "$B * $B - 4 * $A * $C" |bc -l |reduce`
test -n "$opt_verb" && echo "Delta = $B * $B - 4 * $A * $C = $delta"
# Delta négatif => Pas de solution réelle
if test `expr $delta \< 0` -eq 1
then
echo "Delta négatif - Pas de solution réelle pour $A $B $C"
exit 0
fi
# Delta nul => Une solution -B/2A
if test `expr $delta = 0` -eq 1
then
test -n "$opt_verb" && echo "Solution=$B / (2 * $A)"
sol=`echo "$B / ($A * 2)" |bc -l |reduce`
echo "Une solution réelle pour $A $B $C: $sol"
exit 0
fi
# Delta positif
racdelta=`racine $delta |reduce`
test -n "$opt_verb" && echo "Racine delta=$racdelta"
# Solution 1
test -n "$opt_verb" && echo "Solution1=(-($B) - $racdelta) / (2 * $A)"
sol=`echo "(-($B) - $racdelta) / ($A * 2)" |bc -l |reduce`
echo "Solution 1: $sol"
# Solution 2
test -n "$opt_verb" && echo "Solution2=(-($B) + $racdelta) / (2 * $A)"
sol=`echo "(-($B) + $racdelta) / ($A * 2)" |bc -l |reduce`
echo "Solution 2: $sol"
0