PROG 1 – Aufgabe 5 (Getrennte Übersetzungseinheiten)

Ä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
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>