Table of Contents
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 <iostream> 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
<?php function checkName($name) { // Die Länge des Namens prüfen if(strlen($name) == 0) { return false; } // prüfen, ob der erste Buchstabe eine Grossbuchstabe ist if($name[0] < 'A' || $name[0] > '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