Wskaźniki - usunięcie ujemnych el. tablicy

2015-01-26 19:47
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

edytowany 1x, ostatnio: furious programming, 2015-01-26 23:39
Wstawiaj kod w znaczniki kolorujące składnię; Jesli nie wiesz jak się to robi, zobacz do tego artykułu: Formatowanie treści postów na forum - furious programming 2015-01-26 23:40

Pozostało 580 znaków

2015-01-26 21:00
0

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

Pozostało 580 znaków

2015-01-26 21:11
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?

Pozostało 580 znaków

2015-01-26 21:17
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;
}

Pozostało 580 znaków

2015-01-26 21:19
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?

Pozostało 580 znaków

2015-01-26 21:31

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);

Pozostało 580 znaków

2015-01-26 21:45
0

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

Zamiast pisać "temat uważam za zamknięty" zaakceptuj odpowiedź która rozwiązała Twój problem. - several 2015-01-26 22:46
@crunkz - jeśli wątek uważasz za zakończony - rozdaj plusiki pomocnym postom i zaznacz fajeczkę przy poście z rozwiązaniem problemu (możesz także zaakceptować swój post, jeśli zawiera rozwiązanie); - furious programming 2015-01-26 23:40

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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