Заполнение пропущенных номеров из массива - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь заполнить пропущенные числа из пользовательского ввода (который хранится в массиве. Например, если пользователь вводит 9, 5, 2, 7, 1. Моя программа должна вывести пропущенные числа, которые 3, 4, 6, 8.

Вы видите, что пропущенные цифры выделены жирным шрифтом: 1, 2, 3 , 4 , 5, 6 , 7, 8

Однако мой код не работает. Цикл while не работает. Я чувствую, что моя логика работает, но ничего не выводит.

void missing_num(int length, int numbers[]) { // length is the length of the array

// A function which finds the biggest number the user inputed
int big_num_answer = biggest_num(length, numbers);

// A functon which finds the smallest number the user inputed
int small_num_answer = smallest_num(length, numbers);

int has_been_used = 0;
int i = 0;
int start_num = small_num_answer;
while(start_num <= big_num_answer) {

    if(numbers[i] == start_num + 1) {
        start_num += 1;
        has_been_used = 1;
    } else if(i >= length && has_been_used == 0) {
        printf("%d", start_num + 1);
    }

    i++;
    if (i > length) {
        i = 0;
    }
}

}

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Давайте рассмотрим это:

int start_num = small_num_answer;
while(start_num <= big_num_answer) {

Вы хотите вернуться от наименьшего к наибольшему числу, пока все хорошо.

    if(numbers[i] == start_num + 1) {

проблема начинается здесь Я не совсем уверен, но я думаю, что вы хотите проверить, есть ли следующее число в массиве, но вы проверяете только numbers[i] вместо всех элементов numbers.

        start_num += 1;
        has_been_used = 1;

Если текущее число есть, вы увеличиваете целое число для поиска на единицу. И установите флаг, что он находится в массиве. Но вы никогда не сбросите это значение. Так что это всегда будет 1.

    } else if(i >= length && has_been_used == 0) {
        printf("%d", start_num + 1);
    }

здесь вы проверяете, находится ли массив в границах (слишком поздно, поскольку вы использовали numbers[i] без проверки ранее. И проверяете (не работает) флаг, было ли число на входе.

    i++;
    if (i > length) {
        i = 0;
    }
}

Наконец вы проверяете, что i не больше, чем length, что является хорошей идеей, но i = length уже вышел за пределы, поскольку мы начинаем считать с 0.


Я пытаюсь дать вам что-то в духе вашего подхода, но вам понадобится второй цикл для итерации i по всему массиву.

while(start_num < big_num_answer) {

  for(i = 0; i < length; i++){ //iterate though the whole array

    if(numbers[i] == start_num + 1) {
        has_been_used = 1;
    }
  }

  if (has_been_used == 0){
    printf("%d", start_num + 1); //print if not found
  }

  has_been_used = 0; // reset flag
  start_num++; // next elelemt
}
0 голосов
/ 02 мая 2018

Когда у вас возникают проблемы с логикой, лучше просто пройтись по ней и посмотреть, что произойдет. Я не совсем понимаю, что вы пытаетесь сделать в цикле, поэтому давайте пройдемся по нему блок за блоком и представим, что мы используем 1, 2, 5, 7, 9 в качестве входных данных.

while(start_num <= big_num_answer) {

Довольно просто. Цикл while продолжается, пока start_num меньше или равен наибольшему числу. start_num, в данном случае, равно 1.

if(numbers[i] == start_num + 1) {
    start_num += 1;
    has_been_used = 1;
}

i равно 0, поэтому эта строка переходит в if (1 == 2). Это пропущено.

else if(i >= length && has_been_used == 0) 
{
    printf("%d", start_num + 1);
}

Это происходит, если (0> = 5 И 0 = 0). Он пропущен и номера не выводятся.

i++;
if (i > length) {
    i = 0;
}

Теперь я 1. Давайте снова пройдемся по циклу.

if(numbers[i] == start_num + 1) {
    start_num += 1;
    has_been_used = 1;
}

Обращается к if (2 == 2). Так что теперь start_num = 2 и has_been_used = 1.

else if(i >= length && has_been_used == 0) 
{
    printf("%d", start_num + 1);
}

Блок else полностью пропускается, поскольку выполнено другое условие. И этот блок никогда не будет выполнен снова, потому что has_been_used был установлен в 1, и у вас нет кода, который возвращает has_been_used обратно в 0. Поскольку мы пробежали по нему сейчас, мы можем увидеть хотя бы одну причину, по которой код ничего не выводит.

0 голосов
/ 02 мая 2018

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

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

int numbers[1024];
int max = INT_MIN;
int min = INT_MAX;
size_t n;

int main(void) {
    while (n < 1024)
    {
        // use something better then scanf for "production quality" code
        if (scanf("%d", numbers + n++) != 1) break;
        if (numbers[n-1] > max) max = numbers[n-1];
        if (numbers[n-1] < min) min = numbers[n-1];
    }
    if (max > min && max - min)
    {
        size_t rangesize = max - min - 1;

        // use an array of "markers" for the numbers present in the input
        char *used = calloc(1, rangesize);
        if (!used) return 1;

        // set the markers
        for (size_t i = 0; i < n; ++i)
        {
            if (numbers[i] > min && numbers[i] < max)
            {
                used[numbers[i]-min-1] = 1;
            }
        }

        // and use them for output
        for (size_t i = 0; i < rangesize; ++i)
        {
            if (!used[i])
            {
                printf("%d ", (int)i + min + 1);
            }
        }

        puts("");
        free(used);
    }
}

демоверсия

0 голосов
/ 02 мая 2018

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

static void print_with_missing(const int *array, size_t length)
{
    int last = *array;
    printf("%d", last);
    for (size_t i = 1; i < length;)
    {
        while (array[i] != last + 1)
        {
            printf(" %d", ++last);
        }
        printf(" %d", array[i]);
        last = array[i++];
    }
}

если вызывается с вашим образцом массива ({ 1, 2, 5, 7, 9 }), вывод будет:

1 2 3 4 5 6 7 8 9

Примечание: требуется сортировка ввода, что, кажется, имеет смысл. Если вы не хотите показывать это, просто сначала вызовите qsort() внутри функции, конечно.

...