nyac55 Posted October 26, 2013 Report Share Posted October 26, 2013 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 41 3 5 7 92 5 8 11 143 7 11 15 194 9 14 19 24Na przykład.Tablica musi być prawdopodobnie n-1 elementowa. Link to comment Share on other sites More sharing options...
opti Posted October 26, 2013 Report Share Posted October 26, 2013 http://pl.wikibooks.org/wiki/C/Tablice#Tablice_wielowymiarowePrzeanalizuj przykład ze strony:http://urszula.libal.staff.iiar.pwr.wroc.pl/docs/po/Tablice_dynamiczne.pdfCał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 More sharing options...
nyac55 Posted October 26, 2013 Author Report Share Posted October 26, 2013 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ęcifor (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 More sharing options...
Entyrop Posted October 26, 2013 Report Share Posted October 26, 2013 Literówka - w cout zamień "k" na "j". Link to comment Share on other sites More sharing options...
nyac55 Posted October 26, 2013 Author Report Share Posted October 26, 2013 Jeszcze jedno. Ktoś wie co muszę zmodyfikować ,aby z tablicy zostały wypisane wartości jak powyżej tzn.:0 1 2 3 41 3 5 7 92 5 8 11 143 7 11 15 194 9 14 19 24?____________Proszę nie zamykać jeszcze tematu. Link to comment Share on other sites More sharing options...
Sevard Posted October 26, 2013 Report Share Posted October 26, 2013 Dodać spacje, znaki nowej linii i inne podobne mało istotne rzeczy? Link to comment Share on other sites More sharing options...
opti Posted October 26, 2013 Report Share Posted October 26, 2013 Zastanów się jaki związek zachodzi pomiędzy poszczególnymi liczbami w danych wierszach. Link to comment Share on other sites More sharing options...
nyac55 Posted October 26, 2013 Author Report Share Posted October 26, 2013 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+33 wiersz 3*2+1, 3*3+2, 3*4+34 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 More sharing options...
[Ekspert] Hakken Posted October 26, 2013 Report Share Posted October 26, 2013 Jaka jest różnica między kolejnymi elementami w pierwszym wierszu?A w drugim? W trzecim? W n-tym? Link to comment Share on other sites More sharing options...
opti Posted October 26, 2013 Report Share Posted October 26, 2013 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 More sharing options...
Sevard Posted October 27, 2013 Report Share Posted October 27, 2013 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 More sharing options...
nyac55 Posted October 27, 2013 Author Report Share Posted October 27, 2013 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+33 wiersz 3*2+1, 3*3+2, 3*4+34 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 More sharing options...
[Ekspert] Hakken Posted October 27, 2013 Report Share Posted October 27, 2013 Jaka jest różnica między kolejnymi elementami (np. między drugim a pierwszym, trzecim a drugim itd.) w pierwszym wierszu?A w drugim? W trzecim? W n-tym? Link to comment Share on other sites More sharing options...
nyac55 Posted October 27, 2013 Author Report Share Posted October 27, 2013 Elemety:1: Rosną o 12: Rosną o 23: Rosną o 3itd. 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 More sharing options...
Sevard Posted October 27, 2013 Report Share Posted October 27, 2013 Jak to ma się do numeru wiersza (numerując od 0)? Link to comment Share on other sites More sharing options...
nyac55 Posted October 27, 2013 Author Report Share Posted October 27, 2013 Względem numeru wiersza elementy rosną o 1 ,o 2 , o 3 itd. z każdym kolejnym wierszem ,tak. Link to comment Share on other sites More sharing options...
[Ekspert] Hakken Posted October 27, 2013 Report Share Posted October 27, 2013 Czy różnica między kolejnymi elementami jest w jakiś sposób związana z numerem wiersza (np. jest równa)? Link to comment Share on other sites More sharing options...
nyac55 Posted October 27, 2013 Author Report Share Posted October 27, 2013 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 More sharing options...
Sevard Posted October 27, 2013 Report Share Posted October 27, 2013 Może dlatego, że wiersze numeruje się od 0, a nie od 1? Być może gdzieś trzeba coś jeszcze dodać? Link to comment Share on other sites More sharing options...
nyac55 Posted October 27, 2013 Author Report Share Posted October 27, 2013 Sevard jak wiesz co mam zmienić powiedz ,bo kombinuję cały dzień i nic dobrego nie wymyśliłem... Link to comment Share on other sites More sharing options...
Sevard Posted October 27, 2013 Report Share Posted October 27, 2013 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 More sharing options...
nyac55 Posted October 27, 2013 Author Report Share Posted October 27, 2013 Faktycznie ,teraz działa. Nie wpadłbym na to. Dzięki. Link to comment Share on other sites More sharing options...
[Ekspert] Hakken Posted October 27, 2013 Report Share Posted October 27, 2013 Problem rozwiązany, więc temat zamykam.W razie potrzeby otwarcia tematu, proszę o kontakt przez PW. Link to comment Share on other sites More sharing options...