while-Schleife funkftioniert leider nicht richtig;(

23/03/2013 - 20:40 von Ying Gan | Report spam
Hi Leute, folgende Aufgabe habe ich gerade versucht zu lösen:
Schreiben Sie ein Divisions-Skript, in dem Sie um die Eingabe von zwei Zahlen bitten und prüfen, dass keine der eingegebenen Zahlen negativ und die zweite Zahl nicht Null ist. Wenn beide Zahlen diesen Anforderungen entsprechen, teilen Sie die erste durch die zweite Zahl, und geben Sie das Ergebnis aus.

Dieses Perl-Sript habe ich verfasst:

while(){
print"Geben Sie zwei Zahlen ein: ";
chomp($beidezahlen=<STDIN>);
($erstezahl, $zweitezahl)=split(' ',$beidezahlen);
if($erstezahl>0 && $zweitezahl>0){
$erstezahl/$zweitezahl;
$ergebnis=$erstezahl/$zweitezahl;
next;}
elsif($erstezahl<0 || $zweitezahl<0)
{print "Das ist keine gute Eingabe!";
next;
}
else{last;}
}
print"Das Ergebnis ist ";
printf("%.2f",$ergebnis);

Folgende Probleme treten dabei auf:
1. wenn ich z.B. 33 eingebe und das Skript dann 3 durch 3 teilt, bekomme ich null raus.
2. wenn ich 3-2 eingebe, dann kommt bei der Division auch null raus.
3. nur wenn ich -33 oder -3-3 eingebe, dann bekomme ich den erwünschten Satz "Das ist keine gute Eingabe!"

Ich wàre sehr denkbar, wenn sich jemand mein Skript anschauen würde und sagen könnte, was ich falsch gemacht habe. Ich bastele schon seit fast zwei Stunden daran rum und finde einfach nicht den Fehler bzw. die Fehler! Vielen Dank schonmal!
 

Lesen sie die antworten

#1 Bjoern Hoehrmann
23/03/2013 - 21:24 | Warnen spam
* Ying Gan wrote in de.comp.lang.perl.misc:
Schreiben Sie ein Divisions-Skript, in dem Sie um die Eingabe von zwei
Zahlen bitten und prüfen, dass keine der eingegebenen Zahlen negativ und
die zweite Zahl nicht Null ist. Wenn beide Zahlen diesen Anforderungen
entsprechen, teilen Sie die erste durch die zweite Zahl, und geben Sie
das Ergebnis aus.



Nach `perltidy` und ein paar my-Deklarationen:

#!perl -w
use strict;
use warnings;
use diagnostics;

my $ergebnis;
while () {
print "Geben Sie zwei Zahlen ein: ";
chomp( my $beidezahlen = <STDIN> );
my ( $erstezahl, $zweitezahl ) = split( ' ', $beidezahlen );
if ( $erstezahl > 0 && $zweitezahl > 0 ) {
$ergebnis = $erstezahl / $zweitezahl;
next;
}
elsif ( $erstezahl < 0 || $zweitezahl < 0 ) {
print "Das ist keine gute Eingabe!";
next;
}
else { last; }
}
print "Das Ergebnis ist ";
printf( "%.2f", $ergebnis );

Die behandelten Fàlle hier sind

a > 0 && b > 0
a < 0 || b < 0
alles andere

Besonders interessant ist der Fall `b == 0`, wenn zum Beispiel nur eine
Zahl eingegeben wird, dann ist `$zweitezahl` numerisch Null. Das fàllt
unter "else", und beendet die Schleife. Da aber $ergebnis in dem Fall
nie gesetzt wird, kommt nicht das gewünsche Ergebnis. Der Lösung nàher
kommst du, wenn du das erste "next" durch "last" ersetzt, und das "last"
am Ende durch "next", bei Fehlern wird die Schleife dann wiederholt und
bei Erfolg beendet. Dann steckt allerdings immernoch ein Fehler drin.

Folgende Probleme treten dabei auf:
1. wenn ich z.B. 33 eingebe und das Skript dann 3 durch 3 teilt, bekomme ich null raus.
2. wenn ich 3-2 eingebe, dann kommt bei der Division auch null raus.
3. nur wenn ich -33 oder -3-3 eingebe, dann bekomme ich den erwünschten Satz "Das ist keine gute Eingabe!"



Bedenke hier vor allem, dass `split( ' ', $beidezahlen )` erwartet, dass
$beidezahlen zwei durch ein Leerzeichen getrennte Zahlen enthàlt wohin-
gegen "33", "3-2", "-33", und "-3-3" jeweils nur eine Zahl sind, da kein
Leerzeichen drin vorkommt (vergleiche "3 3", "3 -2", und so weiter).
Björn Höhrmann · mailto: · http://bjoern.hoehrmann.de
Am Badedeich 7 · Telefon: +49(0)160/4415681 · http://www.bjoernsworld.de
25899 Dagebüll · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Ähnliche fragen