3

I'm working on a small program that counts the number of times an integer appears in an array. I managed to do this but there is one thing I can't overcome.

My code is:

#include <stdio.h>

int count_occur(int a[], int num_elements, int value);
void print_array(int a[], int num_elements);

void main(void)
{
  int a[20] = {2, 5, 0, 5, 5, 66, 3, 78, -4, -56, 2, 66, -4, -4, 2, 0, 66, 17, 17, -4};
  int num_occ, i;

  printf("\nArray:\n");
  print_array(a, 20);

  for (i = 0; i<20; i++)
  {
    num_occ = count_occur(a, 20, a[i]);
    printf("The value %d was found %d times.\n", a[i], num_occ);
  }
}

int count_occur(int a[], int num_elements, int value)
/* checks array a for number of occurrances of value */
{
  int i, count = 0;
  for (i = 0; i<num_elements; i++)
  {
    if (a[i] == value)
    {
        ++count; /* it was found */
    }
  }
  return(count);
}

void print_array(int a[], int num_elements)
{
  int i;
  for (i = 0; i<num_elements; i++)
  {
    printf("%d ", a[i]);
  }
  printf("\n");
}

My output is :

Array:
2 5 0 5 5 66 3 78 -4 -56 2 66 -4 -4 2 0 66 17 17 -4 
The value 2 was found 3 times.
The value 5 was found 3 times.
The value 0 was found 2 times.
The value 5 was found 3 times.
The value 5 was found 3 times.
The value 66 was found 3 times.
The value 3 was found 1 times.
The value 78 was found 1 times.
The value -4 was found 4 times.
The value -56 was found 1 times.
The value 2 was found 3 times.
The value 66 was found 3 times.
The value -4 was found 4 times.
The value -4 was found 4 times.
The value 2 was found 3 times.
The value 0 was found 2 times.
The value 66 was found 3 times.
The value 17 was found 2 times.
The value 17 was found 2 times.
The value -4 was found 4 times.

How can I avoid double lines in the output?

davidism
  • 121,510
  • 29
  • 395
  • 339
Vandervidi
  • 295
  • 1
  • 4
  • 11

7 Answers7

3

You can use a parallel array, this example uses char[20] in order to save some space:

#include <stdio.h>

int count_occur(int a[], char exists[], int num_elements, int value);
void print_array(int a[], int num_elements);

int main(void) /* int main(void), please */
{
    int a[20] = {2, 5, 0, 5, 5, 66, 3, 78, -4, -56, 2, 66, -4, -4, 2, 0, 66, 17, 17, -4};
    char exists[20] = {0}; /* initialize all elements to 0 */
    int num_occ, i;

    printf("\nArray:\n");
    print_array(a, 20);

    for (i = 0; i < 20; i++)
    {
        num_occ = count_occur(a, exists, 20, a[i]);
        if (num_occ) {
            exists[i] = 1; /* first time, set to 1 */
            printf("The value %d was found %d times.\n", a[i], num_occ);
        }
    }
}

int count_occur(int a[], char exists[], int num_elements, int value)
/* checks array a for number of occurrances of value */
{
    int i, count = 0;

    for (i = 0; i < num_elements; i++)
    {
        if (a[i] == value)
        {
            if (exists[i] != 0) return 0;
            ++count; /* it was found */
        }
    }
    return (count);
}

void print_array(int a[], int num_elements)
{
    int i;
    for (i = 0; i<num_elements; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}

This method is faster, as it skips values already readed and starts iterating from i in count_ocurr:

#include <stdio.h>

int count_occur(int a[], char map[], int num_elements, int start);
void print_array(int a[], int num_elements);

int main(void)
{
    int a[20] = {2, 5, 0, 5, 5, 66, 3, 78, -4, -56, 2, 66, -4, -4, 2, 0, 66, 17, 17, -4};
    char map[20] = {0};
    int num_occ, i;

    printf("\nArray:\n");
    print_array(a, 20);

    for (i = 0; i < 20; i++)
    {
        if (map[i] == 0) {
            num_occ = count_occur(a, map, 20, i);
            printf("The value %d was found %d times.\n", a[i], num_occ);
        }
    }
}

int count_occur(int a[], char map[], int num_elements, int start)
/* checks array a for number of occurrances of value */
{
    int i, count = 0, value = a[start];

    for (i = start; i < num_elements; i++)
    {
        if (a[i] == value)
        {
            map[i] = 1;
            ++count; /* it was found */
        }
    }
    return (count);
}

void print_array(int a[], int num_elements)
{
    int i;
    for (i = 0; i< num_elements; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}
David Ranieri
  • 39,972
  • 7
  • 52
  • 94
1

I would suggest only printing the statement if the current index is also the index of the first occurrence of the number in question.

Inside count_occur, you have the index of each match in i. If you pass in the i from main to count_occur, you can do something such as returning -1 if that value is greater than the i in count_occur. Then if you get that -1 in main, don't print.

In addition, your algorithm could be made faster. Instead of searching the array linearly every time, you can sort a copy of the array so that the search can be done efficiently. (Even if you use one array to index and the other to search, it'll be faster - and still return values in the same order.)

amo
  • 4,082
  • 5
  • 28
  • 42
1
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

int count_occur(int a[], int num_elements, int value, bool selected[]);
void print_array(int a[], int num_elements);

int main(void){
    int a[] = {2, 5, 0, 5, 5, 66, 3, 78, -4, -56, 2, 66, -4, -4, 2, 0, 66, 17, 17, -4};
    int size = sizeof(a)/sizeof(*a);
    bool ba[size];
    memset(ba, 0, sizeof ba);
    int num_occ, i;

    printf("\nArray:\n");
    print_array(a, size);

    for (i = 0; i<size; i++){
        if(ba[i] == true) continue;//skip already count
        num_occ = count_occur(a, 20, a[i], ba);
        printf("The value %d was found %d times.\n", a[i], num_occ);
    }
}

int count_occur(int a[], int num_elements, int value, bool ba[]){
    int i, count = 0;
    for (i = 0; i<num_elements; i++){
        if (a[i] == value){
            ba[i] = true;
            ++count;
        }
    }
    return count;
}

void print_array(int a[], int num_elements){
    int i;
    for (i = 0; i<num_elements; i++){
        printf("%d ", a[i]);
    }
    printf("\n");
}

Little improvement

int count_occur(int a[], int num_elements, int index, bool selected[]);

num_occ = count_occur(a, 20, i, ba);

int count_occur(int a[], int num_elements, int index, bool ba[]){
    int i, count = 0;
    for (i = index; i<num_elements; i++){
        if (a[i] == a[index]){
            ba[i] = true;
            ++count;
        }
    }
    return count;
}
BLUEPIXY
  • 39,699
  • 7
  • 33
  • 70
1
#include<stdio.h>
#include<string.h>

int main()
{
  int arr[] = {2, 5, 0, 5, 5, 66, 3, 78, -4, -56, 2, 66, -4, -4, 2, 0, 66, 17, 17, -4};
  int arrSize = sizeof(arr)/sizeof(arr[0]);
  int tracker[20];
  int i,j,k=0,l=0,count,exists=0;

  for (i=0;i<arrSize;i++)
    printf("%d\t", arr[i]);
  printf("\n");

  memset(tracker, '$', 20);

  for (i=0, j=i+1, count=1, l=0; i<arrSize; i++)
  {
    j=i+1;
    count=1;
    l=0;

    while (l < arrSize)
    {
      if (arr[i] == tracker[l])
      {
        exists = 1;
        break;
      }
      l++;
    }

    if (1 == exists)
    {
      exists = 0;
      continue;
    }

    while (j < arrSize)
    {
      if (arr[i] == arr[j])
        count++;
      j++;
    }
    tracker[k] = arr[i];
    k++;

    printf("count of element %d is %d\n", arr[i], count);
  }

}
Mohammed Raqeeb
  • 75
  • 2
  • 12
1
very simple logic to count how many time a digit apper
#include<stdio.h>
  int main()
{
int a,b,c,k[10];
int p[10]={0};
int bb[10]={0};
scanf("%d\n",&a);
for(b=0;b<a;b++)
{
    scanf("%d",&k[b]);

}
for(b=a-1;b>0;b--)
{
    for(c=b-1;c>=0;c--)
    {
        if((k[b]==k[c])&&(bb[c]==0))
        {
            p[b]=p[b]+1;
            bb[c]=1;
        }
    }
}
    for(c=0;c<a;c++)
        {
        if(p[c]!=0)
        {
            printf("%d is coming %d times\n",k[c],p[c]+1);
        }
    }
    return 0;
}
Mohit Singh
  • 401
  • 1
  • 10
  • 30
0

In your function :

int count_occur(int a[], int num_elements, int value)
/* checks array a for number of occurrances of value */
{
  int i, count = 0;
  for (i = 0; i<num_elements; i++)
  {
    if (a[i] == value)
    {
        ++count; /* it was found */
        a[i] = INFINITY;              // you can typedef INFINITY with some big number out of your bound
    }
  }  
  return(count);
}

And in main() you can edit for loop:

for (i = 0; i<20; i++)
  {
     if(a[i] != INFINITY)
     {
         num_occ = count_occur(a, 20, a[i]);
         printf("The value %d was found %d times.\n", a[i], num_occ);
     }
  }
user2110239
  • 134
  • 1
  • 1
  • 11
0

It is possible to solve with two arrays

#include <stdio.h>



int main() {

int array[12] = {1,2,2,5,2,5,7,6,2,4,2,4}; 

int array2[100] = {0};

int indicator = 1;

int i = 0,j;

int index = 0;

int number_count;

for(int i = 0; i<12;i++) {
    indicator = 1;

    for(j = i+1;j<12;j++) {

        if(array[i] == array[j]){

            indicator = -1;

            break;
        }

    }

    if(indicator == 1){

        array2[index] = array[i];
        index++;
    }
}

for(int k = 0; array2[k]; k++) {

number_count = 0;

for(int m = 0; m<12;m++){

    if(array2[k] == array[m]){

        number_count++;
    }
}

printf("%d was found %d times...\n",array2[k],number_count);
}



return 0;
}
Dr Ox
  • 1