2 Übungen | |
→ | 2.6 Übung 5 |
Theorie |
Aufgabe 1: Zeiger auf Strukturen |
Aufgabe 2: Felder von Strukturen |
Machen Sie sich mit nutzerdefinierten Datenstrukturen vertraut, siehe Nutzerdefinierte Datenstrukturen.
/** @file ex056.c Beispielprogramm fuer Zeiger auf Strukturen.
*/
/* Copyright (C) 2014-2017 - HS Schmalkalden. All rights reserved. */
#include <stdio.h>
/** Ein geometrischer Punkt.
*/
typedef struct {
double x; /**< X-Koordinate. */
double y; /**< Y-Koordinate. */
} PUNKT;
/** Eine Linie.
*/
typedef struct {
PUNKT P0; /**< Anfangspunkt. */
PUNKT P1; /**< Endpunkt. */
} LINIE;
/** Hauptprogramm.
@return 0 bei Erfolg.
*/
int
main(void)
{
LINIE linie; /* Variable, noch ohne Werte */
LINIE *pl; /* Zeiger, soll auf linie zeigen */
/* Initialisierung des Zeigers */
pl = ???;
/* Wertzuweisungen */
pl ??? = 0.5; /* x-Wert Anfangspunkt */
pl ??? = 1.0; /* y-Wert Anfangspunkt */
pl ??? = 5.0; /* x-Wert Endpunkt */
pl ??? = 4.0; /* y-Wert Endpunkt */
/* Ausgabe mit Kurzschreibweise mit Operator -> */
printf("X-Anfang: %lg\n", pl???);
printf("Y-Anfang: %lg\n", pl???);
printf("X-Ende: %lg\n", pl???);
printf("Y-Ende: %lg\n", pl???);
/* Ausgabe in langer Schreibweise mit Operator . */
printf("X-Anfang: %lg\n", ???pl???);
printf("Y-Anfang: %lg\n", ???pl??);
printf("X-Ende: %lg\n", ???pl???);
printf("Y-Ende: %lg\n", ???pl???);
return 0;
}
/* vim: set ai sw=4 ts=4 expandtab : */
Nehmen Sie die erforderlichen Korrekturen an ex056.c vor,
erstellen und testen Sie das Programm ex056.
Verwenden Sie bei der Ausgabe der Daten einmal den Operator "->"
und einmal den Operator ".".
/** @file ex057.c Beispielprogramm fuer Zeiger und Felder von Strukturen.
*/
/* Copyright (C) 2014-2017 - HS Schmalkalden. All rights reserved. */
#include <stdio.h>
/** Ein geometrischer Punkt.
*/
typedef struct {
double x; /**< X-Koordinate. */
double y; /**< Y-Koordinate. */
} PUNKT;
/** Eine Linie.
*/
typedef struct {
PUNKT P0; /**< Anfangspunkt. */
PUNKT P1; /**< Endpunkt. */
} LINIE;
/** Rechteck.
*/
typedef struct {
double xmin; /**< Linker x-Wert. */
double xmax; /**< Rechter x-Wert. */
double ymin; /**< Unterer y-Wert. */
double ymax; /**< Oberer y-Wert. */
} RECHTECK;
/** Konstante Variable vom Typ Rechteck.
*/
static const RECHTECK test_re = { 0.0, 10.0, 0.0, 12.0 };
/** Feld mit mehreren Variablen vom Typ Linie.
Jede Linie besteht ihrerseits aus 2 Punkten.
Jeder dieser Punkte wiederum besteht aus x- und y-Wert.
*/
static const LINIE linien[] = {
{{ 1.0, 1.0 }, { 9.0, 9.0 }}, /* Erste Linie, bestehend aus P0 und P1 */
{{ 2.0, 11.0 }, { 7.0, 8.0 }}, /* Naechste Linie ... */
{{ 4.0, 3.0 }, { 9.5, 9.3 }},
{{ -1.0, 2.0 }, { 10.5, 10.5 }},
{{ 8.5, 8.5 }, { 2.0, 2.0 }},
{{ 5.5, 6.5 }, { 7.5, 8.3 }},
{{ 3.0, 13.0 }, { 7.0, 13.5 }},
{{ 1.0, 9.8 }, { 8.0, 1.0 }},
{{ -3.0, 4.2 }, { 13.0, 4.4 }},
{{ 1.0, 2.0 }, { 3.0, 4.0 }}
};
/** Anzahl der Linien im Feld linien.
Zur Ermittelung der Anzahl wird die Gesamtgroesse der
Variable linien durch die Groesse des Typs dividiert.
*/
static const size_t anzahl_linien = sizeof(linien)/sizeof(LINIE);
/** Pruefe im Punkt im Rechteck oder auf dessen Rand liegt.
@param p Zu pruefender Punkt.
@param r Rechteck, in oder auf dessen Rand der Punkt liegen soll.
@return 1 wenn der Punkt im Rechteck liegt, ansonsten 0.
*/
static
int
punkt_im_rechteck(const PUNKT *p, const RECHTECK *r)
{
int res = 0;
if((???) && (???) && (???) && (???)) {
res = 1;
}
return res;
}
/** Pruefe, ob Linie vollstaendig im Rechteck oder auf
dessen Rand liegt (also
keinen Punkt ausserhalb des Rechtecks hat).
@param p Zu pruefende Linie.
@param r Rechteck, in dem die Linie liegen soll.
@return 1 wenn Linie im Rechteck liegt, ansonsten 0.
*/
static
int
linie_im_rechteck(const LINIE *p, const RECHTECK *r)
{
int res = 0;
if(punkt_im_rechteck(???, ???)) {
if(punkt_im_rechteck(???, ???)) {
res = 1;
}
}
return res;
}
/** Hauptprogramm.
@return 0 bei Erfolg.
*/
int
main(void)
{
LINIE const *pl = NULL; /* Zeiger auf aktuelle Linie */
size_t i; /* Index aktuelle Linie */
int im_rechteck = 0; /* Anzahl Linien im Rechteck */
/* Zeiger auf Feldanfang setzen
*/
pl = linien;
/* Feld durchmustern, dabei fuer jede Linie pruefen, ob
sie im Rechteck liegt.
Falls ja, dann Ergebniszaehler erhoehen.
*/
for(i = 0; i < anzahl_linien; i++) {
if(linie_im_rechteck(???, ???)) {
im_rechteck++;
}
pl++;
}
/* Ergebnis ausgeben
*/
printf("%d Linien liegen vollstaendig im Rechteck.\n", im_rechteck);
return 0;
}
/* vim: set ai sw=4 ts=4 expandtab : */
Das Programm ex057.c definiert Datentypen für einen Punkt, eine
Linie und ein Rechteck. Als Variablen sind ein Rechteck und ein
Feld mit mehreren Linien definiert.
Es soll ermittelt werden, wieviele Linien vollständig im Rechteck
bzw. auf dessen Rand liegen. Das heißt, die Linien sollen keinen
Punkt außerhalb des Rechteckes aufweisen.
const
Das Rechteck test_re und das Linien-Feld linien
wurden beide mit dem Schlüsselwort const definiert. Diese
Variablen sind also nicht änderbar.
const in Funktionsargumenten
In den Funktionsdeklarationen für punkt_im_rechteck() und
linie_im_rechteck() wird das Schlüsselwort const für
die als Funktionsparameter verwendeten Zeiger benutzt.
Dies bedeutet, dass die Funktion keine Änderung an den Variablen
vornimmt, auf die der jeweilige Zeiger zeigt.
const in der Deklaration der Zeiger-Variable
Soll ein Zeiger auf const-Variablen zeigen, muss auch bei
der Deklaration des Zeigers das Schlüsselwort const
verwendet werden.
Initialisierung verschachtelter Datenstrukturen
Die Initialisierungsdaten für das Feld linien werden in
geschweifte Klammern geschrieben, durch Kommata getrennt.
Jeder Linien-Datensatz ist eine Datenstruktur und wird daher
ebenfalls von geschweifte Klammern umgeben. Die Komponenten werden
durch Kommata getrennt.
Die Komponenten des Linien-Datensatzes sind wiederum
Datenstrukturen (Punkte). Sie stehen wiederum in geschweiften
Klammern.
Größenbestimmung durch Division
Der Initialisierungswert für die Variable anzahl_linien
(Anzahl der Elemente im Feld linien) wird bestimmt, indem
die gesamte Feldgröße durch die Größe eines Elementes dividiert
wird.
Nehmen Sie die erforderlichen Korrekturen an ex057.c vor, erstellen und testen Sie das Programm ex057.