Schleife etwas "schöner" und "effektiver" gestalten?



  • Hi,

    ich hab folgende Aufgabe: Durchlaufen Sie ein Array und zählen sie deren Anzahl Elemente auf. Ist zwischen einem Element und dem übernächsten ein anderer Wert, muss dieses Element seperat gezählt werden. Die gezählten Daten sollen in einem seperaten Array abgelegt werden um sie z. B. an eine Funktion zu übergeben und erst am Ende des Programms ausgegeben werden. Ausnahme bei der Ausgabe sind Nullen. Das Array enthält folgende Werte die gezählt werden sollen:
    2, 1, 1, 1, 400, 2, 1, 0, 100, 100

    Soweit sogut, ich hab daraufhin folgendes gecodet:

    #include <iostream>
    
    const unsigned long array_size = 10;
    const unsigned long number_mode = 0;
    const unsigned long number_count = 1;
    
    int main (void)
    {
        unsigned long array[array_size] = { 2, 1, 1, 1, 400, 2, 1, 0, 100, 100 };
        unsigned long number[2][array_size] = { 0 };
    
        for (unsigned long i = 0, position = 0; i < array_size; ++i)
        {
            if (array[i] == 0)
                continue;
    
            if (position == 0)
            {
                number[number_mode][position] = array[i];
                number[number_count][position++]++;
                continue;
            }
    
            if (number[number_mode][position - 1] == array[i])
            {
                number[number_count][position - 1]++;
                continue;
            }
    
            number[number_mode][position] = array[i];
            number[number_count][position]++;
    
            position++;
        }
    
        for (unsigned long i = 0; i < array_size; ++i)
        {
            if (number[number_mode][i] == 0)
                continue;
    
            std::cout << number[number_mode][i] << ": " << number[number_count][i] << std::endl;
        }
    
        return 0;
    }
    

    Laut meinem Lösungsblatt ist die ausgabe wie folgt richtig:

    2: 1
    1: 3
    400: 1
    2: 1
    1: 1
    100: 2
    

    Aber ich bin mit diesem Code absolut unzufrieden. Wie kann ich den Code etwas "schöner" machen oder sogar optimieren?

    Schon mal ein Danke im voraus. 🙂

    Euer Arrayler



  • oh, hab ganz überlesen, daß das ergebnis in einem array landen soll. vielleicht dann sowas.

    //ungetestet
    #include <iostream>
    
    const unsigned long array_size = 10;
    const unsigned long number_mode = 0;
    const unsigned long number_count = 1;
    
    int main (void)
    {
        unsigned long array[array_size] = { 2, 1, 1, 1, 400, 2, 1, 0, 100, 100 };
    
    //<ins>
        unsigned long number[2][array_size] = { 0 };
    //</ins>
        unsigned long value=0;
        unsigned long count=0;
    
        for (unsigned long i = 0, position = 0; i < array_size; ++i)
        {
            if(array[i]==value){
                ++count;
            }
            else{
                if(value!=0){
    //<del>               cout<<value<<count;</del>
    //<ins>
                   number[writePos][0]=value;
                   number[writePos][1]=count;
    //</ins>
                }
                value=array[i];
                count=1;
            }
        }
    //<ins>
        anzeige(number,writePos);
    //</ins>
        return 0;
    }
    


  • Hi,

    der code ist wunderbar, aber leider kann ich dann die werte nicht in Arrayform an eine Funktion weitergeben und sie nicht am Ende des Programms ausführen 😞



  • na dann nutz doch einen std::vector

    und cout << value << endl tauschst du aus durch push_back(value)

    den übergibst du dann an die funktion



  • @volkard: dein code ist fehlerhaft



  • nabend schrieb:

    @volkard: dein code ist fehlerhaft

    kann sein. ist ja auch //ungetestet und nur so als lieferand einer idee eines anderen vorgehens zu verstehen.


Anmelden zum Antworten