4.2 Textzeile in Zahlenfolge umwandeln
Das folgende Programm soll, wie die Beispiele zum Thema "Arrays", den Mittelwert einer Zahlenfolge berechnen. Allerdings soll es hier möglich sein, Zahlenfolgen durch Kommata voneinander getrennt auf einmal einzugeben, anstatt, wie in den Beispielen zuvor, sie einzeln mit mehreren cin-Aufrufen einzulesen. Also z.B.: "1.0,-3.7,39.5" Dies erfordert aber einen höheren Programmieraufwand: Die Eingabe wird zunächst als string aufgefasst, also als Text. In einem nachfolgenden Verarbeitungsschritt wird der Text an den Stelle zerschnitten, wo die Kommata sind. Daraufhin werden die so erhaltenen einzelnen textuellen Darstellungen der Zahlen in "richtige" Zahlen umgewandelt, d.h. sie werden in double-Werte umgewandelt. Dann erst kann die Funktion aufgerufen werden, die den Mittelwert berechnet.
Der Fall, dass Zahlen eingelesen werden sollen, die im ASCII-Format, also textuell, vorliegen, tritt sehr häufig auf, da Daten in diesem Format sehr leicht auch vom Menschen kontrolliert und nachbearbeitet werden können. Wir sehen aber auch gleich, dass diese Art der Datenhaltung von Zahlen Aufwand auf Rechnerseite erfordert. Daran, dass Dinge, die für den Benutzer einfacher werden sollen, für den Programmierer mehr Aufwand bedeuten, sollte man sich schon früh gewöhnen und darauf eingehen, denn Programme sind dafür da, oft und mit grossem Datendurchsatz zu laufen und da zahlt sich ein Mehraufwand in der Programmierung in der Regel aus. Nicht der Programmierer soll es im Zweifelsfall bequem haben, sondern der Benutzer.
Wir verwenden für diesen letzten Schritt einfach die Header-Datei "statistik.h", die im vorhergehenden Beispiel entwickelt wurde. Es ergeben sich also folgende Verarbeitungsschritte:
|
#include <iostream>
#include <string>
#include <sstream>
#include <math.h>
#include "statistik.h"
using namespace std;
int main(void)
{
double werte[1000];
int anzahl,i,aktuell;
string text,zahl;
stringstream merker;
cout<<endl<<"Geben Sie Zahlen durch Kommata getrennt ein: ";
cin>>text;
anzahl = 0;
aktuell = 0;
for(i=0;i<text.size();i++)
{
//Achtung, Reihenfolge wichtig:
if(i==text.size()-1 || text.at(i+1)==',')
{
zahl = text.substr(aktuell,i-aktuell+1);
cout<<zahl<<endl;
merker.clear();
merker << zahl;
merker >> werte[anzahl];
cout<<werte[anzahl]<<endl;
anzahl++;
aktuell=i+2;
}
}
cout<<"Der Mittelwert lautet: "<<mittelwert(werte,anzahl);
return 0;
}
Code 4.2-1: C++ Programm "zahlenparsen.cpp"
zahlenparsen, zahlenparsen.cpp, statistik.h und zahlenparsen.exe - Datei gepackt