Funkcja z trzema argumentami, tablice

Odpowiedz Nowy wątek
2017-12-18 18:50
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;
}
Oczywiście że się da. Pytanie tylko czy znasz wskaźniki na funkcje? - Mokrowski 2017-12-18 19:02

Pozostało 580 znaków

2017-12-18 18:55
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.

edytowany 2x, ostatnio: atmal, 2017-12-18 19:00

Pozostało 580 znaków

2017-12-18 19:01
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?

Pozostało 580 znaków

2017-12-18 19:02
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...

Pozostało 580 znaków

2017-12-18 19:05
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).

Pozostało 580 znaków

2017-12-18 19:08
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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