Inhalte im Array Paarweise nach Vorzeichen ausgeben



  • Guten Abend nochmal. Nach der sehr freundlichen Hilfe vom letzten Beitrag bitte ich nochmal um Unterstützung. Versuche weiter meinen Sohnemann bei den Hausaufgaben zu helfen. Die Aufgabe lautet alle Zahlen vom gleichen Vorzeichen in einem Array auszugeben.
    Bsp.:

    int array[] = {9,5,-7,-7,5,-9,-4};
    

    Als Ausgabe soll dann kommen:

    9 5
    -7 -7
    -9 -4
    

    Wir haben bis jetzt folgendes gemacht:

    int main()
    {
        int array [8] = {5, 0, -7, 2,8,9,6,4};
        for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
            cout << array[i] << array[i+1] << "\n";
            i = i+1;
        }
    
        return 0;
    }
    

    Damit werden zwar die Inhalte im Array paarweise ausgegeben. Aber nicht nach dem Vorzeichen geprüft. Ich bitte hier um Hilfe.



  • Hallo

    @snboy2010 sagte in Inhalte im Array Paarweise nach Vorzeichen ausgeben:

    Die Aufgabe lautet alle Zahlen vom gleichen Vorzeichen in einem Array auszugeben

    @snboy2010 sagte in Inhalte im Array Paarweise nach Vorzeichen ausgeben:

    Array paarweise ausgegeben

    Das passt irgendwie nicht zusammen...
    Alle nebeneinander stehenden Zahlen mit gleichem Vorzeichen ausgeben oder was genau ist jetzt die Aufgabe?



  • @snboy2010 Dann mach doch um die Ausgabe ein if()

    Und überleg mal, wie weit deine Schleife läuft (und somit der Zugriff auf die Arrayelemente)

    Du kannst dir das auch (vor dem if) ausgeben lassen.



  • Ich würde das so lösen:

    1. Einen Iterator iterator(p) auf die erste positive Zahl setzen und einen zweiten Iterator iterator(n) auf die erste negative Zahl setzen.
    2. Zeigen beide Iteratoren auf end() ist man fertig.
    3. Man arbeitet immer auf dem kleineren der beiden Iteratoren, weil die Reihenfolge wichtig ist (entweder 4a oder 4b).
      4a) Ist Iterator(p) gültig und dessen Folgeelement positiv => Paar ausgeben und Iterator(p) um zwei Positionen verschieben. Ist das Folgelemente negativ sucht man ab dem Folgeelement das nächste positive Element.
      4b) das gleiche für Iterator(n), nur für negative Zahlen
    4. zurück zu 2)

    PS:
    Statt mit rohen Arrays zu hantieren nimmt man mit C++ besser std::array.

    Edit:
    Ähm, was genau ist jetzt die Aufgabe? Zahlen paarweise auszugeben, falls sie das gleiche Vorzeichen haben, oder alle Zahlen in Abhängigkeit ihres Vorzeichens auszugeben (erst alle positiven, dann alle negativen)? Ist ein Paar vollständig behandelt, wenn ausgegeben wurde (ist Ausgabe bei {3, 5, 9} 3,5 oder 3,5 und 5,9)?



  • Die Aufgabe ist wie folgt: Es soll immer das nächste Paar aus dem Array ausgegeben werden mit dem gleich Vorzeichen.
    Bsp.:

    int array [10] = {-8,-10,-2,1,-9,0,0,-9};
    
    Ausgabe:
    -8 -10
    -10 -2
    

    Also -8 die nächste Zahl ist -10. Dann kommt das Paar -2 und 1. Unterschiedliche Vorzeichen keine Ausgabe. 1 und -9 unterschiedliche Vorzeichen keine Ausgabe usw.



  • Das ist doch noch einfacher...
    Du guckst dir immer das aktuelle und das nachfolgende Zeichen an, wenn beide das gleiche Vorzeichen haben gibst du sie aus. Danach guckst du dir die nächsten beiden Zeichen an und wiederholst das so lange, bis du alle Zahlen betrachtet hast. Musst nur den Sonderfall für eine ungerade Anzahl betrachten.



  • So gelöst. Hier die Lösung:

    #include <algorithm>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int array [8] = {5, 0, -7, -2,8,9,6,4};
        for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
            if(array[i] > 0 && array[i+1] > 0){
                cout << array[i] << array[i+1] << "\n";
                i = i+1;
            }else if (array[i] < 0 && array[i+1] < 0){
                cout << array[i] << array[i+1] << "\n";
                i = i+1;
            }
        }
    
        return 0;
    }
    


  • Nö, funktioniert nicht für arrays mit ungerader Länge.



  • @snboy2010 sagte in Inhalte im Array Paarweise nach Vorzeichen ausgeben:

    int array [8] = {5, 0, -7, -2,8,9,6,4};

    Wenn du wirklich C++ lehren & lernen willst, dann schau dir auch mal std::adjacent_find an!

    bool is_same_sign(int a, int b) {
        return (a > 0 && b > 0) || (a < 0 && b < 0) || (a == 0 && b == 0);
    }
    
    int arr[] = {5, 0,-7,-2,8,9,6,4};
    auto it = std::begin(arr);
    while ((it = std::adjacent_find(it, std::end(arr), is_same_sign)) != std::end(arr)) { 
        std::cout << *it << " und " << *(it +1) << '\n';
        ++it;
     }
    

    Für viele Dinge gibt es schon fertige Dinge - wie eben "Dinge nebeneinander finden". Was hat 0 eigentlich für ein Vorzeichen? Ich habe 0 jetzt als ein "drittes VZ" behandelt. Wenn 0 zu plus gehören soll, dann:

    bool is_same_sign_0_as_positive(int a, int b) {
        return (a >= 0) == (b >= 0);
    }
    

Anmelden zum Antworten