Wskaźniki - usunięcie ujemnych el. tablicy

0

Witam!
Pozwólcie, że przejdę od razu do rzeczy. Otóż miałem napisać funkcję w ANSI C, która usunie z tablicy elementy ujemne. Operacja miała zostać wykonana bez użycia dodatkowej tablicy, a finalna tab nie mogła zawierać dziur. Udało mi się napisać kod, który zamieszczam poniżej. Wszystko ładnie się kompiluje, rezultaty pokrywają się z oczekiwanymi, jednak Profesor chce, aby funkcja nie opierała się na kopii elementów(trzeba użyć wskaźników). Nie jestem w stanie niczego wymyślić, dlatego proszę o pomoc. Z góry dzięki!

int usunUjemneElementy(int t[], int n)
{
    int i,j,c=0;

    for(i=0;i<n;i++)
    {
        if(t[i]<0) t[i]=0;
        else c++;
    }

    for(i=0;i<n;i++)
    {
        if(t[i]!=0)
        {
            for(j=0;j<i;j++)
            {
                if(t[j]==0)
                {
                    t[j]=t[i];
                    t[i]=0;
                    j=i;
                }
            }
        }
    }

    return c;
}

dodanie znacznika <code class="c"> - @furious programming

0

Jakiej kopii jakich elementów? Bo na pewno nie kopii tablicy.

0

Chodziło właśnie o to, że program działa na kopii elementów tablicy, a zadanie miało zostać zrealizowane przy użyciu wskaźników (przynajmniej dzisiaj dostałem taką informację ) . Mam w takim razie dynamicznie zaalokować pamięć dla tablicy i przeskakiwać wskaźnikiem po jej elementach, aby pozbyć się ujemnych liczb?

1

Bzdura, gdybyś operował na kopii elementów tablicy to Twój program byłby niepoprawny, bo po wyjściu z funkcji tablica nadal by miała stare wartości ujemne. Zresztą sprawdź:

#include <stdio.h>

void f(int tab[])
{
	tab[0] = 2;
}

int main() 
{
	int tab[2] = { -12, 42 };
	printf("%d %d\n", tab[0], tab[1]);
	f(tab);
	printf("%d %d\n", tab[0], tab[1]);
	return 0;
}
0

Rozumiem. Jak widać, nie bez powodu kompilacja zakończyła się wtedy powodzeniem. W takim razie jak mógłbym rozwiązać ten problem przy użyciu wskaźników i dynamicznej alokacji pamięci?

1

Nie wiem po co dynamiczna alokacja tutaj. Jeśli naprawdę musisz przekazać wskaźnik to wystarczy malutka poprawka. Na poprzednim przykładzie:

void f(int tab[])

zamienić na:

void f(int* tab)

reszta bez zmian.

Natomiast jeśli z jakiegoś niepojętego dla mnie powodu każe Ci jednak mieć dynamiczną tablicę, to wystarczy pogooglować. W skrócie

int* tab = (int*) malloc(rozmiar * sizeof(int));
...
f(tab);
...
free(tab);
0

Tego potrzebowałem, dziękuję bardzo! Temat uważam za zamknięty. :)

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