Sonntag, 14. Februar 2010

Subroutines - Taschenrechner als Übung zu Unterfunktionen

Subroutines oder Unterfunktionen sind sehr nützlich. Als erste Übung habe ich einen einfachen Taschenrechner programmiert.


#!/usr/bin/perl
# Taschenrechner by Christian!
print "Bitte Zahl eingeben: ";
chomp($zahl1 = );
print "Rechenart eingeben (+,-,/,*)";
chomp($rechenart = );
print "Zweite Zahl eingeben: ";
chomp($zahl2 = );

if($rechenart eq '+') {
print "\nAddition wird durchgefuehrt.\n";
$ergebnis = &addition($zahl1, $zahl2);
}
elsif($rechenart eq '-') {
print "\nSubtraktion wird durchgeführt.\n";
$ergebnis = &subtraktion($zahl1, $zahl2);
}
elsif($rechenart eq '*') {
print "\nMultiplikation wird durchgeführt.\n";
$ergebnis = &multi($zahl1, $zahl2);
}
elsif($rechenart eq 'x') {
print "\nMultiplikation wird durchgeführt.\n";
$ergebnis = &multi($zahl1, $zahl2);
}
elsif($rechenart eq '/') {
print "\nDivision wird durchgeführt.\n";
$ergebnis = &division($zahl1, $zahl2);
}
elsif($rechenart eq ':') {
print "\nDivision wird durchgeführt.\n";
$ergebnis = &division($zahl1, $zahl2);
}


sub addition {
($_[0] + $_[1]);
}
sub subtraktion {
($_[0] - $_[1]);
}
sub multi {
($_[0] * $_[1]);
}
sub division {
($_[0] / $_[1]);
}

print "Das Ergebnis Ihrer Rechnung: " . $ergebnis . "!!!\n";

S54/3 - Wortliste alphabetisch sortieren (ASCII)

Wörter werden vom Benutzer nacheinander, durch ENTER getrennt, eingegeben. Das Prgramm soll diese alphabetisch (bzw ASCII-betisch) sortieren und ausgeben.

#!/usr/bin/perl

print "\nBitte Worte eingeben, durch Enter getrennt, Beenden mit Strg-D.\n";
@worte = ;
@sortiert = sort @worte;

print @sortiert;


Eine weitere Möglichkeit:

#!/usr/bin/perl
#Zweite Version, Sortierte Liste in einer Zeile ausgeben!
print "\nBitte Worte eingeben, durch Enter getrennt, Beenden mit Strg-D.\n";
chomp(@worte = ); #Worte liegen jetzt ohne \n in der Liste!
@sortiert = sort @worte;

# Leerzeichen an jedes Element anfügen:
foreach $sortiert (@sortiert)
{
$sortiert = $sortiert . " "; # Frage: warum nicht mit "+=" lösen möglich? vgl S.29!
}

# Ausgabe der kompletten Liste:
print "\nSortierte Worte: ",@sortiert,"\n";


Eine Frage, die mir noch offen geblieben ist: warum wird das Komma bei der Ausgabe der kompletten Liste benötigt?

S54/2 - Wörter einer Zahl zuordnen und ausgeben

In dieser Aufgabe von Seite 54 sollen Zahlen fest einem Wort zugeordnet (hardcoded) werden. Der Benutzer soll die 7 Zahlen in beliebeiger Reihenfolge eingeben, die Ausgabe der korrespondierenden Wörter erfolgt dann genau in dieser Reihenfolge.

#!/usr/bin/perl -w
# Aufgabe: Nummern einlesen in Liste und Ausgabe der passenden Namen.
@namen = qw! fred betty barney dino wilma pebbles bamm-bamm !;

print "Bitte Nummern von 1 bis 7 eingeben, durch ENTER getrennt: ";
chomp(@eingabe = ); # Eingabe beenden durch Strg-D.

foreach $eingabe (@eingabe)
{
print $namen[$eingabe - 1] . "\n";
# Frage: warum nicht (Perl gibt Verbesserungsvorschlag!)?:
# print @namen[$eingabe - 1] . "\n";
}

Freitag, 12. Februar 2010

Aufgabe S54/1: Liste einlesen und rückwärts ausgeben

Seite 54, Aufgabe 1

Schreiben Sie ein Programm, dass mehrere Worte (strings) Zeilenweise einliest (getrennt durch Enter-Taste). Nach Beendigung der Eingabe (end-of-input, zB durch Tastenkombination Strg-D (Linux) oder Strg-Z (Windows)) sollen die Worte in Umgekehrter Reihenfolge ausgegeben werden.

#!/usr/bin/perl -w

@lines = ; # Abbrechen mit Strg-D!

@lines = reverse @lines;
print "Rueckwaertsausgabe:\n";
print @lines;

Mittwoch, 20. Januar 2010

Übung S.38

1. Schreibe ein Programm, dass den Umfang eines Kreises mit Radius 12,5 feststellt (die Einheit ist egal!). Umfang ist Radius*2*PI.

#!/usr/bin/perl -w

$pi = 3.141592654;
$umfang = 12.5*2*$pi;
print "Der Umfang ist $umfang groß";
Theoretisch könnte man mit mehr oder weniger Veriablen arbeiten. Ein guter Ansatz ist es aber immer, feste Variablen, die man evtl. nochmal braucht (vgl PI!) als Variable am Anfang des Programms festzulegen.

2. Modifiziere das obige Programm, so dass der Nutzer den Radius per Standart-Input (STDIN) bekannt geben muss.
#!/usr/bin/perl -w

print "Bitte Radius eingeben: ";
$radius = ;
$pi = 3.141592654;
$umfang = $radius*2*$pi;
print "Der Umfang ist $umfang groß";
3. Modifizieren Sie obiges Programm erneut, so dass bei einer Eingabe kleiner als Null kein negativer Wert ausgegeben wird, sondern 0.
#!/usr/bin/perl -w
$pi = 3.141592654;

print "Bitte Radius eingeben: ";
$radius = ;
if ( $radius lt 0 )
{
$umfang = 0;
}
else
{
$umfang = $radius*2*$pi;
}
print "Der Umfang ist $umfang groß";
4. Schreiben Sie ein Programm, dass 2 Zahlen einließt und das Produkt dieser Zahlen als Ergebnis ausgibt.
#!/usr/bin/perl -w

print "\nBitte Zahl 1 eingeben: ";
$zahl1 = ;
print "\nBitte Zahl 2 eingeben: ";
$zahl2 = ;
$ergebnis = $zahl1 * $zahl2;
print "\nDas Produkt dieser Zahlen lautet: $ergebnis";
5. Schreibe ein Programm, dass eine Zahl und ein Wort einliest (jeweils eigene Eingabeaufforderung). Anschließend soll X mal das Wort auf einer eigenen Zeile ausgegeben werden.
#!/usr/bin/perl -w

print "\nBitte Zahl eingeben: ";
$zahl = ;
print "\nBitte Wort eingeben: ";
$wort = ;
print $wort x $zahl;
Warum werden automatisch Zeilenumsprünge gedruckt? Ganz einfach, das "\n" wird bei STDIN mit eingelesen! Durch den chomp-Befehl könnten wir diesen Zeilensprung entfernen, aber da er von der Aufgabenstellung verlangt wird, ist er in unserer Situation nützlich!

Eingabe / Ausgabe

Wenn man den Inhalt einer Variablen ausgeben möchte, sollten die "quote marks", also Anführungszeichen weggelassen werden.
$zahl = 6;
print "$zahl";
besser:
print $zahl;

Dienstag, 19. Januar 2010

Externe Programme ausführen

Um ein Programm auf dem jew. Server auszuführen, muss der Befehl in backticks gestellt werden.

Damit hat man die umfangreichen Möglichkeiten der shell-Programmierung zu Verfügung. Nachfolgend ein Beispiel:
print `ls -la`;
-> Zeigt uns als Ergebnis den Verzeichnisinhalt an:
insgesamt 28
drwxr-xr-x 2 dirk dirk 4096 2010-01-19 17:01 .
drwxrwxrwx 14 root root 4096 2010-01-19 16:28 ..
-rwxr-xr-x 1 dirk dirk 59 2010-01-19 16:50 perl_1
-rw-r--r-- 1 dirk dirk 58 2010-01-19 16:30 perl_1~
-rw-r--r-- 1 dirk dirk 58 2010-01-19 16:30 perl_1.pl
-rw-r--r-- 1 dirk dirk 38 2010-01-19 17:01 perl_2
-rw-r--r-- 1 dirk dirk 38 2010-01-19 17:00 perl_2~