Search code examples
arrayschistogram

C program histogram print results only once


If I inter array for example [1,1,1,2] program would print:

Number 1 appears 3 times.

Number 1 appears 3 times.

Number 1 appears 3 times.

Number 2 appears 1 times.

And it should print:

Number 1 appears 3 times.

Number 2 appears 1 times.

How to fix this?

#include <stdio.h>

int main() {
    int i,arr[1000],counters[1001]={0},n;
    printf("Enter numbers: \n");
    for(i=0;i<100;i++){
        scanf("%d", &arr[i]);
        if(arr[i]==-1) break;
        if(arr[i]<0||arr[i]>100){
            printf("Numbers must be between 0 and 100\n");
            i--;
        }
    }
    n=i;

    for(i=0;i<n;i++){
        counters[arr[i]]++;
    }

    for(i=0;i<n;i++){
        printf("Number %d appears: %d times\n", arr[i], counters[arr[i]]);
    }
    

    return 0;
}

Solution

  • You're looping over the total number of inputs, so you get 4 lines of output in this particular case. However, since you're working with a relatively small number of non-negative integers, you can simplify your program quite a bit by making the indices represent the inputs, like so:

    #include <stdio.h>
    
    
    int main() {
      int arr[101]={0}, n;
      printf("Enter numbers (end with -1): \n");
      while (1) {
        scanf("%d", &n);
        if(n==-1) break;
        if(n<0 || n>100) {
          printf("Numbers must be between 0 and 100\n");
          continue; 
        }
        arr[n]++; 
      }
      
      for(n=0;n<=100;n++){
        if (arr[n]) printf("Number %d appears: %d times\n", n, arr[n]);
      }
    
      return 0;
    }