Array pointer while loop input

▼魔方 西西 提交于 2019-12-08 11:21:02

问题


I am trying to write a program to check for duplicate input from a programmable handheld barcode scanner, I am programming it to be able to scan 2000 barcodes.

I am new to c Programming, I am trying to take an input and put it into the array and increase the pointer to the next with every loop.

Example: int Array [10];

I want to scanf() into Array location 0 on the first loop then increment by 1 location to location 2 etc every time the while loops runs. Please help, your help is much appreciated.

#include <stdio.h>

int main ()
{
    int i,j,k=1,arr[2000],ArrSize=2000;

    //Welcome message
    printf("Welcome to Yamato Transport (S) Pte. Ltd.\n");
    printf("Barcode checker Ver 1.0\n");

    while (k>=2000,k++)
    {
        //Scanner Input
        for(i=0;i<ArrSize;i++)
        {
        scanf("%d",&arr[i]);
        }

        //Duplicate Logic
        printf("Duplicate Barcodes: ");
        for(i=0; i<ArrSize; i++)
        {
            for(j=i+1;j<ArrSize;j++)
            {
            if(arr[i]==arr[j])
            {
            printf("%d\n",arr[i]);
            }
        }
        }
        //Remove single duplicate

        //Clear Screen

    }
  return 0;
}

回答1:


The first problem with your code is this:

int i,j,k=1,...

...

while (k>=2000,k++)
        ^^^^^^
        ups...

This will give the warning "left-hand operand of comma expression has no effect" which actually means that the line is the same as:

while (k++)

That will keep looping until you have integer overflow (which is undefined behavior). So you don't want to do that.

Since you initialize k to 1, I assume that you wanted to do:

while (k++ < 2000)

Now let's assume that you want:

while (k++ < 2000)  // Will loop approx 2000 times
{
    //Scanner Input
    for(i=0; i< ArrSize; i++)  // Will loop 2000 times
    {
        scanf("%d",&arr[i]);
    }

So in the end your program calls scanf 2000 x 2000 = 4.000.000 times. Is that what you want? The purpose of the outer while is unclear.

Your program first reads 2000 integers and afterwards it seems you want to remove duplicates. That's a bad approach as you may end you doing a lot of memory move whenever you need to remove a duplicate element from the array.

A better approach is to check whether a newly scanned value is a duplicate before inserting it in the array. That could look something like:

    for(i=0; i < ArrSize; )
    {
        int tmp;
        if (scanf("%d", &tmp) != 1) 
        {
            // Input error
            exit(1);
        }

        // Check if tmp is already in the array
        int duplicate = 0;
        for (int j = 0; j < i; ++j)
        {
            if (tmp == arr[j])
            {
                duplicate = 1;
                break;
            }
        }
        if (duplicate)
        {
            printf("dup found\n");
        }
        else
        {
            arr[i] = tmp;
            ++i;
        }
    }

This should give you ArrSize unique elements.

Notice: In order to check if something is a duplicate, you'll need to scan through the array from start to the current number of elements. To improve performance you could consider another approach, e.g. a sorted tree, hash tables, etc so that check for duplicates can be done much faster. This gets more important as the number of array elements increase.




回答2:


So half the problem is solved, I am still not sure how do I increase the pointer to the next position so on the next loop it will store another barcode number which will then be passed to the duplicate checker for checking then repeat the loop for the next scan.

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

int main(void) {

int i,j,k=1,arr[2000],counter=1;
//Welcome message
  printf("Welcome to Yamato Transport (S) Pte. Ltd.\n");
  printf("Barcode checker Ver 1.0\n");

  while (k++ < 2000)  // Will loop approx 2000 times
{
//Scanner Input
printf("Scan barcode\n");
for(i=0; i< counter; i++)  // Will loop 1 time
{
    scanf("%d",&arr[i]);
}

  //check for duplicates
  for(i=0; i < counter; )
    {
        int tmp;
        if (scanf("%d", &tmp) != 1) 
        {
            // Input error
            exit(1);
        }

        // Check if tmp is already in the array
        int duplicate = 0;
        for (int j = 0; j < i; ++j)
        {
            if (tmp == arr[j])
            {
                duplicate = 1;
                break;
            }
        }
        if (duplicate)
        {
            printf("Duplicate Barcode\n");
        }
        else
        {
            arr[i] = tmp;
            ++i;
        }
    }

  }
  return 0;
}


来源:https://stackoverflow.com/questions/57984336/array-pointer-while-loop-input

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!