ERLEDIGT
JA
JA
ANTWORTEN
13
13
ZUGRIFFE
1967
1967
EMPFEHLEN
-
06.11.04 20:11 #1
- Registriert seit
- Oct 2004
- Beiträge
- 14
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 :1 2 3 4 5 6 7 8 9 10
#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
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:
Hmm.. ich hoffe, das waren ausreichend Infos dafür, woran ich hänge und wo ich genau Hilfe brauchen würde.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')
Vielen Dank im Voraus!
lg,
AngieGeändert von Sick-Angel (06.11.04 um 20:19 Uhr)
-
06.11.04 21:04 #2
- Registriert seit
- Oct 2004
- Beiträge
- 483
Hi,
einlesen könntest du z.b. so :
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 :
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.)
-
06.11.04 21:55 #3
- Registriert seit
- Oct 2004
- Beiträge
- 14
hey,
danke für den Code!
Ich habe den jetzt so übernommen:
Code :1 2
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 :1 2
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?
lg, AngieGeändert von Sick-Angel (07.11.04 um 22:00 Uhr)
-
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:
Somit steht schon zur Compilezeit fest wie groß dein Array werden wird, und dieseCode :1
int zahlen[50];
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 :1 2 3
do{ ... while(eingabe != 0 && counter < 50);
Ansonsten könntest du unfgewollt über den Speicher hinausschreiben und dein
Programm stürzt ab...
Gruß
RedWing"I'm not deaf, I'm ignoring you"
----
-
07.11.04 00:37 #5
- Registriert seit
- Oct 2004
- Beiträge
- 483
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 :
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
-
07.11.04 13:30 #6
- Registriert seit
- Oct 2004
- Beiträge
- 14
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 :1 2
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?
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, AngieGeändert von Sick-Angel (07.11.04 um 21:59 Uhr)
-
07.11.04 19:56 #7
- Registriert seit
- Oct 2004
- Beiträge
- 483
"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
-
07.11.04 19:59 #8
- Registriert seit
- Oct 2004
- Beiträge
- 14
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
-
07.11.04 20:10 #9
- Registriert seit
- Oct 2004
- Beiträge
- 14
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
-
07.11.04 21:03 #10
- Registriert seit
- Oct 2004
- Beiträge
- 483
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.
-
07.11.04 21:11 #11
- Registriert seit
- Oct 2004
- Beiträge
- 14
Nix sorry, du hast mir auch so schon enormst geholfen!
Zum Counter: Also würds reichen, wenn ich z.b. vor der Mittelwertberechnung einfach ein:
counter = counter--;
mache? Und danach normal mit counter weiterarbeite?
Wäre rein logisch immer eins weniger. Ist es dann auch der letzte Wert, der abgezogen wird? von wegen Median ausgeben, weil der ist der Wert inner Mitte.
Ich probiers ohnehin jetzt aus, aber solltest du noch da sein, und das Ding funkt. nicht, würd ich dich gern nochmals interviewen *g*
-
07.11.04 21:15 #12
- Registriert seit
- Oct 2004
- Beiträge
- 14
ok, passt alles
-
07.11.04 21:48 #13
- Registriert seit
- Oct 2004
- Beiträge
- 483
Na ist doch schön.... fast das ganze Proggi steht jetzt hier im Forum
)
Hoffe mal das dein Prof oder für wen du das machst das nicht findet *grrr*
Wenn nochwas ist, einfach fragen.
Gruss
MFC OpenGL
-
07.11.04 21:58 #14
- Registriert seit
- Oct 2004
- Beiträge
- 14
Selbst wenn ers findet: hier steht doch, dass ich trotz allem selbst gearbeitet hab und der hier reingestellte Code von mir ist
... und die Hinweise, um die ich gebeten habe, sind ja nicht verboten. Wir sollen es ohnehin anschließend präsentieren, und da wird auch ausgefragt, ob wer überhaupt verstanden hat, was da gemacht wurde
... das ist das Entscheidende und wird dann beurteilt.
Wir müssen halt jede Woche Eines von 15 Beispielen lösen, die angegeben sind. 2 hatte ich schon, aber mit diesem hier hab ich anfangs so sehr gekämpft, dass ich das noch als 3. abgeben wollte. War also mehr für mich selber, weil ich mich mit dem Fehler so rumgeärgert hab.Geändert von Sick-Angel (07.11.04 um 22:21 Uhr)
Ähnliche Themen
-
Zahlen einlesen - überwiegen positive oder negative Zahlen?
Von jenny1106 im Forum C/C++Antworten: 10Letzter Beitrag: 06.03.10, 20:51 -
Felder Plausibilisieren/Zahlen runden
Von xall im Forum Java GrundlagenAntworten: 5Letzter Beitrag: 22.04.09, 11:22 -
Liste von Zahlen auf Excel Felder verteilen
Von shadowmonkz im Forum Office-AnwendungenAntworten: 2Letzter Beitrag: 08.04.09, 16:20 -
Mehrere Zahlen, Zahlen Gesamt: Prozent?
Von MacMo im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 3Letzter Beitrag: 30.08.08, 11:19 -
variablen nur einmal einlesen...
Von THE REAL TOOLKIT im Forum Javascript & AjaxAntworten: 0Letzter Beitrag: 18.04.02, 14:55





Zitieren
Login






