PROG 1 – Aufgabe 6 (Notenspiegel-Klassen)

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
This entry was posted in Programmiertechnik 1 and tagged . Bookmark the permalink.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>