Przenoszenie niektórych wartości do innej tablicy

0

Witam, w moim kodzie chcę wybrać po kolei wierszami nieparzyste wartości z tablicy X[w][k] i wpisać je po kolei wierszami do tablicy Z[w][w]. Problem polega na tym, że w pierwszej kolumnie każdego wiersza większego od 0 pomijana jest wartość która powinna być wczytana i wczytywana jest następna.

tzn. jeśli mamy np. tablicę X[3][6]

1 1 3 4 5 6
2 3 4 5 5 7
3 4 5 6 7 8

to tablica Z wygląda w ten sposób:

1 1 3
3 5 5
3 5 7

gdy powinna być:

1 1 3
5 3 5
5 7 3

kod zachowuje się, jakby w warunku

else if (n<w && m>=w){
                m=0;
                n++;
                Z[n][m]=X[i][j];
}

nie było ostatniej linijki przed klamrą

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main (){
srand (time (0));
int w, k, a, b;
cout << "Wprowadz liczbe wierszy / kolumn: ";
cin >> w >> k;
cout << "Wprowadz zakres od a do b: ";
cin >> a >> b;
int X[w][k];
for (int i = 0; i<w; i++){
    for (int j = 0; j<k; j++) {
        X[i][j] = a + ((rand()%(b - a + 1)));
    }
}

int Z [w][w];
int n = 0;
int m = 0;

//wczytywanie wartosci Z[w][w]; Z[w][w] przechowuje tylko nieparzyste wartosci X[w][k]
for (int i = 0; i<w; i++){
    for (int j = 0; j<k; j++) {
        if (abs(X[i][j])%2){
                if (n<w && m<w){
            Z[n][m]=X[i][j];
            m++;
            } else if (n<w && m>=w){
                m=0;
                n++;
                Z[n][m]=X[i][j];
            }
        }
    }
}
//drukowanie wartosci Z[w][w]
for (int i = 0; i<w; i++){
    for (int j = 0; j<w; j++) {
            cout << Z[i][j] << " ";
        if (j==w-1) {
        cout << endl;
        }
    }
}
return 0;

Problem jest zapewne banalny, ale przeglądałem to z 10 razy i wciąż nie mogę znaleźć błędu, z góry dzięki za odpowiedź.

dodanie znaczników <code class="cpp"> - @furious programming

0

Wrzuć to co kompilujesz.

0

Całość:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main (){
srand (time (0));
int w, k, a, b;
cout << "Wprowadz liczbe wierszy / kolumn: ";
cin >> w >> k;
cout << "Wprowadz zakres zapelnienia -a/b: ";
cin >> a >> b;
int X[w][k];
for (int i = 0; i<w; i++){
    for (int j = 0; j<k; j++) {
        X[i][j] = -a + ((rand()%(b + a + 1)));
    }
}
for (int i = 0; i<w; i++){
    for (int j = 0; j<k; j++) {
        cout << X[i][j] << " ";
        if (j==k-1){
        cout << endl;
        }
    }
}
cout << endl;
//transponowanie X
int Y[k][w];
for (int i = 0; i<k; i++){
    for (int j = 0; j<w; j++) {
        Y[i][j]=X[j][i];
    }
}
cout << endl;
for (int i = 0; i<k; i++){
    for (int j = 0; j<w; j++) {
        cout << Y[i][j] << " ";
        if (j==w-1){
        cout << endl;
        }
    }
}
cout << endl;
int Z [w][w];
int n = 0;
int m = 0;
//wyzerowanie Z
for (int i = 0; i<w; i++){
    for (int j = 0; j<k; j++) {
        Z[i][j] = 0;
    }
}
//wczytywanie wartosci Z[w][w]; Z[w][w] posiada tylko nieparzyste wartosci X[w][k]
for (int i = 0; i<w; i++){
    for (int j = 0; j<k; j++) {
        if (abs(X[i][j])%2){
                if (n<w && m<w){
            Z[n][m]=X[i][j];
            m++;
            } else if (n<w && m>=w){
                m=0;
                n++;
                Z[n][m]=X[i][j];
            }
        }
    }
}
//drukowanie wartosci Z[w][w]
for (int i = 0; i<w; i++){
    for (int j = 0; j<w; j++) {
            cout << Z[i][j] << " ";
        if (j==w-1) {
        cout << endl;
        }
    }
}
return 0;

}
2
  1. Nie używaj i++ kiedy można użyć ++i bo ci ten brzydki nawyk się zemści
  2. Używaj bardziej znaczących nazw zmiennych np rozmiary tablicy Y,X zaś iteratory pętli to y,x
  3. Zakres masz niepoprawnie oprogramowany, ma być: a+rand()%(b-a+1);
  4. Wyświetlanie możesz zapisać prościej:
for(int y=0;y<w;++y){
    for(int x=0;x<w;++x) cout<<Z[y][x]<<" ";
    cout<<endl;
}

Ja wolę inny zapis:

for(int y=0;y<w;++y,cout<<endl) for(int x=0;x<w;++x) cout<<Z[y][x]<<" ";
  1. Warunek: if(abs(X[i][j])%2) można zapisać jako: if(X[i][j]&1)
  2. Warunek: n<w lepiej dołącz do powyższego: if((X[i][j]&1)&&(n<w)) zamiast dwukrotnie go powtarzać
  3. Rozważ przerobienie na: int Z[w*w]; wtedy nie masz podwójnego indeksowania i wszystko jest prostsze.
  4. Brakuje ci ++m po drugim Z[n][m]=X[i][j];

1 użytkowników online, w tym zalogowanych: 0, gości: 1