Pages : 1
#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...
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
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#8 Le 19/06/2012, à 20:45
- fav
Re : Petit programme en shell
waouuhh 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
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!!!
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…
(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 )
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#12 Le 20/06/2012, à 12:15
- fav
Re : Petit programme en shell
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!
Pas du tout ,l'honoraire que j'ai mentionne en haut dit bien que les donnees initiales sont notee par heure :
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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
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
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