Funkcja z trzema argumentami, tablice

0

Witam wszystkich. Mam problem z otrzymaniem prawidłowego wyniki zwracanego przez funkcję "compute3". Ma ona sumować ilość elementów tablicy, które posiadają wartości większe od zadanej wartości (przekazanej jako argument). W moim kodzie dla tej funkcji uzyskuje niepoprawny wynik. Proszę o pomoc. W jaki sposób przerobić kod aby te wszystkie funkcje (compute1, compute2 i compute3) utworzyć jako jedna funkcja?

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

int main()
{
    int wartosc=3;
    int i;
    int n=9;
    int *tab[n];

    for(i=0;i<n;i++)    // dynamiczna alokacja pamieci
        tab[i]=calloc(n,sizeof(int));

  //  int tab[n];

    wczyt1D(tab,n);

    for(i=0;i<n;i++)
        printf("\n Element tablicy nr %d wynosi: %d",i,tab[i]);

    int sumaDodatnich;
    sumaDodatnich=compute1(tab,n);
    printf("\n Suma elementow dodatnich wynosi: %d",sumaDodatnich);

    int iloscParzystych;
    iloscParzystych=compute2(tab,n);
    printf("\n Ilosc elementow parzystych wynosi: %d", iloscParzystych);

    int iloscLiczbWieksz;
    iloscLiczbWieksz=compute3(tab,n,wartosc);
    printf("\n Ilosc liczb wiekszych od zadanej wartosci wynosi: %d", iloscLiczbWieksz);

    return 0;
}

void wczyt1D(int tab[], int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("\n Podaj element tablicy nr %d:",i);
        scanf("%d", &tab[i]);
    }
}

int compute1(int tab[],int n)
{
    int sumaD=0;
    int iloscParz=0;
    int i;
    for(i=0;i<n;i++)
    {
        if(tab[i]>0) sumaD=sumaD+tab[i];
    }

    return sumaD;
}
int compute2(int tab[],int n)
{
    int iloscParz=0;
    int i;
    for(i=0;i<n;i++)
    {
        if(tab[i]%2==0) iloscParz=iloscParz+1;
    }
    return iloscParz;
}
int compute3(int tab[],int n,int x)
{
    int i;
    int lWieksze;
    for(i=0;i<n;i++)
    {
        if(tab[i]>x) lWieksze=lWieksze+1;
    }
    return lWieksze;
}

0

To:

int *tab[n];

nie jest tablica int. To jest tablica wskaźników typu int.

Wystarczy zrobić coś takiego:

int tab[n];

w C99 (i nie tylko), bez żadnych calloców, malloców.

A jak chcesz pobawić się z callocem to:

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

Poza tym nie rozumiem dlaczego z tych 3 funkcji chcesz zrobić jedną tracąc na czytelności kodu (choć trudno mówić tu o czytelności kiedy funkcję nazywają się compute1, compute2 albo compute3. Ale można to zrobić - zauważ że pętla jest taka sama. Więc możesz w jednej pętli umieścić takie same warunki jak w tych trzech funkcjach.

0

Dzięki za odpowiedź. Polecenie było tak ułożone, aby zastosować dynamiczną alokacje pamięci. Wszystkie inne funkcje poza tą compute3 działają prawidłowo. Może jest jakieś inne rozwiązanie dotyczące samej tej nieszczęsnej funkcji?

0

Jak umieszczę każdą z tych pętli w jednej funkcji to w jaki sposób mam napisać fragment kodu odpowiedzialny za zwracanie wartości przez funkcję? Będę miał trzy wartości zwracane przez return...

0

W takim razie podałem wersję

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

Bo to że teraz działa (z tablicą wskaźników) to szczęście oraz Undefined Behaviour.

Tak samo z trzecią funkcją - UB ponieważ próbujesz odczytać wartość z niezainicjalizowanej zmiennej lWieksze. Ustaw jej początkową wartość na 0.

Nie będziesz miał zwracania wartości tylko odpowiednia zmienna będzie miała odpowiednią wartość (choć zostawiłbym to tak jak jest teraz).

0

Aaa no tak, moje niedopatrzenie. Dzięki za pomoc! Pozdrawiam :)

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