Parameterdefinitionen in C
Eine Konstante kann auch einen Wert bezeichnen, der bei einem Funktionsaufruf als Argument angegeben wurde.
In den runden Klammern einer Funktionsdefinition kann eine Parameterdeklaration stehen, die einer Konstantendefinition ohne Angabe des Wertes ähnelt. Der Wert der Konstante wird nämlich durch den Wert des Arguments beim Aufruf der Funktion angegeben.
constparameter.c
#include <stdio.h>
void ausgeben( int const n )
{ printf( "%d\n", n ); }int main( void )
{ ausgeben( 7 ); }stdout
7
Die Übergabe eines Wertes an einen Konstantenparameter beim Funktionsaufruf entspricht der Definition einer Konstante, im Falle des Programms »constparameter.c« also »int const n = 7«.
constparameter1.c
#include <stdio.h>
void ausgeben( int const n )
{ printf( "%d\n", n ); }int main( void )
{ ausgeben( 7 ); ausgeben( 3 ); }stdout
7
3
Eine Konstantenbezeichner bezeichnet während der Lebenszeit der Konstante immer den gleichen Wert. Dadurch ist es aber nicht ausgeschlossen, daß während einer anderen Lebenszeit der gleiche Bezeichner einen anderen Wert bezeichnet. In dem Programm »constparameter1.c« wird die Funktion »ausgeben« zweimal aufgerufen. Dadurch entstehen hintereinander zwei Inkarnationen der Funktion »ausgeben«. Zu jeder Inkarnation gehört ein „Leben“ der Konstante. Während des ersten Lebens ist sie 7, während des zweiten Lebens ist sie 3. Während jedes Lebens ist sie konstant.
Mehrfache Uebergabe eines Arguments
|Zeit main
| .----------------.
| | |
| | |
| | ausgeben( 7 ) | void ausgeben
| | | .-------------------------------.
| | | | ( int const | Erstes
| | '-----> n ) | Exemplar
| | | { printf( "%d\n", n ); } | der Funktion
| | | | | "ausgeben"
| | '-------------|-----------------'
| | | V
| | | 7
| | |
| | |
| | ausgeben( 3 ) | void ausgeben
| | | .-------------------------------.
| | | | ( int const | Zweites
| | '-----> n ) | Exemplar
| | | { printf( "%d\n", n ); } | der Funktion
| | | | | "ausgeben"
| | '-------------|-----------------'
| | | V
| | | 3
| | |
V '----------------'
Mehrfache Exemplare eine Funktion sind ein Beispiel für die Möglichkeit der Erzeugung mehrerer Laufzeitexemplare durch ein einziges Stück Quelltext. Dadurch ist es möglich, beim Programmieren Arbeit zu sparen, da nicht alles, was mehrfach passiert soll, genauso oft auch im Programmtext stehen muß. Hier wird beispielsweise die Funktionsdefinition mehrfach verwendet, um verschiedene Werte auszugeben, obwohl sie nur einmal im Quelltext vorkommt.
Das Geschehen kann mit zwei aufeinanderfolgenden Blöcken verglichen werden, in denen jeweils eine Konstante »n« definiert wird. (Tatsächlich ist eine Funktionsdefinition ja auch die Benennung einer Verbundanweisung.) Die Lebenszeit der ersten Konstante »n« mit dem Wert »7« endet bevor die Lebenszeit der zweiten Konstante »n« mit dem Wert »3« beginnt. Da die Lebenszeiten und Gültigkeitsbereiche sich nicht überlappen entsteht kein Konflikt.
constexample.c
#include <stdio.h>
int main( void )
{ { int const n = 7; { printf( "%d\n", n ); }}
{ int const n = 3; { printf( "%d\n", n ); }}}stdout
7
3
Mehrere Parameter
Eine Funktion kann auch mehrere Parameterdeklarationen haben, die dann durch ein Komma voneinander getrennt werden.
multiparameter.c
#include <stdio.h>
void doppelausgabe( int const a, int const b )
{ printf( "%d\n", a );
printf( "%d\n", b ); }int main( void )
{ doppelausgabe( 4, 9 ); }stdout
4
9
Übungsfragen
? Ausgabe vorhersagen
- / Umbenennen
#include <stdio.h> /* printf */
void f( int const i ) { printf( "%d\n", i ); }
int main( void ) { int const a = 1; f( a ); }
- Welche Ausgabe erzeugt das obige Programm?
? Ausgabe vorhersagen
- / Umbenennen
#include <stdio.h> /* printf */
void f( int const i )
{ printf( "%d\n", i ); }int main( void )
{ int const i = 1; int const j = 2; f( j ); }- Welche Ausgabe erzeugt das obige Programm?
Übungsaufgaben
/ Übungsaufgabe
Schreiben Sie eine Wirkfunktion »schreibzahl«, die eine als Argument beim Aufruf angegebene Zahl ausgibt!
/ Übungsaufgabe
Schreiben Sie eine Wertfunktion »zahl«, die eine als Argument beim Aufruf angegebene Zahl unverändert zurückgibt!
/ Übungsaufgabe
Schreiben Sie eine Wirkfunktion »summe», die die Summe der beiden als Argument angegebenen Zahlen ausgibt!
/ Übungsaufgabe
Schreiben Sie eine Wertfunktion »summe», die die Summe der beiden als Argument angegebenen Zahlen zurückgibt!
/ Ausgabe eines Zeichens
Schreiben Sie eine Funktion, welche eine ihre übergebene Zahl zusammen mit dem Schriftzeichen, das diese Zahl als Kennzahl hat, ausgibt. Wird die Funktion mit dem Wert »65« aufgerufen, so soll sie die Zeile »Das Zeichen A hat die Kennzahl 65.« ausgeben.
/ Übungsaufgabe
- / Umbenennen
#include <stdio.h> /* printf */
void f( int const i )
{ printf( "%d\n", i ); }int main( void )
{ int const i = 1; int const j = 2; f( j ); }- Benennen Sie den Parameter »i« in »k« und die Konstante »i« (welche kein Parameter ist) in »n« um, ohne das Verhalten des Programms zu verändern.
Verkürzung
Schreiben Sie ein möglichst kurzes Programm, das genau die folgende Ausgabe erzeugt.
Ausgabe
11910
11910 32251
11910
23141
23141 32251
23141
10312
10312 32251
10312
24170
24170 32251
24170
17233
17233 32251
17233
24947
24947 32251
24947
In der Lösung darf jedes Numeral im Programmtext (Quellcode) nur einmal vorkommen! Die Schreibweise und Formatierung der Ausgabe muß mit dem folgenden Muster exakt übereinstimmen. Versuchen Sie, eine sich wiederholende Struktur in der Ausgabe als eine Wirkfunktion zu definieren.
Wenn die Lösung nicht gleich gelingt, dann verringern Sie vorübergehend die Anforderungen und schreiben Sie erst einmal ein Programm, daß z.B. nur einen Teil der Ausgabe erzeugt, aber noch Wiederholungen enthält oder die Ausgabe nicht ganz genau so wie vorgegeben erzeugt. Versuchen Sie Ihr Programm dann in kleinen Schritten zu verbessern, bis es den Anforderungen der Aufgabenstellung möglichst nahekommt.
Ein möglicher Weg zu Lösung könnte folgendermaßen beginnen.
1.) Ein Programm schreiben, das alle Zeilen so ausgibt, wie sie aufgelistet werden.
2.) Dieses Programm schrittweise umstrukturieren, bis jedes Numeral nur noch einmal vorkommt.
- Würfel
- Schreiben Sie eine Wertfunktion »wuerfel«, die eine ganzzahlige Pseudozufallszahl ergibt, die größergleich 1 und kleinergleich dem Wert ihres ganzzahligen Parameters ist. (Die Funktion soll sich für Parameterwerte zwischen 1 und 32768 so verhalten.) So soll der Wert von »wuerfel( 6 )« beispielsweise eine ganzzahlige Pseudozufallszahl zwischen 1 und 6 sein.
- / Vertauschen der Werte zweier Objekt mit einer Funktion
{ int x = 22;
int y = 47;
swap( x, y ); /* Ist solch eine Funktion moeglich? */
printf( "%d\n%d\n", x, y ); /* Ausgabe: 47 22 */ }