02.06.2013 Aufrufe

klausuraufgaben - Hochschule Ravensburg-Weingarten

klausuraufgaben - Hochschule Ravensburg-Weingarten

klausuraufgaben - Hochschule Ravensburg-Weingarten

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 -

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!