Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/06/2012, à 18:57

fav

Petit programme en shell

Bonjour a tous,

j'apprends le shell de linux petit a petit et j'ai un pti problème.

En fait, je suis professeur et je fais des cours particuliers a domicile.

Mon problème est simple:

Pour chaque élève correspond un tarif propre a eux.

Donc, je veux créer un ptit logiciel ou j'inscrit le nom de l’élève ainsi que mon honoraire par heure

Ainsi,des que on commence le cours j'appuie sur "d" comme début pour le début du cours et puis lorsque j'ai fini le cours j'appuie sur "f" comme fin du cours.

Par conséquent, le logiciel me donne la durée que j'ai passe entre ces deux instants, la date d'aujourd'hui, ainsi que l'honoraire que doit les parents des élèves et donc tout ceci se passe dans l’imprimante comme facture.



Si quelqu'un pourrait m'aider a faire cela!!!

Merci!


On ne va jamais aussi loin que lorsqu'on ne sait pas où l'on va.

Hors ligne

#2 Le 18/06/2012, à 19:14

YMADEC

Re : Petit programme en shell

Inutile de poster deux discussions...

http://forum.ubuntu-fr.org/viewtopic.php?id=957531

Hors ligne

#3 Le 18/06/2012, à 19:18

Spitfire 95

Re : Petit programme en shell

#!/bin/bash

echo -n "Appuyez sur d puis sur entrée pour lancer le chronomètre : "

# On attend que l'on ait appuyé sur f
while [ ! "$d" = "d" ]; do
    read d
done

# On saute une ligne (fondamental pour l'esthétisme ^^)
echo

# f devient l'heure de lancement
d=$(date +%s)

echo -n "Appuyez sur f puis sur entrée pour arrêter le chronomètre : "

# On attend que l'on ait appuyé sur f
while [ ! "$f" = "f" ]; do
    read f
done

f=$(date +%s)

let DIFF=$(($f - $d))
let m=$(($DIFF / 60))
let s=$(($DIFF % 60))

echo $m minutes $s secondes

Sais pas faire l'impression, et tu vas te retrouver avec plus de 60 minutes si tu dépasses l'heure.
Bref, à améliorer.


Trisquel GNU/Linux 6.0 / Fedora 19 & rawhide.
joueur ryzom et wesnoth
Développeur livewallpaper
Membre déserteur et traître de la brigade des S.

Hors ligne

#4 Le 18/06/2012, à 20:49

fav

Re : Petit programme en shell

Merci pour ta réponse Spitfire 95. Ça me mets bien sur la bonne piste ! Mais tu mets beaucoup de "let", c'est obligatoire de les mettre?


On ne va jamais aussi loin que lorsqu'on ne sait pas où l'on va.

Hors ligne

#5 Le 18/06/2012, à 21:11

pingouinux

Re : Petit programme en shell

Bonsoir,
En reprenant les notations de Spitfire 95 #3 :

tarif_horaire=25
DIFF=4200 # Nb de secondes écoulées
printf "Prix = %.2f €\n" $(bc -l <<<"$tarif_horaire*$DIFF/3600")
Prix = 29.17 €

Hors ligne

#6 Le 19/06/2012, à 00:06

sputnick

Re : Petit programme en shell

Sinon ya des vrais outils pour ça : voir http://taskcoach.org/


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#7 Le 19/06/2012, à 06:56

nesthib

Re : Petit programme en shell

Ah ben du coup je regardais le sujet supprimé et je pensais qu'il n'y avait pas de réponses…

Voici mon code :

#!/bin/bash

while read -p "Taux horaire : " taux
do
    [[ ${taux} =~ ^[0-9]+([.][0-9]+)?$ ]] && break
done
echo "Le taux horaire est défini à ${taux} €"

total=0

function addtime () {
    [ $debut ] || { echo 'Vous devez appuyer sur « d » pour démarrer le chrono' ; return 1 ; }
    total=$(( $total + $fin - $debut ))
    echo "le total est actuellement à $(s2h) ($(prix) €)"
}
function s2h () {
    echo "$(( ${total}/3600 ))h $(( ${total}%3600/60 ))m $(( ${total}%60 ))s"
}
function prix () {
    bc <<<"scale=2;${taux}*${total}/3600"
}

while read -n 1 -p "commande : " commande
do
    echo
    case ${commande} in
        d) echo "début du cours : $(date)" ; debut=$(date +'%s') ;;
        f) echo "fin du cours : $(date)" ; fin=$(date +'%s') ; addtime ; break ;;
        p)
           case ${pause} in
               pause) pause="" ; echo "reprise : $(date)" ; debut=$(date +'%s') ;;
               *) pause="pause" ; echo "pause : $(date)" ; fin=$(date +'%s') ; addtime ;;
           esac ;;
        i) fin=$(date +'%s') ; addtime && debut=$(date +'%s') ;;
        *) echo "Commande \"${commande}\" invalide !" ; continue ;;
    esac
done

Disons que mon taux horaire est de 1 centime par seconde, et j'arrondis mon travail à l'heure. Je te laisse compter combien tu me dois tongue


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#8 Le 19/06/2012, à 20:45

fav

Re : Petit programme en shell

waouuhh smile je vous remercie tous pour ces réponses !

Ainsi, si disons que j'ai 3 élèves en même temps qui a chaque nom associe un honoraire différent et qui commence a des heures différents et qui se terminent a des heures différents

Ex:

Marc 20 Euro / h commence a 9h du matin
Jean 15 Euro / h commence a 9h15 du matin
Sophie 35 Euro /h commence a 10h du matin

Ainsi, comment fais t-on pour faire fonctionner les horloges en même temps pour ces différents élèves?

Par exemple, j'entre le nom de l’élève et mets start pour activer la décompte puis un second élève arrive 15 mn plus tard et je mets son nom puis active son chronomètre!

Ex: marc start
apres 15mn ...
Sophie start

puis quand marc part je mets marc stop
puis Sophie stop

Merci!!!


On ne va jamais aussi loin que lorsqu'on ne sait pas où l'on va.

Hors ligne

#9 Le 19/06/2012, à 21:01

Spitfire 95

Re : Petit programme en shell

Tu lances le programme sur trois consoles différentes.


Trisquel GNU/Linux 6.0 / Fedora 19 & rawhide.
joueur ryzom et wesnoth
Développeur livewallpaper
Membre déserteur et traître de la brigade des S.

Hors ligne

#10 Le 19/06/2012, à 21:02

fav

Re : Petit programme en shell

nesthib a écrit :

Disons que mon taux horaire est de 1 centime par seconde, et j'arrondis mon travail à l'heure. Je te laisse compter combien tu me dois

Ben , il suffit de diviser l'honoraire par heure par 3600!!! tongue
ie

taux=taux/3600.0

On ne va jamais aussi loin que lorsqu'on ne sait pas où l'on va.

Hors ligne

#11 Le 20/06/2012, à 07:12

nesthib

Re : Petit programme en shell

@fav : je pense que l'on t'a donné suffisamment de pistes pour que tu essaies de faire quelque chose par toi même… wink

(NB. sinon j'espère que tu n'es pas prof de maths, parce que vu les données initiales il fallait plutôt multiplier le tarif à la seconde par 3600 tongue)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#12 Le 20/06/2012, à 12:15

fav

Re : Petit programme en shell

nesthib a écrit :

je pense que l'on t'a donné suffisamment de pistes pour que tu essaies de faire quelque chose par toi même…

(NB. sinon j'espère que tu n'es pas prof de maths, parce que vu les données initiales il fallait plutôt multiplier le tarif à la seconde par 3600 )

En tout cas merci quand même!

lol Pas du tout ,l'honoraire que j'ai mentionne en haut dit bien que les donnees initiales sont notee par heure :

fav a écrit :

Marc 20 Euro / h commence a 9h du matin
Jean 15 Euro / h commence a 9h15 du matin
Sophie 35 Euro /h commence a 10h du matin

merci


On ne va jamais aussi loin que lorsqu'on ne sait pas où l'on va.

Hors ligne

#13 Le 20/06/2012, à 20:46

titi89

Re : Petit programme en shell

bonjour,

#!/bin/bash
echo -n "Entrez le nom de l'élève :   "
read eleve
echo
echo -n "Entrez le tarif horaire sous la forme "00.00" :   "
read tarif_horaire
echo
echo -n "Appuyez sur d puis sur entrée pour lancer le chronomètre : "

# On attend que l'on ait appuyé sur f
while [ ! "$d" = "d" ]; do
    read d
done

# On saute une ligne (fondamental pour l'esthétisme ^^)
echo

# f devient l'heure de lancement
d=$(date +%s)

echo -n "Appuyez sur f puis sur entrée pour arrêter le chronomètre : "

# On attend que l'on ait appuyé sur f
while [ ! "$f" = "f" ]; do
    read f
done

f=$(date +%s)

let DIFF=$(($f - $d))
echo $DIFF

cout=$(echo "scale=2;$tarif_horaire*$DIFF/3600" /1 | bc)

echo " $(date) : $eleve " coût horaire: " $tarif_horaire €"  " coût de la prestation : $cout  €" >> mesprestations.txt
echo " $(date) : $eleve " coût horaire: " $tarif_horaire €"  " coût de la prestation : $cout  €"

#pour voir tes prestations dans le terminal:
#cat mesprestations.txt 
exit 0

un truc dans le genre pour t'aider
un terminal par élève
un fichier unique pour garder tes prestations
c'est pour t'aider vite fait
@+

Hors ligne

#14 Le 20/06/2012, à 21:25

pingouinux

Re : Petit programme en shell

Salut,
Pour info, ces 2 lignes :

echo " $(date) : $eleve " coût horaire: " $tarif_horaire €"  " coût de la prestation : $cout  €" >> mesprestations.txt
echo " $(date) : $eleve " coût horaire: " $tarif_horaire €"  " coût de la prestation : $cout  €"

peuvent être remplacées par celle-ci :

echo " $(date) : $eleve " coût horaire: " $tarif_horaire €"  " coût de la prestation : $cout  €" | tee -a mesprestations.txt

Hors ligne

#15 Le 20/06/2012, à 21:39

titi89

Re : Petit programme en shell

wink

Hors ligne

#16 Le 20/06/2012, à 22:05

nesthib

Re : Petit programme en shell

@titi89 : je te recommande également de regarder ma solution. Elle est relativement similaire à la tienne mais utilise une approche bash, AMHA, un peu plus moderne (ex. case, ne pas utiliser let…)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#17 Le 20/06/2012, à 22:48

titi89

Re : Petit programme en shell

@nesthib ok je regarde j'avais pas tout lu

en attendant permet de lancer plusieurs élèves dans un terminal:

#!/bin/bash

rm tmpeleve.txt

PS3="Votre choix: " 
select item in "- Départ d'un élève " "- Arrêt d'un élève " "- Fin"
do
echo "vous avez choisi l'item $REPLY: $item"
case "$REPLY" in
1)
echo -n "nom de l'élève : "
read eleve
echo -n "tarif horaire : "
read tarif_horaire
echo "$eleve|$tarif_horaire|$(date +%s)" >> tmpeleve.txt
;;
2)
echo -n "nom de l'élève dont la prestation est finie : "
read fineleve
fin=$(date +%s)
while read ligne
do
a="$(cut -d "|" -f1 <<< $ligne)"
b="$(cut -d "|" -f2 <<< $ligne)"
c="$(cut -d "|" -f3 <<< $ligne)"
 if [ "$fineleve" = "$a" ]; then 
let DIFF=$(($fin - $c))
cout=$(echo "scale=2;$b*$DIFF/3600" /1 | bc)
echo " $(date) : $a " coût horaire: " $b €"  " coût de la prestation : $cout  €" | tee -a mesprestations.txt
else a=a
fi
done < tmpeleve.txt
;;
3)
exit 0
;;
esac
done

exit 0

Hors ligne

#18 Le 21/06/2012, à 00:39

sputnick

Re : Petit programme en shell

Une solution full Perl totalement complète et portable smile

prérequis : paquet libyaml-appconfig-perl

La configuration YAML (plus simple qu'un fichier rc classique):

# Prix de l'heure
prix:
    Vanessa: 0
    Kadhera: 25
    Marcel: 50
    Gertrude: 100
    Philibert: 200
    Adolf: 1000000000000
monnaie: '€'

Le script commenté : http://pastie.org/4124666

ou :

#!/usr/bin/env perl

# A renseigner avec sa config :
my $conf_file = "compteur_cours.yaml";

# -----8<--------------------------------------------------------------------------------
# 2012-06-21 00:29:05.0 +0200 / sputnick <gilles.quenot *AT* gmail>
use strict; use warnings;
use YAML::AppConfig;

$|++;

clear();

my $conf = YAML::AppConfig->new(file => $conf_file)
    or die "A-peut-pas charger la conf :/\n";

printBold("Appuyer sur 'd' pour Demarrer\n");
print ">>> ";
my $key = getInputKey('d');
my $start_time = time();

clear();
printBold("On demarre le cours\n");
print "Taper 'f' pour Fermer\n>>> ";

$key = getInputKey('f');

# On calcule le nombre de secondes écoulées
my $real_time = time() - $start_time ;

clear();
printBold("Voici la liste des Prenoms avec les prix idoines:\n\n");

# on itere sur les clefs de la HASH des prenoms
# (cela utilise une référence déréférencée)
foreach my $prenom (keys %{$conf->{config}->{prix}}) {
    printf(
        "%10s%30.2f%s\n",
        $prenom,
        taPrisCher($real_time, $conf->{config}->{prix}->{$prenom}),
        $conf->{config}->{monnaie}
    );
}

# fonction qui compte() en fonction des parametres
sub taPrisCher {
    my ($sec, $prix_heure) = @_;

    return $prix_heure / 3600 * $sec;
}

# fonction technique pour
# recup la touche appuyée.
sub getInputKey {
    my $kk = shift;

    my $key = 0;
    # Tant qu'on a pas la touche requise...
    while ($key ne $kk) {
        print "\r>>> ";
        my $dec = ord(getc);
        $key = chr($dec);
    }

    return $key;
}

sub clear {
    system $^O eq 'MSWin32' ? 'cls' : 'clear';
}

sub printBold {
    my $str = shift;
    print "\033[1m$str\033[0m";
}

# vim:ts=4:sw=4

image

Dernière modification par sputnick (Le 21/06/2012, à 07:56)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#19 Le 26/06/2012, à 19:01

fav

Re : Petit programme en shell

Merci beaucoup a vous tous,vous me sauve enormement la vie !Je vais tout de suite les essayers! merci!


On ne va jamais aussi loin que lorsqu'on ne sait pas où l'on va.

Hors ligne