Die Beschreibung des Programms findet ihr oben in der Lösung.
Programmiertechnik 1 – Aufgabe 3 (Klausurnoten)
Das Ergebnis wird als HTML Code ausgegeben und mit diesem Aufruf könnt ihr es direkt in die Datei schreiben. Jedenfalls unter Linux:
./Aufgabe3 > ergebniss.htm
Lösung:
//
// Aufgabe3.cpp
//
// Programmiertechnik Uebungsaufgabe 3: Klausurnoten
//
// Liest Klausurnoten im Format ganze,zehntel oder ganze.zehntel ein
// und bestimmt die beste und die schlechteste Note, den Durchschnitt
// sowie die Durchfallquote in Prozent.
// Das Programm beruecksichtigt dabei nur die nach Pruefungsordnung
// zulaessigen Noten (1,0 1,3 1,7 2,0 2,3 2,7 3,0 3,3 3,7 4,0 5,0),
// andere Noten werden unter Ausgabe einer Warnung ignoriert.
// Alle Noten bis 4.0 gelten als bestanden, nur die 5.0 als durchgefallen.
//
// Das Programm gibt als Klausurergebnis folgende Werte aus:
// - die Anzahl der beruecksichtigten Noten
// - die beste Note
// - die schlechteste Note
// - den Durchschnitt
// - die Durchfallquote
//
// Autor: Andreas Giemza
// Erstellt am: 9.11.2009
//
#include <iostream>
#include <iomanip>
int main ()
{
//--------------------------------------------------------- Noten einlesen
std::cout << "Noten im Format ganze,zehntel eingeben (Ende mit Strg-D):n";
int ganzeNote; // [1..5]
char komma;
int zehntelNote; // [0, 3, 7] fuer Noten 1 bis 3, nur 0 fuer Noten 4 und 5
/* 1: Direkt nach diesem Kommentar
weitere Variablen definieren */
int anzahl = 0;
struct Note
{
int ganze;
int zehntel;
} beste, schlechteste, durchschnitttemp;
durchschnitttemp.ganze = 0;
durchschnitttemp.zehntel = 0;
int durchgefallen = 0;
bool gueltigeEingabe;
/* 1: Ende */
while (std::cin >> ganzeNote >> komma >> zehntelNote)
{
//------------------------------------------------------ Eingabe pruefen
/* 2: Direkt nach diesem Kommentar
Anweisungen fuer das Pruefen der eingegebenen Note */
gueltigeEingabe = true;
if (komma == ',' || komma == '.')
{
switch (ganzeNote)
{
case 1:
case 2:
case 3:
if (zehntelNote != 0 && zehntelNote != 3 && zehntelNote != 7)
gueltigeEingabe = false;
break;
case 4:
case 5:
if (zehntelNote != 0)
gueltigeEingabe = false;
break;
default:
gueltigeEingabe = false;
break;
}
}
else
gueltigeEingabe = false;
if (gueltigeEingabe == false)
{
std::cout << "Unzulaessige Note " << ganzeNote << komma << zehntelNote << " wird ignoriert!n";
continue; // Keine gueltige Eingabe somit wird hiermit die Schleife neu gestartet ...
}
/* 2: Ende */
//--------------------------------------------------- Noten aufsummieren
/* 3: Direkt nach diesem Kommentar
Anweisungen fuer das Aktualisieren von Notensumme, Anzahl Noten,
Anzahl Durchgefallene, beste und schlechteste Note */
// Beim ersten Durchgang beste und schlechteste Note mit der ersten gueltigen Eingabe fuellen
if (anzahl == 0)
{
beste.ganze = ganzeNote;
beste.zehntel = zehntelNote;
schlechteste.ganze = ganzeNote;
schlechteste.zehntel = zehntelNote;
}
// Zaehler updaten
anzahl++;
if (ganzeNote == 5)
durchgefallen++;
// Falls aktuelle Note schlechter als vorherige schleteste updaten
if (schlechteste.ganze < ganzeNote || (schlechteste.ganze <= ganzeNote && schlechteste.zehntel < zehntelNote))
{
schlechteste.ganze = ganzeNote;
schlechteste.zehntel = zehntelNote;
}
// Das gleiche fuer die beste Note
if (beste.ganze > ganzeNote || (beste.ganze >= ganzeNote && beste.zehntel > zehntelNote))
{
beste.ganze = ganzeNote;
beste.zehntel = zehntelNote;
}
// Durchschnitt updaten
durchschnitttemp.ganze += ganzeNote;
durchschnitttemp.zehntel += zehntelNote;
/* 3: Ende */
} // while
//------------------------------------------------------ Ergebnis ausgeben
/* 4: Direkt nach diesem Kommentar
Anweisungen zum Berechnen von Durchschnitt und Durchfallquote
sowie zum Ausgeben des Klausurergebnisses */
std::cout << "nAnzahl beruecksichtigter Noten: " << anzahl << "n";
if (anzahl != 0)
{
std::cout << std::fixed << std::setprecision(1);
std::cout << "Beste Note: " << beste.ganze << "." << beste.zehntel << "n";
std::cout << "Schlechteste Note: " << schlechteste.ganze << "." << schlechteste.zehntel << "n";
double durchschnitt = ((double)durchschnitttemp.ganze / (double)anzahl) + ((double)durchschnitttemp.zehntel / (double)anzahl * 0.1);
std::cout << "Durchschnitt: " << durchschnitt << "n";
double durchfallquote = ((double)durchgefallen / (double)anzahl * 100);
std::cout << "Durchfallquote: " << durchfallquote << "%n";
}
/* 4: Ende */
} // main