tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
1967
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Sick-Angel Sick-Angel ist offline Mitglied
    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:

    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
    Geändert von Sick-Angel (06.11.04 um 20:19 Uhr)
     

  2. #2
    MFC openGL MFC openGL ist offline Mitglied Brokat
    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.)
     

  3. #3
    Sick-Angel Sick-Angel ist offline Mitglied
    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, Angie
    Geändert von Sick-Angel (07.11.04 um 22:00 Uhr)
     

  4. #4
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    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 :
    1
    
    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 :
    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"
    ----

  5. #5
    MFC openGL MFC openGL ist offline Mitglied Brokat
    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
     

  6. #6
    Sick-Angel Sick-Angel ist offline Mitglied
    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, Angie
    Geändert von Sick-Angel (07.11.04 um 21:59 Uhr)
     

  7. #7
    MFC openGL MFC openGL ist offline Mitglied Brokat
    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
     

  8. #8
    Sick-Angel Sick-Angel ist offline Mitglied
    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
     

  9. #9
    Sick-Angel Sick-Angel ist offline Mitglied
    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
     

  10. #10
    MFC openGL MFC openGL ist offline Mitglied Brokat
    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.
     

  11. #11
    Sick-Angel Sick-Angel ist offline Mitglied
    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*
     

  12. #12
    Sick-Angel Sick-Angel ist offline Mitglied
    Registriert seit
    Oct 2004
    Beiträge
    14
    ok, passt alles
     

  13. #13
    MFC openGL MFC openGL ist offline Mitglied Brokat
    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
     

  14. #14
    Sick-Angel Sick-Angel ist offline Mitglied
    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

  1. Antworten: 10
    Letzter Beitrag: 06.03.10, 20:51
  2. Felder Plausibilisieren/Zahlen runden
    Von xall im Forum Java Grundlagen
    Antworten: 5
    Letzter Beitrag: 22.04.09, 11:22
  3. Liste von Zahlen auf Excel Felder verteilen
    Von shadowmonkz im Forum Office-Anwendungen
    Antworten: 2
    Letzter Beitrag: 08.04.09, 16:20
  4. Mehrere Zahlen, Zahlen Gesamt: Prozent?
    Von MacMo im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 30.08.08, 11:19
  5. variablen nur einmal einlesen...
    Von THE REAL TOOLKIT im Forum Javascript & Ajax
    Antworten: 0
    Letzter Beitrag: 18.04.02, 14:55