填充数组

时间:2018-05-02 11:27:32

标签: c arrays if-statement while-loop

我试图填写用户输入中缺少的数字(存储在数组中。例如,如果用户输入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 :(得分:1)

当你遇到逻辑问题时,最好逐行检查,看看会发生什么。我不太明白你在循环中想要做什么,所以让我们逐块浏览并假装我们使用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;
}

我是0,所以这一行证明了if(1 == 2)。它被跳过了。

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

这证明了if(0> = 5 AND 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的代码。因为我们现在已经完成了它,所以我们可以看到代码不输出任何内容的至少一个原因。

答案 1 :(得分:0)

你做了很多我不理解的事情。无论如何,这是一个快速尝试:

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()

答案 2 :(得分:0)

这是另一个不太复杂的想法,不需要排序输入,但提供有序输出:

#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);
    }
}

online demo

答案 3 :(得分:0)

让我们解读这个:

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
}