-5

Problem

This program giving me wrong result for odd numbers because second case statement also executing every time. Please tell me why this happening.

Program

#include <stdio.h>

int main() {

    int num,rem,te=0,to=0,e=0,o=0;
    float ae,ao;

    while (1) {

    printf("\nEnter Number : ");
    scanf("%d",&num);
    if (num==0) break;
    rem=num%2;
    switch (rem) {

        case 0 :
            te+=num;
            e++;

        case 1 :
            to+=num;
            o++;

    }
}   
printf("\nTotal of even numbers : %d",te);
printf("\nTotal of odd numbers : %d",to);
printf("\nTotal of number of even numbers : %d",e);
printf("\nTotal of number of odd numbers : %d",o);
printf("\nAverage of even no. : %f",ae=te/e);
printf("\nAverage of odd no. : %f",ao=to/o);        

getchar();
return 0;
}

output:

Enter Number : 1

Enter Number : 2

Enter Number : 3

Enter Number : 4

Enter Number : 5

Enter Number : 6

Enter Number : 0

Total of even numbers : 12

Total of odd numbers : 21

Total of number of even numbers : 3

Total of number of odd numbers : 6

Average of even no. : 4.000000

Average of odd no. : 3.000000

anmoloo7
  • 79
  • 1
  • 2
  • 7

2 Answers2

2

Add break; at the end of each case.

switch (rem) {

    case 0 :
        te+=num;
        e++;
        break;

    case 1 :
        to+=num;
        o++;
        break;
}
s4eed
  • 7,173
  • 9
  • 67
  • 104
2

A switch in C has a follow-through feature meaning that program control runs into the cases below the one you enter. You can cancel that effect by using a break statement:

switch (rem){
case 0:
    te+=num;
    e++;
    break;
case 1:
    to+=num;
    o++;
}

In your case though you could use the considerably simpler

if (num % 2){
    to += num;
    ++o;
} else {
    te += num;
    ++e;
}

And also beware that your averages will be calculated in integer arithmetic. Use 1f * te / e instead, taking care to check that e is not zero.

Bathsheba
  • 231,907
  • 34
  • 361
  • 483