Usuwanie elementów tablicy

0

Witam!
Mam 2 kody "swojego autorstwa", które mają realizować dwa polecenia.

  1. "Usuwanie" elementów z tablicy które kończą się na 0.
  2. "Usuwanie" elementów równe poprzednikowi.

Mają to być procedury, zacząłem na początku od zrobienia wszystkiego w mainie.
Niestety nie wiem jak przełożyć to na procedury, moje próby kończą się na tym, że program zawiesza się po wczytaniu tablicy.
Czy byłby ktoś tutaj w stanie, pokazać mi kod chociażby z jednego zadania, a dokładnie tego jak wygląda taka funkcja void, lub solidnie mnie naprowadził jak powinien wyglądać taki szkielet, bym mógł sobie to "przetłumaczyć na swój język i zrozumieć"?
Za pewne gubię się gdzieś we wskaźnikach, przez co i program się zawiesza.
Moje "rozwiązania" kolejno:

  1. https://paste.ofcode.org/qxPife2er2pPcPdsQ82xNT
  2. https://paste.ofcode.org/DxVpNQPFGfNyJSA2jqH2Hx

Porzucam moje "wypociny" co do tego by było to sobie procedurką. (Dla załamania rąk ;) ) https://paste.ofcode.org/35g97tThK55SXYURusUBJS2

// Zapomniałem dodać o tym, że czasem w pierwszym programie, wyrzuca ona śmieci, pod niektórymi wartościami i nie umiem tego jeszcze wytłumaczyć..

0

"Usuwanie" elementów z tablicy które kończą się na 0

Co to znaczy, że element tablicy kończy się na 0?

Niestety nie wiem jak przełożyć to na procedury

Możesz utworzyć na przykład następujące procedury do podstawowej obsługi tablic:

void wczytajTablice(int* tablica, size_t liczbaElementow);
void wypiszTablice(int* tablica, size_t liczbaElementow);

A wszystkie funkcje, które dodatkowo zmieniają wskaźnik tablicy (np. tworzą nową) możesz zrealizować na co najmniej dwa sposoby:

/**
 * Podejście nr 1;
 *
 * Zalety:
 * - mniejsza liczba parametrów,
 * - na pierwszy rzut oka bardziej czytelna.
 *
 * Wady:
 * - nie do końca jest jasne czy funkcja zwalnia poprzedni wskaźnik; należałoby to uwzględnić w komentarzu, co daje minus do używalności.
 */
void filtrujTablice(int** tablica, size_t* liczbaElementow);

/**
 * Podejście nr 2;
 *
 * Zalety:
 * - nie modyfikuje w żaden sposób tablicy wejściowej.
 *
 * Wady:
 * - większa liczba argumentów.
 */
void filtrujTablice(int* tablicaWejsciowa, size_t wejsciowaLiczbaElementow, int** tablicaWyjsciowa, size_t* wyjsciowaLiczbaElementow);

Trzecią alternatywą byłoby wykorzystanie struktur na przykład.

0

Ok... rozumiem, że to jest C bo użyto bibliotek C.

  1. T = (int *) calloc(n ,sizeof(int));
    Skoro za chwile wypełniasz elementy to nie ustawiaj ich na zero. Calloc inicjalizuje bajty na 0.
    Użyj malloc.
    Skoro to C to cast do int* jest zbędny.

  2. *(T+i)
    pisz to po ludzku T[i]

3).
Błąd jest tu na oko wsadzasz wciąż kolejne elementy do i:

             j = i;
            for(; j<n; j++)
            {
                *(T+i) = *(T+j+1);
            }

podejzewam, że jak już to tak to ma wyglądać:

             j = i+1;
            for(; j<n; j++)
            {
                T[j-1] = T[j];
            }
0

Tylko że samo działanie jest ok, w sensie, kiedy w mainie mam wszystko czyli

 #include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, *T;
    int i;
    int j=0;

    printf("Podaj liczbe elementow tablicy T: ");
    scanf("%d", &n);

    T = (int *) calloc(n ,sizeof(int));

    printf("Podaj kolejne wyrazy tablicy: \n");
    for(i=0; i<n; i++)
    {
        scanf("%d", T+i);
    }
    printf("\n");
    for(i=0; i<n; i++)
    {
        printf("%d \n", *(T+i));
    }
    printf("\n");
    for(i=0; i<n;)
    {
        if(*(T+i) == *(T+i-1))
        {
            j = i;
            for(; j<n; j++)
            {
                *(T+j-1) = *(T+j);
            }
         n--;
        }
        else
        {
            i++;
        }
    }
    printf("\n");
    for(i=0; i<n; i++)
    {
        printf("%d \n", *(T+i));
    }
    printf("\n");
    printf("n=%d", n);
    return 0;
}

Wszystko działa dobrze, tylko teraz chce zrobić tak by mieć procedurę w sumie tylko z tego

  for(i=0; i<n;)
    {
        if(*(T+i) == *(T+i-1))
        {
            j = i;
            for(; j<n; j++)
            {
                *(T+j-1) = *(T+j);
            }
         n--;
        }
        else
        {
            i++;
        }
    }
// Po X czasu mam takie coś: (Tyle że tak jakby funkcja działała, ale nic nie robiła.. Jakieś sugestie?)

```c
 #include <stdio.h>
#include <stdlib.h>

void USUW(int n,int *T)
{
    int i;
    int j=0;
    for(i=0; i<n;)
    {
        if((*(T+i) % 10) == 0)
        {
            j = i;
            for(; j<n; j++)
            {
                *(T+i) = *(T+j+1);
            }
         n--;
        }
        else
        {
            i++;
        }
    }
}

int main()
{
    int n, *T;
    int i;
    int j=0;

    printf("Podaj liczbe elementow tablicy T: ");
    scanf("%d", &n);

    T = (int *) calloc(n ,sizeof(int));

    printf("Podaj kolejne wyrazy tablicy: \n");
    for(i=0; i<n; i++)
    {
        scanf("%d", T+i);
    }
    printf("\n");

    USUW(n, &T);


    for(i=0; i<n; i++)
    {
        printf("%d \n", *(T+i));
    }

    return 0;
}


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