perl, doppelte ausgabe

K

kissen

Hi,

ich habe eine Frage zu Perl. Ich schreibe grade ein Programm, welches den BMI ausrechnet, und auf Wunsch eben den altersgerechten BMI.

Jedoch gibt es jedes mal wenn ich mit einem Alter den BMI ausrechnen lassen, die Ausgabe "Sie sind untergewichtig", "Sie haben ein Normalgewicht" oder "Sie sind uebergewichtig" doppelt aus .. Jetzt suche ich seit geraumer Zeit den Fehler, finde aber nichts. Kann jemand helfen?

Hier der Code:

Code:
#!/usr/bin/perl

print "Wir berechnen Ihren Body-Mass-Index zur Bewertung Ihres Koerpergewichts\n";
print "Sind Sie maennlich, weiblich oder keine Angabe (m/w/n)?: ";
my $gen=<STDIN>;
print "Bitte geben Sie Ihr Alter ein (oder ein n fuer keine Angabe): ";
my $age=<STDIN>;
print "Bitte geben Sie Ihr Gewicht ein (in kg): ";
my $weight=<STDIN>;
print "Bitte geben Sie Ihre Koerpergroesse eine (in m (x.yz)): ";
my $size=<STDIN>;

chomp($gen);
chomp($age);
chomp($size);
chomp($weight);

my $bmi=($weight / ($size*$size));

print "Ihr Body-Mass-Index: ".$bmi."\n";

@out = ("Sie sind untergewichtig!\n", "Sie haben ein Normalgewicht!\n", "Sie sind uebergewichtig!\n");
@minm = ('19', '20', '21', '22', '23', '24');
@minf = ('18', '19', '20', '21', '22', '23');
@maxm = ('24', '25', '26', '27', '28', '29');
@maxf = ('23', '24', '25', '26', '27', '28');

if($gen=="m" && $age < 18 && $age != "n"){
  print "Sie muessen mindestens 18 Jahre alt sein!\n";
}
elsif($gen=="m" && $age >= 18 && $age <= 24){
  if($bmi <= $minm[0]){
    print $out[0];
  }
  elsif($bmi >= $minm[0] && $bmi <= $maxm[0]){
  print $out[1];
  }
  elsif($bmi >= $maxm[0]){
  print $out[2];
  }
}
elsif($gen=="m" && $age >= 25 && $age <= 34){
  if($bmi <= $minm[1]){
    print $out[0];
  }
  elsif($bmi >= $minm[1] && $bmi <= $maxm[1]){
  print $out[1];
  }
  elsif($bmi >= $maxm[1]){
  print $out[2];
  }
}
elsif($gen=="m" && $age >= 35 && $age <= 44){
  if($bmi <= $minm[2]){
    print $out[0];
  }
  elsif($bmi >= $minm[2] && $bmi <= $maxm[2]){
  print $out[1];
  }
  elsif($bmi >= $maxm[2]){
  print $out[2];
  }
}
elsif($gen=="m" && $age >= 45 && $age <= 54){
  if($bmi <= $minm[3]){
    print $out[0];
  }
  elsif($bmi >= $minm[3] && $bmi <= $maxm[3]){
  print $out[1];
  }
  elsif($bmi >= $maxm[3]){
  print $out[2];
  }
}
elsif($gen=="m" && $age >= 55 && $age <= 64){
  if($bmi <= $minm[4]){
    print $out[0];
  }
  elsif($bmi >= $minm[4] && $bmi <= $maxm[4]){
  print $out[1];
  }
  elsif($bmi >= $maxm[4]){
  print $out[2];
  }
}
elsif($gen=="m" && $age >= 64){
  if($bmi <= $minm[5]){
    print $out[0];
  }
  elsif($bmi >= $minm[5] && $bmi <= $maxm[5]){
  print $out[1];
  }
  elsif($bmi >= $maxm[5]){
  print $out[2];
 } 
}

if($gen=="w" && $age < 18 && $age != "n"){
  print "Sie muessen mindestens 18 Jahre alt sein!\n";
}
elsif($gen=="w" && $age >= 18 && $age <= 24){
  if($bmi <= $minf[0]){
    print $out[0];
  }
  elsif($bmi >= $minf[0] && $bmi <= $maxf[0]){
  print $out[1];
  }
  elsif($bmi >= $maxf[0]){
  print $out[2];
  }
}
elsif($gen=="w" && $age >= 25 && $age <= 34){
  if($bmi <= $minf[1]){
    print $out[0];
  }
  elsif($bmi >= $minf[1] && $bmi <= $maxf[1]){
  print $out[1];
  }
  elsif($bmi >= $maxf[1]){
  print $out[2];
  }
}
elsif($gen=="w" && $age >= 35 && $age <= 44){
  if($bmi <= $minf[2]){
  print $out[0];
  }
  elsif($bmi >= $minf[2] && $bmi <= $maxf[2]){
  print $out[1];
  }
  elsif($bmi >= $maxf[2]){
  print $out[2];
  }
}
elsif($gen=="w" && $age >= 45 && $age <= 54){
  if($bmi <= $minf[3]){
    print $out[0];
  }
  elsif($bmi >= $minf[3] && $bmi <= $maxf[3]){
  print $out[1];
  }
  elsif($bmi >= $maxf[3]){
  print $out[2];
  }
}
elsif($gen=="w" && $age >= 55 && $age <= 64){
  if($bmi <= $minf[4]){
    print $out[0];
  }
  elsif($bmi >= $minf[4] && $bmi <= $maxf[4]){
  print $out[1];
  }
  elsif($bmi >= $maxf[4]){
  print $out[2];
  }
}
elsif($gen=="w" && $age >= 64){
  if($bmi <= $minf[5]){
    print $out[0];
  }
  elsif($bmi >= $minf[5] && $bmi <= $maxf[5]){
  print $out[1];
  }
  elsif($bmi >= $maxf[5]){
  print $out[2];
  }
}

sub mas{
 if($bmi <= 20){
   print $out[0];
 }
 elsif($bmi >= 20 && $bmi <= 25){
   print $out[1];
 }
 elsif($bmi >= 25){
    print $out[2];
 }
}

sub fem{
 if($bmi <= 19){
    print $out[0];
 }
 elsif($bmi >= 19 && $bmi <= 24){
    print $out[1];
 }
 elsif($bmi >= 24){
    print $out[2];
 }
}

sub uns{
 if($bmi <= 18.5){
    print $out[0];
 }
 elsif($bmi >= 18.5 && $bmi <= 25){
    print $out[1];
 }
 elsif($bmi >= 25){
    print $out[2];
 }
}

if($gen=="m" && $age=="n"){
  mas;
}
elsif($gen=="w" && $age=="n"){
  fem;
}
elsif($gen=="n" && $age=="n"){
  uns;
}


Danke im Voraus,
 
Hi.

Erstmal: Dein Code ist ... nicht schön. Du machst für jeden Fall eine Bedingung auf. Sowas kann man zusammenfassen. Guck dir das nochmal genauer an :)

Dann: Obligatorisch bei perl ist es, den Interpreter mit der Option -w aufzurufen. Zusätzlich solltest du auch strict verwenden.
Also:
Code:
#!/usr/bin/perl -w

use strict;

Wenn du das tust, siehst du auch schon deinen Fehler: Du nutzt für Stringvergleiche den Operator für Zahlen. Strings werden mit "ne" (für !=) und "eq" (für ==) verglichen.
Also z.B.:
Code:
if ("aepfel" eq "birne") ...

Steht eigentlich auch in jedem Perl-Tutorial. Ist also kein Geheimnis.
Ob es im Endeffekt jetzt daran lag, weiss ich nicht, da ich nicht die Zeit habe, jede deiner Abfragen zu korrigieren.
 
Hi,

danke erstmal fuer deine Antwort.

Du machst für jeden Fall eine Bedingung auf. Sowas kann man zusammenfassen. Guck dir das nochmal genauer an :)

Ich weiss nicht, ich finde auch dass das irgendwie zu viel ist, aber ich komm irgendwie nicht drauf, wie ich das aendern muss.

Dann: Obligatorisch bei perl ist es, den Interpreter mit der Option -w aufzurufen. Zusätzlich solltest du auch strict verwenden.
Also:
Code:
#!/usr/bin/perl -w

use strict;
Danke, stimmt, das -w hatte ich vergessen. Vielen Dank fuer den Tip mit use strict; somit wird der Code sauberer ..:>

Wenn du das tust, siehst du auch schon deinen Fehler: Du nutzt für Stringvergleiche den Operator für Zahlen. Strings werden mit "ne" (für !=) und "eq" (für ==) verglichen.
Also z.B.:
Code:
if ("aepfel" eq "birne") ...

Steht eigentlich auch in jedem Perl-Tutorial. Ist also kein Geheimnis.
Ob es im Endeffekt jetzt daran lag, weiss ich nicht, da ich nicht die Zeit habe, jede deiner Abfragen zu korrigieren.

Wow, genau das war der Fehler! Vielen, vielen Dank :)

Kann mir vielleicht noch jemand auf die Spruenge helfen, wie ich das mit den Bedinungen reduziere?

Danke im Voraus,

kissen
 
Ein Beispiel wären mehrdimensionale Hashs. Da Du aber bereits mit Arrays arbeitest, nutze sie doch besser aus. Ein Vorschlag:

Code:
@minm = (19, 20, 21, 22, 23, 24);
@minf = (18, 19, 20, 21, 22, 23);
@maxm = (24, 25, 26, 27, 28, 29);
@maxf = (23, 25, 25, 26, 27, 28);
@years = (0, 10, 20, ...);

my $i=-1; while($minm[++$i]) {
  if ($years[$i] <= $age and $age < $years[$i+1]) {
    if ($gen eq 'm') {
      if ($bmi < $minm[$i]) {print "Mager\n";}
      elsif ($bmi > $maxm[$i]) {print "Fett\n";}
      else {print "Normal\n";}
    else {
      if ($bmi < $minf[$i]) {print "Mager\n";}
      elsif ($bmi > $maxf[$i]) {print "Fett\n";}
      else {print "Normal\n";}
    }
    last;
  }
}

Gruss, Daniel
 
Zuletzt bearbeitet:
Hey,

danke fuer deine Anwort. Ich antworte erst so spaet, da ich den Code noch nicht verstanden hatte, habe mich nun erst mit Hashes befasst.
Ich habe nun den Code so wie du ihn stehen hast mehr oder weniger uebernommen.

Vielen Dank euch beiden,

kissen
 

Ähnliche Themen

E/A-Fehler (.snapshots is not a btrfs subvolume).

ip6tables Problem

Server und Client für TCP und UDP

[Perl] Perl OO Methodenaufruf in anderem Objekt

Creative Labs SoundBlaster Audigy 2 ZS unter Debian / Kernel 3.16

Zurück
Oben