MezData-Logo Lösungen Button :CPP: Loesung

BaustelleSAE Muster-Klassenarbeit

Version: 23.02.2011

Musterlösung

Allgemeiner Teil:

Aufgabe 1

Punkte:2

Um Ein-Ausgaberoutinen verwenden zu können, sind einfache Einträge in der cpp-Datei vorzunehmen.
Welche sind dies?

Lösung

#include <conio.h> // getch()
#include <iostream.h> // cin cout

Aufgabe 2

Punkte:2

Aus welchem Grund müssen in c/c++ Variablen deklariert werden?

Lösung

  1. Um Speicherplatz für die Variablen zu reservieren
  2. Den Kontext der Variablen festzulegen, Ort der Deklaration entscheidet z.B. darüber ob Variable global oder lokal ist.

Aufgabe 3

Punkte:2

Worin besteht der Unterschied zwischen der Definition und Deklaration von Variablen?
Anhand eines einfachen Beispiels erläutern!

Lösung

int susi;  // Deklaration, es wird Speicher für eine Integervariable reserviert,
           // Speicher ist über den Bezeichner susi ansprechbar,
           // Achtung in susi kann noch ein beliebiger Wert stehen!

susi = 17; // Definition, susi wird der Wert 17 zugewiesen, geschiet dies zum ersten mal nach der Deklaration
           // spricht man auch von Initialisierung von susi mit dem Wert 17

int otto = 18; // Deklaration und Initialisierung von otto mit 18

Aufgabe 4

Punkte:4

Wie ist der Aufbau und die Wirkungsweise einer Do-While-Schleife?
Zeigen Sie den wesentlichen Unterschied zu While-Schleife anhand eines Quellcodebeispiels!

Lösung

do Anweisungen while (Bedingung); Wobei Anweisungen eine einzelne Anweisung oder ein Block von Anweisungen sein kann. Fußgesteuerte Schleife,
solange Bedingung erfüllt ist werden die Anweisungen erneut ausgeführt, d.h im Gegensatz zur While-Schleife mindestens ein mal!

int i = 100;
do{            // tue erst mal
  cout << i << " ";
  i++;
}while (i<10); // solange i < 10 springe wieder zu do
// Ausgabe 100  i=101

Projekt Teil Theorie:

Beschreibung des Projekts

Die Statistik eines Webauftritts soll ausgewertet und als Balkendiagramm graphisch dargestellt werden. Im Theorie-Teil soll die Ausgabe auf der Konsole geschehen, im Praxis-Teil soll eine "stats.html" Seite generiert werden.

Die Main-Funktion (hier immer mal wieder nachschauen wie die Funkionen verwendet werden):

void main()
{
  cout << "WebSite-Statistiken v1.0 von Oliver Mezger\n\n";
  hits_ausgeben();
  cout<<"\n Hits gesammt: "<<prozente_berechnen()<<"\n\n";
  cout<<"\n Gesammt: "<<prozente_ausgeben() << "% \n\n";
  balken_ausgeben();
  getch();
}
Die Daten liegen in folgender Form vor:
const SITES = 5;      // Anzahl der Seiten
string names[SITES] = {"Bananas","Apples","Funk'n","Deep Blue","Fluids"};
int hits[SITES]= {240,34,487,154,85}; // Zugriffe auf die Seiten
int prozente[SITES];   // In Prozent umgerechnete Zugriffe (noch zu berechnen)

Aufgabe 5 (name_ausgeben)

Punkte:12

Analysieren Sie folgende Funktion (Beschreibung (2 Punkte)), erstellen Sie ein Struktogramm (6 Punkte)!

string name_ausgeben(string s){  // Was tut diese Funktion?
  while (s.length() < 10) s=s+'.';  // s.length gibt die Laenge von s zurueck
  return s + ": ";
}

Welche Rückgabe ist bei dem Aufrufen name_ausgeben("Hugo") (2 Punkte) und name_ausgeben("Tante Erna geht schwimmen") (2 Punkte) zu erwarten?

Lösung

Funktion name_ausgeben(s) (6 Punkte)

Eingabe: Parameter: s: String
Ausgabe: Rückgabe: String

name_ausgeben(s) ergänzt den String s um '.' bis die Länge 10 erreicht ist, dann wird noch ein ':' angehängt und das Ergebnis zurückgegeben. Der String wird formatiert, unterschiedliche Längen sollen ausgeglichen werden. (2 Punkte)

name_ausgeben("Hugo") (2 Punkte)

 "Hugo......:"

name_ausgeben("Tante Erna geht schwimmen") (2 Punkte)

 "Tante Erna geht schwimmen:"

Aufgabe 6 (hits_ausgeben)

Punkte:10

Eine Funktion hits_ausgeben() soll die Seitenzugriffe zu den Web-Seiten aus den Daten formatiert ausgeben. Erstellen Sie ein Struktogramm (6 Punkte) und vervollständigen sie den Programmcode (4 Punkte):
void hits_ausgeben(){   // Ausgabe der Seitenzugriffe

    cout << name_ausgeben(names[i]); // Siehe Tip ->


}
So soll die Ausgabe aussehen:
Tip: Die Funktion name_ausgeben() aus 5 kann verwendet werden!

Lösung

Funktion hits_ausgeben() (6 Punkte)

Eingabe: globales SITES: integer, globales hits[] : integer
Ausgabe: auf Konsole: Name...: Zugriffe
Lokale Variable: i : integer

C-Quellcode: (4 Punkte)
void hits_ausgeben(){   // Ausgabe der Seitenzugriffe
  for (int i=0;i<SITES;i++){  // fuer alle SITES
    cout << name_ausgeben(names[i]); // Seitenname format
    cout << hits[i] << endl;         // Zugriffe
  } // -fuer alle SITES
}

Aufgabe 7 (prozente_berechnen)

Punkte:10

Erstellen Sie den Programmcode für Funktion prozente_berechnen() mit Kommentaren, wie werden die Prozente berechnet?

Die Funktion greift auf folgende globale Variablen und Konstanten zu: SITES, hits[], prozente[] und hat als Rückgabewert die Summe der Seitenzugriffe aus hits[].
Die Datentypen entnehmen Sie aus der Beschreibung des Projekts.

Lösung

int prozente_berechnen(){
  int sum_hits=0;          // Summe der Gesammt-Zugriffe
  for (int i=0; i<SITES;i++){ // fuer alle SITES
    sum_hits = sum_hits+hits[i]; // Aufsummieren der Hits
  } // -fuer alle SITES
  for (int i=0; i<SITES;i++){  // fuer alle SITES
    prozente[i] = (100.0*hits[i] / sum_hits)+0.5; // Prozentualen Anteil berechnen und runden
  } // -fuer alle SITES
  return sum_hits;  // Rueckgabe der Gesammt-Hits
}

Aufgabe 8 (prozente_ausgeben)

Punkte:25

Gegeben ist folgender Source-Code, analysieren Sie den Code und kommententieren (10 Punkte) Sie ihn,
erstellen Sie ein Struktogramm (15 Punkte)!
int prozente_ausgeben(){
  int prozsum = 0;
  for (int i=0;i<SITES;i++){
    cout << name_ausgeben(names[i]);
    if (prozente[i] >9)
      cout << " ";
    else
      cout << "  ";
    cout << prozente[i] << "% ";
    cout << endl;
    prozsum = prozsum + prozente[i];
  }
  return prozsum;
}
Wozu dient die if-Anweisung?

Welchen Wert gibt die Funkion zurück?

Lösung

Funktion prozente_ausgeben() (15 Punkte)

Eingabe: globales SITES: integer,
globales names[]: String,
globales prozente[]: integer

Ausgabe: auf Konsole: Name...: prozentuale Zugriffe
Rückgabe Summe der Prozente: integer

Lokale Variable: prozsum: integer; i: integer

C-Quellcode:   (10 Punkte)
int prozente_ausgeben(){ // Ausgabe der Prozente pro Seite auf Konsole
  int prozsum = 0;       // Summe der Prozente mit 0 initialiseren
  for (int i=0;i<SITES;i++){         // fuer alle SITES
    cout << name_ausgeben(names[i]); // Name formatiert ausgeben
    if (prozente[i] >9)              // wenn Prozentwert 2-stellig
      cout << " ";                   // ein Leerzeichen ausgeben
    else                             // sonst
      cout << "  ";                  // 2 Leerzeichen ausgeben
    cout << prozente[i] << "% ";     // Prozente ausgeben
    cout << endl;                    // neue Zeile
    prozsum = prozsum + prozente[i]; // Prozente aufsummieren
  }                                  // -fuer alle SITES
  return prozsum;                    // Prozentsumme zurueckgeben
}

Aufgabe 9 (balken_ausgeben)

Punkte:25

Erstellen Sie eine Funktion balken_ausgeben(), die proportionale Anzahl (prozente / 2) an Sternen ausgibt. Erstellen Sie ein Struktogramm (10 Punkte) und einen kommentierten Quelltext (15 Punkte)!
void balken_ausgeben(){
  
}

Lösung

Funktion balken_ausgeben() (10 Punkte)

Eingabe: globales SITES: integer,
globales names[]: String,
globales prozente[]: integer

Ausgabe: auf Konsole: Name...: prozentuale Zugriffe + Balken

Lokale Variable: i,j,k: integer

C-Quellcode:    (15 Punkte)
void balken_ausgeben(){ // Ausgabe der Prozente als Balken
  int i,j,k;                         // lokale Variablen
  for (i=0;i<SITES;i++){             // fuer alle SITES
    cout << name_ausgeben(names[i]); // Name formatiert ausgeben
    if (prozente[i] >9)              // wenn Prozentwert 2-stellig
      cout << " ";                   // ein Leerzeichen ausgeben
    else                             // sonst
      cout << "  ";                  // 2 Leerzeichen ausgeben
    cout << prozente[i] << "% ";     // Prozente ausgeben
    j= prozente[i]/2;                // j proportional prozent/2
    for (k=0;k<j;k++){               // j mal
      cout << "*";                   // einen Stern ausgeben
    }                                // -j mal
    cout << endl;                    // neue Zeile
  }                                  // -fuer alle SITES
}

Punkte:Total 92

Download
Ausführbares Programm Des Projekts Quelltext anschauen
Stuffit-Expander™Stuffit-Expander™ ZipZip Stuffit-Expander™Stuffit-Expander™ ZipZip ./.
webstats.exe.sit ./. webstatistics.sit webstatistics.zip main.cpp.txt

Zum Praxis-Teil...