klausuraufgaben - Hochschule Ravensburg-Weingarten
klausuraufgaben - Hochschule Ravensburg-Weingarten
klausuraufgaben - Hochschule Ravensburg-Weingarten
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
A UFGABE 1<br />
FACHHOCHSCHULE RAVENSBURG -WEINGARTEN<br />
PROF. DR.-ING. S. KELLER<br />
ANGEWANDTE INFORMATIK<br />
PROGRAMMIEREN 1/2<br />
A UFGABEN ZUR K LAUSURVORBEREITUNG<br />
Gegeben ist die Funktion ausgabe().<br />
Die Funktion gibt die ersten n Zeichen einer mit '\0' abgeschlossenen Zeichenfolge aus. Ist n größer als<br />
die Anzahl der Zeichen in der Zeichenfolge, so gibt die Funktion die komplette Zeichenfolge ( bis zum '\0'-<br />
Zeichen ) aus. Die Funktion erwartet als Parameter die Zeichenfolge ( Import-Parameter: text ) und die<br />
Anzahl der auszugebenden Zeichen ( Import-Parameter: n ).<br />
int ausgabe(char *text, unsigned short n)<br />
{ unsigned short zaehler=n;<br />
if ( n>0)<br />
while ( text || n )<br />
{ putchar(*text++);<br />
n--;<br />
}<br />
printf("\n");<br />
return zaehler-n;<br />
}<br />
a) Die Funktion arbeitet fehlerhaft. Wo liegt der/die Fehler. Korrigieren Sie die Funktion.<br />
b) Definieren Sie ein Makro mit dem Namen AUSGABE.<br />
Das Makro soll analog der Funktion ausgabe() die ersten n Zeichen einer Zeichenfolge bzw. die<br />
komplette Zeichenfolge ausgeben. Das Makro AUSGABE( text, n ) hat kein Ergebnis. Das Makro<br />
entspricht daher der Funktion ausgabe(), jedoch realisiert als void Funktion.
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 2<br />
Gegeben ist die Funktion hobbit(). Herr K., Programmierer dieser Funktion, liebt es möglichst kompakte<br />
Programme zu schreiben und hat daher möglichst viele Anweisungen in die for-Schleife gepakt. Dieser<br />
Programmierstil gefällt seinem Vorgesetzten Herr M, der vorwiegend in Pascal programmiert nicht. In<br />
Pascal werden for-Schleifen ausschließlich als Zählschleifen verwendet. Herr M. weist daher Herr K. an<br />
die for-Schleife durch eine äquivalente while-Schleife zu ersetzen. Wie sieht die Funktion hobbit() nach<br />
der Änderung aus ?<br />
void hobbit( int delta )<br />
{<br />
int a,b;<br />
for (a=getchar(), b=0; a != EOL; b++, putchar(a), a=getchar() )<br />
if ( b%delta == 0 ) printf("\n");<br />
}<br />
A UFGABE 3<br />
Gegeben ist die folgende korrekte Funktion bs():<br />
int *bs( int liste[], int n, int x )<br />
{ int anf=0,end=n-1,m,*ptrm;<br />
while (1)<br />
{ m=(anf+end)/2;<br />
ptrm=&liste[m];<br />
if (x > *ptrm) anf = m+1;<br />
else end = m-1;<br />
if ( anf > end ) return (int *) 0;<br />
if (*ptrm == x) return ptrm;<br />
}<br />
}<br />
Schreiben Sie die Funktion bs() so um, daß anstatt der Endlosschleife eine Schleife mit echter<br />
Wiederholungsbedingung verwendet wird. Wählen Sie den Bedingungsausdruck so, das die Schleife nur<br />
aufgrund dieser Bedingung(en) verlassen wird und nicht durch break oder return im Rumpf der Schleife.<br />
Entscheiden sie sich für ein Schleifen-Konstrukt while oder do...while , so daß die gegebene<br />
Schleife am einfachsten realisiert werden kann. Begründen Sie Ihre Entscheidung.<br />
- 2 -
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 4<br />
Gegeben sind die beiden Funktionen FF() und Clock().<br />
unsigned char FF( unsigned int j, unsigned int k)<br />
{ static unsigned char q=0;<br />
if ( !j && !k ) ;<br />
if (!j && k ) q=1;<br />
if ( j && !k ) q=0;<br />
if ( j && k ) q=!q;<br />
return q;<br />
}<br />
unsigned int clock( unsigned char tick)<br />
{ static unsigned int count=0;<br />
return count = count + tick;<br />
}<br />
Diese beiden Funktionen werden in folgendem Programm verwendet:<br />
#include <br />
#define N 4<br />
unsigned int clock(unsigned char);<br />
unsigned char FF( unsigned int , unsigned int );<br />
int main()<br />
{ unsigned int count=0;<br />
while ( count < N ) count = clock(FF(1,1));<br />
printf("count= %iu\n",count);<br />
return 0;<br />
}<br />
Wie oft wird die while-Schleife in main() durchlaufen ?<br />
Begründen Sie Ihre Antwort.<br />
- 3 -
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 5<br />
In ANSI-C gibt es den dreistelligen Operator ? ( bedingter Ausdruck ) mit folgender Bedeutung:<br />
a1 ? a2 : a3 ist identisch mit : if (a1== TRUE) a2;<br />
else a3;<br />
Der Wert des Ausdruckes ( a1 ? a2 : a3 ) ist entweder a2 oder a3.<br />
Gegeben ist folgendes Programm:<br />
#include <br />
main()<br />
{<br />
int nx,nzahl, nmax=100 ;<br />
for ( nx=2,nzahl=2; nzahl
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 6<br />
Gegeben sind folgende Definitionen:<br />
static int vektor[]={10,15,4,25};<br />
int dasist,*stelle;<br />
struct knoten { char titel[6];<br />
int index;<br />
} goethe = { "Faust",5};<br />
struct knoten *dichter;<br />
char *text,**pfeil;<br />
Welche der folgenden Ausdrücke / Anweisungsfolgen sind korrekt, welche sind falsch ? Geben Sie für<br />
alle korrekten Ausdrücke /Anweisungsfolgen das Ergebnis entweder als Wert oder in Form einer Grafik<br />
an, falls das Ergebnis ein Zeiger ist. Die Grafik beschreibt die Datenstruktur auf die der Zeiger verweist.<br />
1. dichter = goethe;<br />
2. text = (&goethe)->titel;<br />
3. text=stelle;<br />
4. text=goethe.titel + 4;<br />
5. dasist=&vektor[2]-vektor;<br />
6. stelle = vektor+3;<br />
dasist=vektor[*stelle++];<br />
7. pfeil= &text;<br />
*pfeil="Hesse";<br />
(&goethe)->titel[0]=**pfeil;<br />
- 5 -
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 7<br />
Gegeben sind folgende Definitionen und Ausdrücke<br />
static int matrix[2][3] = { { -3, 14, 5 }, {1, -10, 8 } };<br />
static int *liste[] = { matrix[0], matrix[1] };<br />
int *p = liste[1];<br />
Welche Werte ergeben die folgenden Ausdrücke, unter der Annahme das jeder Ausdruck direkt<br />
nach obiger Definition ausgeführt wird.<br />
Erklären Sie, wie Sie zu Ihrem Ergebnis kamen d.h. welche Wirkung der Ausdruck bezüglich<br />
obiger Datenstruktur hat.<br />
Ausdruck<br />
*liste[1];<br />
Ergebniswert Erklärung zur Wirkung des Ausdruckes<br />
*(*(matrix+1)+1 ));<br />
*(matrix[0]+2);<br />
*(++p);<br />
*(--p-2);<br />
- 6 -
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 8<br />
Das folgende Bild beschreibt eine Datenstruktur, in der Prüfungen, Anzahl der Teilnehmer an der<br />
Prüfung, sowie die Namen der Prüfungsteilnehmer gespeichert werden.<br />
Tabelle "Prüfung"<br />
Bezeichnun<br />
g<br />
Anzahl der<br />
Teilnehme<br />
r<br />
Verweis auf<br />
Teilnehmerlist<br />
e<br />
Teilnehmerliste Namen<br />
Prog. 3 3 ----------- -------> ------> "sowieso"<br />
Multimedia 2 | ------> "mitmacher"<br />
| ------> "witzkopf"<br />
|<br />
|----------- -------> ------> "nachbrenner"<br />
------> "glasklar"<br />
Eine Prüfung wird in der Tabelle "Prüfung"durch eine Zeile (Datensatz) repräsentiert. Zu jeder<br />
Prüfung wird ein Text, der die Prüfung bezeichnet und die Anzahl der Teilnehmer abgelegt. Für<br />
jeder Prüfung existiert zusätzlich eine Teilnehmerliste, in der für jeden Teilnehmer ein Eintrag<br />
abgelegt ist, der auf den Namen des Prüfungsteilnehmers verweist. Über einen Zeiger, der auf die<br />
Teilnehmerliste verweist wird die Verbindung Prüfung/Prüfungsteilnehmer geschaffen.<br />
Gegeben sind folgende Typdeklarationen:<br />
typedef char STRING[16];<br />
typedef char *TEXT;<br />
typedef TEXT *TEILNEHMERLISTE;<br />
a) Definieren Sie einen Datentyp PRUEFUNG, der einen Datensatz (Zeile) der Tabelle "Prüfung" im Bild<br />
repräsentiert. Verwenden Sie dazu die vordefinierten Datentypen.<br />
b) Deklarieren Sie eine Variable pruefungsliste, die oben angebene Tabelle bestehend aus zwei<br />
Datensätzen aufnimmt, sowie zwei Variablen liste1 und listet2 zur Aufnahme der Teilnehmerlisten.<br />
Alle Variablen sollen modulglobal vereinbart werden.<br />
- 7 -
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 9<br />
Gegeben sind folgende Datentypen und Funktionen<br />
#define NIL 0<br />
typedef struct kn { kn *erster;<br />
kn *zweiter;<br />
} STRUKTUR;<br />
typedef STRUKTUR *ZEIGER;<br />
STRUKTUR *gebilde(int groesse)<br />
{ ZEIGER top;<br />
}<br />
top=(ZEIGER) malloc ( sizeof(STRUKTUR) );<br />
wachstum(top,groesse);<br />
return top;<br />
void wachstum(ZEIGER gabel, int tiefe)<br />
{ ZEIGER knospe;<br />
}<br />
if (tiefe==0)<br />
{ gabel->erster=NIL;<br />
gabel->zweiter=NIL;<br />
}<br />
else<br />
{ knospe= (ZEIGER) malloc( sizeof(STRUKTUR) );<br />
gabel->erster=knospe;<br />
wachstum(knospe,tiefe-1);<br />
knospe= (ZEIGER) malloc( sizeof(STRUKTUR) );<br />
gabel->zweiter=knospe;<br />
wachstum(knospe,tiefe-1);<br />
}<br />
Stellen sie das Gebilde aus Zeigern und Variablen grafisch dar, das durch die Funktion<br />
gebilde()erzeugt wird, wenn die Funktion mit aktuellem Parameter "2" ( d.h. gebilde(2) )<br />
aufgerufen wird.<br />
- 8 -
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 10<br />
Welche Ausgabe produziert das folgende C-Programm. Da sie die Ausgaben nicht auf einer Seite<br />
dokumentieren können sollten Sie die Aktionen des Programms und dessen Ausgabe durch einen<br />
kurzen Text beschreiben.<br />
#include <br />
#define ANZAHL 2<br />
int Welcher(int);<br />
int Was(int);<br />
main()<br />
{<br />
}<br />
int i,k,tag=0;<br />
int (*JobListe[ANZAHL])()={Welcher,Was};<br />
for ( i=1;i
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 11<br />
In einem größeren Softwareprojekt sollen Sie ein Modul implementieren, welches drei<br />
Funktionen exportiert. Für den Import der Funktionen in anderen Modulen sollen die<br />
Prototypen in einer Headerdatei zu Verfügung gestellt werden. Zur Realisierung der<br />
Funktionen wurde Ihnen eine logische Schnittstelle vorgegeben. In einer globalen<br />
Headerdatei typen.h sind alle projektspezifischen Datentypen deklariert.<br />
Schnittstellenbeschreibung:<br />
Funktionsname: FKT_E<br />
Importparameter: Struktur vom Typ S<br />
Exportparameter: Liste von Zeigern auf Funktionen, die als Ergebnis int-Werte<br />
zurückliefern<br />
Ergebnis: Zeiger auf ein zweidimensionales array mit Komponenten vom Typ float<br />
Funktionsname: FKT_Z<br />
Importparameter: Zeiger auf eine Funktion, die als Ergbnis ein unsigned long<br />
zurückliefert<br />
Exportparameter: Liste von int-Werten<br />
Ergebnis: Zeiger auf eine Strukur vom Typ S<br />
Funktionsname: FKT_D<br />
Importparameter: Zeiger auf einen string<br />
Exportparameter: Struktur vom Typ S<br />
Ergebnis: Zeiger auf eine Liste von Zeigern, die auf int-Werte verweisen<br />
Geben Sie für diese drei Funktionen die Prototypen in der Headerdatei an.<br />
Bitte beachten Sie , das Sie eine logische Beschreibung der Schnittstelle bekommen<br />
haben. Für die Realisierung von Exportparametern müssen Sie sich daher eine konkrete<br />
Realisierung ausdenken.<br />
- 10 -
<strong>Hochschule</strong> für Technik und Sozialwesen, Fachhochschule <strong>Ravensburg</strong>-<strong>Weingarten</strong><br />
Angewandte Informatik<br />
Prof. Dr.-Ing. Silvia Keller Programmieren 1/2<br />
A UFGABE 12<br />
Das Programm QUATSCH besteht aus vier Programmodulen QUATSCH, SCHERZ, WITZ und RIPU:<br />
Modul QUATSCH<br />
Import-Objekte:<br />
Export-Objekte<br />
int main(void)<br />
{ int a,b=5;<br />
b=DoWi( InPu(b) );<br />
printf("%i %i",a,b);<br />
return 0;<br />
}<br />
Modul WITZ<br />
Import-Objekte :<br />
Export-Objekte :<br />
int witz=0;<br />
Modul SCHERZ<br />
Import-Objekte :<br />
Export-Objekte :<br />
int DoWi(int Do)<br />
{<br />
witz=OutPu()%(Do+3);<br />
return witz;<br />
}<br />
Modul RIPU<br />
Import-Objekte :<br />
Export-Objekte :<br />
static char Pu[20];<br />
static int wo=0;<br />
int InPu(int was)<br />
{ if ( wo==19 ) wo=0;<br />
Pu[wo++]= (char) was;<br />
return was;<br />
}<br />
int OutPu(void)<br />
{ if ( wo==0 ) return -1;<br />
return (int) Pu[--wo];<br />
}<br />
a) Geben Sie im obigen Bild in den Modulköpfen zu jedem Modul Import- und Exportobjekte an. Ergänzen<br />
Sie im obigen Bild die Module QUATSCH und SCHERZ mit den Prototypen der importierten Objekte.<br />
b) Beschreiben Sie die Modulhierarchie des Programms durch einen Modulhierarchiegraphen ( beachten<br />
Sie den Modultyp )<br />
c) Geben Sie zu obigem Programm den Inhalt des MAKEFILES an, so daß bei Änderung eines<br />
Quellmodule nur der betroffene Pfad neu erzeugt wird. Erläutern Sie Ihre Regeln.<br />
- 11 -