vector<int> statistisch auswerten [Gelöst]



  • Ich möchte gerne einen vector<int> statistisch auswerten.
    Beispiel: In dem Vektor sind Kontenstände gespeichert im Bereich von 0,- bis 2000,- Euro.
    Nun soll eine statistische Verteilung in 100 Euro Schritten ermittelt werden, wären also insgesamt 20 Gruppen.

    Normalerweise würde ich dazu eine switch/case Anweisung benutzen.
    Soweit ich das aber weiß, geht

    switch(myvector[i]) {}
    

    nicht.

    D.h. man müßte dann mit der Verzweigung if arbeiten, was bei der Anzahl von 20 Verzweigungen unschön ist.
    Gibt es irgendwelche Alternativen?


  • Mod

    Wieso sollte der gezeigte switch nicht gehen?



  • Der switch an sich geht schon noch, aber bei der case Anweisung verweigert
    der Compiler den Dienst.

    Also:

    switch(myvector[i])
     {
       case (myvector[i]<100): Gruppe1+=1;break;
     }
    

    Fehlermeldung: "i cannot appear in a constant-expression"

    Nachtrag: Ich ahne den Fehler...
    Richtig wäre

    case (i<100) : Gruppe1+=;break;
    


  • Wieso denn ueberhaupt ein switch-statement. Wenn ich dich richtig verstanden habe, dann moechtest du mehrere Beitraege in Gruppen 100, 200, 300, 400, ..., 2000 aufteilen.

    Das kann man doch viel schoener so machen:

    int main() 
    { 
    	vector<int> money(100); // Enthaelt Werte zwischen 0 und 2000
    	vector<int> groups(20);
    
    	// Initialisieren etc.
    
    	for ( size_t i = 0; i < money.size(); ++i )
    	{
    		size_t group_index = (money[i] - money[i] % 100) / 100 - 1; // Liefert zum Beispiel fuer money[i] = 1750 den Wert 16
    		++groups[group_index]; // Zaehle in der entsprechenden Gruppe eins hoch
    	}
    }
    

    Der Code ist so noch nicht ganz richtig, du musst die vielleicht noch ein par Details ueberlegen. Zum Beispiel wenn money[i] == 0 bekommst du ein Problem.

    *Edit
    Zeile 10 kann man auch einfacher schreiben, da ja bei Integer-Division die Nachkomastellen abgeschnitten werden.



  • redrew99 schrieb:

    In dem Vektor sind Kontenstände gespeichert im Bereich von 0,- bis 2000,- Euro.
    Nun soll eine statistische Verteilung in 100 Euro Schritten ermittelt werden, wären also insgesamt 20 Gruppen.

    So wie ich das verstehe sind es 21 Gruppen (0-99, 100-199, .. 1900-1999, 2000).

    redrew99 schrieb:

    Normalerweise würde ich dazu eine switch/case Anweisung benutzen.

    Wie soll das funktionieren?

    Wie wäre es also einfach damit:

    vector<unsigned> distribution(21, 0);
    
    //für jeden Stand
    unsigned amount = ..;
    ++distribution[ amount / 100 ];
    


  • Ja, Bereiche von Werten in der case-Anweisung anzugeben, scheint nicht möglich zu sein.

    @icarus2, @TyRoXx :
    Danke für die Tips, das schaue ich mir mal an.



  • redrew99 schrieb:

    Ja, Bereiche von Werten in der case-Anweisung anzugeben, scheint nicht möglich zu sein.

    Doch, das geht schon. Folgendes zum Beispiel funktioniert einwandfrei:

    vector<int> my_vector(10, 0);
    	size_t i = 0;
    
    	switch ( my_vector[i] )
    	{
    	case 0:
    		cout << 0 << endl;
    		break;
    	case 1:
    		cout << 1 << endl;
    		break;
    	default:
    		cout << "Default" << endl;
    		break;
    	}
    

    Das Problem in deinem Code war das

    case (myvector[i]<100): // ...
    

    Das geht so nicht. Der Compiler braucht da nicht einen boolschen Ausdruck sondern in dem Fall einen Integer.



  • icarus2 schrieb:

    redrew99 schrieb:

    Ja, Bereiche von Werten in der case-Anweisung anzugeben, scheint nicht möglich zu sein.

    Doch, das geht schon. Folgendes zum Beispiel funktioniert einwandfrei:

    vector<int> my_vector(10, 0);
    	size_t i = 0;
    
    	switch ( my_vector[i] )
    	{
    	case 0:
    		cout << 0 << endl;
    		break;
    	case 1:
    		cout << 1 << endl;
    		break;
    	default:
    		cout << "Default" << endl;
    		break;
    	}
    

    In dem Code wird aber auch kein Bereich angegeben, sondern nur ein Wert.
    Man könnte theoretisch natürlich 2000 case-Anweisungen setzen, das würde gehen, ja.

    icarus2 schrieb:

    Das Problem in deinem Code war das

    case (myvector[i]<100): // ...
    

    Das geht so nicht. Der Compiler braucht da nicht einen boolschen Ausdruck sondern in dem Fall einen Integer.

    Ja, das war natürlich Murks. Problem ist halt, daß an der Stelle ein boolscher Ausdruck nicht zulässig ist.



  • Mir fällt gerade ein, wenn ein boolscher Ausdruck an der Stelle nicht zulässig ist, könnte man den doch auch im Vorfeld ermitteln und der case-anweisung dann
    das Ergebnis(als integerwert) des boolschen Ausdrucks übergeben.



  • redrew99 schrieb:

    Mir fällt gerade ein, wenn ein boolscher Ausdruck an der Stelle nicht zulässig ist, könnte man den doch auch im Vorfeld ermitteln und der case-anweisung dann
    das Ergebnis(als integerwert) des boolschen Ausdrucks übergeben.

    Ein Boolean hat nur zwei Werte, true oder false. Du brauchst fuer dein Switch-Statement allerdings 21 verschiedene Werte. Dein Vorhaben klappt daher nicht.

    Aber wie gesagt. Ein Switch-Statement ist hier unagebracht. Stell dir vor, du moechtest auf einmal die Verteilung von 100er auf 10er aendern. Mehr als 200 cases? Das ist nicht so toll.

    Mach es so wie es von mir und TyRoXx vorgeschlagen wurde.


Anmelden zum Antworten