c++ vector füllen

Winter2

Grünschnabel
Hallo,

ich habe mehrere Vektoren mit folgenden Einträgen (z.B.):

Nr. 1: 1,0,0,0,0,3,0,0,0,0
Nr. 2: 0,2,0,0,0,3,0,0,0,0
Nr. 3: 0,0,0,7,0,3,0,0,0,0
Nr. 4: 0,0,0,0,9,3,0,0,0,0
Nr. 5: 0,0,0,0,0,5,0,0,0,0
Nr. 6: 0,0,0,0,0,5,0,0,3,0

Ich möchte die Nullen zwischen den Werten mit einem konstanten Wert belegen. Am Ende sollen die Vektoren so aussehen:

Nr. 1: 1,9,9,9,9,3,0,0,0,0
Nr. 2: 0,2,9,9,9,3,0,0,0,0
Nr. 3: 0,0,0,7,9,3,0,0,0,0
Nr. 4: 0,0,0,0,9,3,0,0,0,0
Nr. 5: 0,0,0,0,0,5,0,0,0,0
Nr. 6: 0,0,0,0,0,5,9,9,3,0

Hat jemand eine Idee, wie man so etwas programmiert?

Bin für jede Hilfe dankbar,

Viele Grüße,
Winter2
 
Hallo,

du brauchst auf jeden Fall eine doppelte Schleife, in der inneren Schleife setzt du deine Bedingung, diese welche wäre, dass nur zwischen den Ziffern die Stellen gesetzt werden sollen, nicht alle Nullen..

vlg

C:
for (i = 0; i < Wert1; ++i)
{
     for (e=0;e<Wert2;++e)
     {
          if(deine Bedingung)
          {
               vector[i][e]= 9;
          }
     }
}

die innere Schleife mit der Varibalen e läuft alle Spalten deiner Matrix durch, die äussere die Zeilen. Ich hoffe es hilft dir weiter, hab das Stück Code nicht getestet, hab es nur mal eben schnell hier hergeschrieben..

vlg
 
Danke für die schnelle Antwort.

Ich denke mein Hauptproblem ist eine Bedingung für die if-Schleife zu finden. Ich hatte schon diese Bedingungen versucht:

Code:
for ( i = 0; i <  Wert1; ++i ){
  for ( e = 0; e <  Wert2; ++e){
    if (vector[i][e] != 9 && vector[i][e-1] == 9) break; 
    if (vector[i][e] != 0 && vector[i][e+1] == 0) vector[i][e+1]=9;
  }
}

Damit bekomme ich:

Nr. 1: 1,9,9,9,9,3,0,0,0,0 --> o.k.
Nr. 2: 0,2,9,9,9,3,0,0,0,0 --> o.k.
Nr. 3: 0,0,0,7,9,3,0,0,0,0 --> o.k.
Nr. 4: 0,0,0,0,9,3,9,9,9,9 --> nicht o.k.
Nr. 5: 0,0,0,0,0,5,9,9,9,9 --> nicht o.k.
Nr. 6: 0,0,0,0,0,5,9,9,3,0 --> o.k.

Ich schaffe die Bedingung nicht, falls die beiden Einträge direkt neben einander liegen oder nur ein Eintrag vorhanden ist.

Viele Grüße,
Winter2
 
Ich hatte mir das so vorgestellt:
Die erste if-Schleife:
Code:
if (vector[i][e] != 9 && vector[i][e-1] == 9) break;
Der erste Eintrag != 9 (Grün) wird gesucht und es wird geprüft, ob der Eintrag davor == 9 (Violett).

Die zweite if-Schleife:
Code:
 if (vector[i][e] != 0 && vector[i][e+1] == 0) vector[i][e+1]=9;
Der erste Eintrag != Null wird gesucht (Rot) und es wird geprüft, ob der Eintrag danach == Null (Blau)

Nr. 1: 1,0,0,0,0,3,0,0,0,0
Nr. 2: 0,2,0,0,0,3,0,0,0,0
Nr. 3: 0,0,0,7,0,3,0,0,0,0
Nr. 6: 0,0,0,0,0,5,0,0,3,0

Falls das der Fall ist wird an die Stelle der "blauen" Null eine 9 geschrieben usw. bis die Nullen zwischen den Zahlen aufgefüllt sind. Dann trifft die Bedingung der ersten if-Schleife zu und es wird abgebrochen:

Nr. 1: 1,9,9,9,9,3,0,0,0,0
Nr. 2: 0,2,9,9,9,3,0,0,0,0
Nr. 3: 0,0,0,7,9,3,0,0,0,0
Nr. 6: 0,0,0,0,0,5,9,9,3,0

Funktioniert, nur im Fall Nr. 4 und Nr. 5 nicht. Mir ist auch klar, warum es nicht funktioniert, mir fällt nur nicht ein, wie es funktionieren könnte.

Besten Dank,
Winter2
 
Hallo,

ich denke so einfach geht das nicht ... Ich hätte das so gelöst das ich vorher einmal den Vektor durchgehe mir die fallende Flanke und die steigende Flanke heraussuche, und dann die ganzen Nullen die innerhalb der Wanne liegen, durch eine 9 ersetze:

C++:
    for (unsigned int i = 0; i < matrix.size(); i++) {
        int last_element = 0, start = 0, counter = 0;
        vector<int>::iterator last, first;

        for (vector<int>::iterator curr = matrix[i].begin();
             curr != matrix[i].end();
             curr++) {
            // fallende Flanke
            if (abs(last_element) > 0 && *curr == 0) {
                start = 1;
                first = curr;
            }
            // steigende Flanke
            if (start && last_element == 0 && abs(*curr) > 0) {
                last = curr;
                break;
            }
            if (start)
                counter++;
            // weder steigende noch fallende Flanke gefunden
            if (curr == matrix[i].end() - 1)
                counter = 0;
            last_element = *curr;
        }

        if (counter > 0) {
            matrix[i].erase(first, last);
            matrix[i].insert(first, counter, 9);
        }
    }

Gruß,
RedWing
 
Zurück