Mehrere Zahlen auf einmal einlesen, Felder, Hashing

Sick-Angel

Grünschnabel
C++: Mehrere Zahlen auf einmal einlesen, Felder, Hashing

Hallo,

ich hoffe, ihr könnt mir wieder helfen. Ich soll als Aufgabe eine Zahlenkette (max. 50 Zahlen, Abschluß mit Wert 0) einlesen und dann als Ausgabe bestimmte Berechnungen anzeigen lassen (also Mittelwert, Median & Standardabweichung).

Wir hatten in der Vorlesung besprochen was Felder/Arrays sind, und Hashing, was ich allerdings nicht wirklich verstanden habe *schäm* Zumindest nicht, wie ich in den Beispielen Verwendung dafür haben würde.

Jedenfalls sollte es mit diesen Dingen zu lösen sein. Ich scheitere aber schon am richtigen Einlesen, weil die einzelnen Zahlen durch Leerzeichen getrennt werden und man dafür laut Google "cin.getline" u.ä. braucht, was wir jedoch nicht besprochen hatten.

Folgenden Ansatz hatte ich mir mit Hilfe des Skripts und der Suchfunktion zusammengebastelt:

Code:
#include <iostream.h>
#include <math.h>
int main()
{
int feld[49];
cout << "Bitte geben Sie eine Zahlenreihe ein:" << endl;
cin.getline(feld,49,0);
cout << "Ihre Eingabe lautet:" << feld << endl;
return 0;
}

Das ist mal nur fürs Einlesen. Die Ausgabe sollte mir halt nur zeigen, ob das Einlesen geklappt hat. Irgendwie ein halbherziger Test-Versuch :rolleyes:

Dann hab ich noch gefunden, dass man die Anzahl der Eingaben durch
anzahl = strlen(feld);
rausfinden sollte? Hab das auf mein Beispiel umgemünzt.

Sortieren sollte durch
int feld[49];
sort(feld,feld+sizeof(feld))
gehen.

Stimmen die letzten Ansätze soweit?
Dass mein Code nicht passt, weiß ich durchs Kompilieren. Da kommt folgende Fehlermeldung:

bsp2.C:10: no matching function for call to `_IO_istream_withassign::getline (int[49], int, int)'
/opt/GNU/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/../../../../include/g++-3/iostream.h:129: candidates are: class istream & istream::getline(char *, int, char = '\n')
/opt/GNU/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/../../../../include/g++-3/iostream.h:131: class istream & istream::getline(unsigned char *, int, char = '\n')
/opt/GNU/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/../../../../include/g++-3/iostream.h:136: class istream & istream::getline(signed char *, int, char = '\n')
Hmm.. ich hoffe, das waren ausreichend Infos dafür, woran ich hänge und wo ich genau Hilfe brauchen würde.

Vielen Dank im Voraus!

lg,
Angie
 
Zuletzt bearbeitet:
Hi,

einlesen könntest du z.b. so :
Code:
int buffer, counter = 0;
int array[50];  // 50 array plätze, von 0 - 49 
 
do
{
   cin>>buffer;
   array[counter++] = buffer;  //  array[position im array nachher immer um +1 erhöht]
}
while(buffer != 0)  //solange bis die 0 eingegeben wurde


ausgabe :
Code:
for(int i=0; i <= 49; i++)
    cout<<array[i]<<endl;



Hoffe das dir das ein wenig hilft. Ansonsten frag nochmal (Code nicht getestet, sollte aber gehen.)
 
hey,

danke für den Code!

Ich habe den jetzt so übernommen:
Code:
editiert

Bei der Ausgabe gibt er mir jedoch immer die 4. Stelle der Zahlen an, die ich eingegeben hab. Kanns nicht wirklich nachvollziehen.

Anderer Versuch, dass der mir die Anzahl der eingegebenen Werte anzeigt - für die spätere Mittelwert-Berechnung (mit Code aus http://www.tutorials.de/forum/showthread.php?t=14871 )

Code:
editiert

Der gibt mir aber immer die Array-Größe aus, unabhängig davon, wieviele ich eingebe. Was muß ich in dem Befehl abändern?

:confused:

lg, Angie
 
Zuletzt bearbeitet:
Das liegt daran das dein Array "zahlen" statisch ist,
das heißt es wird immer die Größe 50 haben, da du es so definiert hast:
Code:
int zahlen[50];
Somit steht schon zur Compilezeit fest wie groß dein Array werden wird, und diese
Größe aendert sich dann auch nicht mehr innerhalb deines Programms...
Wenn du wissen willst wieviel Zahlen eingegeben wurden, lass dir
doch einfach "counter" ausgeben...

Noch was:
Du solltest deine while Schleife um folgendes erweitern:
Code:
do{
...
while(eingabe != 0 && counter < 50);

Ansonsten könntest du unfgewollt über den Speicher hinausschreiben und dein
Programm stürzt ab...

Gruß

RedWing
 
RedWing hat natürlich recht damit, erweitere Sicherheitshalber die Whileschleife wie er das gemacht hat... (hatte das nur mal eben auf die schnelle als Beispiel gemacht)

Die Mittelwertberechnung könnte so aussehen :
Code:
int helpi = 0;
for(int i=0; i < counter; i++)
   helpi+=array[i];
helpi = helpi / counter;
 
cout<<"Mittelwert : "<<helpi<<endl;


Achso, und dein Fehler kommt daher das du HINTER der FOR Schleife KEIN Semikolon setzten solltest, sonst macht er 50 mal nix, und dann eine einzige Ausgabe ;)


Und entschuldigt bitte die bekloppte Namensgebung, es ist schon spät.... gute Nacht
 
Ganz zuerst DAAAANKE! gott, ist das klasse, wenn sowas endlich mal funktioniert :)

Also Mittelwert berechnen ist klar. Median ist die Ausgabe der mittleren Zahl. D.h. wenn die Anzahl der Zahlenreihe ungerade ist, eben die mittlere Zahl, wenn gerade, dann der Mittelwert der beiden mittleren Zahlen. Hoffe, ich hab das mit der If-Funktion halbwegs getroffen. Weiß nicht genau, wie ich auf die einzelnen Zahlen(werte) zugreifen soll.

Standardabweichung ist die Wurzel von der Varianz. Die Varianz bekommt man, indem man von ALLEN eingebenen Zahlen einzeln den Mittelwert abzieht, und das Ergebnis dann zum Quadrat nimmt. Die Gesamtsumme dann durch die Anzahl.

Also angenommen die Eingaben sind 1 2 3
Der Mittelwert ist 2
Varianz = ( (1-2)² + (2-2)² + (3-2)² ) / 3
Varianz = 1 + 0 + 1 = 2
Standardabweichung = sqrt (Varianz) = Wurzel von 2 = 1,41

Hmm.. vielleicht als Hilfe um meinen konfusen Code zu verstehen.

Mein Code mittlerweile:
Code:
editiert

Er keift beim Kompilieren jedoch wegen der Zeilen rum:

median = double(zahlen[zentral1]+zahlen[zentral2])/2;
und
median = double(zahlen[zentral3]);

bsp1.C:32: invalid types `int[50][double]' for array subscript
bsp1.C:35: invalid types `int[50][double]' for array subscript

Wie kann ich das anpassen? Hatte versucht das Array zahlen in double zu ändern, aber da kommt die Meldung:
bsp1.C:32: invalid types `double[50][double]' for array subscript
bsp1.C:35: invalid types `double[50][double]' for array subscript

Was kann ich sonst noch tun? :confused:

Noch was: er gibt mir die 0 auch als eigenen Wert an. Also als ichs nur mit dem Code für Anzahl und Mittelwert ausgeben versucht hab. Dabei sollte das nur dazu dienen, um das Einlesen zu beenden. Wie krieg ich das weg?

lg, Angie
 
Zuletzt bearbeitet:
"median = double(zahlen[zentral1]+zahlen[zentral2])/2;
und
median = double(zahlen[zentral3]);

bsp1.C:32: invalid types `int[50][double]' for array subscript
bsp1.C:35: invalid types `int[50][double]' for array subscript"

Das Problem liegt daran, das zentral1 und die anderen zentral's double Werte sind, ein Array kann man nur mit int Werten ansprechen.

Wäre ja auch dumm wenn du array[0] bis array[1] hättest, dazwischen gibts ja unendlich viele Kommawerte ;)

Ich habe deinen Code nicht getestet, aber um einen double Wert in einen integer zu konvertieren, schreib einfach
(int)
davor.

Beispiel :

double x =1.0;
int test=0;
test = (int)x;

dann ist jetzt test = 1

Aber ob das von dir so gewollt ist weiss ich natürlich nicht, jedoch so kannst du das machen
 
Hey,

eigentlich würds ja schon Sinn machen, wenn die zentral's bei der weiteren Berechnung nur int's wären. Brauchte sie nur davor als double, damit ich den Median rausfiltern kann.

Ich versuchs jetzt mal mit dem (int)-Befehl zu kompilieren. Hoffe es klappt.

Zu dem 0-Problem kannst du mir nicht helfen, oder? ... Also wie ich den als Wert wegbekomme?

Lieben Gruß,
Angie
 
Es funktioniert! Ich freu mich grad wie blöde :)

Bis auf den 0-er - Fehler halt.

Ausgabe war folgende:
Bitte geben Sie eine Zahlenreihe in aufsteigender Reihenfolge ein.
Zwischen den Zahlen einen Abstand von einer Leerzeile einhalten. Mit der Eingabe der Ziffer 0 beenden Sie diese Reihe.
3 3 3 3 3 0
anzahl: 6
Mittelwert: 2.5
Median: 3
Standardabweichung: 1.11803

Versuch noch rauszufinden, ob und wie ich die 0 wegfiltern kann, und dann geb ich das Beispiel ab.

Komm grad nach einem verzweifelnden Wochenende gar nicht mehr aus dem Grinsen raus :)

Angie
 
Sorry @Sick-Angel

hatte das "null Problem" überlesen ;)

das bekommste weg, wenn du NACH der while Schleife vom einlesen ein
counter--;
machst.
Dann speichert der die zwar, aber du benutzt die nicht weiter, da er genau einen Wert vorher aufhört.
 
Zurück