Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

nyac55

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

Polecane posty

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach


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 do komentarza
Udostępnij na innych stronach

Gość
Temat jest zablokowany i nie można w nim pisać.


  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...