Funkcja z trzema argumentami, tablice

Funkcja z trzema argumentami, tablice
CO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
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?

Kopiuj
#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;
}

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

To:

Kopiuj
int *tab[n];

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

Wystarczy zrobić coś takiego:

Kopiuj
int tab[n];

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

A jak chcesz pobawić się z callocem to:

Kopiuj
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.

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
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?

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
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...

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

W takim razie podałem wersję

Kopiuj
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).

CO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

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

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.