2016-01-19 4 views
-3

Supposons qu'un ensemble de nombres soit donné dans un fichier number_list.txt. Trouver la somme des numéros du fichier dans les catégories suivantes:Obtenir la somme des nombres de 1,2 et 3 chiffres du fichier texte en perl

Sum of all 1 digits numbers 
Sum of all 2 digits numbers 
Sum of all 3 digits numbers 
Sum of all numbers starting with a digit 7 
Sum of all number ending with a digit 8 

écrire du code dans perl pour trouver les sommes ci-dessus

exemple: Si nous avons « number_list.txt »

  23 
      258 
      1 
      24 
      57 
      76 
      85 
      72 
      4 
      654 
      958 
      6 
      46 
      358 

Ensuite, nous devons obtenir une réponse comme ça

   Sum of all 1 digits numbers 
        1 + 4 + 6 = 11 

      Sum of all 2 digits numbers 
        23 + 24 + 57 + 76 + 85 + 72 + 46 = 383 

      Sum of all 3 digits numbers 
        258 + 654 + 958 + 358 = 2228 

      Sum of all numbers starting with a digit 7 
        76 + 72 = 148 

      Sum of all number ending with a digit 8 
        258 + 358 + 958 = 1574 

Et j'ai fait jusqu'à présent.

#!/usr/bin/perl 
    use strict; 
    use warnings; 

    my $filename = "numbers.txt"; 
    open(my $fh, '<', $filename) or die "Can't open $filename: $!"; 
    my @array1; 
    my @array2; 
    my @array3; 
    my @array4; 

    print "\n \n"; 
    while (my $line = <$fh>) { 
    #if (length($line) == 1) 
    #{ 

    # push (@array1, $line); 
    #} 
    if (length($line) == 2) 
    { 
     push (@array2, $line); 
    } 
    if (length($line) == 3) 
    { 
     push (@array3, $line); 
    } 
    if (length($line) == 4) 
    { 
     push (@array4, $line); 
    } 
} 
#print "\n Sum of all digits numbers\n \n"; 
#for each (@array1) { 
#   print "$_"; 
# } 
my $sum1 = 0; 
my $sum2 = 0; 
my $sum3 = 0; 

print "\n \n Sum of all 1 digits numbers of:\n \n"; 
for each my $num2 (@array2) { 
     print "$num2"; 
     $sum1 = $sum1 + $num2; 
    } 
    print "\n Sum = $sum1"; 

print "\n \n Sum of all 2 digits numbers of:\n \n"; 
for each my $num3 (@array3) { 
     print "$num3"; 
     $sum2 = $sum2 + $num3; 
    } 
    print "\n Sum = $sum2"; 

print "\n \n Sum of all 3 digits numbers of:\n \n"; 
foreach my $num4(@array4) { 
     print "$num4"; 
     $sum3 = $sum3 +$num4; 
    } 
    print "\n Sum = $sum3"; 

J'ai donc du mal à faire ce programme de manière simple. Y at-il une méthode simple pour faire ce programme?

Et aussi j'ai du mal à obtenir

Sum of all numbers starting with a digit 7 
    Sum of all number ending with a digit 8 
+0

comment choisir séparément chaque nombre en utilisant leur longueur de chiffres.Je recherche le code en perl mais je ne pouvais pas trouver –

+0

Veuillez écrire un code qui montre à quelle distance vous êtes arrivé et où vous êtes coincé Avez-vous lu le fichier? Comment itérez-vous sur les lignes, etc – Joshua

+0

J'ai ajouté mes codes :) –

Répondre

-1

Vous pouvez faire tout avec regex.

while(<$fh>) { 
    $sum1+= $_ if /^\d$/; 
    $sum2+= $_ if /^\d{2}$/; 
    $sum3+= $_ if /^\d{3}$/; 
    $sum7+= $_ if /^7\d*$/; 
    $sum8+= $_ if /^\d*8$/; 
} 

si vous mettez le numéro à la liste, vous pouvez les imprimer comme:

local $" = ' + '; 
print "@sum1 = $sum1"; 
+0

quelqu'un ne commente pas pour downvote ... –

0

Tout d'abord, l'importation sum de List::Util pour faire des tableaux de sommation des nombres plus facile.

Si c'est un fichier relativement faible (ce qui est sans doute), les choses sont beaucoup plus facile si vous les tirez tous dans un tableau premier et les grep que vous les avez besoin

donc une fois que vous vous avez ouvert un fichier. ..

use List::Util 'sum'; 

my @nums = <$fh>; 
chomp @nums; # Remove trailing newlines; 

my @values; 

print "Sum of all 3 digits numbers\n"; 
@values = grep { length == 3 } @nums; 
print join(' + ', @values), ' = ', sum(@values), "\n"; 

print "Sum of all numbers starting with a digit 7\n"; 
@values = grep { index($_, 7) == 0 } @nums; 
print join(' + ', @values), ' = ', sum(@values), "\n"; 

print "Sum of all numbers ending with a digit 8\n"; 
@values = grep { index(reverse($_), 8) == 0 } @nums; 
print join(' + ', @values), ' = ', sum(@values), "\n"; 

Idéalement, vous mettriez un code en double (comme l'impression que des sommes) à l'intérieur d'un sub. Chaque fois que vous retapez le même code, vous augmentez vos chances de faire une erreur.

Si vous voulez le faire en streaming à travers le fichier, vous devrez garder une trace de plusieurs tableaux que vous allez

my (@len_3, @len_4, @len_5, @start_7, @end_8); 

while (my $n = <$fh>) { 
    if (length $n == 3) { 
     push @len_3, $n; 
    } 
    # ... 
    if (index($n, 7) == 0) { 
     push @start_7, $nl=; 
    } 
} 

print "Sum of all 3 digits numbers\n"; 
print join(' + ', @len_3), ' = ', sum(@len_3), "\n"; 
# ... 

Plus « cas » que vous avez, plus les tableaux que vous avez à suivre. Il existe de meilleurs moyens de le faire - par exemple, stocker des références de tableau en tant que valeurs de hachage - mais si vous apprenez simplement, cela peut être un peu déroutant en ce moment.

0

Je l'aborder comme ceci:

#!/usr/bin/perl 

use strict; 
use warnings; 
use Data::Dumper; 
use List::Util qw (sum); 

my %numbers; 
my %startswith; 

open(my $fh, '<', "numbers.txt") or die $!; 

while (<$fh>) { 
    my ($num, $start_num) = m|((\d)\d*)|; 
    push(@{ $numbers{length($num)} }, $num); 
    push(@{ $startswith{$start_num} }, $num); 
} 
close ($fh); 
print Dumper \%numbers; 
print Dumper \%startswith; 

foreach my $len (sort keys %numbers) { 
    print "Sum of all $len digits numbers:\n"; 
    print join("+", @{ $numbers{$len} }), "\n"; 
    print sum (@{$numbers{$len}}),"\n"; 
} 
foreach my $first (sort keys %startswith) { 
    print "Sum of all numbers starting with $first:\n"; 
    print join("+", @{ $startswith{$first} }), "\n"; 
    print sum (@{ $startswith{$first} }), "\n"; 
} 

Cela donne sortie:

Sum of all 1 digits numbers: 
1+4+6 
11 
Sum of all 2 digits numbers: 
23+24+57+76+85+72+46 
383 
Sum of all 3 digits numbers: 
258+654+958+358 
2228 
Sum of all numbers starting with 1: 
1 
1 
Sum of all numbers starting with 2: 
23+258+24 
305 
Sum of all numbers starting with 3: 
358 
358 
Sum of all numbers starting with 4: 
4+46 
50 
Sum of all numbers starting with 5: 
57 
57 
Sum of all numbers starting with 6: 
654+6 
660 
Sum of all numbers starting with 7: 
76+72 
148 
Sum of all numbers starting with 8: 
85 
85 
Sum of all numbers starting with 9: 
958 
958 

Et soutiendront implicitement les numéros de longueur arbitraire.(Vous pouvez utiliser List::Util pour la somme, mais je pensais offrir un non-module