Wpis z mikrobloga

#!$%@? wskaźniki w języku C. Mam przekopiować elementy niezerowe z Tablicy A do Tablicy B. Jak to #!$%@? zrobić? Przypisuje sobie np:
int *wsk=tab[i]
przypisuje wartości do tab[i] i jak mam potem znaleźć te niezerowe elementy i przypisać je do tablicy B? Wszystko ogarniam, ale z tym wskaźnikiem #!$%@? się juz z 5h.
#programowanie #jezykc #studbaza
  • 35
@Tytyka: zakładam dynamiczną alokacje pamieci
1. robisz pierwszy obieg pętli i liczysz ile jest niezerowych elementów
2. alokujesz pamiec tyle ile trzeba na niezerowe elementy
3. robisz fora z dwoma indeksami - jeden na tablice A, drugi na tablice B
4. lecisz tym forem po tablicy A i indeks na tablice B inkrementujesz tylko jak wrzucisz niezerowy element w stylu
if(tab_a[i_a] != 0 )
{
tab_b[i_b] = tab_a[i_a];
i_b++;
`}
5.
@MamCieNaHita: masz na myśli czemu int? Programowanie mam od 3 miesięcy raz w tygodniu i właśnie tak uczyli nas wprowadzania tablic i macierzy.

Ogólnie to jestem nowicjuszem pod tym względem.
@Tytyka: program wykonuje się sekwencyjnie.
deklarujesz zmienną n - ma ona śmieciowe wartości, bo nic tam nie wpisałeś. może być 0, może być 2313128
to samo z m
następnie tworzysz tab[n] na stosie. generalnie powinno się albo tworzyć tablice ze stałym rozmiarem - np. tab[255], albo alokować dynamicznie za pomocą malloc. ty w tym przypadku korzystasz z VLA, czyli odkładasz na stosie tablicę ze zmiennym rozmiarem - który w tym przypadku
@MamCieNaHita: A no tak zapomniałem nazwać inaczej tej drugiej tablicy, powinno być tab1[m], ale to by wyszło przy użyciu jej już dalej w programie.
Ale przechodząc do dalszej części programu. Już miałem kilka pomysłów i jak może się wydawać żadnej nie zadziałał. Tak jak na zdjęciu, chciałem zliczyć elementy niezerowe, przypisać ich liczbę do zmiennej m, tak żeby zgadzała się ilość elementów w tablicy tab1[m], a potem wstawić te wartości za
Tytyka - @MamCieNaHita: A no tak zapomniałem nazwać inaczej tej drugiej tablicy, powi...

źródło: comment_nz7cTGCjzjEPjdXd4HfunvNEfFxq4oHC.jpg

Pobierz
@Tytyka: biorąc pod uwagę, że mówisz, że tyle już spędziłeś na próbie ogarnięcia idei wskaźnika, nie wiem czy moje wywody ci jakoś pomogą.

wyobraź sobie, że masz rozłożone karty na stole, wartościami do dołu, jedna za drugą. odwracasz 5 kart w tym rządku - to twoja tablica. wiesz, że masz ich 5, bo są odwrócone. a teraz zapisz sobie z boku na kartce, że masz ich 5 - to twoja zmienna
@MamCieNaHita: Czyli z tego co zrozumiałem, mam stworzyć np:
tab[5], przypisać int *wsk=&tab[5]
int *p=wsk
i potem za pomocą wskaźnika p przejrzeć tab[5] w poszukiwaniu elementów niezerowych, zapisać ilość tych elementów np do int m
stworzyć tab1[m] i znowu za pomocą wskaźnika p przypisać odpowiednie wartości niezerowe do tej tablicy?
@Tytyka Piszesz int tab[n]. Pamiętając, że kod wykonuje się linijka po linijce, ile wtedy wynosi n?

Wskaźniki są bardzo proste do opanowania, tylko trzeba się skupić na semantyce i zrozumieć jak to działa pod spodem.
@MamCieNaHita: Udało mi się to zrobić, znaczy przekopiować te elementy, ale mam jedno pytanie. Czy mogę to zrobić na na tab[n]? Bo teraz wprowadziłem sobie tablice z 8 elementami i za każdym razem jak zmieniam liczbę elementów to muszę również zmienić wartość w liczniku, a ja chciałbym zrobić taką uniwersalna. Jest to do zrobienia dla nowicjusza czy raczej sobie odpuścić i liczyć, że laborant będzie łaskawy?
Tytyka - @MamCieNaHita: Udało mi się to zrobić, znaczy przekopiować te elementy, ale ...

źródło: comment_u5STjHaKShXugA6NcZSDEYPELEiCy6EU.jpg

Pobierz
@ldefix: no cóż, trzeba sobie jakoś radzić. Po prostu wtedy zlicza mi j++, a nie wypełnia miejsca w tab1[g]. Jak będę zanosił program do laboranta to zamienię pętlę na do while, żeby tego nie było