Schrift
[thread]11461[/thread]

Ein kleiner Taschenrechner



<< >> 6 Einträge, 1 Seite
DuDe
 2008-03-13 16:32
#107005 #107005
User since
2008-03-13
3 Artikel
BenutzerIn
[default_avatar]
Hallo Perl-Community!
Ich bin im Bereich Perl noch seeeehr neu und habe heute mal mein erstes Script geschrieben. Es ist ein kleiner Taschenrechner mit den 4 Grundrechenarten.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!C:\perl\ -w

# -------------- Aufruf des Menüs ------------

system(cls);
print "###################################################\n";
print "\t Welcome to the first Perlscript by DuDe\n";
print "###################################################\n\n";
print "[1] Addition\n[2] Subtraktion\n[3] Division\n[4] Multiplikation\n\n";
print "Was fuer eine Rechnung wollen sie durchfuehren: ";
$art = <STDIN>;
chop $art;

# ------------- Aufforderung 2 Zahlen einzugeben ----------
print "\nEin , muss als . eingegeben werden!";
print "\nGeben sie die erste Zahl ein:\t ";
$z1 = <STDIN>;
chop $z1;
print "Geben sie die zweite Zahl ein:\t ";
$z2 = <STDIN>;
chop $z2;

# ------------- Bedingungsauswertung zur Auswahl der Rechnung ---------

$sol ="Das Ergebnis von $z1";
$sol2 ="$z2 lautet:\t";
if($art eq "1")
{
$erg = $z1 + $z2;
print "$sol + $sol2 $erg \n\n";
}
elsif($art eq "2")
{
$erg = $z1 - $z2;
print "$sol - $sol2 $erg \n\n";
}
elsif($art eq "3")
{
$erg = $z1 / $z2;
print "$sol / $sol2 $erg \n\n";
}
elsif($art eq "4")
{
$erg = $z1 * $z2;
print "$sol * $sol2 $erg \n\n";
}
else
{
print "Error! Sie haben einen nicht akzeptablen wert eingeben!";
}
system(pause);


Nun wollte ich [a] einmal wissen was ihr davon so haltet (denkt dran, es ist mein absolut erstes script ;) ) und [b] würde ich gern eine Schleife einbinden, welche den Benutzer fragt ob er noch eine Rechnung durchführen möchte und dann zur Abfrage der Rechenart springt.
Ich würde nach der einer Eingabe (y/n) fragen und den Wert mit einer If-Schleife überprüfen lassen, nur bekomme ich das einfach nicht eingebaut :(

Vielleicht könnt ihr mir dabei ja helfen :)

mfg
DuDe
pq
 2008-03-13 16:40
#107006 #107006
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bitte unbedingt Wiki:UseStrict lesen
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
DuDe
 2008-03-13 23:43
#107016 #107016
User since
2008-03-13
3 Artikel
BenutzerIn
[default_avatar]
Oh mensch, ok ich verstehe was gemeint ist. Da werde das in Zukunft auf jeden Fall berücksichtigen. Dankesehr! :)
sid burn
 2008-03-16 20:26
#107104 #107104
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Code (perl): (dl )
1
2
$z1 = <STDIN>;
chop $z1;


Das sieht unschön aus. Das was du willst ist es das newline Zeichen am ende zu entfernen. chop() entfernt aber einfach das letzte Zeichen. Egal was es ist. Es ist also besser chomp() zu verwenden. Das entfernt nur das Newline Zeichen am Ende des Strings. Wenn keins vorhanden ist, dann wird nichts entfernt.

Das ganze kannst du dann noch kombinieren.
Code (perl): (dl )
chomp( $z1 = <STDIN> );


Code (perl): (dl )
system(cls);

Sorry, aber was soll der blödsinn? Wenn ich ein programmaufrufe will ich nicht das dieser mein ganzen Bildschirm löscht. Sowas komplett aus dem Programm rausschmeißen. Ich weiß auch gar nicht warum jeder Anfänger ständig so ein Müll einbaut! Bildschirm löschen, Sinnlose Menüs aufbauen...

Weiterhin solltest du kein system() nutzen. Dadurch wird dein programm komplett unportabel. "cls" z.B. gibt es unter Linux gar nicht, und du bekommst dann eine Fehlermeldeung.

Weiterhin kannst du dir auch gar nicht sicher sein ob solche Kommandos überhaupt das tun was du überhaupt möchtest.

Code (perl): (dl )
1
2
3
4
5
print "###################################################\n";
print "\t Welcome to the first Perlscript by DuDe\n";
print "###################################################\n\n";
print "[1] Addition\n[2] Subtraktion\n[3] Division\n[4] Multiplikation\n\n";
print "Was fuer eine Rechnung wollen sie durchfuehren: "; 


Hmmpf, versuche es mal ohne Menü hinzubekommen. Indem der Benutzer einfach simple Sachen wie "13 + 12" eingibt etc.

Weiterhin Würde ich diese Überflüssigen Raute Zeichen komplett weg lassen. Die will keiner sehen. Weiterhin kannst du auch den String Multiplikator nutzen was deutlisch schöner ist. beispielweise.

Code (perl): (dl )
print '#' x 40, "\n";

Was dann 40ig Raute Zeichen gefolgt von einem Newline Zeichen ausgiebt.

Code (perl): (dl )
$art $z1 $z2 $sol $sol2 


Deine ganze Variablen sind total nichtsaussagend! Bitte überarbeite diese, damit sie selbsterlärend sind.

Code (perl): (dl )
1
2
3
4
5
if($art eq "1")
{
$erg = $z1 + $z2;
print "$sol + $sol2 $erg \n\n";
}


1) Code bitte Einrücken! Damit wird dieser deutlich lesbarer.
2) Es gibt ein Unterschied zwischen eq und ==. "eq" benutzt man wenn man zwei Strings vergleichen möchte. == benutzt man wenn man Zahlen vergleichen möchte. Zwar hast du mit "1" einen String. Aber eigenltich willst du ja eher Zahlen vergleichen.

Code (perl): (dl )
1
2
3
if ( $art == 1 ) {
    printf "$sol + $sol2 = %lf \n\n", $z1 + $z2;
}


Ansonsten kannst du auch printf() nutzen wie du oben siehst. Dort ist das erste Argument ein Template. "%lf" ist hier ein Platzhalter. Für diesen Platzhalter wird das erste Argument eingesetzt. Was hier $z1 + $z2 ist. Du kannst auch mehrere Platzhalter verwenden. DIeser werden dann der Reihenfolge abgearbeitet. Wenn dir printf() noch zu kompliziert ist dann ist es nicht schlimm. Informationen hierzu findest du unter "perldoc -f sprintf". Du kannst aber auch deine Möglichkeit weiterhin benutzen.

Code (perl): (dl )
system(pause);

Wie oben bereits schonmal gesagt unportabel und sollte man nicht nutzen. Unter Linux gibt es den Befehl "pause" ebenfalls nicht.

Entweder du nutzt soetwas überhaupt nicht. Also gar keine Abfrage das der Benutzer eine taste drücken soll. Oder du schaust dir mal das Modul Term::ReadKey an. Das sollte eine Portable Möglichkeit dafür bereitstellen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
murphy
 2008-03-17 00:57
#107116 #107116
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
sid burn+2008-03-16 19:26:28--
[...]
Code (perl): (dl )
1
2
3
if ( $art == 1 ) {
    printf "$sol + $sol2 = %lf \n\n", $z1 + $z2;
}

[...]


Wenn wir schon bei Stilfragen sind, muss ich doch mal sagen, dass dieser printf-Aufruf ebenfalls kein guter Stil ist!

Ich halte es für besser entweder
Code (perl): (dl )
printf "%f + %f = %f\n\n", $sol, $sol2, $z1 + $z2;

oder
Code (perl): (dl )
print "$sol + $sol2 = " . ($z1 + $z2) . "\n\n";

zu schreiben.

Es ist aber ungeschickt, wie im obigen Beispiel Daten in den Formatstring zu interpolieren, da die interpolierten Variablen ja auch mal ein Formatkommando enthalten könnten, was dann zu allerlei merkwürdigen Fehlern oder gar Sicherheitslöchern führen kann.
When C++ is your hammer, every problem looks like your thumb.
DuDe
 2008-03-17 01:38
#107117 #107117
User since
2008-03-13
3 Artikel
BenutzerIn
[default_avatar]
wow dankesehr!
Solche Kommentare habe ich mir gewünscht! Habe mir schon gedacht das das script seeeeeehr überarbeitungsbedürftig ist, aber wie gesagt es war mein wirklich erstes script und ich freue mich das es auf solch starke Kritik gestoßen ist, denn nun kann ich daran arbeiten.
Ich werde das ganze nocheinmal von vorn schreiben und in dem Thread hier posten. :)

mfg
DuDe
<< >> 6 Einträge, 1 Seite



View all threads created 2008-03-13 16:32.