Home > Net >  Incorrect calculations of averages
Incorrect calculations of averages

Time:11-22

I have this super simple code for calculating averages of given even and odd numbers, until the user gives 0. (I would use for loop but we can't). I'm having a really strange problem with program rounding results like 25/2 is 2.00000. Sorry if this question is stupid but I just can't find a problem. What am I doing completely wrong?

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

void funkcja()
{
    int sumaNiep = 0;
    int sumaPa = 0;
    int userInput = 1;
    int i = 0;

    while(userInput != 0)
    {
        //wprow zmiennej
        printf("%d. Podaj calkowita liczbe: ", i 1);
        scanf("%d", &userInput);

        //jesli parzysta
        if (userInput % 2 == 0)
        {
            sumaPa  = userInput;
        } else {
            sumaNiep  = userInput;
        }
        i  ;
    }

    double sredniaNiep = sumaNiep/(i-1);
    double sredniaPa = sumaPa/(i-1);

    printf("\nsrednia parzysta %d / %d : %lf", sumaPa, i, sredniaPa);
    printf("\nsrednia parzysta %d / %d : %lf", sumaNiep, i, sredniaNiep);

}


int main()
{
    funkcja();
}

CodePudding user response:

The problem is that you do an integer division at the end.

You should break out of the loop if the user enters 0 and make at least one operand a double when you do the division. You also need to count the number of evens and odds:

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

void funkcja() {
    int sumaNiep = 0;
    int sumaPa = 0;
    int userInput = 1;
    int iPa = 0;
    int iNiep = 0;
    int i = 0;

    while(1) {
        printf("%d. Podaj calkowita liczbe: ",   i);
        if(scanf(" %d", &userInput) != 1 || userInput == 0) break; // break out

        // jesli parzysta
        if(userInput % 2 == 0) {
            sumaPa  = userInput;
              iPa;                  // count evens
        } else {
            sumaNiep  = userInput;
              iNiep;                // count odds
        }
    }
    if(iPa) { // avoid div by zero
        double sredniaPa = (double)sumaPa / iPa;       // double div
        printf("srednia parzysta %d / %d : %lf\n", sumaPa, iPa, sredniaPa);
    }
    if(iNiep) { // avoid div by zero
        double sredniaNiep = (double)sumaNiep / iNiep; // double div
        printf("srednia parzysta %d / %d : %lf\n", sumaNiep, iNiep, sredniaNiep);
    }
}

CodePudding user response:

The problem was I divided by the number of all digits (odd and even) to calculate both averages. Here is improved code:

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

void funkcja()
{
    int sumaNiep = 0;
    int sumaPa = 0;
    int userInput = 1;
    int i_p = 0, i_np = 0;

    while(userInput != 0)
    {
        //wprow zmiennej
        printf("%d. Podaj calkowita liczbe: ", i_p i_np 1);
        scanf("%d", &userInput);

        //jesli parzysta
        if (userInput % 2 == 0)
        {
            sumaPa  = userInput;
            if (userInput != 0)
            {
                 i_p  ;
            }
        } else {
            sumaNiep  = userInput;
            i_np  ;
        }


    }

    if (i_np != 0)
    {
        double sredniaNiep = sumaNiep/(i_np);
        printf("\nSrednia nieparzysta %d / %d : %lf", sumaNiep, i_np, sredniaNiep);

    }
    if (i_p != 0)
    {
        double sredniaPa = sumaPa/(i_p);
        printf("\nSrednia parzysta %d / %d : %lf", sumaPa, i_p, sredniaPa);
    }


}


int main()
{
    funkcja();
}
  •  Tags:  
  • c
  • Related