Mainframe Programmierung II - Exam.pdf

Mainframe Programmierung II - Exam
Mainframe Programmierung II - Exam Aufgabe 1) Ein Job soll erstellt werden, der in drei Schritten eine große Textdatei verarbeitet. Zuerst soll die Datei sortiert werden, dann gefiltert und schlussendlich in eine neue Datei geschrieben werden. Dazu sollen JCL-Statements verwendet werden, um diesen Workflow auf einem Mainframe automatisch auszuführen. a) Erstelle ein JCL-Job, der die Datei INPUT.TX...

© StudySmarter 2024, all rights reserved.

Mainframe Programmierung II - Exam

Aufgabe 1)

Ein Job soll erstellt werden, der in drei Schritten eine große Textdatei verarbeitet. Zuerst soll die Datei sortiert werden, dann gefiltert und schlussendlich in eine neue Datei geschrieben werden. Dazu sollen JCL-Statements verwendet werden, um diesen Workflow auf einem Mainframe automatisch auszuführen.

a)

Erstelle ein JCL-Job, der die Datei INPUT.TXT sortiert und die Ergebnisse in SORTED.TXT schreibt. Nutze die relevanten JCL-Statements und Parameter, die in der Vorlesung behandelt wurden.

Lösung:

Erstellen eines JCL-Jobs zum Sortieren der Datei INPUT.TXT

Hier ist ein Beispiel für einen JCL-Job, der die Datei INPUT.TXT sortiert und die sortierten Ergebnisse in SORTED.TXT schreibt:

//JOBNAME   JOB (ACCOUNT),'SORT FILE',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID //STEP1     EXEC PGM=SORT //SORTIN    DD DSN=INPUT.TXT,DISP=SHR //SORTOUT   DD DSN=SORTED.TXT, //          DISP=(NEW,CATLG,DELETE), //          SPACE=(CYL,(5,1)), //          DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //SYSIN     DD *   SORT FIELDS=(1,80,CH,A) /* //SYSOUT    DD SYSOUT=* //SYSPRINT  DD SYSOUT=* 
  • //JOBNAME: Definiert den Job mit einem Namen und weiteren Attributen wie Klasse und Benachrichtigung.
  • //STEP1: Definiert einen Schritt im Job, der das Programm PGM=SORT ausführt.
  • //SORTIN: Gibt die Eingabedatei INPUT.TXT an.
  • //SORTOUT: Gibt die Zieldatei SORTED.TXT an und definiert die Disposition sowie die Attribute der Datei.
  • //SYSIN: Enthält die Steueranweisungen für das Sortierprogramm, in diesem Fall das Sortierfeld.
  • //SYSOUT: Gibt den Standard-Output an.
  • //SYSPRINT: Gibt den Ausgabe-Log (Systemausdruck) an.

b)

Erweitere das obige JCL-Script, um einen zweiten Schritt hinzuzufügen, der die sortierte Datei SORTED.TXT anhand eines vorgegebenen Musters filtert. Speichere die Ergebnisse in FILTERED.TXT. Implementiere diesen Schritt und achte darauf, den entsprechenden //EXEC und //DD Statements zu verwenden.

Lösung:

Erweitern des JCL-Jobs zur Sortierung und Filterung der Datei

Hier ist ein aktualisiertes JCL-Script, das zusätzlich zu der Sortierfunktion eine Filterfunktion hinzufügt:

//JOBNAME   JOB (ACCOUNT),'SORT AND FILTER FILE',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID //STEP1     EXEC PGM=SORT //SORTIN    DD DSN=INPUT.TXT,DISP=SHR //SORTOUT   DD DSN=SORTED.TXT, //          DISP=(NEW,CATLG,DELETE), //          SPACE=(CYL,(5,1)), //          DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //SYSIN     DD *   SORT FIELDS=(1,80,CH,A) /* //SYSOUT    DD SYSOUT=* //SYSPRINT  DD SYSOUT=* //STEP2     EXEC PGM=ICETOOL //TOOLIN    DD *   COPY FROM(SORTED.TXT) TO(FILTERED.TXT) USING(RPT1) /* //SORTED    DD DSN=SORTED.TXT,DISP=SHR //FILTERED  DD DSN=FILTERED.TXT, //          DISP=(NEW,CATLG,DELETE), //          SPACE=(CYL,(5,1)), //          DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //TOOLMSG   DD SYSOUT=* //DFSMSG    DD SYSOUT=* 
  • //JOBNAME: Definiert den Job mit einem Namen und weiteren Attributen wie Klasse und Benachrichtigung.
  • //STEP1: Definiert einen Schritt im Job, der das Programm PGM=SORT ausführt.
  • //SORTIN: Gibt die Eingabedatei INPUT.TXT an.
  • //SORTOUT: Gibt die Zieldatei SORTED.TXT an und definiert die Disposition sowie die Attribute der Datei.
  • //SYSIN: Enthält die Steueranweisungen für das Sortierprogramm, in diesem Fall das Sortierfeld.
  • //SYSOUT: Gibt den Standard-Output an.
  • //SYSPRINT: Gibt den Ausgabe-Log (Systemausdruck) an.
  • //STEP2: Definiert einen zweiten Schritt im Job, der das Programm PGM=ICETOOL ausführt.
  • //TOOLIN: Enthält die Steueranweisungen für das ICETOOL-Programm. In diesem Fall wird die Datei SORTED.TXT gefiltert.
  • //SORTED: Gibt die sortierte Eingabedatei SORTED.TXT an.
  • //FILTERED: Gibt die gefilterte Zieldatei FILTERED.TXT an und definiert die Disposition sowie die Attribute der Datei.
  • //TOOLMSG: Gibt den ICETOOL-Ausgabe-Log (Tool-Botschaften).
  • //DFSMSG: Gibt den DFSORT-Ausgabe-Log (DFSORT-Botschaften).

c)

Zum Abschluss erweitere den Job um einen letzten Schritt, der die gefilterte Datei FILTERED.TXT in eine neue Datei FINAL.TXT kopiert. Implementiere diesen Schritt und stelle sicher, dass alle Job-Abhängigkeiten richtig definiert sind. Nutze den COND-Parameter, um den gesamten Job bedingt auf den Erfolg der vorherigen Schritte auszuführen.

Lösung:

Vollständiger JCL-Job zur Sortierung, Filterung und Kopierung einer Datei

Hier ist das vollständige JCL-Script, das die Datei INPUT.TXT sortiert, filtert und schließlich die gefilterte Datei in eine neue Datei FINAL.TXT kopiert:

//JOBNAME   JOB (ACCOUNT),'SORT, FILTER, COPY FILE',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID //STEP1     EXEC PGM=SORT,COND=(0,NE) //SORTIN    DD DSN=INPUT.TXT,DISP=SHR //SORTOUT   DD DSN=SORTED.TXT, //          DISP=(NEW,CATLG,DELETE), //          SPACE=(CYL,(5,1)), //          DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //SYSIN     DD *   SORT FIELDS=(1,80,CH,A) /* //SYSOUT    DD SYSOUT=* //SYSPRINT  DD SYSOUT=* //STEP2     EXEC PGM=ICETOOL,COND=(0,NE) //TOOLIN    DD *   COPY FROM(SORTED.TXT) TO(FILTERED.TXT) USING(RPT1) /* //SORTED    DD DSN=SORTED.TXT,DISP=SHR //FILTERED  DD DSN=FILTERED.TXT, //          DISP=(NEW,CATLG,DELETE), //          SPACE=(CYL,(5,1)), //          DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //TOOLMSG   DD SYSOUT=* //DFSMSG    DD SYSOUT=* //STEP3     EXEC PGM=IEBGENER,COND=(0,NE) //SYSPRINT  DD SYSOUT=* //SYSUT1    DD DSN=FILTERED.TXT,DISP=SHR //SYSUT2    DD DSN=FINAL.TXT, //          DISP=(NEW,CATLG,DELETE), //          SPACE=(CYL,(5,1)), //          DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //SYSIN     DD DUMMY 
  • //JOBNAME: Definiert den Job mit einem Namen und weiteren Attributen wie Klasse und Benachrichtigung.
  • //STEP1: Definiert einen Schritt im Job, der das Programm PGM=SORT ausführt und die Eingabedatei sortiert.
  • //SORTIN: Gibt die Eingabedatei INPUT.TXT an.
  • //SORTOUT: Gibt die Zieldatei SORTED.TXT an und definiert die Disposition sowie die Attribute der Datei.
  • //SYSIN: Enthält die Steueranweisungen für das Sortierprogramm, in diesem Fall das Sortierfeld.
  • //SYSOUT: Gibt den Standard-Output an.
  • //SYSPRINT: Gibt den Ausgabe-Log (Systemausdruck) an.
  • //STEP2: Definiert einen zweiten Schritt im Job, der das Programm PGM=ICETOOL ausführt und die sortierte Datei filtert.
  • //TOOLIN: Enthält die Steueranweisungen für das ICETOOL-Programm. In diesem Fall wird die Datei SORTED.TXT gefiltert.
  • //SORTED: Gibt die sortierte Eingabedatei SORTED.TXT an.
  • //FILTERED: Gibt die gefilterte Zieldatei FILTERED.TXT an und definiert die Disposition sowie die Attribute der Datei.
  • //TOOLMSG: Gibt den ICETOOL-Ausgabe-Log (Tool-Botschaften) an.
  • //DFSMSG: Gibt den DFSORT-Ausgabe-Log (DFSORT-Botschaften) an.
  • //STEP3: Definiert einen dritten Schritt im Job, der das Programm PGM=IEBGENER ausführt und die gefilterte Datei in die Zieldatei kopiert.
  • //SYSPRINT: Gibt den Ausgabe-Log (Systemausdruck) an.
  • //SYSUT1: Gibt die gefilterte Eingabedatei FILTERED.TXT an.
  • //SYSUT2: Gibt die Zieldatei FINAL.TXT an und definiert die Disposition sowie die Attribute der Datei.
  • //SYSIN: Wird als Dummy angegeben, da das IEBGENER-Programm keine spezifischen Steueranweisungen benötigt.
  • COND-Parameter: Stellt sicher, dass jeder Schritt nur ausgeführt wird, wenn der vorherige erfolgreich abgeschlossen wurde (Condition-Code ist 0).

Aufgabe 2)

Du arbeitest als Systemadministrator für einen Großrechner, der auf dem IBM Mainframe-Betriebssystem z/OS läuft. Dein Aufgabenbereich umfasst die Verwaltung von Jobs, die Sicherheitskontrolle, das Dateisystemmanagement und die Überwachung des Systems. Überlege Dir, wie Du auf Grundlage der Funktionen und Architekturen von z/OS, wie in den Notizen beschrieben, spezifische Aufgaben bewältigen kannst.

a)

a) Erkläre die Rolle von JCL (Job Control Language) in der Verwaltung von Jobs und Prozessen in einem z/OS-System. Gib ein Beispiel für ein JCL-Skript, das einen einfachen Batch-Job startet und erläutere die wichtigsten Bestandteile des Skripts.

Lösung:

Auf einem z/OS-System ist die Job Control Language (JCL) essenziell für die Verwaltung von Jobs und Prozessen. JCL ist eine Scriptsprache, die genutzt wird, um dem Betriebssystem Anweisungen zu geben, wie ein Batch-Job ausgeführt werden soll. Sie dient dazu, Jobs zu definieren, deren Abläufe zu steuern und die benötigten Ressourcen bereitzustellen.

  • Rolle von JCL:
    • Job-Definition: JCL spezifiziert, welche Programme ausgeführt werden sollen und welche Ressourcen (z.B. Dateien, Drucker) benötigt werden.
    • Priorisierung: Es kann festgelegt werden, in welcher Reihenfolge die Jobs ausgeführt werden sollen.
    • Umgebung: Die Betriebsumgebung für Jobs wird definiert, inklusive Speicherbedarf und Laufzeitbeschränkungen.
    • Fehlerbehandlung: JCL ermöglicht eine Spezifizierung von Maßnahmen im Falle von Fehlern während der Jobausführung.

Hier ein Beispiel für ein einfaches JCL-Skript, das einen Batch-Job startet:

 //JOB1 JOB (ACCT#),'Job Name',CLASS=A,MSGCLASS=A, // NOTIFY=&SYSUID //STEP1 EXEC PGM=IEFBR14 //DD1 DD DSN=USER.TEST.FILE, // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(1,1)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=800) 
  • //JOB1 JOB: Diese Zeile definiert den Beginn eines Jobs namens 'JOB1'. Es wird eine Abrechnungsnummer (ACCT#), ein Jobname ('Job Name'), eine Jobklasse (CLASS=A) und eine Nachrichtenklasse (MSGCLASS=A) festgelegt. NOTIFY=&SYSUID sorgt dafür, dass der Jobinhaber über das Ende des Jobs benachrichtigt wird.
  • //STEP1 EXEC PGM=IEFBR14: Dies stellt den Jobschritt namens 'STEP1' dar, welcher das Dummy-Programm IEFBR14 ausführt. Dieses Programm wird häufig verwendet, um leere Jobschritte zu erstellen oder Ressourcen zuzuweisen.
  • //DD1 DD: Diese Zeile beschreibt eine Datendefinitionsdokumentation (DD). In diesem Fall wird eine neue Datei namens 'USER.TEST.FILE' erstellt. DISP=(NEW,CATLG,DELETE) bedeutet, dass die Datei neu erstellt wird (NEW), in das Katalogsystem aufgenommen wird (CATLG), und im Fall eines Fehlers gelöscht wird (DELETE). SPACE=(TRK,(1,1)) spezifiziert den benötigten Speicherplatz in Tracks. DCB=(RECFM=FB,LRECL=80,BLKSIZE=800) beschreibt das Datenkontrollblock-Format (DCB) der Datei, inklusive Rekordformat (RECFM=FB), logischer Rekordlänge (LRECL=80) und Blockgröße (BLKSIZE=800).

b)

b) Beschreibe, wie RACF (Resource Access Control Facility) in einem z/OS-Betriebssystem zur Benutzer- und Ressourcenkontrolle eingesetzt wird. Diskutiere die Schritte, die Du unternehmen würdest, um einem neuen Benutzer Zugriff auf einen bestimmten Datensatz im VSAM-Dateisystem zu gewähren.

Lösung:

RACF (Resource Access Control Facility) ist ein Sicherheitsprodukt von IBM, das im z/OS-Betriebssystem eingesetzt wird, um Zugangskontrollen für Benutzer und Ressourcen zu verwalten. Es sorgt dafür, dass nur autorisierte Benutzer Zugriff auf bestimmte Ressourcen (wie Dateien, Programme und Systeme) haben.

  • RACF-Funktionen:
    • Benutzerverwaltung: Erstellen, Ändern und Löschen von Benutzerprofilen.
    • Ressourcenschutz: Definieren von Regeln für den Zugriff auf Daten und andere Ressourcen.
    • Überwachung: Aufzeichnen von Zugriffen und Aktivitäten zur Überwachung und Compliance.
    • Gruppenverwaltung: Organisieren von Benutzern in Gruppen, um Zugriffsberechtigungen effizient zu verwalten.

Hier sind die Schritte, die unternommen werden müssen, um einem neuen Benutzer Zugriff auf einen bestimmten Datensatz im VSAM-Dateisystem zu gewähren:

  • Schritt 1: Anlegen eines neuen Benutzerprofils

    Zunächst wird ein neues Benutzerprofil in RACF erstellt. Dies kann mit dem Befehl ADDUSER gemacht werden.

    ADDUSER USERID(NAME('Neuer Benutzer') PASSWORD(password))
  • Schritt 2: Definieren einer Gruppe (optional)

    Falls der neue Benutzer zu einer vorhandenen oder neuen Gruppe gehören soll, kann eine Gruppe definiert werden.

    ADDGROUP GROUPID(DATENZUGRIFF)

    Füge den Benutzer zur definierten Gruppe hinzu:

    CONNECT USERID(GRUPPE(ID=DATENZUGRIFF))
  • Schritt 3: Festlegen der Ressourcenzugriffsrechte

    Zugriffsrechte auf den VSAM-Datensatz werden festgelegt. Der Datensatz muss in RACF definiert und zugänglich gemacht werden.

    RDEFINE DATASET('VSAM.DATENSATZ.NAME') UACC(NONE)
  • Schritt 4: Zugewiesen des Zugriffs für den Benutzer oder die Gruppe

    Erteile dem neuen Benutzer oder der Gruppe die erforderlichen Zugriffsrechte (z.B. Lesen oder Schreiben).

    PERMIT 'VSAM.DATENSATZ.NAME' CLASS(DATASET) ID(USERID ODER GRUPPE) ACCESS(READ/UPDATE)
  • Schritt 5: Aktivieren der Änderungen

    Stelle sicher, dass die Änderungen aktiviert werden, indem das Kommando SETROPTS verwendet wird.

    SETROPTS RACLIST(DATASET) REFRESH

Durch diese Schritte wird der neue Benutzer korrekt in das System integriert und erhält Zugriff auf den spezifischen VSAM-Datensatz, wobei die Sicherheitsrichtlinien von RACF eingehalten werden.

c)

c) Diskutiere die Unterschiede und Anwendungsgebiete der verschiedenen Dateisysteme in z/OS (VSAM, HFS, zFS). Erkläre ein Szenario, in dem Du zFS anstelle von VSAM verwenden würdest und warum.

Lösung:

Im z/OS-System gibt es verschiedene Dateisysteme, von denen jedes für spezifische Anwendungsgebiete geeignet ist. Die gebräuchlichsten Dateisysteme sind VSAM, HFS und zFS. Im Folgenden werde ich die Unterschiede und Anwendungen der jeweiligen Dateisysteme erläutern und ein Szenario beschreiben, in dem zFS anstelle von VSAM verwendet wird.

  • VSAM (Virtual Storage Access Method):
    • VSAM ist ein Hochleistungsdateisystem, das primär zur Speicherung und Verwaltung großer Datenmengen verwendet wird.
    • Es unterstützt verschiedene Datensatzorganisationen wie Key-Sequenced Data Sets (KSDS), Entry-Sequenced Data Sets (ESDS) und Relative Record Data Sets (RRDS).
    • Anwendungsgebiete: Transaktionsverarbeitung, Datenbanken, Batch- und Online-Anwendungen.
  • HFS (Hierarchical File System):
    • HFS wird für UNIX-Dateizugriffe in einer z/OS-Umgebung verwendet.
    • Es ist ein älteres Dateisystem, das heutzutage häufig durch zFS ersetzt wird.
    • Anwendungsgebiete: UNIX-basierte Anwendungen und Dateiverwaltung.
  • zFS (z/OS File System):
    • zFS ist das modernere Dateisystem für UNIX-Dateien innerhalb von z/OS und bietet verbesserte Leistung und Skalierbarkeit im Vergleich zu HFS.
    • Es unterstützt erweiterte Funktionen wie Wettbewerbskontrolle, Symmetrische Dateisystemoperationen und konsistente Inkonsistenzprüfungen.
    • Anwendungsgebiete: UNIX-basierte Anwendungen, Web-Server, und alles, was eine moderne und skalierbare UNIX-Dateisystemplattform benötigt.

Szenario für die Verwendung von zFS anstelle von VSAM:

Stelle Dir vor, dass Du eine neue Web-Anwendung auf Deinem z/OS-System deployen möchtest. Diese Web-Anwendung basiert auf einer Reihe von UNIX-basierten Werkzeugen und Bibliotheken und benötigt eine ebensolche Dateistruktur, um reibungslos zu funktionieren. Weiterhin ist geplant, dass mehrere Benutzer gleichzeitig auf die Dateien zugreifen und Änderungen vornehmen können.

  • Warum zFS wählen?
    • UNIX-Kompatibilität: Die Web-Anwendung erfordert ein Dateisystem, das mit UNIX-Dateien und -Verzeichnissen kompatibel ist. zFS ist dafür optimal geeignet.
    • Parallelzugriff: Da mehrere Benutzer gleichzeitig Dateizugriffe durchführen, bietet zFS durch seine moderne Architektur leistungsfähige Wettbewerbskontrollen und skaliert besser als VSAM in solchen Szenarien.
    • Erweiterte Funktionen: zFS bietet zusätzliche Funktionen wie symmetrische Dateisystemoperationen, die für eine Web-Anwendung von Vorteil sind.

In diesem Szenario bietet zFS die notwendigen Funktionen und die Leistung, die für die Anforderungen der Web-Anwendung erforderlich sind, während VSAM primär für transaktionsbasierte Batch-Jobs geeignet wäre und nicht die erweiterte UNIX-Integration und Parallelzugriffe bietet, die zFS zur Verfügung stellt.

Aufgabe 3)

Du wirst mit einer COBOL-Programmieraufgabe betraut. Entwickle ein COBOL-Programm, das in der Lage ist, grundlegende finanzielle Berechnungen durchzuführen und die Ergebnisse auf dem Bildschirm auszugeben. Das Programm soll dabei Dateneingaben vom Benutzer entgegennehmen. Die Struktur des Programms muss alle typischen COBOL-Divisionen enthalten: IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA DIVISION und PROCEDURE DIVISION.

a)

Erstelle den Header und die DATA DIVISION deines COBOL-Programms. Definiere in der DATA DIVISION alle Variablen, die Du für die Berechnung und Ausgabe benötigst. Berücksichtige dabei folgende Datentypen: numerisch und alphanumerisch.

Lösung:

Im folgenden Abschnitt erstelle ich den Header und die DATA DIVISION für das COBOL-Programm, das zur Durchführung grundlegender finanzieller Berechnungen dient. Der Header beinhaltet die IDENTIFICATION DIVISION und die ENVIRONMENT DIVISION, während die DATA DIVISION die Variablendeklarationen enthält, die für die Berechnungen und Ausgaben benötigt werden.

  • IDENTIFICATION DIVISION: Diese Division enthält den Programmnamen und die allgemeine Beschreibung des Programms.
  • ENVIRONMENT DIVISION: Diese Division spezifiziert die Umgebung, in der das Programm ausgeführt wird. Sie besteht aus der Konfiguration der Eingabe- und Ausgabegeräte.
  • DATA DIVISION: Diese Division enthält alle Datendefinitionen und -deklarationen, die im Programm verwendet werden.

Hier ist der Code:

 ' IDENTIFICATION DIVISION.  PROGRAM-ID. FinanzBerechnung.  AUTHOR. Dein Name.   ENVIRONMENT DIVISION.  CONFIGURATION SECTION.  SOURCE-COMPUTER. IBM-370.  OBJECT-COMPUTER. IBM-370.   DATA DIVISION.  FILE SECTION.   WORKING-STORAGE SECTION.  01 WS-Feld.     05 WS-Betrag1        PIC 9(7)V99.     05 WS-Betrag2        PIC 9(7)V99.     05 WS-Ergebnis       PIC 9(7)V99.     05 WS-Operation      PIC X(1).  01 WS-AnzeigeFeld.     05 WS-AnzeigeText    PIC X(50) VALUE 'Das Ergebnis der Berechnung ist: '.     05 WS-AnzeigeWert    PIC 9(7)V99.   PROCEDURE DIVISION. ' 

Dieser Header und die DATA DIVISION decken die grundlegenden Variablen ab, die wir für die finanzielle Berechnung und die entsprechende Ausgabe benötigen. Die numerischen Variablen sind mit PIC 9(7)V99 deklariert, was bedeutet, dass sie bis zu 7 Stellen vor dem Dezimalpunkt und 2 Stellen nach dem Dezimalpunkt haben können. Die alphanumerische Variable WS-Operation ist mit PIC X(1) deklariert, um ein einzelnes Zeichen aufzunehmen, das die durchzuführende Operation darstellt.

b)

Implementiere in der PROCEDURE DIVISION eine Routine, die zwei vom Benutzer eingegebene numerische Werte einliest, diese addiert und das Ergebnis auf dem Bildschirm ausgibt. Zeige den gesamten Code und erkläre die Funktion jeder Anweisung kurz.

Lösung:

Ich werde jetzt die Aufgabe lösen, indem eine Routine in der PROCEDURE DIVISION implementiert wird, die zwei numerische Werte vom Benutzer einliest, diese addiert und das Ergebnis auf dem Bildschirm ausgibt.

Hier ist der vollständige COBOL-Code mit den erforderlichen Divisionen und Anweisungen:

 ' IDENTIFICATION DIVISION.  PROGRAM-ID. FinanzBerechnung.  AUTHOR. Dein Name.   ENVIRONMENT DIVISION.  CONFIGURATION SECTION.  SOURCE-COMPUTER. IBM-370.  OBJECT-COMPUTER. IBM-370.   DATA DIVISION.  FILE SECTION.   WORKING-STORAGE SECTION.  01 WS-Feld.  05 WS-Betrag1       PIC 9(7)V99.  05 WS-Betrag2       PIC 9(7)V99.  05 WS-Ergebnis      PIC 9(7)V99.  05 WS-Operation     PIC X(1).  01 WS-AnzeigeFeld.  05 WS-AnzeigeText   PIC X(50) VALUE 'Das Ergebnis der Berechnung ist: '.  05 WS-AnzeigeWert   PIC 9(7)V99.   PROCEDURE DIVISION.  Main-Prozedur.       DISPLAY 'Bitte geben Sie den ersten Betrag ein: '.       ACCEPT WS-Betrag1.       DISPLAY 'Bitte geben Sie den zweiten Betrag ein: '.       ACCEPT WS-Betrag2.             ADD WS-Betrag1 TO WS-Betrag2 GIVING WS-Ergebnis.        MOVE WS-Ergebnis TO WS-AnzeigeWert.       DISPLAY WS-AnzeigeText WS-Ergebnis.             STOP RUN. ' 

Erklärung der Funktionen jeder Anweisung:

  • IDENTIFICATION DIVISION: Enthält grundlegende Informationen über das Programm, wie den Programmnamen und den Autor.
  • ENVIRONMENT DIVISION: Spezifiziert die Umgebung, in der das Programm ausgeführt wird, und die Konfiguration der Eingabe- und Ausgabegeräte.
  • DATA DIVISION: Deklariert die Datenelemente, die im Programm verwendet werden.
    • WORKING-STORAGE SECTION: Diese Sektion enthält die Deklarationen der Variablen. - WS-Betrag1 und WS-Betrag2 sind numerische Variablen für die Eingaben des Benutzers. - WS-Ergebnis ist die numerische Variable für das Ergebnis der Addition. - WS-Operation ist eine Variable für die Operation, die durchgeführt werden soll (hier nicht benutzt). - WS-AnzeigeText ist eine alphanumerische Variable, die den Text enthält, der auf dem Bildschirm ausgegeben wird. - WS-AnzeigeWert ist die numerische Variable, die das Ergebnis zur Anzeige aufnimmt.
  • PROCEDURE DIVISION: Enthält die Logik des Programms. - Die Main-Prozedur führt die folgenden Schritte aus: 1. DISPLAY: Zeigt eine Aufforderung zur Eingabe des ersten Betrags an. 2. ACCEPT: Liest den ersten Betrag vom Benutzer ein und speichert ihn in WS-Betrag1. 3. DISPLAY: Zeigt eine Aufforderung zur Eingabe des zweiten Betrags an. 4. ACCEPT: Liest den zweiten Betrag vom Benutzer ein und speichert ihn in WS-Betrag2. 5. ADD: Addiert WS-Betrag1 und WS-Betrag2 und speichert das Ergebnis in WS-Ergebnis. 6. MOVE: Kopiert den Wert von WS-Ergebnis nach WS-AnzeigeWert. 7. DISPLAY: Zeigt den Text und das Ergebnis der Berechnung auf dem Bildschirm an. 8. STOP RUN: Beendet die Programmausführung.

Dieser Code zeigt Schritt-für-Schritt, wie Benutzereingaben gelesen, addiert und die Ergebnisse auf dem Bildschirm angezeigt werden.

c)

Erweitere dein COBOL-Programm um eine Funktion, die eine Gehaltsabrechnung erstellt. Implementiere eine Berechnung, bei der monatliche Abzüge (wie z.B. Steuern und Versicherungen) von einem Bruttogehalt abgezogen werden. Das Ergebnis soll in einer variablen Nettoeinkommen gespeichert und ausgegeben werden. Führe mathematische Berechnungen durch und beschreibe die Schritte detailliert.

Lösung:

Ich werde das bestehende COBOL-Programm erweitern, um eine Gehaltsabrechnungsfunktion zu implementieren. Das Programm soll monatliche Abzüge (z.B. Steuern und Versicherungen) von einem Bruttogehalt abziehen und das Nettoeinkommen berechnen. Anschließend wird das Nettoeinkommen auf dem Bildschirm ausgegeben.

Hier ist der erweiterte COBOL-Code:

 ' IDENTIFICATION DIVISION.  PROGRAM-ID. Gehaltsberechnung.  AUTHOR. Dein Name.   ENVIRONMENT DIVISION.  CONFIGURATION SECTION.  SOURCE-COMPUTER. IBM-370.  OBJECT-COMPUTER. IBM-370.   DATA DIVISION.  FILE SECTION.   WORKING-STORAGE SECTION.  01 WS-Feld.  05 WS-Bruttogehalt      PIC 9(7)V99.  05 WS-Steuern           PIC 9(7)V99.  05 WS-Versicherung      PIC 9(7)V99.  05 WS-Nettoeinkommen    PIC 9(7)V99.   01 WS-AnzeigeFeld.  05 WS-AnzeigeText       PIC X(50) VALUE 'Das Nettoeinkommen beträgt: '.  05 WS-AnzeigeWert       PIC 9(7)V99.   PROCEDURE DIVISION.  Main-Prozedur.       DISPLAY 'Bitte geben Sie das Bruttogehalt ein: '.       ACCEPT WS-Bruttogehalt.       DISPLAY 'Bitte geben Sie die monatlichen Steuern ein: '.       ACCEPT WS-Steuern.       DISPLAY 'Bitte geben Sie die monatlichen Versicherungen ein: '.       ACCEPT WS-Versicherung.             SUBTRACT WS-Steuern WS-Versicherung FROM WS-Bruttogehalt GIVING WS-Nettoeinkommen.        MOVE WS-Nettoeinkommen TO WS-AnzeigeWert.       DISPLAY WS-AnzeigeText WS-Nettoeinkommen.             STOP RUN. ' 

Erklärung der Funktionen jeder Anweisung:

  • IDENTIFICATION DIVISION: Enthält grundlegende Informationen über das Programm, wie den Programmnamen und den Autor.
  • ENVIRONMENT DIVISION: Spezifiziert die Umgebung, in der das Programm ausgeführt wird, und die Konfiguration der Eingabe- und Ausgabegeräte.
  • DATA DIVISION: Deklariert die Datenelemente, die im Programm verwendet werden.
    • WORKING-STORAGE SECTION: Diese Sektion enthält die Deklarationen der Variablen. - WS-Bruttogehalt: Numerische Variable für das eingegebene Bruttogehalt. - WS-Steuern: Numerische Variable für die monatlichen Steuern. - WS-Versicherung: Numerische Variable für die monatlichen Versicherungsabzüge. - WS-Nettoeinkommen: Numerische Variable für das berechnete Nettoeinkommen. - WS-AnzeigeText: Alphanumerische Variable, die den Anzeigetext enthält. - WS-AnzeigeWert: Numerische Variable, die das Nettoeinkommen zur Anzeige aufnimmt.
  • PROCEDURE DIVISION: Enthält die Logik des Programms. Die Main-Prozedur führt die folgenden Schritte aus: 1. DISPLAY: Zeigt eine Aufforderung zur Eingabe des Bruttogehalts an. 2. ACCEPT: Liest das Bruttogehalt vom Benutzer ein und speichert es in WS-Bruttogehalt. 3. DISPLAY: Zeigt eine Aufforderung zur Eingabe der monatlichen Steuern an. 4. ACCEPT: Liest die monatlichen Steuern vom Benutzer ein und speichert sie in WS-Steuern. 5. DISPLAY: Zeigt eine Aufforderung zur Eingabe der monatlichen Versicherungen an. 6. ACCEPT: Liest die monatlichen Versicherungen vom Benutzer ein und speichert sie in WS-Versicherung. 7. SUBTRACT: Zieht die monatlichen Steuern und Versicherungen vom Bruttogehalt ab und speichert das Ergebnis in WS-Nettoeinkommen. 8. MOVE: Kopiert den Wert von WS-Nettoeinkommen nach WS-AnzeigeWert. 9. DISPLAY: Zeigt den Text und das Nettoeinkommen auf dem Bildschirm an. 10. STOP RUN: Beendet die Programmausführung.

Dieser erweiterte COBOL-Code zeigt, wie Bruttogehalt, Steuern und Versicherungen eingelesen und das Nettoeinkommen berechnet und angezeigt werden.

Aufgabe 4)

Du arbeitest als Mainframe-Entwickler und Dein Team hat die Aufgabe, die Leistung einer bestehenden COBOL-Anwendung zu optimieren. Die Anwendung verarbeitet täglich eine große Menge an Transaktionsdaten und es gibt Berichte darüber, dass sie zu Spitzenzeiten signifikante Verzögerungen aufweist. Du musst mehrere Schritte unternehmen, um diese Anwendung zu analysieren und zu optimieren. Berücksichtige dabei die nachfolgenden Optimierungstechniken:

  • Analyse bestehender Programme zur Identifikation von Engpässen
  • Verbesserung der Algorithmen und Datenstrukturen
  • Nutzung von Assembler für zeitkritische Abschnitte
  • Verwendung von leistungsstarken Bibliotheken und Tools
  • Optimierung von SQL-Abfragen und Datenbankzugriffen
  • Überwachung und regelmäßiges Profiling der Anwendungen

a)

a) Beschreibe detailliert, wie Du vorgehen würdest, um die bestehenden Programme zu analysieren und Engpässe zu identifizieren. Verwende dafür konkrete Methoden und Tools, die im Mainframe-Umfeld gängig sind.

Lösung:

Analyse bestehender Programme zur Identifikation von Engpässen

Um die Leistung einer bestehenden COBOL-Anwendung zu optimieren, müssen wir systematisch vorgehen, um Engpässe zu identifizieren und zu analysieren. Hier ist ein detaillierter Ansatz:

  • Verständnis der aktuellen Arbeitslast: Zuerst muss erfasst werden, wie die Anwendung derzeit genutzt wird und wann die Spitzenzeiten auftreten. Hierzu können Log-Dateien und Überwachungssysteme wie IBM OMEGAMON herangezogen werden, um Leistungsmessdaten zu sammeln.
  • Erstellung eines Performance-Profils: Mithilfe von Tools wie IBM Application Performance Analyzer (APA) und Strobe können detaillierte Performance-Profile der Anwendung erstellt werden. Diese Profile helfen dabei, die Anwendungslaufzeiten zu visualisieren und potenzielle Engpässe zu identifizieren.
  • Code-Analysen:Der Einsatz von statischen Analysetools wie IBM Debugger for z/OS oder Cobol Analyzer ermöglicht es, den Quellcode auf ineffiziente Algorithmen und unsaubere Codemuster hin zu überprüfen.
  • SQL-Analyse: Wenn die Anwendung auf eine Datenbank zugreift, ist es wichtig, die SQL-Abfragen zu analysieren. Tools wie IBM DB2 Query Monitor und Triton können helfen, ineffiziente SQL-Abfragen zu identifizieren.
  • Monitoring und Echtzeitanalyse: Durch den Einsatz von Überwachungswerkzeugen wie IBM OMEGAMON können in Echtzeit Systemressourcen überwacht werden. Dies hilft, Engpässe bei CPU-, I/O- und Speicherressourcen zu erkennen.
  • Benchmarking: Erstelle Benchmark-Testszenarien, um Teile der Anwendung isoliert zu testen. Dies ermöglicht es, die Auswirkungen von Optimierungen zu messen und zu bewerten.

Zusammengefasst sollte diese herangehensweise eine umfassende und detaillierte Analyse der bestehenden COBOL-Anwendung ermöglichen und die Identifikation von Engpässen unterstützen.

b)

b) Im Anschluss an die Analyse entscheidest Du, die Algorithmen und Datenstrukturen zu optimieren. Nimm an, Du hast eine Funktion gefunden, die sehr oft aufgerufen wird und aktuell eine Zeitkomplexität von \(O(n^2)\) aufweist. Beschreibe einen alternativen Ansatz zur Optimierung dieser Funktion und berechne die neue Zeitkomplexität. Gehe dabei etwa auf eine Optimierung von \(O(n)\) ein und erkläre Deine Lösung Schritt für Schritt. Wenn es sinnvoll ist, kannst Du dazu auch Pseudocode oder COBOL-Code-Snippets verwenden.

Lösung:

Optimierung der Algorithmen und Datenstrukturen

Um eine Funktion mit einer aktuellen Zeitkomplexität von O(n²) auf O(n) zu optimieren, müssen wir einen alternativen Algorithmus finden, der die gleiche Aufgabe effizienter erledigen kann. Hier ist ein Beispiel, wie dies durchgeführt werden kann.

Problemstellung

Nehmen wir an, die Funktion durchsucht ein Array, um Paare von Elementen zu finden, die eine bestimmte Bedingung erfüllen (z.B. eine Zielsumme). Der ursprüngliche Algorithmus hat eine doppelte Schleife, die zu einer Zeitkomplexität von O(n²) führt.

Perform varying i from 1 by 1 until i > MAX-INDEX     Perform varying j from i+1 by 1 until j > MAX-INDEX         If (ARRAY(i) + ARRAY(j) = TARGET-SUM)             DISPLAY 'Pair found: ' ARRAY(i) ' and ' ARRAY(j)         End-if     End-performEnd-perform

Dieser Algorithmus prüft jedes Paar von Elementen und hat deshalb eine Zeitkomplexität von O(n²).

Optimierte Lösung

Eine effizientere Lösung würde ein Hash-Set verwenden, um die Zeitkomplexität auf O(n) zu reduzieren. Dabei gehen wir die Liste nur einmal durch und überprüfen, ob das Komplement eines Elements (d.h. TARGET-SUM - aktuelles Element) bereits im Hash-Set vorhanden ist. So kann jedes Element in konstanter Zeit geprüft und eingefügt werden.

Pseudocode

Initialize an empty SetPerform varying i from 1 by 1 until i > MAX-INDEX     Compute complement = TARGET-SUM - ARRAY(i)     If Set contains complement         DISPLAY 'Pair found: ' complement ' and ' ARRAY(i)     Else         Add ARRAY(i) to Set     End-ifEnd-perform

In diesem Pseudocode wird jedes Element nur einmal untersucht und entweder das Komplement gefunden oder das Element zum Set hinzugefügt. Die Zeitkomplexität für das Durchsuchen und Einfügen in das Set ist O(1), was zu einer Gesamtzeitkomplexität von O(n) führt.

COBOL Code-Snippet

Ein entsprechender COBOL-Code, der diesen Ansatz umsetzt, könnte wie folgt aussehen:

WORKING-STORAGE SECTION.01  SUB-VALUE   PIC 9(5).01  SET-TABLE   OCCURS 100 INDEXED BY S-INDEX.01  SET-COUNT   PIC 9(5) VALUE 0.PROCEDURE DIVISION.    Perform varying i from 1 by 1 until i > MAX-INDEX         Compute SUB-VALUE = TARGET-SUM - ARRAY(i)         Search SET-TABLE             When SET-TABLE (S-INDEX) = SUB-VALUE                 DISPLAY 'Pair found: ' SUB-VALUE ' and ' ARRAY(i)         End-Search         If S-INDEX > SET-COUNT             Add 1 to SET-COUNT             Move ARRAY(i) to SET-TABLE (SET-COUNT)         End-if    End-Perform

Das obige COBOL-Code-Snippet implementiert den optimierten Algorithmus mit einer Zeitkomplexität von O(n). Dabei werden die Elemente und ihre Komplement überprüft und im Set gespeichert, um die weitere Suche zu erleichtern.

Sign Up

Melde dich kostenlos an, um Zugriff auf das vollständige Dokument zu erhalten

Mit unserer kostenlosen Lernplattform erhältst du Zugang zu Millionen von Dokumenten, Karteikarten und Unterlagen.

Kostenloses Konto erstellen

Du hast bereits ein Konto? Anmelden