====== Programmparameter ======
Die einfachste Möglichkeit Benutzereingaben zu bekommen sind Programmparameter. Das geschriebene Programm wird direkt mit Parametern gestartet. Wichtig ist **die korrekte Anzahl an Parametern** und dass **jeder Parameter separat geprüft** wird.
===== Beispiele =====
Die folgenden Beispiele lesen einen Namen und Alter als Kommandozeilenparameter ein, prüfen die Parameter auf Korrektheit und geben Sie dann wieder aus.\\
Geprüft wird, ob der Vorname mit einem Grossbuchstaben startet und sonst nur Kleinbuchstaben enthält und ob das Alter zwischen 1 und 99 ist und nicht mit einer 0 startet. Es gibt **elegantere Möglichkeiten zu prüfen**, ob eine Zahl zwischen 1 und 99 ist, nämlich könnte man den **String in eine Zahl umwandeln**. Hier wird aber gezeigt, wie man einen String prüft, ob er passt. Auch gibt es **elegantere Möglichkeiten** Fehler auszugeben. Man könnte **Fehler sammeln und alle gemeinsam ausgeben**. Bietet eine Programmiersprache keine vernünftige Möglichkeit einzelne Zeichen zu vergleichen (Bash, Perl), so werden reguläre Ausdrücke verwendet.
==== Bash ====
=== Der Code ===
#!/bin/bash
# definieren der beiden benötigten Funktionen
function checkString {
case $1 in # ersten Parameter der Funktion prüfen
[[:upper:]] | [[:upper:]][[:lower:]]* ) echo "$1" ;;
*) echo "" ;;
esac
}
function checkNumber {
case $1 in # ersten Parameter der Funktion prüfen
[1-9] | [1-9][0-9] ) echo "$1" ;;
*) echo "" ;;
esac
}
# Prüfen, ob Anzahl der Parameter korrekt ist
if [ $# -ne 2 ]; then
echo "usage: $0 [name] [age]"
exit
fi
name=$(checkString $1) # ersten Parameter des Programms als Parameter für checkString verwenden
age=$(checkNumber $2) # zweiten Parameter des Programms als Parameter für checkNumber verwenden
if [ -z $name ]; then # Prüfen, ob Name leer ist
echo "Der Name muss mit einem Grossbuchstaben beginnen und darf sonst nur Buchstaben enthalten"
exit 1
fi
if [ -z $age ]; then # Prüfen, ob Alter leer ist
echo "Das Alter muss mit 1-9 beginnen, darf nur Zahlen enthalten und maximal 99 sein"
exit 1
fi
# Ausgabe
echo "Dein Name ist $name und du bist $age Jahre alt"
=== Ausführen ===
Die Datei input.sh mit dem obigen Code erstellen und folgendes ausführen:
chmod +x input.sh # als ausführbar markieren
./input.sh Werner 30 # ausführen
==== C++ ====
=== Der Code ===
#include
bool checkName(char* name) {
int len = 0;
// die Länge des nullterminierten Strings herausfinden
while(name[len] != 0)
len++;
// ist der String lang genug?
if(len == 0)
return false;
// ist das erste Zeichen ein Grossbuchstabe?
if(name[0] < 'A' || name[0] > 'Z')
return false;
// sind alle anderen Zeichen Kleinbuchstaben?
for(int i = 1; i < len; i++) {
if(name[i] < 'a' || name[i] > 'z')
return false;
}
// sind alle Bedingungen erfüllt?
return true;
}
bool checkAge(char* age) {
int len = 0;
// die Länge des nullterminierten Strings herausfinden
while(age[len] != 0)
len++;
// prüfen der Länge des Parameters
if(len == 0 || len > 2)
return false;
// prüfen, ob mit 1-9 begonnen wird
if(age[0] < '1' || age[0] > '9')
return false;
// prüfen, ob alle anderen Zeichen zahlen sind
for(int i = 1; i < len; i++) {
if(age[i] < '0' || age[i] > '9')
return false;
}
// sind alle Bedingungen erfüllt?
return true;
}
int main(int argc, char* argv[]) {
// prüfen, ob die Anzahl der Parameter stimmt.
if(argc != 3) { // programmname zählt dazu
printf("%s%s%s", "Usage: ", argv[0], " [name] [age]\n");
return 1;
}
// sprechendere Namen verwenden
char* name = argv[1];
char* age = argv[2];
// den ersten Parameter prüfen
if(!checkName(name)) {
printf("%s", "Der Name muss mit einem Grossbuchstaben beginnen und darf sonst nur Buchstaben enthalten\n");
return 1;
}
// den zweiten Parameter prüfen
if(!checkAge(age)) {
printf("%s", "Das Alter muss mit 1-9 beginnen, darf nur Zahlen enthalten und maximal 99 sein\n");
return 1;
}
// Ausgabe
printf("%s%s%s%s%s", "Dein Name ist ", name, " und du bist ", age, " Jahre alt\n");
}
=== Kompilieren und Ausführen ===
g++ -Wall -g -std=c++14 input.cpp -o input # kompilieren
./input Werner 30 # ausführen
==== Golang ====
=== Der Code ===
package main
import "os"
import "fmt"
func checkName(name string) bool {
// Länge prüfen
if(name == "") {
return false
}
// Prüfen, ob erstes Zeichen ein Grossbuchstabe ist
if(name[0] < 'A' || name[0] > 'Z') {
return false
}
// Prüfen, ob alle anderen Zeichen Kleinbuchstaben sind
for i := 1; i < len(name); i++ {
if(name[i] < 'a' || name[i] > 'z') {
return false
}
}
// Sind alle Bedingungen erfüllt?
return true
}
func checkAge(age string) bool {
// Länge prüfen
if(age == "" || len(age) > 2) {
return false
}
// Prüfen ob erstes Zeichen zwischen 1 und 9 ist
if(age[0] < '1' || age[0] > '9') {
return false
}
// Prüfen, ob zweites Zeichen zwischen 0 und 9 ist
if(len(age) == 2) {
if(age[1] < '0' || age[1] > '9') {
return false
}
}
// Sind alle Bedingungen erfüllt?
return true
}
func main() {
if(len(os.Args[1:]) != 2) {
fmt.Println("Usage: "+os.Args[0]+" [Name] [Alter]")
return
}
// sprechendere Namen verwenden
name := os.Args[1]
age := os.Args[2]
// den Namen prüfen
if(!checkName(name)) {
fmt.Println("Der Name muss mit einem Grossbuchstaben beginnen und darf sonst nur Kleinbuchstaben enthalten")
return
}
// das Alter prüfen
if(!checkAge(age)) {
fmt.Println("Das Alter muss mit 1-9 beginnen, darf nur Zahlen enthalten und maximal 99 sein")
return
}
// Ausgabe
fmt.Println("Dein Name ist "+name+" und du bist "+age+" Jahre alt")
}
=== Kompilieren und ausführen ===
Die Datei input.go mit obigen Code füllen und folgendes ausführen
go build input.go # kompilieren
./input Werner 30 # ausführen
==== Java ====
=== Der Code ===
public class Input {
private boolean checkName(String name) {
// kürzere Schreibweise diesesmal
if(name.isEmpty()) return false; // Länge prüfen
if(name.charAt(0) < 'A' || name.charAt(0) > 'Z') return false; // Grossbuchstabe an erster Stelle?
for(int i = 1; i < name.length(); i++) // Kleinbuchstaben an allen anderen Stellen
if(name.charAt(i) < 'a' || name.charAt(i) > 'z')
return false;
// Sind alle Bedingungen erfüllt?
return true;
}
private boolean checkAge (String age) {
// Länge prüfen
if(age.isEmpty() || age.length() > 2) return false;
// 1-9 an erster Stelle?
if(age.charAt(0) < '1' || age.charAt(0) > '9') return false;
// 0-9 an zweiter Stelle?
if(age.length() == 2)
if(age.charAt(1) < '0' || age.charAt(1) > '9') return false;
// Sind alle Bedingungen erfüllt?
return false;
}
public static void main(String[] args) {
// Vorgriff Objektorientiertes Programmieren
Input in = new Input();
for(int i = 0; i < args.length; i++)
System.out.println(args[i]);
// Anzahl der Parameter prüfen
if(args.length != 2) {
System.out.println("Usage: "+args[0]+" [Name] [Alter]");
return;
}
// Sprechendere Namen verwenden
String name = args[0];
String age = args[1];
// Prüfen der einzelnen Parameter
if(!in.checkName(name)) {
System.out.println("Der Name muss mit einem Grossbuchstaben beginnen und darf sonst nur Kleinbuchstaben enthalten");
return;
}
if(!in.checkAge(age)) {
System.out.println("Das Alter muss mit 1-9 beginnen, darf nur Zahlen enthalten und maximal 99 sein");
return;
}
// Ausgabe
System.out.println("Dein Name ist "+name+" und du bist "+age+" Jahre alt");
}
}
=== Kompilieren und ausführen ===
Die Datei Input.java mit obigen Inhalt erstellen und folgendes Ausführen:
javac Input.java # kompilieren
java Input Werner 30 # ausführen
==== JavaScript ====
Das ist nur über die Browserkonsole möglich. Wird das angefragt, so wird ein Programm nachgereicht.
==== Perl ====
Ich habe auf die schnelle keinen Weg an den regulären Ausdrücken vorbei gefunden
=== Code ===
#!/usr/bin/perl
use strict;
use warnings;
sub checkName {
# Parameter auslesen
my $name = shift;
# Länge prüfen
if(length($name) eq 0) {
return 0; # false
}
# reguläre Ausdrücke verwenden
if($name =~ /^[A-Z][a-z]*$/) {
# Parameter passt in den regulären Ausdruck
return 1; # true
}
return 0; # false
}
sub checkAge {
# Parameter auslesen
my $age = shift;
# Länge prüfen
if(length($age) eq 0 || length($age) gt 2) {
return 0; # false
}
# reguläre Ausdrücke verwenden
if($age =~ /^[1-9][0-9]*$/) {
# Parameter passt in den regulären Ausdruck
return 1; # true
}
return 0; # false
}
# Anzahl der Argumente prüfen
if (@ARGV != 2) {
print "Usage: input.pl [Name] [Alter]\n";
exit;
}
# sprechendere Namen verwenden
my $name = shift @ARGV;
my $age = shift @ARGV;
# Parameter prüfen
if(!checkName($name)) {
print "Der Name muss mit einem Grossbuchstaben beginnen und darf sonst nur Kleinbuchstaben enthalten\n";
exit;
}
if(!checkAge($age)) {
print "Das Alter muss mit 1-9 beginnen, darf nur Zahlen enthalten und maximal 99 sein\n";
exit;
}
# Ausgabe
print "Dein Name ist $name und du bist $age Jahre alt\n";
=== Ausführen ===
Den obigen Code in die Datei input.pl kopieren und folgendes ausführen
perl input.pl Werner 30
==== PHP ====
=== Code ===
'Z') {
return false;
}
// Sind alle anderen Buchstaben Kleinbuchstaben?
for($i = 1; $i < strlen($name); $i++) {
if($name[$i] < 'a' || $name[$i] > 'z') {
return false;
}
}
// Alle Bedingungen sind erfüllt
return true;
}
function checkAge($age) {
// Die Länge des Alters prüfen
if(strlen($age) == 0 || strlen($age) > 2) {
return false;
}
// prüfen, ob das Alter mit 1-9 beginnt
if($age[0] < '1' || $age[0] > '9') {
return false;
}
// prüfen, ob die zweite Zahl (falls vorhanden) zwischen 0 und 9 ist
if(strlen($age) == 2) {
if($age[1] < '0' || $age[1] > '9') {
return false;
}
}
// Alle Bedingungen sind erfüllt
return true;
}
// prüfen, ob die Anzahl der Parameter stimmt
if(sizeof($argv) != 3) {
echo "Usage: $argv[0] [Name] [Alter]\n";
exit;
}
// sprechendere Namen verwenden
$name = $argv[1];
$age = $argv[2];
// die beiden Variablen prüfen
if(!checkName($name)) {
echo "Der Name muss mit einem Grossbuchstaben beginnen und darf sonst nur Buchstaben enthalten\n";
exit;
}
if(!checkAge($age)) {
echo "Das Alter muss mit 1-9 beginnen, darf nur Zahlen enthalten und maximal 99 sein\n";
exit;
}
echo "Dein Name ist $name und du bist $age Jahre alt\n";
=== Ausführen ===
Die Datei input.php mit obigen Code befüllen und auf folgendem Weg ausführen.
php input.php Werner 30
==== Python ====
Python bietet mit **OptParse** oder **ArgParse** ziemlich gute Module für Programmparameter an. Hier soll aber gezeigt werden, wie es mit Bordmitteln funktioniert.
=== Code ===
import sys
# Funktion definieren
def checkName(name):
# ist die Länge korrekt
if len(name) == 0:
return False
firstCharacter = True
for c in name:
if firstCharacter:
# ist das erste Zeichen ein Grossbuchstabe?
if c < 'A' or c > 'Z':
return False
firstCharacter = False
else:
# sind alle anderen Zeichen Kleinbuchstaben?
if c < 'a' or c > 'z':
return False
# Alle Bedingungen sind erfüllt
return True
def checkAge(age):
# ist die Länge korrekt?
if len(age) <= 0 or len(age) > 2:
return False
# Fängt das erste Zeichen zwischen 1 und 9 an?
if age[0] < '1' or age[0] > '9':
return False
# Ist das zweite Zeichen (falls vorhanden) zwischen 0 und 9?
if len(age) == 2:
if age[1] < '0' or age[1] > '9':
return False
# Alle Bedingungen sind erfüllt
return True
# Die Anzahl der Parameter prüfen
if len(sys.argv) != 3:
print("Usage: "+sys.argv[0]+" [Name] [Alter]")
sys.exit(1)
# sprechendere Namen verwenden
name = sys.argv[1]
age = sys.argv[2]
# Die Parameter prüfen
if not checkName(name):
print("Der Name muss mit einem Grossbuchstaben beginnen und darf sonst nur Buchstaben enthalten")
sys.exit()
if not checkAge(age):
print("Das Alter muss mit 1-9 beginnen, darf nur Zahlen enthalten und maximal 99 sein")
sys.exit()
# Ausgabe
print("Dein Name ist "+name+" und du bist "+age+" Jahre alt")
=== Ausführen ===
Die Datei input.py mit obigen Quelltext füllen und so zum Laufen bringen:
python3 input.py
===== Übungen =====
* Lese eine ganze Zahl als Programmparameter ein und berechne die Fakultät dieser Zahl
* Erweitere die obigen Beispiele um einen weiteren Parameter. Lese zusätzlich das Geburtsdatum ein (inklusive Prüfungen!) und gib es aus
* Baue einen kleinen Taschenrechner, der addieren und subtrahieren kann
* Erweitere den Taschenrechner um die Multiplikation und Division