podział na pliki i makefile

Odpowiedz Nowy wątek
2014-12-13 20:42
Wybitny Samiec
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ę ;)

Patrząc na tag ... chyba mylisz trzy pojęcia na raz C#, #C i C - _13th_Dragon 2014-12-14 03:16

Pozostało 580 znaków

2014-12-13 21:41
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.

Pozostało 580 znaków

2014-12-13 21:50
Wybitny Samiec
0

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

Pozostało 580 znaków

2014-12-14 00:02
Wybitny Samiec
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ć...

Pozostało 580 znaków

2014-12-14 03:15
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-14 12:02
Wybitny Samiec
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;
} 
edytowany 1x, ostatnio: Shalom, 2016-12-13 18:26

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