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 :

calcul de temps


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 30
    Par défaut calcul de temps
    bonjour! je débute en Perl et j'aimerais solliciter votre aide pour mon script.

    je veux faire un script en PERL qui additionne les heures données en paramètre.
    Les paramètres sont en format XX:YY où XX qui est entre 0 et 99, et YY qui est entre 0 et 59.
    et si je dépasse 24 heures, je dois donnez le résultat en jours .
    Par exemple 22:04 9:03 va imprimer 1jours et 7:07 et

    12:58 9:03 va imprimer 22:01.

    voici ce que j'ai fait
    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
    #!/usr/bin/perl
    use feature "switch";
    i($#ARGV!=1)
    {
    print "Erreur argument non valide->heure:minute
    heure:minute\n";
    exit 1;}
    ($heure,$minute)=split(":",$ARGV[1]);
    ($heure,$minute)=split(":",$ARGV[0]);
    if (($heure<0)|| ($heure>99)) {
    print "heure invalide\n";
    exit 1;}
    if (($minute<0)||($minute>59))
    {print "minute invalide\n";
    exit 1;}
    $heure+=$heure;
    $minute+=$minute;
    print "$heure:$minute\n";
    exit 0;
    je suis perdu au niveau de l'addition des heures et des minutes. donc dans les 3 dernières lignes.
    est ce que vous pouvez m'aider? merci

  2. #2
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 452
    Par défaut
    Bonjour,

    Comme tu débutes, quelques impératifs :
    indenter le code !
    utiliser impérativement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use warnings;
    use strict;
    potasser les doc tu peux commencer ICI et

    Tu débutes en Perl mais pas en arithmétique je suppose
    Bon comme c'est ton premier message, une piste :
    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use utf8;
     
    my ( $J, $H, $M) = 0;
     
    if($#ARGV!=1) {
    	print "Erreur argument non valide->heure:minute heure:minute\n";
    	exit 1;
    }
     
    my ($heure1,$minute1)=split(":",$ARGV[0]);
    my ($heure2,$minute2)=split(":",$ARGV[1]);
     
    if ($heure1<0 || $heure1>99) {
    	print "heure1 invalide\n";
    	exit 1;
    }
    if ($heure2<0 || $heure2>99) {
    	print "heure2 invalide\n";
    	exit 1;
    }
    if ($minute1<0 || $minute1 >59) {
    	print "minute1 invalide\n";
    	exit 1;
    }
    if ($minute2<0 || $minute2 >59) {
    	print "minute2 invalide\n";
    	exit 1;
    }
     
    $H = $heure1 + $heure2;
    $M = $minute1 + $minute2;
    print "\n$H:$M\n\n";
     
    if ( $H >= 24 ) {
    	$J = int ( $H / 24 );
    	$H = $H % 24;
     
    	if ( $M >= 60 ){
    		$H = $H + int ($M /60);
    		$M = $M % 60;
    	} else {
    		if ( $M >= 60 ){
    			$H = $H + int ($M /60);
    			$M = $M % 60;
    		}
    	}
    	printf ('%d jour(s) %d:%02d', $J, $H, $M);
    }	else {
    	if ( $M >= 60 ){
    		$H = $H + int ($M /60);
    		$M = $M % 60;
    	} else {
    		if ( $M >= 60 ){
    			$H = $H + int ($M /60);
    			$M = $M % 60;
    		}
    	}
    	printf ('%d:%02d', $H, $M);
    }
    exit 0;
    J'espère n'avoir rien oublié...

    On doit pouvoir faire plus Sioux, mais au moins c'est lisible !

    % est l'opérateur modulo qui donne le reste de la division
    int donne la partie entière de la division

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    @ dmganges: j'ai l'impression (à première vue) que ton code se répète et ne comprends pas trop la raison. Erreur de copier-coller?

    Par ailleurs, je pense qu'il faut convertir les minutes au-delà de 60 en heures avant de convertir les heures au-delà de 24 en jours, car la conversion des minutes au-delà de 60 en heures est susceptible de faire passer le nombre d'heures au-delà de 24.

    (J'écris "au-delà" en simplifiant pour signifier supérieur ou égal.)

  4. #4
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 452
    Par défaut
    @ Lolo78
    Il ne me semble pas qu'il puisse y avoir débordement car au départ le créneau des 2 paramètres est bien limité :
    Citation Envoyé par kylan
    Les paramètres sont en format XX:YY où XX qui est entre 0 et 99, et YY qui est entre 0 et 59.
    Mais tu as raison il est plus logique de commencer par les minutes...
    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use utf8;
     
    my ( $J, $H, $M) = 0;
     
    if($#ARGV!=1) {
    	print "Erreur argument non valide->heure:minute heure:minute\n";
    	exit 1;
    }
     
    my ($heure1,$minute1)=split(":",$ARGV[0]);
    my ($heure2,$minute2)=split(":",$ARGV[1]);
     
    if ($heure1<0 || $heure1>99) {
    	print "heure1 invalide\n";
    	exit 1;
    }
    if ($heure2<0 || $heure2>99) {
    	print "heure2 invalide\n";
    	exit 1;
    }
    if ($minute1<0 || $minute1 >59) {
    	print "minute1 invalide\n";
    	exit 1;
    }
    if ($minute2<0 || $minute2 >59) {
    	print "minute2 invalide\n";
    	exit 1;
    }
     
    $H = $heure1 + $heure2;
    $M = $minute1 + $minute2;
    print "\n$H:$M\n\n";
     
     
    if ( $M >= 60 ) {
    	$H = $H + int ( $M / 60 );
    	$M = $M % 60;
    }
     
    if ( $H < 24 ) {
    	printf ('%d:%02d', $H, $M);
    } else {
    	my $J = int ($H / 24);
    	$H = $H % 24;
    	printf ('%d jour(s) %d:%02d', $J, $H, $M);
    }
     
    exit 0;
    et c'est plus clair

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 30
    Par défaut
    merci de votre aide!

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dmganges Voir le message
    @ Lolo78
    Il ne me semble pas qu'il puisse y avoir débordement car au départ le créneau des 2 paramètres est bien limité. [...]
    Je pensais à un cas de figure illustré par l'exemple suivant:
    23:45 + 00:30 = 23:75

    Si tu commences par diviser les heures par 24, tu n'as pas un jour entier, le nombre de jour est 0. Ensuite tu traites les minutes et ton code initial obtient 24:15. Mais tu as déjà traité les heures, c'est trop tard pour les retraiter. C'est pour cela qu'il vaut mieux commencer par traiter les minutes, ce qui conduit à incrémenter l'heure; ensuite on constate qu'il y a un jour entier, et on obtient la valeur 01:00:15 (et non 00:24:15).

    Le nouveau code que tu as posté corrige ce cas de figure.

  7. #7
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 452
    Par défaut
    EXACT Lolo78 !
    MERCI pour ta vigilance !

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Un détail, mais ceci :
    Citation Envoyé par dmganges Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ( $J, $H, $M) = 0;
    ne fait pas ce que l'on pourrait croire (initialiser à 0 les trois variables $J, $H, $M).
    Il n'initialise que $J. Pour tout initialiser, il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ( $J, $H, $M) = (0, 0, 0);
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ( $J, $H, $M) = (0) x 3;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ perl -E 'my ($a, $b) = 0; say "a=[", $a // "UNDEF", "]", " b=[", $b // "UNDEF", "]";'
    a=[0] b=[UNDEF]

  9. #9
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 452
    Par défaut
    MERCI Philou67430, tu as bien raison :
    Plus j'apprends, et plus je mesure mon ignorance.

    Celle-là j'aurais cherché longtemps !
    Mais à la relecture, ça me paraît maintenant évident.

    Sauf erreur (encore) :
    met les 3 à UNDEF ?

    C'est quoi l'astuce ?

Discussions similaires

  1. comment calculer le temps d'execution
    Par passion_info dans le forum C++Builder
    Réponses: 1
    Dernier message: 09/06/2005, 09h13
  2. Calculer le temps passé
    Par Joeleclems dans le forum MFC
    Réponses: 4
    Dernier message: 29/04/2005, 09h40
  3. calculer le Temp écoulé
    Par ada_b dans le forum SQL
    Réponses: 1
    Dernier message: 30/11/2004, 09h44
  4. [MFC] : CTime ? Calcul de temps d'éxécution
    Par jonzuzu dans le forum MFC
    Réponses: 10
    Dernier message: 25/05/2004, 14h22
  5. Réponses: 8
    Dernier message: 18/09/2002, 03h20

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