替换数组中的元素

时间:2013-11-22 07:13:08

标签: c arrays

我有一个问题,给我一个巨大的疼痛。 这段代码的目的是用一个整数值填充一个数组,同时防止字符串等....但它不能防止重复,但尝试我远远地用新的替换数字例如,数字 输入6个整数 1,2,3,4,5,5

我的代码将让我用另一个数字替换位置1的2。我想要它做的是不要再重复相同的数字,例如请在位置1替换2.我不希望用户再次输入2 ...我想让它仔细检查数组的工作如果任何重复的数字都存在,谢谢。

        system("clear");
        printf("\nEntering Winning Tickets....\n");
        nanosleep((struct timespec[]){{1, 0}}, NULL);

        system("clear");
        char userInput[256];
        char c;

        int duplicationArray[6] = {-1, -1, -1, -1, -1, -1};
        for (i = 0; i < 6; i++)
        {
            printf("\nPlease enter the %d winning ticket number!(#'s must be between 1-49): ", i+1);
            fgets(userInput, 256, stdin);
            if ((sscanf(userInput, "%d %c", &winningNumbers[i], &c) != 1 || (winningNumbers[i] <= 0) || winningNumbers[i] >= 50))
            {
                printf("\nInvalid Input.\n") ;
                nanosleep((struct timespec[]){{0, 350000000}}, NULL);
                system("clear");
                i = i - 1;
            }
        }

        for (i = 0; i < 6 - 1; ++i)
        {

            min = i;
            for (j = i+1; j < 6; ++j)
            {
                if (winningNumbers[j] < winningNumbers[min])
                    min = j;
            }

            temp = winningNumbers[i];
            winningNumbers[i] = winningNumbers[min];
            winningNumbers[min] = temp;

        }

        for (i = 0; i < 6; i++)
        {
            if (winningNumbers[i] == winningNumbers[i+1])
            {
                duplicationArray[i] = i;
                duplicationCounter++;

            }

            else
            {
                duplicationCounter--;
            }
        }


           if (duplicationCounter > -6)

        {

            for (i = 0; i < 6; i++)
            {
                int j, min, temp;
                min = i;
                for (j = i+1; j < 6; ++j)
                {
                    if (duplicationArray[j] > duplicationArray[min])
                        min = j;
                }

                temp = duplicationArray[i];
                duplicationArray[i] = duplicationArray[min];
                duplicationArray[min] = temp;

            }

            for (i = 0; i < 6; i++)
            {
                if (duplicationArray[i] == -1)
                {
                    zeroCounter++;
                }
            }
            int resize = (6 - zeroCounter)+1;

            for (i = 0; i <= resize; i++)
            {
                if (duplicationArray[i] == -1)
                {
                    i++;
                }

                else if (duplicationArray[i] != -1)
                {
                    system("clear");

                    printf("\nDuplicated numbers has been dected in your array. ");
                    printf("\nPlease replace the number %d at postion %d with another number: ", winningNumbers[duplicationArray[i]], duplicationArray[i]);
                    fgets(userInput, 256, stdin);

                    if ((sscanf(userInput, "%d %c", &winningNumbers[duplicationArray[i]], &c) != 1 || (winningNumbers[i] <= 0) || winningNumbers[i] >= 50))
                    {
                        printf("\nInvalid Input.\n") ;
                        nanosleep((struct timespec[]){{0, 350000000}}, NULL);
                        system("clear");
                        i = i - 1;
                    }
                }               
            }

            duplicationCounter = 0;

            for (i = 0; i < 6; i++)
            {
                if (winningNumbers[i] == winningNumbers[i+1])
                {
                    duplicationArray[i] = i;
                    duplicationCounter++;

                }

                else
                {
                    duplicationCounter--;
                }

            }

            printf("%d, ", duplicationCounter);

        }

2 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdint.h>

#define DATA_SIZE 6

int main(void){
    char userInput[256];
    int inputNum, winningNumbers[DATA_SIZE];
    uint64_t table = 0;
    int i=0;
    while(i<DATA_SIZE){
        printf("\nPlease enter the %d winning ticket number!(#'s must be between 1-49): ", i+1);
        fgets(userInput, sizeof(userInput), stdin);
        if(sscanf(userInput, "%d", &inputNum) != 1 || inputNum <= 0 || inputNum >= 50)
            continue;
        uint64_t bit = 1 << inputNum;
        if(table & bit)
            continue;
        table |= bit;
        winningNumbers[i++] = inputNum;
    }
    for(i=0;i<DATA_SIZE;++i)
        printf("%d ", winningNumbers[i]);
    printf("\n");
    return 0;
}

答案 1 :(得分:0)

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

#define DATA_SIZE 6

int inputNumberWithRangeCheck(const char *msg, const char *errMsg, int rangeStart, int rangeEnd){
    char inputLine[256];
    int n;

    for(;;){
        printf("%s", msg);
        fgets(inputLine, sizeof(inputLine), stdin);
        if(sscanf(inputLine, "%d", &n) != 1 || n < rangeStart || n > rangeEnd)
            fprintf(stderr, "%s", errMsg);
        else
            return n;
    }
}

int inputNumber(void){
    return inputNumberWithRangeCheck(
        "\nPlease enter the winning ticket number!(#'s must be between 1-49): ",
        "Invalid Input.\n",
        1,49);
}

int *inputArray(int *array, size_t size){
    int i;
    for(i=0;i<size;++i){
        printf("\nInput for No.%d\n", i+1);
        array[i] = inputNumber();
    }
    return array;
}

int **duplicateCheck(int *array, size_t size){
    int **check, count;
    int i, j;

    check = malloc(size*sizeof(int*));
    if(!check){
        perror("memory allocate\n");
        exit(-1);
    }
    //There is no need to sort the case of a small amount of data
    //(Cost of this loop because about bubble sort)
    for(count=i=0;i<size -1;++i){
        for(j=i+1;j<size;++j){
            if(array[i] == array[j]){
                check[count++] = &array[i];
                break;
            }
        }
    }
    check[count] = NULL;
    if(count)
        return check;
    else {
        free(check);
        return NULL;
    }
}

int main(void){
    int winningNumbers[DATA_SIZE];
    int **duplication;
    int i, j;

    inputArray(winningNumbers, DATA_SIZE);

    while(NULL!=(duplication = duplicateCheck(winningNumbers, DATA_SIZE))){
        for(i=0;i<DATA_SIZE;++i){
            if(duplication[i]){
                printf("\nyour input numbers : ");
                for(j=0;j<DATA_SIZE;++j)
                    printf("%d ", winningNumbers[j]);
                fprintf(stderr, "\nThere is duplicate. Please re-enter.\n");
                *duplication[i] = inputNumber();
            } else
                break;
        }
        free(duplication);
    }
    for(i=0;i<DATA_SIZE;++i)
        printf("%d ", winningNumbers[i]);
    printf("\n");
    return 0;
}