Внедрение в C - Появление кода 2018: День 1_2 - PullRequest
0 голосов
/ 29 апреля 2019

Это проблема:

Вы заметили, что устройство повторяет один и тот же список изменения частоты снова и снова.Для калибровки устройства вам нужно найти первую частоту, которую оно достигает дважды.

Например, используя тот же список изменений, что и выше, устройство будет работать следующим образом:

  • Текущийчастота 0, изменение +1;результирующая частота 1.
  • Текущая частота 1, изменение -2;результирующая частота -1.
  • частота тока -1, изменение +3;результирующая частота 2.
  • Текущая частота 2, изменение +1;результирующая частота 3.
  • (На этом этапе устройство продолжает с начала списка.)
  • Текущая частота 3, изменение +1;результирующая частота 4.
  • Текущая частота 4, смена -2;результирующая частота 2, которая уже была замечена.

В этом примере первая частота, достигнутая дважды, равна 2. Обратите внимание, что вашему устройству может потребоваться повторять свой список изменений частоты много раз, прежде чем дублировать частоту.найден, и что дубликаты могут быть найдены в процессе обработки списка.

Вот другие примеры:

  • + 1, -1 сначала достигает 0 дважды.
  • + 3, +3, +4, -2, -4 сначала достигает 10 дважды.
  • -6, +3, +8, +5, -6 сначала достигает 5 дважды.
  • + 7, +7, -2, -7, -4 сначала дважды достигает 14.

Какую первую частоту достигает ваше устройство дважды?

Вот моя реализация в C, которая перебирает весь список, но никогда не находит соответствия.

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

int main(void){

    int sum = 0;
    int q = 0;
    int len = 0;
    char buffer[20];
    int val = 0;
    int list[2000];
    int *plist = list;

    FILE *pFile = NULL;
    pFile = fopen("input.txt", "r");
    if (pFile == NULL){
        printf("file failed to open\n");
        return -1;
    }

    while((fgets(buffer, 20, pFile)) != NULL){  //store all the sums (calculated frequncies induced by changes) in an array called list
        sum += atoi(buffer);
        *plist = sum;
        ++plist;
        ++len;
        }

    fclose(pFile);
    pFile = NULL;
    plist = list;

    printf("length is %d\n\n", len);

    //below will now iterate through the loop and treat it as circular, so up to the element before current element 

    for(int i = 0; i < len && val == 0; ++i){
        for(int j = i + 1; j < len + i; ++j){
            if (j >= len)
                q = abs(len - j);
            else
                q = j;
            printf("here is i: %d\there is j: %d\n", list[i], list[q]);
            if(list[i] == list[q]){
                val = list[i];
                break;
            }
        }
    }

    printf("the first frequency is %d\n", val);
    getchar();
    return 0;
}

1 Ответ

0 голосов
/ 29 апреля 2019

Есть несколько проблем с вашим кодом.Самое главное, что вы перебираете список изменений частоты только один раз, хотя даже в описании задачи упоминается, что вам может потребоваться сделать это несколько раз.Решение состоит в том, чтобы прочитать файл изменений в массив, а затем создать второй массив с суммами (как вы делаете это сейчас), применив первый несколько раз, начиная с начальной частоты = 0. Кроме того, массив суммы после инициализации должен быть вставленЭлемент 0 в начале, который является начальной частотой.

Я не знаю ваш формат входного файла, поэтому вам нужно проверить, что он читается, как ожидалось.Тем не менее, я проверил 2-ю часть вашего кода (двойной цикл) с массивом list, инициализированным обеими последовательностями сумм +1, -1 и +3, +3, +4, -2, -4 (с повторением последнегодважды), и все работало нормально.

Два других изменения, которые следует учитывать:

  • Не используйте val == 0 в качестве условия остановки цикла;если 0 является повторяющимся значением, цикл будет повторяться по всем элементам.Вместо этого рассмотрите возможность использования флага (например, булевой переменной) для выхода из внутреннего и внешнего циклов.
  • Нет необходимости «рассматривать цикл как круговой», достаточно сравнить текущий элемент со всеми будущими элементами.

Надеюсь, что поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...