podział na pliki i makefile

0

cześć,
piszę program liczący średnią i wariancję podanych liczb. kiedy było wszystko w jednym pliku działało ok. to mój pierwszy podział na pliki, więc możliwe że robie jakieś radykalne błędy. bardzo proszę was o zerknięcie na kod i pomoc.

main.c:

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

    int n, k, p;
    float * tab;
    int i = 0;
    float arytmetyczna, wariancja;

    float licz_sr();
    float licz_war();
    void podaj_liczby();
    void drukuj();

int main() {

    podaj_liczby();

    licz_war();

    licz_sr();

    drukuj();
return 0;
}
 

gui.c:

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

void podaj_liczby(int n, int i, float * tab)
{

printf("podaj ile liczb\n");
    scanf("%d",&n);
    tab = (float*)malloc(n * sizeof(float));
printf("podaj te liczby:\n");
    for(i=0; i<n; i++)
        {
            printf("tab[%d] = ", i);
            scanf("%f", &tab[i]);
        }
}

void drukuj(int k, float wariancja, float arytmetyczna)
{
       printf("1.wariancja\n2.srednia");
       scanf("%d",&k);
       switch(k)
    {
        case 1:
            printf("%f\n", wariancja);
        break;
        case 2:
            printf("%f\n", arytmetyczna);
        break;
    }
}

obliczanie.c:

float licz_sr(int i, int n, float arytmetyczna, float wariancja, float * tab)
{
        for(i=0, arytmetyczna=0; i<=n ; i++)
        arytmetyczna += tab[i];
        arytmetyczna /= n;
return arytmetyczna;
}


float licz_war(int i, int n, float arytmetyczna, float wariancja, float * tab)
{
        for(i=0, wariancja=0 ;i<n;i++)
        wariancja += (tab[i]-arytmetyczna)*(tab[i]-arytmetyczna);
        wariancja /= n;
return wariancja;
}
 

bardzo krótko zajmuję się programowaniem w c i bardzo proszę o pomoc.
oprócz tego muszę jeszcze napisać do tego makefila. czy jest to w ogóle możliwe, jeśli nie mam linuxa i nie mam możliwości zainstalowania virtual boxa?
z góry dziękuję ;)

0

Zmienne powinny być deklarowane w funkcji, która ich używa, nie globalnie, oraz przekazywane jako argumenty i zwracane przez funkcje. Np. możesz zrobić coś takiego:

int main(){
  int *liczby, n, arytmetyczna;
  n = wczytaj_liczny(liczby); // funkcja wczytaj_liczby zwraca ilosc wczytanych liczb
  arytmetyczna = licz_sr(liczby, n);
  // itd.
}

Jeśli chcesz używać zmiennych globalnych w wielu plikach, to oprócz deklaracji w main.c musisz je zadeklarować we wszystkich plikach z modyfikatorem extern.

0

dlaczego w mainie powinnam przypisać znakiem "=" funkcje np. do n? kurcze, nie rozumiem o co chodzi

0

troche pozmieniałam ale ciągle nie działa...

main. c:

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

    int n;
    float * tab;
    float arytmetyczna, wariancja;

    float licz_sr();
    float licz_war();
    int podaj_liczby();
    int podaj_ile();
    void drukuj();

int main() {

    n=podaj_ile();

    *tab=podaj_liczby(n);

    arytmetyczna=licz_sr(n, tab);

    wariancja=licz_war(arytmetyczna, n, tab);

    drukuj(wariancja, arytmetyczna);

return 0;
} 

gui.c:

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

int podaj_ile()
{
int n;
printf("podaj ile liczb\n");
    scanf("%d",&n);

return n;
}

int podaj_liczby( n)
{
int i;
float * tab;
tab = (float*)malloc(n * sizeof(float));
printf("podaj te liczby:\n");
    for(i=0; i<n; i++)
        {
            printf("tab[%d] = ", i);
            scanf("%f", &tab[i]);
        }
return *tab;
}

void drukuj(int k, float wariancja, float arytmetyczna)
{
       printf("1.wariancja\n2.srednia");
       scanf("%d",&k);
       switch(k)
    {
        case 1:
            printf("%f\n", wariancja);
        break;
        case 2:
            printf("%f\n", arytmetyczna);
        break;
    }
} 

obliczanie.c:

 float licz_sr(int i, int n, float arytmetyczna, float * tab)
{
        for(i=0, arytmetyczna=0; i<=n ; i++)
        arytmetyczna += tab[i];
        arytmetyczna /= n;
return arytmetyczna;
}


float licz_war(int i, int n, float arytmetyczna, float wariancja, float * tab)
{
        for(i=0, wariancja=0 ;i<n;i++)
        wariancja += (tab[i]-arytmetyczna)*(tab[i]-arytmetyczna);
        wariancja /= n;
return wariancja;
}

najgorsze, że nie zwraca żadnych błędów i nie wiem gdzie mam szukać...

0

Funkcje licz_war:

  1. deklarujesz bez parametrów: float licz_war();
  2. definiujesz z pięcioma parametrami: float licz_war(int i, int n, float arytmetyczna, float wariancja, float * tab)
  3. wywołujesz z trzema parametrami: wariancja=licz_war(arytmetyczna, n, tab);

We wszystkich trzech przypadkach musi się zgadzać co do ilości oraz co do typów.
To samo dotyczy pozostałych funkcji.

0

3 podejscie i znow porażka :( przepraszam, że was tak męczę al błagam, mógłby mi ktoś dokładnie wytłumaczyć co jest nie tak? jużsię poplątałam strasznie w tym programie, a muszę go dzisiaj skończyć... jeszcze raz proszę o pomoc. czy teraz funkcje są ok ? chyba poplątałam coś ze wskaźnikami, bo wyskakują błędy: incompatible type for argument 2 of "licz_sr". to samo do licz_war
main.c:

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

    int n;
    float * tab;
    float arytmetyczna, wariancja;

    float licz_sr(int n, float *tab);
    float licz_war(float arytmetyczna, int n, float *tab);
    int podaj_liczby(int n);
    int podaj_ile();
    void drukuj(float wariancja,float arytmetyczna);

int main() {

    n=podaj_ile();

    *tab=podaj_liczby(n);

    arytmetyczna=licz_sr(n, * tab);

    wariancja=licz_war(arytmetyczna, n, * tab);

    drukuj(wariancja, arytmetyczna);

return 0;
} 

gui.c:

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

int podaj_ile()
{
int n;
printf("podaj ile liczb\n");
    scanf("%d",&n);

return n;
}

float podaj_liczby( n)
{
int i;
float * tab;
tab = (float*)malloc(n * sizeof(float));
printf("podaj te liczby:\n");
    for(i=0; i<n; i++)
        {
            printf("tab[%d] = ", i);
            scanf("%f", &tab[i]);
        }
return *tab;
}

void drukuj(wariancja, arytmetyczna)
{
    int k;
       printf("1.wariancja\n2.srednia");
       scanf("%d",&k);
       switch(k)
    {
        case 1:
            printf("%f\n", wariancja);
        break;
        case 2:
            printf("%f\n", arytmetyczna);
        break;
    }
}

obliczanie.c:

float licz_sr( n, arytmetyczna, *tab)
{
    int i;
        for(i=0, arytmetyczna=0; i<=n ; i++)
        arytmetyczna += tab[i];
        arytmetyczna /= n;
return arytmetyczna;
}


float licz_war( n, *tab)
{
    int i;
    float arytmetyczna, wariancja;
        for(i=0, wariancja=0 ;i<n;i++)
        wariancja += (tab[i]-arytmetyczna)*(tab[i]-arytmetyczna);
        wariancja /= n;
return wariancja;
} 

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