IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Gestions des dates [Débutant(e)]


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut Gestions des dates
    Bonjour,
    Débutant, je n'ai pas trouvé exactement ce que je cherchais...
    Je vous expose mon problème:

    Je cherche à faire un petit script avec le langage perl :

    L'utilisateur entrera la production qu'il a, mon script calculera a partir de la production par heure le début de la production, mon problème est le calcul d'heure, il entrera l'heure comme ceci HH:MM:SS, en puis donnera le résultat, seulement je suis bloqué dans mon calcul d'heure, je ne trouve pas la fonction apte à le gerer...

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Lit notre FAQ et il y a des codes Perl à disposition dans les sources de la rubrique Perl.
    Sinon, Ta question n'est pas clair, et évite les titres de messages non explicite.

    Merci et bienvenu à toi sur ce forum et dans le monde Perl.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut
    Bonjour Djibril, merci pour la bienvenue,

    J'ai lu la faq, mais je n'ai pas trouvé ce que je cherche, ou alors je n'ai pas compris comment l'utiliser dans mon cas, je vais vous donner un exemple pour plus de compréhension :

    L'utilisateur rentre l'heure de relevé de production : 11H 11M 11S
    Il rentre sa production qu'il a faite depuis le début jusqu'au relevé : 11 222 x
    Il rentre sa production qu'il fait par heure : 1 222 x

    A partir de la, on lui donne le l'heure du début de production :
    11 222 / 1 222 = 9.18
    18 / 1.666 = 10.80
    80 / 1.666 = 48
    on arrive a 9H 10M 48S

    on soustrait donc
    11H 11M 11S et
    09H 10M 48S
    ce qui nous donne
    02H 00M 23S
    La production a donc démarrer il y 2H 00M 23S
    Je voudrais automatisé sous un script, avec la date du relevé a la production par heure donné par l'utilisateur.

    J'espère me faire comprendre...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Par défaut
    Bonjour,

    Je m'ennuyais un peu donc j'ai jeté un oeil à ton problème .
    Ci-dessous un code perl qui fait ce que tu demandes en se servant de la fonction split et de la concaténation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    #! /usr/bin/perl
     
    use warnings;
     
    #On entre le nom de l'utilisateur
    print "\nVeuillez entrer le nom de l\'utilisateur et appuyer sur \'entrée\': \n";
    my $utilisateur = <STDIN>;
     
    #on entre l'heure de releve de la production sous la forme HH:MM:SS
    print "Veuillez entrer l\'heure de releve de la production sous la forme HH:MM:SS :\n";
    my $releve  = <STDIN>;
     
    #On découpe $releve en 3 termes: $hours_rel:$min_rel:$sec_rel et on met le tout dans un tableau
    my @tab = split(/:/, $releve);
    my $hours_rel=$tab[0];
    my $min_rel=$tab[1];
    my $sec_rel=$tab[2];
     
    #on entre la production faite du debut jusqu'au relevé
    print "Veuillez entrer la production faite du debut jusqu'au relevé: \n";
    my $prod_tot = <STDIN>;
     
    #on entre la production faite par heure
    print "Veuillez entrer la production faite par heure: \n";
    my $prod_by_hours = <STDIN>;
     
    #on cherche la valeur exacte du nombre d'heures
    my $deb_hours=$prod_tot/$prod_by_hours;
     
    #Afin d'arrondir, on découpe le resultat en 2 termes: ce qu'il y a avant le '.' et ce qu'il y a après le point et on met le tout dans un tableau
    #Le 1er terme du tableau contient le nombre/terme avant le "."
    #Le 2eme terme du tableau contient le nombre/terme apres le "."
    @tab = split(/\./, $deb_hours);
     
    #On affecte le nombre d'heure arrondi à la variable $deb_hours qui ne sera pas réutilisée
    $deb_hours = $tab[0];
     
    #On affecte le reste du nombre d'heures (0.18 dans ton exemple) à la variable $deb_min
    my $deb_min = "0".".".$tab[1];
     
    #On multiplie $deb_min par 60 pour avoir la valeur exacte du nombre de minutes
    $deb_min *= 60;
     
    #Afin d'arrondir, on découpe le resultat en 2 termes: ce qu'il y a avant le '.' et ce qu'il y a après le point et on met le tout dans un tableau
    @tab = split(/\./, $deb_min);
     
    #On affecte le nombre de minutes à la variable $deb_min qui ne sera pas réutilisée
    $deb_min = $tab[0];
     
    #On affecte le reste du nombre de minutes (0.80 dans ton exemple) à la variable $deb_sec
    my $deb_sec = "0".".".$tab[1];
     
    #On multiplie $deb_sec par 60 pour avoir la valeur exacte du nombre de secondes
    $deb_sec *= 60;
     
    #Afin d'arrondir, on découpe le resultat en 2 termes: ce qu'il y a avant le '.' et ce qu'il y a après le point
    @tab = split(/\./, $deb_sec);
     
    #On affecte le nombre de secondes à la variable $deb_sec qui ne sera pas réutilisée
    $deb_sec = $tab[0];
     
    print "\n=> Nom de l\'utilisateur:\t\t\t\t $utilisateur \n";
    print "=> Heure de relevé de production:\t\t\t $hours_rel:$min_rel:$sec_rel \n";
    print "=> Production totale entre le debut et la releve:\t $prod_tot \n";
    print "=> Production par heure:\t\t\t\t $prod_by_hours \n";
     
    #Je n'obtiens pas le meme résutat que toi car je n'arrondis pas mes heures et minutes dans les calculs
    print "=> Heure de début de production:\t\t\t $deb_hours:$deb_min:$deb_sec \n";
     
    #Pour faciliter le calcul du délai je passe tout en secondes
    my $time_releve_production = $hours_rel*3600+$min_rel*60+$sec_rel;
    my $time_debut_production = $deb_hours*3600+$deb_min*60+$deb_sec;
     
    my $delai_en_sec = $time_releve_production - $time_debut_production ;
    my $delai_hours = $delai_en_sec/3600;
    @tab = split(/\./, $delai_hours);
    $delai_hours = $tab[0];
    my $delai_min = ($delai_en_sec - 3600*$delai_hours)/60;
    @tab = split(/\./, $delai_min);
    $delai_min = $tab[0];
    my $delai_sec = ($delai_en_sec - 3600*$delai_hours -60*$delai_min);
     
    print "\n=> La production a donc démarrée il y a $delai_hours heures $delai_min minutes $delai_sec secondes \n\n";
    J'ai essayé de commenter au maximum pour que tu puisses suivre facilement, par contre des fois le nom de mes variables n'est peut etre pas tres judicieux.
    Il y a surement plein d'autres méthodes pour le faire mais j'ai essayé de suivre tes explications.

    Bonne journée et bonne chance pour la suite

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut
    Un grand merci, j'en espérais pas tant..
    Je ne connaissait pas la fonction split, il est vrai qu'elle est remplis son rôle dans ce script.
    Encore merci et très bon boulot

    edit: J'aimerais mettre un valeur a la production, rajouter 30/h, je suis un peut perdu avec ces variables et calcul, et je m'y prend mal.
    Je ne sais pas si je dois rajouter une variable pour la prod par défaut de 30/h ou alors redéfinir je sais pas trop ou ...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Par défaut
    Re ,

    Si tu es un peu perdu en lisant mon script, reprend le calmement en partant du début ligne par ligne en essayant de comprendre la fonction de chacune d'elles, normalement j'ai suivit le raisonnement que tu avais donné.
    N'essaye pas de modifier mon script, crée en parallèle ton propre programme avec tes propres noms de variables, en déclarant tes variables en dur ou en les demandant via l'invité de commande (<STDIN>), en testant chaque ligne et en vérifiant que tu comprends l'utilité de chacune d'elles.

    N'hésite pas à vérifier le contenu de tes variables lors de la rédaction de ton programme via des commandes du type:
    print "Valeur: $valeur \n";
    Ce que je t'ai fournis n'est que le squelette de ton programme , il est loin d'être parfait, tu devras apporter quelques modifications pour un programme véritablement fiable:

    • Il te faudra vérifier les valeurs insérées par l'utilisateur (l'empêcher de mettre n'importe quoi).
    • S'intéresser à la fonction 'defined" et aux tests 'if' pour les cas où lors de tes divisions, ton reste (0.18 ou 0.80 dans ton cas) est 'null' : tu peux tester ce cas en mettant production totale =3000 et production par heure=1000 par exemple, le résultat donne 3 heures 0 minutes 0 secondes , ce que le programme çi-dessus ne gère pas pour l'instant.
    • Gérer le cas où l'utilisateur pour s'amuser mettrait ta variable $prod _by_hours à 0 : dans le programme çi-dessus, il y a une division hors le programme ci-dessus ne gére pas le cas où l'utilisateur tenterait une division par 0.
    • Gérer le cas où la date de relevé et la date de production ne sont pas la même (exemple: releve = 09:59:00 , production totale =12000 et production par heure=1000, ce qui te fait changer de jour et te donne donc des résultats négatifs lorsque tu utilises le programme çi-dessus.
    • Mettre des valeurs par défaut pour certaines variables dans le cas ou l'utilisateur ne rentre pas de valeur (voir la fonction 'if', la fonction de comparaison et la valeur de retour de ton champ lorsque tu appuies sur entrée sans mettre de valeur).


    Je sais çà a l'air de faire beaucoup mais ce n'est qu'une dizaine de lignes a rajouter.

    Comme tu vois , c'est pas tout çà mais t'as quand même encore du boulot

Discussions similaires

  1. gestion des dates dans un formulaire
    Par clement42 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 18/05/2006, 11h34
  2. [VB6]gestion des dates
    Par luckelm dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/04/2006, 20h25
  3. Application international (Gestion des dates)
    Par vsavoir dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/08/2005, 10h22
  4. Réponses: 3
    Dernier message: 13/08/2004, 18h52
  5. [MCD] [MCD] Gestion des dates
    Par brionne dans le forum Schéma
    Réponses: 3
    Dernier message: 30/05/2003, 13h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo