Wartość bezwzględna w tablicy wielowymiarowej.

0

Witam.
Mam problem z programem mianowicie mam napisać program który pobierze od użytkownika 9 liczb i zapisze je w macierzy 3 x 3 a następnie wyświetli macierz której elementami są wartości bezwzględne podanych liczb.
Program pobiera liczby jak należy ale potem się wywala. Domyślam się że problem jest w drugiej zagnieżdżonej chciałem tam po prostu zmienić znak jeśli liczba jest mniejsza od zera ale coś zrobiłem źle. Proszę o pomoc i wyjaśnienie tego co zrobiłem nie tak i jak należało by to zrobić poprawnie.

#include<iostream>
using namespace std;

int main()
{
    const int wymiar = 3;
    int macierz [wymiar][wymiar];

    for (int i = 0; i < wymiar; i++)
    {
        for (int j = 0; j < wymiar; j++)
        {
            cout << "Podaj element nr: " << i + 1 << " , " << j + 1 << ": " << endl;
            cin >> macierz[i][j];

        }

    }

    for (int i = 0; i < wymiar; i++)
    {
        for (int j = 0; j < wymiar; j++)
        {
             if (i < 0)
            {
                cout << -i << endl;
            }

            else if(j < 0)
            {
                cout << -j << endl;
            }

            else
            {
                cout << i << endl;
                cout << j << endl;
            }
        }
    }

    for(int i = 0; i < wymiar; i++)
    {
        for(int j = 0; j < wymiar; i++)
        {
            cout << macierz[i][j] << '\t';
        }
    }
}
0
Wikt0r napisał(a):
for (int i = 0; i < wymiar; i++)
{
    for (int j = 0; j < wymiar; j++)
    {
         if (i < 0)
        {
            cout << -i << endl;
        }

        else if(j < 0)
        {
            cout << -j << endl;
        }

        else
        {
            cout << i << endl;
            cout << j << endl;
        }
    }
}

to są indeksy a nie wartości spod indeksów. One zawsze będą nie ujemne i to nawer z zakresu [0..2]

0
Wikt0r napisał(a):
for(int i = 0; i < wymiar; i++)
{
    for(int j = 0; j < wymiar; i++)
    {
        cout << macierz[i][j] << '\t';
    }
}

}

A tu masz literówkę w drugiej pętli j++ a nie i++

0
KamilAdam napisał(a):
Wikt0r napisał(a):
for (int i = 0; i < wymiar; i++)
{
    for (int j = 0; j < wymiar; j++)
    {
         if (i < 0)
        {
            cout << -i << endl;
        }

        else if(j < 0)
        {
            cout << -j << endl;
        }

        else
        {
            cout << i << endl;
            cout << j << endl;
        }
    }
}

to są indeksy a nie wartości spod indeksów. One zawsze będą nie ujemne i to nawer z zakresu `[0..2]

Nie rozumiem czy mógłbyś mi to wyjaśnić prościej i jaśniej ?

0
Wikt0r napisał(a):
KamilAdam napisał(a):
Wikt0r napisał(a):
for (int i = 0; i < wymiar; i++)
{
    for (int j = 0; j < wymiar; j++)
    {
         if (i < 0)
        {
            cout << -i << endl;
        }

        else if(j < 0)
        {
            cout << -j << endl;
        }

        else
        {
            cout << i << endl;
            cout << j << endl;
        }
    }
}

to są indeksy a nie wartości spod indeksów. One zawsze będą nie ujemne i to nawer z zakresu `[0..2]

Nie rozumiem czy mógłbyś mi to wyjaśnić prościej i jaśniej ?

Może inaczej. Co według ciebie robi ten fragment? Bo według mnie nie robi nic ziązanego z poleceniem i powinien wylecieć

0
KamilAdam napisał(a):
Wikt0r napisał(a):
KamilAdam napisał(a):
Wikt0r napisał(a):
for (int i = 0; i < wymiar; i++)
{
    for (int j = 0; j < wymiar; j++)
    {
         if (i < 0)
        {
            cout << -i << endl;
        }

        else if(j < 0)
        {
            cout << -j << endl;
        }

        else
        {
            cout << i << endl;
            cout << j << endl;
        }
    }
}

to są indeksy a nie wartości spod indeksów. One zawsze będą nie ujemne i to nawer z zakresu `[0..2]

Nie rozumiem czy mógłbyś mi to wyjaśnić prościej i jaśniej ?

Może inaczej. Co według ciebie robi ten fragment? Bo według mnie nie robi nic ziązanego z poleceniem i powinien wylecieć

Ten fragment w zamiarze maił zmienić znak jeśli i lub j było mniejsze od 0 ale faktycznie jak się teraz spojrzałem na to co napisałeś i jeszcze raz na kod to nie ma to sensu. Więc co powinienem zrobić w tym wypadku bo nie mam pomysłu .

0

Aby dostać się do elementu tablicy dwuwymiarowej (Twojej macierzy) musisz napisać na przykład tak: macierz[i][j]. W powyższym kodzie sprawdzasz indeksy a nie wartości.
Poza tym proponuję użyć funkcji abs do uzyskania wartości bezwględnej.

1
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

constexpr int msize=3;
typedef int matrix[msize][msize];

void input(matrix m)
{
    for(int y=0;y<msize;++y) for(int x=0;x<msize;++x) (cout<<"m["<<(y+1)<<"]["<<(x+1)<<"]= ")&&(cin>>m[y][x]);
}

void show(const matrix m)
{
    cout<<"----------------"<<endl;
    for(int y=0;y<msize;++y,cout<<endl) for(int x=0;x<msize;++x) cout<<' '<<setw(8)<<m[y][x];
}

void mabs(matrix m)
{
	for(int y=0;y<msize;++y) for(int x=0;x<msize;++x) m[y][x]=abs(m[y][x]);
}

int main()
{
	matrix m;
	input(m);
	show(m);
	mabs(m);
	show(m);
	return 0;
}
0

Spróbowałem z funkcją abs znaczy to chyba trochę na wyrost bo napisałem tak abs(macierz[i][j]) i to też nie dało efektu.

Co to znaczy nie dało efektu?

0
KamilAdam napisał(a):

Spróbowałem z funkcją abs znaczy to chyba trochę na wyrost bo napisałem tak abs(macierz[i][j]) i to też nie dało efektu.

Co to znaczy nie dało efektu?

    {
        for (int j = 0; j < wymiar; j++)
        {
             cout << abs(macierz[i][j]);
        }
    }

    Napisałem tak no i program się wywala tzn wchodzi w pętlę nieskończoną. Nie chce wyjść na zupełnego głupka no ale nie wiem jak mam się za to zabrać.
1
Wikt0r napisał(a):
  for (int i = 0; i < wymiar; i++)
    {
        for (int j = 0; j < wymiar; j++)
        {
             cout << abs(macierz[i][j]);
        }
    }

Napisałem tak no i program się wywala tzn wchodzi w pętlę nieskończoną. Nie chce wyjść na zupełnego głupka no ale nie wiem jak mam się za to zabrać.

Na 100% problem nie w tym fragmencie. Aczkolwiek wyświetlone liczby będą się zlewać w jedną bo nie podałeś żadnych białych znaków.

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