User Tools

Site Tools


inputs_param

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
inputs_param.txt · Last modified: 2017/07/05 11:03 by gg