Нахождение определенной комбинации в текстовом файле - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть текстовый файл комбинаций без повторения 6 чисел в диапазоне от 1 до 10, например:

2 3 8 9 6 4 
8 3 1 4 7 9 
1 3 5 7 6 9 
1 5 7 9 8 4 
1 3 5 4 8 7 
2 4 6 8 7 1 
6 7 8 3 5 9 
3 1 6 2 7 9 
1 7 4 2 5 8 
3 4 9 2 1 7 
...

, и у меня есть золотая комбинация, скажем, 2, 1, 3, 9, 8, 5

Я хочу проверить, сколько раз у меня в текстовом файле есть комбинация, которая соответствует 5 числам золотой комбинации. Это моя попытка кода:

// Including C Standard Libraries
#include <stdint.h>

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

int main()
{

    // Gold Combination
    int n1 = 2;
    int n2 = 1;
    int n3 = 3;
    int n4 = 9;
    int n5 = 8;
    int n6 = 5;

    // Numbers of Matching Combinations
    int match_comb = 0; 

    // Creating a file to see combinations content
    char ch, file_name[25];
    FILE *fp;

    fp = fopen("combinations.txt", "r");  // Read Mode

    if (fp == NULL)
    {
        perror("Error while opening the file.\n");
        exit(EXIT_FAILURE);
    }

    int j = 0;
    int mn = 0;  // Number of matched numbers
    int x[6] = {0,0,0,0,0,0};

    char c;

    while((c = fgetc(fp)) != EOF)
    {
        if(c == ' ' || c == '\n')
        {

        }
        else
        {

            x[j] = c;


            if (j == 5)
            {
                if(x[0]==n1 || x[0]==n2 || x[0]==n3 || x[0]==n5 || x[0]==n6){
                    mn += 1;
                }if(x[1]==n1 || x[1]==n2 || x[1]==n3 || x[1]==n5 || x[1]==n6){
                    mn += 1;
                }if(x[2]==n1 || x[2]==n2 || x[2]==n3 || x[2]==n5 || x[2]==n6){
                    mn += 1;
                }if(x[3]==n1 || x[3]==n2 || x[3]==n3 || x[3]==n5 || x[3]==n6){
                    mn += 1;
                }if(x[4]==n1 || x[4]==n2 || x[4]==n3 || x[4]==n5 || x[4]==n6){
                    mn += 1;
                }if(x[5]==n1 || x[5]==n2 || x[5]==n3 || x[5]==n5 || x[5]==n6){
                    mn += 1;
                }

                if ( mn == 5)
                {
                    match_comb += 1;  // Adding One the the Match Combinantions counter
                }

                for (int i = 0; i < 6; ++i)  // Resetting x array
                {
                    x[i] = 0;
                }    

                mn = 0;  // Resetting
                j = -1;  // Resetting j

            }

            j += 1;


        }
    }


    printf("Number of Matching Combinations:");
    printf("%d", match_comb);
    printf("\n");

    fclose(fp);

    return 0;
}

Но я думаю, что код не работает, потому что он всегда говорит, что есть 0 подходящих комбинаций. Есть ли способы упростить или заставить мой код работать?

также, это работает только для чисел с одной цифрой, но в случае, если у меня есть больший диапазон, скажем, 1-20, я не совсем уверен, как собрать числа из текстового файла. Я думал в состоянии, когда после каждого пробела был счетчик, если счетчик равен единице, возьмите символ как число из одной цифры, если счетчик равен двум, соберите два символа и сделайте что-нибудь, чтобы сообщить коду кодсобрать два символа и использовать полученное число, но я не знаю, как это сделать ..

Редактировать:

int main()
{

    // Gold Combination
    int n1 = 20;
    int n2 = 1;
    int n3 = 35;
    int n4 = 9;
    int n5 = 18;
    int n6 = 5;

    // Numbers of Matching Combinations
    int match_comb = 0; 

    // Creating a file to see combinations content
    char ch, file_name[25];
    FILE *fp;

    fp = fopen("combinations.txt", "r");  // Read Mode

    if (fp == NULL)
    {
        perror("Error while opening the file.\n");
        exit(EXIT_FAILURE);
    }

    int j = 0;
    int mn = 0;  // Number of matched numbers
    int x[6] = {0,0,0,0,0,0};

    int c;

    while((c = fgetc(fp)) != EOF)
    {

        //x[j] = fscanf(fp, "%d", &c);

        fscanf(fp, "%d %d %d %d %d %d", &x[0], &x[1], &x[2], &x[3], &x[4], &x[5]);

        printf("%d", x[0]);
        printf(" ");
        printf("%d", x[1]);
        printf(" ");
        printf("%d", x[2]);
        printf(" ");
        printf("%d", x[3]);
        printf(" ");
        printf("%d", x[4]);
        printf(" ");
        printf("%d", x[5]);

        if(x[0]==n1 || x[0]==n2 || x[0]==n3 || x[0]==n5 || x[0]==n6){
            mn += 1;
        }if(x[1]==n1 || x[1]==n2 || x[1]==n3 || x[1]==n5 || x[1]==n6){
            mn += 1;
        }if(x[2]==n1 || x[2]==n2 || x[2]==n3 || x[2]==n5 || x[2]==n6){
            mn += 1;
        }if(x[3]==n1 || x[3]==n2 || x[3]==n3 || x[3]==n5 || x[3]==n6){
            mn += 1;
        }if(x[4]==n1 || x[4]==n2 || x[4]==n3 || x[4]==n5 || x[4]==n6){
            mn += 1;
        }if(x[5]==n1 || x[5]==n2 || x[5]==n3 || x[5]==n5 || x[5]==n6){
            mn += 1;
        }

        if ( mn == 5)
        {
            match_comb += 1;  // Adding One the the Match Combinantions counter
        }

        for (int i = 0; i < 6; ++i)  // Resetting x array
        {
            x[i] = 0;
        }    

        mn = 0;  // Resetting

        printf("\n");


    }

    printf("Number of Matching Combinations:");
    printf("%d", match_comb);
    printf("\n");

    fclose(fp);

    return 0;
}

1 Ответ

1 голос
/ 02 ноября 2019

Проблема заключается в:

x[j] = c;

Это присваивает символ целому числу. Вам нужно преобразовать с в целое число. Например, вычитая код символа из нуля:

x[j] = c-'0';

Вы можете использовать isdigit(c), чтобы проверить, действительно ли c является цифрой.

Либо с помощью отладчика, либоиспользуя printf для отображения точных значений x[0], x[1], ..., вы получите более четкое представление о том, что идет не так.

Что касается чтения чисел, состоящих более чем из 1 цифры, лучше всего использовать функциюнапример, fscanf(fp, "%d", &c), который автоматически преобразует прочитанные символы в число. Обратите внимание, что если вы используете &c здесь, c должен быть целым числом, а не символом.

Если вы хотите работать с fscanf, вам нужно удалить вызовы к fgetc (в вашем цикле while), потому что в противном случае fgetc каждый раз удаляет символ. Удаление символа не является проблемой, если это пробел или символ новой строки, но это проблема для первой цифры в строке. Когда fgetc больше нельзя использовать для проверки конца файла, используйте возвращаемое значение fscanf, как описано в этого поста . Например:

while (true)  // endless loop, but will end via a 'break'
{
    //  remove if(c == ' ' || c == '\n')
    if (fscanf(fp, "%d", &c) != 1)  // check whether fscanf found 1 input
        break; // this jumps out of the while loop
    ....  // rest of your code
}

Если вы действительно хотите использовать fgetc для чтения чисел, вам нужно что-то вроде:

if (isdigit(c))
    num = num * 10 + (c - '0');

и еще не ставьте num в X-array, пока не встретите не цифру. После этого num необходимо сбросить до 0.

Что касается кода, который вы используете для вычисления количества совпадений, он выглядит довольно умно, если вы полностью новичок в программировании. Улучшение будет заключаться в том, чтобы также поместить значения n в массив и использовать циклы for для проверки количества совпадений.

...