Wskaźniki i modyfikacja argumentów wewnątrz funkcji

0

Witam!

Chciałbym poprosić o pomoc w edycji kodu, który znajduje się poniżej.

Zadanie do wykonania polega na przerobieniu funkcji usun_ujemne tak, aby pierwszy argument był traktowany jako wektor, a funkcja posługiwała się indeksami i do iteracji po wektorze i j - do zapamiętywania elementów nieujemnych.

Dopiero zaczynam swoją naukę programowania i nie wszystko rozumiem, a na uczelni nie leci się od podstaw, stąd byłbym bardzo wdzięczny za pomoc.

Kod:

#include <stdio.h>

void usun_ujemne(double *v, int *n)
{                                  
        /* Usuwa ujemne elementy z wektora v */
        double         *u = v;
        int             l = *n;
        while (l--) {
                if (*v >= 0)    /* jeśli element jest dodatni */
                        *u++ = *v;      /* to zapamiętaj go w "nowym"
                                         * wektorze */
                else
                        (*n)--; /* w przeciwnym razie zmniejsz 
                                 * wartosc wskazywana przez n */
                v++;
        }
}

void pwekt(double *v, int n)
{
        printf("[ ");
        while (n--) {
                printf("%g ", *v);
                v++;
        }
        printf("]");
}

int main()
{
        double          v[] = {-10, 0, 10, -20, 30, 1.1, -2.2, -3.3, 300.003, 1024.5};
        int             n = sizeof v / sizeof v[0];

        printf("Wektor: ");
        pwekt(v, n);
        printf(" (%d elementow)\n", n);

        usun_ujemne(v, &n);

        printf("Wektor po usunieciu ujemnych elementow: ");
        pwekt(v, n);
        printf(" (%d elementow)\n", n);

        return 0;
}
0

Następnym razem za bzdurny tytuł wątku i brak sensownych tagów będzie kosz. W czym dokładnie jest problem?

1

v.resize(distance(v.begin(), std::remove_if(v.begin(), v.end(), std::bind2nd(std::less<double>(), 0.0))));

0

Może faktycznie nazwa tematu nie była najlepsza, ale nie chodzi mi o zdobycie gotowca, tylko zrozumienie, co tutaj się dzieje.

Po kolei:

  1. Zmiana argumentu funkcji:
    void usun_ujemne(double *v, int *n)

Czyli zamiast double *v, mam tutaj wstawić tablicę? Na przykład int tab[ROZMIAR]?

Wiem, że iteracja to powtarzanie, czyli dalej chcę stworzyć pętlę, która sprawdzi całą zawartość tablicy. Coś w rodzaju tego?

int i=0;
while (i<ROZMIAR) {
  i++;
}
0

To zadanie możesz poprawnie wykonać po zapoznaniu się z tematami:

  1. Tablice - przekazywanie do funkcji.
  2. Wskaźniki - arytmetyka wskaźnikowa.
    Bez zapoznania się sam nie zrobisz.
0

Czyli jeśli tablica ma zostać przekazana do funkcji wyglądałoby to następująco?

void usun_ujemne(int tablica[], int *n)

Dla funkcji nie ma znaczenia liczba elementów tablicy? Może zostać po prostu int tablica[]?

0

A skąd funkcja się dowie ile ma elementów?

0

Czyli w tym samym miejscu dopisać jeszcze:

void usun_ujemne(int tablica[], int Rozmiar, int *n)
0

Nie!

void usun_ujemne(int tablica[], int Rozmiar,int N, int *rozmiar, int *n)

Po kiego dwa razy rozmiar przekazywać kiedy można cztery!

0

Dobra, nie było pytania.

To może na prostszym przykładzie.

Czyli mam funkcję read, jej argumentem jest pewna tablica c i co oznacza tutaj int i?

void read(int c[],int i)
{
    int j;
    for(j=0;j<i;j++)
        scanf("%d",&c[j]);

}
 
void display(int d[],int i)
{
    int j;
    for(j=0;j<i;j++)
        printf("%d ",d[j]);
    printf("\n");
}
 
 
int main()
{
    int a[5];
    printf("Wprowadź 5 elementów listy \n");
    read(a,5);
    printf("Elementami listy są : \n");
    display(a,5);
    return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.