Решение средней арифметической и средней ошибки - PullRequest
0 голосов
/ 12 марта 2019

Мой код вызывает проблемы, связанные с выдачей окончательного результата.Ранее программа возвращала, что есть ошибка в делении на ноль в среднем геометрическом.Теперь программа в среднем арифметическом возвращает -2.00000.Программа показывает ошибку # IND00 в SredniaGeometryczna(); - это среднее геометрическое.

У вас есть идеи, как ее решить?Заранее спасибо.

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

int ilosc(int*);
double sredniaArytmetyczna(int, int*); 
double sredniaGeometryczna(int, int*);
double sredniaHarmoniczna(int, int*);

int main()
{
    int tab[10];

    char wybor;
    printf("Wybierz, ktora srednia chcesz policzyc: [A]rytmetyczna, [G]eometryczna, [H]armoniczna.\n");
    wybor=getch();
    int ile;
    long double srednia;
    switch(wybor)
    {
    case 'a':
    case 'A':
        //instrukcje dla arytmetycznej
        ile=ilosc(tab);
        srednia=sredniaArytmetyczna(ile, tab);
        printf("Srednia to: %f",srednia);
        //tab* == tab[0]
        //printf("Srednia to: %f", sredniaArytmetyczna(ilosc(tab),tab)); - mozna tak samo zrobic za pomoca jednej linijki

        break;
    case 'g':
    case 'G':
        //instrukcje dla geometrycznej
        ile=ilosc(tab);
        srednia=sredniaGeometryczna(ile, tab);
        printf("Srednia to: %f",srednia);

        break;
    case 'h':
    case 'H':
        ile=ilosc(tab);
        srednia=sredniaHarmoniczna(ile, tab);
        printf("Srednia to: %f",srednia);
        break;


    default:
        printf("Bledny wybor");
    }

    return 0;
}

int ilosc(int* tablica)  
{
    int ileLiczb, i;
    printf("Podaj ile liczb chcesz wprowadzic (max 10) : \n");

    scanf("%d", &ileLiczb);
    i=0;
    while(i<ileLiczb)
    {
        printf("Podaj %d liczbe calkowita: ", i+1);
        scanf("%d", &tablica[i]);
        ++i;
    }
    return 0;
}

double sredniaArytmetyczna(int iloscLiczb, int *Tab)
{
    double wynik=0;

    for(int i=0; i<iloscLiczb; ++i)
    {
        wynik+=Tab[i];
    }

    return wynik/iloscLiczb;
}

double sredniaGeometryczna(int iloscLiczb, int *Tab)
{

    double wynik=0;

    for(int i=0; i<iloscLiczb; ++i)
    {
        wynik=Tab[i]*Tab[++i];
    }

    return pow(wynik,1/iloscLiczb);
}

double sredniaHarmoniczna(int iloscLiczb, int *Tab)
{

    double wynik=0;

    for(int i=0; i<iloscLiczb; ++i)
    {
        wynik+=(1/Tab[i]);
    }

    return iloscLiczb/wynik;
}

1 Ответ

1 голос
/ 12 марта 2019

ilosc должен возвращать количество чисел, но всегда возвращает 0. Изменение

return 0;

до

return ileLiczb;

И когда вы вычисляете мощность в sredniaGeometryczna, вы выполняете целочисленную арифметику. Вам нужно изменить 1/iloscLiczb на 1/(double)iloscLiczb, чтобы он выполнял арифметику с плавающей запятой. Или вы можете изменить объявление параметра iloscLiczb на double, и оно будет преобразовано автоматически при вызове функции.

Вам необходимо аналогичное изменение в sredniaHarmoniczna. Изменить 1/Tab[i] на 1/(double)Tab[i]

...