Prüfung C++ Altstudiengang Wiederholer SS 2001 (Prof. Sauer) Es soll eine Querverweisliste für ein C++ Programm erstellt werden. Ausgangspunkt ist eine Datei, in der ein C++ Programm gespeichert ist. Diese Datei ist in einem Verzeichnis unter dem Namen pr12203.cpp abgelegt. Die Datei hat folgendes Aussehen: #include<iostream.h> #define PI 3.14159265389793 #define quadrat(a) ((a)*(a)) void main() { int ; //float Kreisflaeche; cout<< Zahl eingeben:\n ; cin>>; /* Blockkommentar kriesflaeche = quadrat()*pi; */ cout<< \n Die Kreisflaeche betraegt: <<quadrat()*pi; } Abb1: Die Programm-Textdatei PR12203.CPP Aus dieser Datei ergeben sich für den Querverweis die folgenden Worte: void main int cout cin cout quadrat PI Abb2:Liste der Wörter aus der Textdatei PR12203.CPP 1
Es sind im wesentlichen C++ Schlüsselwörter und die vom Programmierer angegebenen (Programmierer-) Wörter, die hier ermittelt werden sollen. De Wörter sollen allgemein, unabhängig vom vorliegenden Programmtext ermittelt werden, der hier als Beispiel dient. Mit einem anderen Programmquelltext, der andere Programmiererwörter enthällt, soll das Programm ebenfalls funktionieren. Kommentare (Zeilen-,Block-) sind zu überlesen. Literale (Zeichenketten-,Zeichen-,Konstanten) und Zahlen sollen ebenfalls keine Beachtung finden. Präprozessoranweisungen bleiben unberücksichtigt. Zu jedem Wort sind Zeile und Spalte anzugeben, in denen das Wort im Quelltext vorkommt. Weitere Einzelheiten zur Programmanalyse sind im vorgegebenen Quelltext zu einem C++ Programm (vgl. Abb1) und der zugehörigen Wortliste (Abb.2) zu entnehmen. Jedes ermittelte Wort aus der eingelesenen Textdatei soll auf dem Standartausgabegerät (Bildschirm) protokolliert werden, auch wenn es bereits vorgekommen ist. 1.) Aufgabe Gib das C++ Programm an ( Hauptprogramm), das die Worte nach der vorliegenden Spezifikation ermittelt und auf das Standartausgabegerät ausgibt. 2
2.) Aufgabe Die Ausgabe der einzelnen Wörter auf das Standartausgabegerät soll durch einen Aufruf einer Funktion ersetzt werden, die folgendes bewirkt: - Jedes Wort, das im Funktionsaufruf als Argument (neben zwei weiteren Argumenten: Zeilen- und Spaltennummer unter denen das Wort im Programmquelltext vorkommt) auftritt ist in eine Tabelle (sequentielle Liste auf der Basis Array ) aufzunehmen. De Tabelle ist im dynamischen Speicherbereich anzuordnen. - Jeder Tabelleneintrag enthält drei Spalten zu Aufnahme eines Wortes, eines Zählers und eines Verweises auf Zeilen- und Spaltennummer in der das Wort im Quelltext vorkommt. Die Strucktur des Tabelleneintrages soll unter den Namen daten deklariert bzw. definiert sein. Im Zähler ist die An der Vorkommen gespeichert, die die Wörter im Quelltext besitzen. So wird dreimal aus dem Quelltext ermittelt. Das wirdbeim Einfügen in die Tabelle festgestellt und unter zaehler gespeichert. - Für Zeilen und Spalten, unter denen das Wort im Quelltext gefunden wurde, ist in daten ein Verweis auf eine sequentiell verkettete Liste anzugeben. Jedes Listenelement dieser Liste umfast einen Knoten, der die Zeilen- und Spaltennummer enthätl. Die sequentiell verkettete Liste mit Zeilen- und Spaltennummern ist unter dem Namen *ortliste 1 zu deklarieren bzw. definieren. - Das Aufnehmen eines Wortes in die Tabelle übernimmt die Methode einfuegen() des benutzerdefinierten Datentyps (Klasse) seqliste (Tabelle). Eine Instanz zum Aufruf dieser Methode ist im Hauptprogrammabschnitt einzurichten. Der Aufbau der Tabelle hat damit folgende Gestalt: swort zaehler *ortliste void 1 main 1 int 1 3... 6 4 0 6 9 0 8 6 0 8 94 11 13 16 17 0 Abb.3: Speicherstucktur 3
a) Gib den benutzerdefinierten Datentyp mit dem Namen ort für einen Listenknoten einer einfach geketeten Liste an, dessen Elemente die Zeilen und Spaltennummern aufnehmen, unter denen sich die Worte im Quelltext befinden. Es sind alle zur Lösung nötigen Datenelemente und Methoden (z.b. Konstrucktor) vollständig anzugeben. Auch eine Ausgabefunktion ist vorzusehen. Zeilen- und Spaltennummer sind private Datenelemente, der Verweis auf den Nachfolger eines Listenknotens darf public deklariert sein. b) Die Strucktur daten ist zu deklarieren bzw. definieren. Alle Elemente der Stucktur sind öffentlich zugänglich. Methoden sind außerhalb der Deklaration zu definieren (anzugeben). Nur unbedingt zur Lösung der Aufgabe notwendige Methoden sollen ermittelt werden. Eine Ausgabefunktion ist gefordert. c) Die Deklarationder Klasse (Schnittstellenbeschreibung) seqliste (Tabelle) ist anzugeben. Neben privaten Datenelementen sind nur die Deklarationen der zur Lösung der Aufgabe notwendigen Methoden anzugeben. d) Die Methoden zur seqliste sollen nun angegeben werden. Dazu zählt auch die bereits erwähnte Methode zum Einfügen (einfügen() ). e) Die Tabelle soll im Hauptprogrammabschnitt einschließlich der Querverweise durch folgende Anweisung ausgegeben werden. cout << sl ; sl ist eine Instanz der Tabelle (sequentielle Liste). Die Aufgabe soll in folgendem Format erfolgen <1> void <6,4> <1> main <6,9> <1> int <8,4> <3> <8,9> <11,13> <16,17> Vor jedem Wort steht in spitzen Klammern eine Zahl die angibt, wie häufig das Wort im Programmquelltext vorkommt. Danach folgt in der nächsten Zeile das Paar aus Zeilennummer und Spaltennummer, unter der sich ds Wort im Quelltext befindet. In einer Zeile sollen maximal sechs Querverweise stehen können. 4
3.) Aufgabe Die vorliegende Ausgabe ist nicht nach Worten sortiert. Schreibe eine einfache Sortierroutine, sie soll Methode der Klasse seqliste sein, die das Sortieren der Tabelleneinträge vornimmt. Die Ausgabe würde danach folgende Gestalt annehmen: <1> PI <16,23> <1> cin <11,4> <2> cout <10,5> <15,5> <1> int <8,4> <1> main <6,9> <1> quadrat <16,12> <1> void <6,4> <3> <8,9> <11,13> <16,17> Abb4: Nach Worten sortierte Ausgabe Gib die Sortierroutine an. 5