Bash second degré shell linux

antrax34130 -  
 antrax34130 -
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é
Configuration: Linux Mandriva
Firefox 2.0.0.13

2 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    0
    1. antrax34130
       
      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