Frage

Ich schreibe ein Programm, das in einer Eingabedatei vom Benutzer nimmt. Die Datei hat Bündel Zahlen drin, und ich werde die Zahlen in der Datei und erstellen Sie ein Grundstück auf der Grundlage dieser Zahlen mit GD :: Graph .

Die erste Zeile der Datei ist, X-Achse, die zweite Zeile der Datei ist, Y-Werte zu der X-Achse entspricht, und dritte, vierte, ..., usw. Zum Beispiel:

1 2 3 4 5 
2 4 5 10 14
5 6 8 12 13

So in der obigen ersten Linie X-Achse ist, ist die zweite y-Werte entsprechend zu diesen xaxis so 10 Punkte holen wird. (1, 2), (1, 5) (2, 4) (2, 6) .... (4,10) (4,12) (5,14) (5, 13)

I plane jede Zeile des Arrays zu lesen und dann die Leitung auf Leerzeichen oder Tabulator Aufspalten und die Werte in einem Array gespeichert werden. So Array 1 wird x-Achse haben, werden array2 haben y-Achse, aber wie soll ich speichern 3., 4., 5., ... usw Linien in einem Array so werden sie (x, y)?

Darüber hinaus Wie finde ich den größten Wert für die ersten und zweiten Leitungen (2 Arrays), so kann ich eine Grenze für meine X und Y-Achsen erstellen?

War es hilfreich?

Lösung

Whoops, die Frage falsch verstanden, möchten Sie entweder ein AoAoH oder AoH, je nachdem, ob jede Zeile nach dem ersten repräsentiert eine Linie oder die sind alle Punkte nur jeweils aufgetragen werden. Hier ist, wie ich es schreiben würde, wenn jede Zeile in der Datei eine Linie in der Grafik werden sollte:

#!/usr/bin/perl

use strict;
use warnings;
use List::Util qw/min max/;

my @x_points         = split " ", scalar <>; #read in the x axis labels
my ($x_min, $x_max)  = (sort { $a <=> $b } @x_points)[0,-1];
my ($y_min, $y_max)  = (0, 0);

#lines is an AoAoH, first layer are the lines to be drawn
#second layer is a list of coords
#third layer are the x and y coords
my @lines;
while (<>) {
    my @y_points = split;
    #if the two arrays are not the same size, we have a problem
    die "invalid file\n" unless @y_points == @x_points;

    $y_min = max($y_min, @y_points);
    $y_max = min($y_max, @y_points);

    push @lines, [ 
        map { { x => $x_points[$_], y => $y_points[$_] } }  
    0 .. $#x_points 
    ];
}

use Data::Dumper;

print "x min and max $x_min $x_max\n",
      "y min and max $y_min $y_max\n",
      "data:\n",
      Dumper(\@lines);

my $i;
for my $line (@lines) {
    $i++;
    print "line $i is made up of points: ",
        (map { "($_->{x}, $_->{y}) " } @$line), "\n";
}

Und hier ist, wie ich damit umgehen würde, wenn sie nur Punkte werden ploted sind:

#!/usr/bin/perl

use strict;
use warnings;
use List::Util qw/min max/;

my @x_points         = split " ", scalar <>; #read in the x axis labels
my ($x_min, $x_max)  = (sort { $a <=> $b } @x_points)[0,-1];
my ($y_min, $y_max)  = (0, 0);

#lines is an AoAoH, first layer are the lines to be drawn
#second layer is a list of coords
#third layer are the x and y coords
my @points;
while (<>) {
    my @y_points = split;
    #if the two arrays are not the same size, we have a problem
    die "invalid file\n" unless @y_points == @x_points;

    $y_min = max($y_min, @y_points);
    $y_max = min($y_max, @y_points);

    push @points,
        map { { x => $x_points[$_], y => $y_points[$_] } }
        0 .. $#x_points;
}

use Data::Dumper;

print "x min and max $x_min $x_max\n",
      "y min and max $y_min $y_max\n",
      "data:\n",
      Dumper(\@points);

print "Here are the points: ", 
    (map { "($_->{x}, $_->{y}) " } @points), "\n";

Andere Tipps

Nicht wirklich eine Antwort auf Ihre Frage, aber nicht verpassen GD: :. Graph :: Daten

Es sei denn, Sie sind sicher , dass die ersten und die letzten in jeder Zeile ist kleinste / größte Sie brauchen etwas zu verwenden, wie List :: Util 's min() und max().


Ich verstehe wirklich nicht, was Sie meinen „Die erste Zeile der Datei ist der X-Achse, die zweite Zeile der Datei Y-Achse ist und die dritte, vierte, ..., etc. sind entsprechende Punkte auf der X-Achse.“

Sie können Ihren x- und y-Arrays wachsen, wie Sie gehen.

#!/usr/bin/perl

use Data::Dumper;
use warnings;
use strict;

my @xs = ();
my @ys = ();
my $expecting_xs = 1;
my $last_xs_count;

while(<>) {
  chomp;
  my @values = split(/\s+/);
  if($expecting_xs) {
    push(@xs, @values);
    $last_xs_count = @values;
    $expecting_xs = 0;
  } else {
    if(@values != $last_xs_count) {
      die "Count mismatch";
    } 
    push(@ys, @values);
    $expecting_xs = 1;
  }
}

if(!$expecting_xs) {
  die("Odd number of lines");
}

my($xmin, $xmax) = extremes(@xs);
my($ymin, $ymax) = extremes(@ys);

print "xmin: $xmin xmax: $xmax ymin: $ymin ymax: $ymax\n";
print Dumper(\@xs), Dumper(\@ys);

sub extremes {
  my(@values) = @_;
  return undef unless @values;
  my $min = shift(@values);
  my $max = $min;
  for my $value (@values) {
    $max = $value if $value > $max;
    $min = $value if $value < $min;
  }
  return $min, $max;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top