Ähnlich wie Aufgabe 3 und 4 aber diesmal gehen nur Fächer des Studiengangs TIB und es werden getrennte Übersetzungseinheiten genutzt.
Programmiertechnik 1 – Aufgabe 5 (Getrennte Übersetzungseinheiten)
Aufruf:
./Aufgabe5 Benno Beispiel > Notenspiegel.html
Lösung:
Aufgabe5.cpp:
//
// Aufgabe5.cpp
//
// Programmiertechnik Uebungsaufgabe 5: Getrennte Uebersetzungseinheiten
//
// Liest die Namen von Faechern mit den zugehoerigen Noten
// in eine verkettete Liste ein und
// gibt dann einen Notenspiegel im HTML-Format aus.
// Aufruf mit dem Namen des Studenten als Argument(e).
//
// Autor: H.Drachenfels
// Erstellt am: 4.12.2009
// DIESE DATEI NICHT AENDERN!
//
#include <iostream>
#include <cstring> // std::strcmp()
#include "FachNote.h"
#include "FachNotenListe.h"
//============================================================= Hauptprogramm
int main (int argc, char *argv[])
{
if (argc < 2)
{
std::cerr << "Name des Studenten als Argument angeben!n";
return 1;
}
//--------------------------------------------------- Notenspiegel einlesen
std::cerr << "Fach und Note eingeben (Ende mit Strg-d):n";
for (;;)
{
// Speicherplatz fuer eine weitere Note besorgen:
FachNote *fachNotePtr = new FachNote;
char komma;
// Fach und Note einlesen und pruefen:
std::cin >> fachNotePtr->fach;
std::cin >> fachNotePtr->ganze >> komma >> fachNotePtr->zehntel;
if (std::cin.eof() || std::cin.bad())
{
std::cerr << "Eingabeenden";
delete fachNotePtr;
break;
}
if (std::cin.fail())
{
std::cerr << "Falsche Eingabe: ";
delete fachNotePtr;
std::cin.clear();
char c;
while (std::cin.get(c) && c != 'n' && c != ' ' && c != 't')
{
std::cerr << c;
}
std::cerr << 'n';
continue;
}
if ((komma != ',' && komma != '.') || ! istRichtig(fachNotePtr))
{
std::cerr << "Falsche Eingabe: "
<< fachNotePtr->fach << ' '
<< fachNotePtr->ganze << komma << fachNotePtr->zehntel
<< 'n';
delete fachNotePtr;
continue;
}
// in Notenliste eintragen:
einfuegen(fachNotePtr);
}
//------------------------------------ Notenspiegel im HTML-Format ausgeben
std::cout <<
"<html>n"
"<head>n"
"<title>Notenspiegel</title>n"
"</head>n"
"<body>n"
"<h2>Notenspiegel<br><hr></h2>n"
"<p>n"
"<b>Student:</b><br>n";
for (int i = 1; i < argc; ++i)
{
std::cout << argv[i] << 'n';
}
std::cout <<
"</p>n"
"<p>n"
"<table width="100%">n"
"<tr><th align="left">Fach:</th><th align="left">Note:</th></tr>n";
for (FachNote *p = ersteFachNotePtr;
p != 0;
p = p->naechsteFachNotePtr)
{
std::cout <<
"<tr>"
"<td>" << p->fach << "</td>"
"<td>" << inWorten(p) << "</td>"
"<td>" << p->ganze << ',' << p->zehntel << "</td>"
"</tr>n";
}
std::cout <<
"</table>n"
"</p>n"
"<hr noshade>n"
"</body>n"
"</html>n";
//---------------------------------------------------- Notenliste freigeben
FachNote *fachNotePtr;
while ((fachNotePtr = entfernen()) != 0)
{
delete fachNotePtr;
}
return 0;
} // main
FachNotenListe.cpp:
// FachNotenListe.cpp
#include "FachNotenListe.h"
#include "FachNote.h"
FachNote *ersteFachNotePtr = 0;
void einfuegen(FachNote *fachNotePtr)
{
fachNotePtr->naechsteFachNotePtr=ersteFachNotePtr;
ersteFachNotePtr=fachNotePtr;
}
FachNote * entfernen()
{
if (ersteFachNotePtr)
{
FachNote *tmp=ersteFachNotePtr;
ersteFachNotePtr=ersteFachNotePtr->naechsteFachNotePtr;
return tmp;
}
else
return NULL;
}
FachNotenListe.h:
// FachNotenListe.h #ifndef FACHNOTENLISTE_H #define FACHNOTENLISTE_H //=================================================================== Include #include "FachNote.h" //========================================================= Globale Variabeln extern FachNote *ersteFachNotePtr; //================================================================ Prototypen void einfuegen(FachNote *fachNotePtr); FachNote * entfernen(); #endif
FachNote.cpp:
// FachNote.cpp
#include "FachNote.h"
bool istRichtig(FachNote *fachNotePtr)
{
bool note = false;
bool fach = false;
switch (fachNotePtr->ganze)
{
case 1:
case 2:
case 3:
if (fachNotePtr->zehntel == 0 || fachNotePtr->zehntel == 3 || fachNotePtr->zehntel == 7)
note = true;
case 4:
case 5:
if (fachNotePtr->zehntel == 0)
note = true;
}
char faecher[26][40] = {"Mathematik1", "Digitaltechnik", "Programmiertechnik1", "Systemmodellierung", "Kommunikationskompetenz", "Mathematik2", "Rechnerarchitekturen", "Programmiertechnik2", "ElektrischeSchaltungstechnik", "Mathematik3", "Kommunikationstechnik", "AlgorithmenundTheoretischeInformatik", "Betriebssysteme", "Softwaretechnik", "Mikroprozessorsysteme", "Rechnernetze", "Datenbanksysteme", "DigitaleSysteme", "Physik", "IntegriertesPraktischesStudiensemester", "EngebetteteSysteme", "VerteilteSysteme", "TeamProjekt", "Wahlplichtmodul", "Betriebwirtschaftslehre", "Bachlorarbeit"};
for (int i = 0; i <= 25; i++)
{
if (strcmp (fachNotePtr->fach, faecher[i]) == 0)
{
fach = true;
break;
}
}
if (note == true && fach == true)
return true;
else
return false;
}
const char *inWorten(FachNote *fachNotePtr)
{
double tempnote = (double)fachNotePtr->ganze + (double)fachNotePtr->zehntel*0.1;
if (tempnote < 1.5)
return "sehr gut";
if (tempnote < 2.5)
return "gut";
if (tempnote < 3.5)
return "befriedigend";
if (tempnote <= 4 && tempnote > 3.5)
return "ausreichend";
return "nicht ausreichend";
}
FachNote.h:
// FachNote.h
#ifndef FACHNOTE_H
#define FACHNOTE_H
//=================================================================== Include
#include <cstring>
//=========================================================== Typ-Deklaration
struct FachNote
{
FachNote *naechsteFachNotePtr; // Verkettung
char fach[40];
int ganze;
int zehntel;
};
//================================================================ Prototypen
bool istRichtig(FachNote *);
const char *inWorten(FachNote *);
#endif
Makefile:
# # Makefile # # Autor: H.Drachenfels # Erstellt am: 03.04.2009 # CXX = g++ CXXFLAGS = -g -W -Wall -ansi -pedantic OBJECTS = Aufgabe5.o FachNote.o FachNotenListe.o Aufgabe5: $(OBJECTS) $(CXX) $(CXXFLAGS) -o Aufgabe5 $(OBJECTS) clean: rm -f Aufgabe5 $(OBJECTS) Aufgabe5.o: Aufgabe5.cpp FachNotenListe.h FachNote.h FachNote.o: FachNote.cpp FachNote.h FachNotenListe.o: FachNotenListe.cpp FachNotenListe.h FachNote.h
test.txt:
Aufruf:
./Aufgabe5 Benno Beispiel < test.txt > Notenspiegel.html
Mathematik1 5.0 Digitaltechnik 4.0 Programmiertechnik1 3.7 Systemmodellierung 3.3 Kommunikationskompetenz 3.0 Mathematik2 2.7 Rechnerarchitekturen 2.3 Programmiertechnik2 2.0 ElektrischeSchaltungstechnik 1.7 Mathematik3 1.3 Kommunikationstechnik 1.0 AlgorithmenundTheoretischeInformatik 1.5 Betriebssysteme 6.0 Softwaretechnik 4.3 Mikroprozessorsysteme 3.2 Mathe 1.0