Jump to content

Archived

This topic is now archived and is closed to further replies.

nyac55

Rozwiązany: C++ tworzenie tablicy 2-wymiarowej dynamicznej i wykorzystanie jej w programie?

Recommended Posts

Witam. Mam pytanie jak w C++ tworzy się tablicę 2-wymiarową dynamiczną ,jak przypisywać wartości oraz jak je odczytywać?? Proszę o pomoc (wraz z odpowiednimi komentarzami ,aby udało mi się to zrozumieć) ,gdyż w internecie nie jest to jasno opisane. Natomiast program ,w którym tablica będzie wykorzystana ma za zadanie tworzyć taką tablicę i wyświetlać dane w następujący sposób:

0 1 2 3 4

1 3 5 7 9

2 5 8 11 14

3 7 11 15 19

4 9 14 19 24

Na przykład.

Tablica musi być prawdopodobnie n-1 elementowa.

Link to comment
Share on other sites

http://pl.wikibooks.org/wiki/C/Tablice#Tablice_wielowymiarowe

Przeanalizuj przykład ze strony:

http://urszula.libal.staff.iiar.pwr.wroc.pl/docs/po/Tablice_dynamiczne.pdf

Całość rozbija się o odpowiednią alokację pamięci i zwalnianie jej w momencie przestania używania wiersza/całej tablicy. Najpierw alokujesz pamięć na wiersze, a potem na poszczególne kolumny.

Link to comment
Share on other sites

Przeanalizowałem poniższy fragment ,przepisałem przykład do swojego programu i po wyświetleniu tablicy mam same 0. Chyba tak nie powinno być?


#include <iostream>
using namespace std;
int main(int argc, char** argv) {

int w,k;
cout<<"Liczba wierszy";
cin>>w;
cout<<"Liczba kolumn";
cin>>k;
int **tab = new int *[w]; //alokacja pamięci
for (int i=0;i<w;++i)
{
tab[i]= new int [k]; //alokacja pamięci
for(int j=0;j<k;++j) //wpisanie wartosci do tablicy
{
tab[i][j]=i+j;
}
}
//wypisz tab[w][k]
for(int i=0;i<w;++i)
{
for(int j=0;j<k;++j)
{
cout<<tab[i][j]<<' ';

}
}


return 0;
}

Link to comment
Share on other sites

J rośnie z każdym zwiększaniem i ,ale nie wiem jak to zaimplementować ,próbowałem if'em ,ale jeszcze mi się nie udało.


#include <iostream>

using namespace std;

int main(int argc, char** argv) {

int w,k;
cout<<"Liczba wierszy";
cin>>w;
cout<<"Liczba kolumn";
cin>>k;
int **tab = new int *[w]; //alokacja pamięci
for (int i=0;i<w;i++)
{
tab[i]= new int [k]; //alokacja pamięci
for(int j=0,g=1;j<k;j++,g++) //wpisanie wartosci do tablicy
{
if(i!=0)
{
tab[i][j]=(i*j)+g;
}
else
tab[i][j]=i+j;
}
}
//wypisz tab[w][k]
for(int i=0;i<w;i++)
{
for(int j=0;j<k;j++)
{
cout<<tab[i][j]<<' ';

}
cout<<"\n";
}


return 0;
}

Obecnie mam coś takiego ,ale wynik nie jest jeszcze poprawny.

_+_+_+_+_+_+_

Różnica to:

2 wiersz: 2*2+1 ,2*3+2, 2*4+3

3 wiersz 3*2+1, 3*3+2, 3*4+3

4 wiersz 4*2+1, 4*3+2.....

Próbowałem to ująć tym kodem ,ale jeszcze coś jest nie tak...?

Link to comment
Share on other sites

Pierwszy element każdego wiersza to jego numer (indeksujemy od zera). Następne elementy są zwiększane właśnie o numer wiersza w którym się znajdujemy (ale tutaj już liczone od 1). Pokombinuj ze zmienną pomocniczą, poza tym przypatrz się instrukcji sterującej if jaką stworzyłeś - czy na pewno jest wszystko OK?

Link to comment
Share on other sites

Wróć do wcześniejszej wersji kodu, bo ta ostatnia to jakaś masakra. Zmienne pomocnicze, ify itp. nie są potrzebne. To są zwykłe ciągi arytmetyczne. Wystarczy tylko ustalić jakie są różnice w poszczególnych wierszach (a do tego żadnych czarów nie trzeba) i zastosować wzór na kolejny wyraz ciągu arytmetycznego. Można to zrobić nieco sprytniej i uniknąć mnożenia, ale i tu obejdzie się bez ifów i zmiennych tymczasowych, trzeba tylko ustalić jaka jest zależność między danym wyrazem ciągu, a poprzednim.

Zacznij korzystać z std::endl, to naprawdę zwiększa czytelność wyniku.

Link to comment
Share on other sites

Dalej nic nie wymyśliłem ,co działało by poprawnie. Może coś podpowiecie.

2 wiersz: 2*2+1 ,2*3+2, 2*4+3

3 wiersz 3*2+1, 3*3+2, 3*4+3

4 wiersz 4*2+1, 4*3+2.....

Takie znalazłem różnice licząc od 2 wiersz ,dlatego do 1 zastosowałem if ,ale zgadzają mi się tylko 1 i 2 wiersz ,później już nie...

Link to comment
Share on other sites

Elemety:

1: Rosną o 1

2: Rosną o 2

3: Rosną o 3

itd. Tylko nie wiem jak to ująć w kodzie? Próbowałem zmienną pomocniczą ,jednak nie uzyskałem zamierzonego efektu. Próbowałem też nieco inaczej ,ale też nic z tego.

+++++++

Z tym ,że 1 element z 1 pętli for rośnie tylko o 1.

Link to comment
Share on other sites

Tak co wiersz zmienia się o daną stałą wartość. dla 1 o 1, dla 2 o 2 itd.


#include <iostream>
using namespace std;
int main(int argc, char** argv) {

int w,k;
cout<<"Liczba wierszy";
cin>>w;
cout<<"Liczba kolumn";
cin>>k;
int **tab = new int *[w]; //alokacja pamięci
for (int i=0;i<w;i++)
{
tab[i]= new int [k]; //alokacja pamięci
for(int j=0;j<k;j++) //wpisanie wartosci do tablicy
{
tab[i][j]=(i*j)+j;
}
}
//wypisz tab[w][k]
for(int i=0;i<w;i++)
{
for(int j=0;j<k;j++)
{
cout<<tab[i][j]<<' ';

}
cout<<"\n";
}


return 0;
}

Teraz mi się to zwiększa z każdym wierszem ,ale to jeszcze nie jest to co miało być.?

Link to comment
Share on other sites


tab[i][j]=i+j*(i+1)

Jednak przydałoby się, żebyś najpierw zrobił sobie powtórkę z analizy matematycznej (przynajmniej z ciągów) i dopiero wtedy brał się za programowanie. To jest coś, co zwykle robi się na pierwszych zajęciach z analizy na studiach (lub się to nawet pomija, bo powinno być w liceum).

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...