tablica 2d c++

0

Witam mam problem z zadaniem z egzaminu z programowania. Otóż zadanie brzmi: "Dana jest tablica kwadratowa NxN. Napisz program, który dla podanych z klawiatury i j oraz r wypisze wszystkie elementy leżące w odległości r od elementu [i][j]"
zrobiłem taki kod:
{
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;
void wypelnianie(int **tab,int &n)
{
srand(time(NULL));
for(int i=1;i<=n;i++,cout<<endl)
{
tab[i]=new int[n];
for(int j=1;j<=n;j++)
{
tab[i][j]=rand()%10;
cout<<tab[i][j]<<" ";
}
}
}
void wypisanie(int **tab,int &n,int &i,int &j,int &r)
{
for(int k=i-r;k<=i+r;k++,cout<<endl)
{
for(int l=j-r;l<=j+r;l++)
{
if(k==i-r || k==i+r || l==j-r || l==j+r)
{

                    cout<<tab[k][l]<<" ";

                }
            else
                cout<<"  ";



    }
}

}
int main()
{
int n,r,i,j;
int **tab=new int *[n];
cout<<"Podaj n: ";
cin>>n;
cout<<endl;
wypelnianie(tab,n);
cout<<endl<<"Podaj i: ";
cin>>i;
cout<<endl<<"Podaj j: ";
cin>>j;
cout<<endl<<"Podaj r: ";
cin>>r;
wypisanie(tab,n,i,j,r);
return 0;
}
}
lecz jeśli "r" będzie za duże to wywala program. A chciałbym żeby program działał także jeśli podamy i oraz j które znajdują się na rogach a wyświetlą się możliwe elementy sąsiadujące znajdujące się w tej tabeli. Z góry dziękuje :)

0

Używasz niezainicjowanej zmiennej n:

int n,r,i,j;
int **tab=new int *[n];

Indeksy tablic w C++ zaczynają się od 0 więc wpisujesz dane poza tablicą(tablicami):

for(int i=1;i<=n;i++,cout<<endl)
    {
        tab[i]=new int[n];
        for(int j=1;j<=n;j++)
        {
            tab[i][j]=rand()%10;

Jeżeli nie chcesz wypisywać danych spoza tablicy to sprawdź wartości k i l przed tą linią:

cout<<tab[k][l]<<" ";

Dodatkowo: wartości których nie będziesz zmieniał nie musisz przekazywać przez referencję:

void wypelnianie(int **tab,int &n)
void wypisanie(int **tab,int &n,int &i,int &j,int &r)
0

Zamieniłem funkcje na :
{

void wypisanie(int **tab,int &n,int &i,int &j,int &r)
{
for(int k=i-r;k<n+r;k++,cout<<endl)
{
for(int l=j-r;l<n+r;l++)
{
if((k>=0 && l>=0 )&&(k<n && l<n) )
{
if(k==i-r || k==i+r || l==j-r || l==j+r)
{
cout<<tab[k][l]<<" ";
}
else
cout<<" ";
}
}
}
}

}

wyswietla sie wszystko co powinno lecz z nadmiarem:

0

dobra udało się. Podam niżej rozwiązanie tego zadania

void wynik(int **tab,int n,int i,int j,int r)
{
    for(int k=i-r;k<n+r;k++,cout<<endl)
    {
        for(int l=j-r;l<n+r;l++)
        {
            if(k>=0 && k<=i+r && l>=0 && l<=j+r && k<n && l<n)
            {
                if(k==i-r || k==i+r || l==j-r || l==j+r)
                {
                    cout<<tab[k][l]<<" ";
                }
                else
                    cout<<"  ";
            }
        }
    }
}

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