Gleiche wie Aufgabe 5 nur diesmal mit Klassen.
Programmiertechnik 1 – Aufgabe 6 (Notenspiegel-Klassen)
Aufruf:
./Aufgabe5 Benno Beispiel > Notenspiegel.html
Lösung:
Aufgabe6.cpp:
//
// Aufgabe6.cpp
//
// Programmiertechnik Uebungsaufgabe 6: Notenspiegel objektorientiert
//
// Liest die Namen von Faechern mit den zugehoerigen Noten ein und
// gibt dann einen Notenspiegel im HTML-Format aus.
// Aufruf mit dem Namen des Studenten als Argument(e).
//
// Autor: H.Drachenfels
// Erstellt am: 13.12.2007
//
#include "Notenspiegel.h"
#include <iostream>
int main (int argc, char *argv[])
{
if (argc < 2)
{
std::cerr << "Name des Studenten als Argument(e) angeben!n";
return 1;
}
Notenspiegel derNotenspiegel(&argv[1]);
derNotenspiegel.einlesen();
derNotenspiegel.htmlAusgeben();
return 0;
}
Notenspiegel.cpp:
//
// Notenspiegel.cpp
//
// Programmiertechnik Uebungsaufgabe 6: Klasse Notenspiegel
//
// Autor: H.Drachenfels
// Erstellt am: 14.12.2007
//
#include "Notenspiegel.h"
#include <iostream>
Notenspiegel::Notenspiegel (char **namePtr)
: namePtr_(namePtr)
{
return;
}
Notenspiegel::~Notenspiegel ()
{
FachNote *fachNotePtr;
while ((fachNotePtr = this->dieFachNoten_.entfernen()) != 0)
{
delete fachNotePtr;
}
return;
}
void Notenspiegel::einlesen ()
{
std::cerr << "Fach und Note eingeben (Ende mit Strg-d):n";
for (;;)
{
//------------------------------------ Fach und Note einlesen und pruefen
char fach[40];
int ganze;
int zehntel;
char komma;
std::cin >> fach;
std::cin >> ganze >> komma >> zehntel;
if (std::cin.fail())
{
if (std::cin.eof() || std::cin.bad())
{
std::cerr << "Eingabeenden";
return;
}
std::cerr << "Keine Zahl: ";
std::cin.clear();
char c;
while (std::cin.get(c) && c != 'n' && c != ' ' && c != 't')
{
std::cerr << c;
}
std::cerr << 'n';
continue;
}
FachNote *fachNotePtr = new FachNote(fach, ganze, zehntel);
if (komma != ',' && komma != '.' || ! fachNotePtr->istRichtig())
{
std::cerr << "Falsche Eingabe: "
<< fach << ' ' << ganze << komma << zehntel
<< 'n';
delete fachNotePtr;
continue;
}
//----------------------------------------------- in Notenliste eintragen
this->dieFachNoten_.einfuegen(fachNotePtr);
}
}
void Notenspiegel::htmlAusgeben () const
{
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 (char **p = this->namePtr_; *p != 0; p++)
{
std::cout << *p << '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 = this->dieFachNoten_.getErsteFachNote();
p != 0;
p = p->getNaechsteFachNote())
{
std::cout <<
"<TR>"
"<TD>" << p->getFach() << "</TD>"
"<TD>" << p->inWorten() << "</TD>"
"<TD>" << p->getGanze() << ',' << p->getZehntel() << "</TD>"
"</TR>n";
}
std::cout <<
"</TABLE>n"
"</P>n"
"<HR NOSHADE>n"
"</BODY>n"
"</HTML>n";
}
Notenspiegel.h:
//
// Notenspiegel.h
//
// Programmiertechnik Uebungsaufgabe 6: Klasse Notenspiegel
//
// Autor: H.Drachenfels
// Erstellt am: 14.12.2007
//
#ifndef NOTENSPIEGEL_H
#define NOTENSPIEGEL_H
#include "FachNotenListe.h"
class Notenspiegel
{
public:
Notenspiegel (char **namePtr);
~Notenspiegel ();
void einlesen ();
void htmlAusgeben () const;
private:
char **namePtr_;
FachNotenListe dieFachNoten_;
};
#endif
FachNotenListe.cpp:
// FachNotenListe.cpp
#include "FachNotenListe.h"
FachNotenListe::FachNotenListe ()
{
this->ersteFachNotePtr_ = 0;
}
FachNotenListe::~FachNotenListe ()
{
}
void FachNotenListe::einfuegen (FachNote *fachNotePtr)
{
fachNotePtr->setNaechsteFachNote(this->ersteFachNotePtr_);
this->ersteFachNotePtr_ = fachNotePtr;
}
FachNote* FachNotenListe::entfernen ()
{
if (ersteFachNotePtr_)
{
FachNote *tmp = this->ersteFachNotePtr_;
this->ersteFachNotePtr_ = this->ersteFachNotePtr_->getNaechsteFachNote();
return tmp;
}
else
return 0;
}
FachNote* FachNotenListe::getErsteFachNote () const
{
return this->ersteFachNotePtr_;
}
FachNotenListe.h:
//
// FachNotenListe.h
//
// Programmiertechnik Uebungsaufgabe 6: Klasse FachNotenListe
//
// Autor: H.Drachenfels
// Erstellt am: 24.06.2008
//
#ifndef FACHNOTENLISTE_H
#define FACHNOTENLISTE_H
#include "FachNote.h"
class FachNotenListe
{
public:
FachNotenListe ();
~FachNotenListe ();
void einfuegen (FachNote *fachNotePtr);
FachNote* entfernen ();
FachNote* getErsteFachNote () const;
private:
FachNote *ersteFachNotePtr_;
};
#endif
FachNote.cpp:
// FachNote.cpp
#include "FachNote.h"
#include <cstring>
FachNote::FachNote (const char *fachPtr, int ganze, int zehntel)
: naechsteFachNotePtr_(0),ganze_(ganze), zehntel_(zehntel)
{
std::strcpy(this->fach_, fachPtr);
}
FachNote::~FachNote ()
{
}
bool FachNote::istRichtig () const
{
bool note = false;
bool fach = false;
switch (this->ganze_)
{
case 1:
case 2:
case 3:
if (this->zehntel_ == 0 || this->zehntel_ == 3 || this->zehntel_ == 7)
note = true;
case 4:
case 5:
if (this->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 (std::strcmp (this->fach_, faecher[i]) == 0)
{
fach = true;
break;
}
}
return note && fach;
}
const char* FachNote::inWorten () const
{
double tempnote = (double)this->ganze_ + (double)this->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)
return "ausreichend";
return "nicht ausreichend";
}
FachNote* FachNote::getNaechsteFachNote () const
{
return this->naechsteFachNotePtr_;
}
void FachNote::setNaechsteFachNote (FachNote *fachNotePtr)
{
this->naechsteFachNotePtr_ = fachNotePtr;
}
const char* FachNote::getFach () const
{
return this->fach_;
}
int FachNote::getGanze () const
{
return this->ganze_;
}
int FachNote::getZehntel () const
{
return this->zehntel_;
}
FachNote.h:
//
// FachNote.h
//
// Programmiertechnik Uebungsaufgabe 6: Klasse FachNote
//
// Autor: H.Drachenfels
// Erstellt am: 24.06.2008
//
#ifndef FACHNOTE_H
#define FACHNOTE_H
class FachNote
{
public:
FachNote (const char *fachPtr, int ganze, int zehntel);
~FachNote ();
bool istRichtig () const;
const char* inWorten () const;
FachNote* getNaechsteFachNote () const;
void setNaechsteFachNote (FachNote *fachNotePtr);
const char* getFach () const;
int getGanze () const;
int getZehntel () const;
private:
FachNote *naechsteFachNotePtr_;
char fach_[40];
int ganze_;
int zehntel_;
};
#endif
Makefile:
# # Makefile # # Autor: H.Drachenfels # Erstellt am: 14.12.2007 # CXX = g++ CXXFLAGS = -g -W -Wall -ansi -pedantic OBJECTS = Aufgabe6.o Notenspiegel.o FachNotenListe.o FachNote.o Aufgabe6: $(OBJECTS) $(CXX) $(CXXFLAGS) -o Aufgabe6 $(OBJECTS) clean: rm -f Aufgabe6 $(OBJECTS) Aufgabe6.o: Aufgabe6.cpp Notenspiegel.h Notenspiegel.o: Notenspiegel.cpp FachNotenListe.h FachNote.h FachNotenListe.o: FachNotenListe.cpp FachNotenListe.h FachNote.h FachNote.o: FachNote.cpp FachNote.h
test.txt:
Aufruf:
./Aufgabe6 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