perl, doppelte ausgabe

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von kissen, 28.01.2007.

  1. kissen

    kissen Guest

    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,
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 angelsfall, 28.01.2007
    angelsfall

    angelsfall Routinier

    Dabei seit:
    09.05.2005
    Beiträge:
    315
    Zustimmungen:
    0
    Ort:
    Berlin
    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.
     
  4. kissen

    kissen Guest

    Hi,

    danke erstmal fuer deine Antwort.

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

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

    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
     
  5. #4 Xanti, 28.01.2007
    Zuletzt bearbeitet: 28.01.2007
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    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
     
  6. kissen

    kissen Guest

    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
     
Thema:

perl, doppelte ausgabe

Die Seite wird geladen...

perl, doppelte ausgabe - Ähnliche Themen

  1. Linux Foundation: Hyperledger-Projekt startet mit 30 Mitgliedern

    Linux Foundation: Hyperledger-Projekt startet mit 30 Mitgliedern: Das Hyperledger-Projekt der Linux Foundation will eine neue Form der dezentralisierten Kontoführung nach dem Prinzip der »distributed ledger« bei...
  2. Perl 6 offiziell vorgestellt

    Perl 6 offiziell vorgestellt: Wie erwartet, ist die Version C(hristmas) von Perl 6 veröffentlicht worden. Perl 6 stellt nicht, wie der Name suggeriert, einen Nachfolger von...
  3. Perl: 20 Jahre CPAN

    Perl: 20 Jahre CPAN: Vor 20 Jahren wurde das erste Modul in das Comprehensive Perl Archive Network (CPAN) hochgeladen, woran Neil Bowers mit einem Abriss der...
  4. Perl 5.22.0 freigegeben

    Perl 5.22.0 freigegeben: Die neue Version 5.22 von Perl bringt den Anwendern mehr Sicherheit bei Eingabedateien, Unicode 7.0 und zahlreiche weitere Verbesserungen....
  5. [Perl] Perl OO Methodenaufruf in anderem Objekt

    [Perl] Perl OO Methodenaufruf in anderem Objekt: Hallo, Ich bin dabei in Perl ein Pokerspiel zu programmieren, hänge aber momentan an einem Problem, wo ich nicht weiterkomme. Ich habe die...