Bergervei/Prozeduren mit Zeichenketten

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
<code id="4bd4971f736f1" hidden>
;-- M. Hielscher / Chr. Wagenknecht --
(define random-maker
  (let* ((multiplier 48271)
         (modulus 2147483647)
         (apply-congruence
          (lambda (current-seed)
            (let ((candidate (modulo (* current-seed multiplier) modulus)))
              (if (zero? candidate)
                  modulus
                  candidate))))
         (coerce
          (lambda (proposed-seed)
            (if (integer? proposed-seed)
                (- modulus (modulo proposed-seed modulus)) 19880214))))
  (lambda (initial-seed)
    (let ((seed (coerce initial-seed)))
      (lambda args
        (cond ((null? args)
               (set! seed (apply-congruence seed))
               (/ (- modulus seed) modulus))
              ((null? (cdr args))
               (let* ((proposed-top
                       (ceiling (abs (car args))))
                      (exact-top
                       (if (inexact? proposed-top)
                           (inexact->exact proposed-top)
                           proposed-top))
                      (top
                       (if (zero? exact-top)
                           1
                           exact-top)))
                 (set! seed (apply-congruence seed))
                 (inexact->exact (floor (* top (/ seed modulus))))))
              ((eq? (cadr args) 'reset)
               (set! seed (coerce (car args))))
              (else
               (display "random: unrecognized message")
               (newline))))))))

(require-library 'sisc/libs/srfi/srfi-19)
(import srfi-19)

(define random (random-maker (time-nanosecond (current-time))))
</code>

== Weitere Selektoren für Zeichenketten ==

In Anlehnung an die Selektoren <tt>car</tt> / <tt>cdr</tt> für Listen sollen zunächst analoge Selektoren für Zeichenketten entwickelt werden. Dabei ist genau auf deren Definitions- und Wertebereich zu achten. Man spricht in diesem Zusammenhang von der ''Signatur einer Prozedur'':

'''Beispiel:'''

<blockquote>
<tt><b>string-car:</b></tt> <math>string \longmapsto char</math>
</blockquote>

<table border="1" cellspacing="1" cellpadding="4">
<tr>
<td width="400" align="center" valign="top">[[Bild:String_car.GIF]]</td>
<td width="900" align="left" valign="top">
<code id="5066bb1a26893">
(define string-car
  (lambda (zk)
    (string-ref zk 0)))
</code>

<run id="5066bb1a26a6d">(string-car "Informatik")</run>
</td>
</tr>
<tr>
<td width="400" align="center" valign="top">[[Bild:String_cdr.GIF]]</td>
<td width="900" align="left" valign="top">
<code id="5066bb1a26900">
(define string-cdr
  (lambda (zk)
    (substring zk 1 (string-length zk))))
</code>

<run id="5066bb1a26ace">(string-cdr "Informatik")</run>
</td>
</tr>
<tr>
<td width="400" align="center" valign="top">[[Bild:String_last.GIF]]</td>
<td width="900" align="left" valign="top">
<code id="5066bb1a26963">
(define string-last
  (lambda (zk)
   (string-ref zk (- (string-length zk) 1))))
</code>

<run id="5066bb1a26b2c">(string-last "Informatik")</run>
</td>
</tr>
</table>

== Generierung von Benutzernamen und Kennwörtern ==

[[Bild:Anmeldung.gif|miniatur|hochkant=3|Beispiel für eine Netzwerk-Anmeldung]]
Der Administrator eines Computernetzwerkes möchte die Festlegung von Benutzernamen für eine größere Anzahl von Benutzern automatisieren. Dazu legt er fest:<br />
Das Kennwort setzt sich aus den ersten drei Buchstaben des Vornamens und dem kompletten Nachnamen zusammen. Diese Zeichenkette wird grundsätzlich klein geschrieben.

'''Beispiel:'''

 > (benutzername "Beatrix "Berger")
 --> beaberger

Implementieren Sie eine entsprechende Prozedur.

<code id="5066cc162e065">
(define benutzername
  (lambda (vorname nachname)
    (string-append (string-downcase (substring vorname 0 3))
                   (string-downcase nachname))))
</code>

<run id="5066cc162e113">
(benutzername "Beatrix" "Berger")
</run>

== Mein individuelles Kfz-Kennzeichen ==

[[Bild:Kennzeichen_Deutschland.jpg|miniatur|hochkant=1.5|Aktuelles deutsches Kfz-Kennzeichen aus dem Landkreis Rastatt (Baden-Württemberg)]]

Viele Autofahrer legen goßen Wert auf ein ganz individuelles polizeiliches Kennzeichen an ihrem Fahrzeug. Häufig soll es die Anfangsbuchstaben des Vor- und Nachnamens sowie den Geburtstag und den Geburtsmonat beinhalten.<br />

Schreiben Sie eine Prozedur, die die persönliche Daten entgegennimmt und das gewünschte Kennzeichen als Zeichenkette zurückgibt.

'''Beispiel:'''
 
 > (kennzeichen "Romy" "Berger" '(14 02 1988))
 --> "GR-RB 142"

<code id="5066bb1a269d8">
(define kennzeichen
  (lambda (vorname nachname datum)
    (string-append "GR-"
                   (string (char-upcase (string-car vorname)))
                   (string (char-upcase (string-car nachname)))
                   " "
                   (number->string (car datum))
                   (number->string (cadr datum)))))
</code>

<run id="5064c75c8b913">
(kennzeichen "Romy" "Berger" '(14 02 1988))
</run>