在C中打印每个第n个值的自定义迭代数组

时间:2016-03-22 08:48:19

标签: c arrays loops iteration

我目前正在做家庭作业,我要做的就是询问数组的大小以及我想要循环播放的内容(我应该跳过多少内容)。示例(我加粗了用户的反应)

阵列有多大? 的 10

您想如何迭代它? 3

条件:

然后它应该遍历每三个项目,然后开始循环遍历尚未被挑选的项目直到最后一个项目。我还必须从我提供的代码中看到的第一个项目(0)开始。

这就是我认为我能做到的......

int amount=0, often=0, counter=0, x;

printf("Size of Array? ");
scanf("%d", &amount);
printf("iteration size? ");
scanf("%d", &often);

// sets the array (1 means it exists)
int[] array[amount];
for(x=0; x<amount; x++)
    array[x] = 1;

// the part that I'm confused on
// supposed to iterate through everything
for(x=0; x<amount; x++){
    if(array[0] == 1){
        printf("#0\n");
        array[0]=0;
    }
    if(array[x]==1)
        counter++;
    if(counter == often){
        printf("#%d\n", x);
        array[x]=0;
        counter=0;
    }
return 0;
}

但是,我需要不断循环直到整个数组完成,除了最后一个。我循环通过一次数组后,我的停止。这是我想要的输出的输出。

  

我的输出:

     

0

     

3

     

6

     

9

     

通缉输出:

     

0

     

3

     

6

     

9

     

4

     

8

     

5

     

2

     

7

注意想要的输出如何循环通过它再次选择尚未被选中的第三个数字。这是我困惑的地方以及如何解决这个问题。任何指导或信息都会很棒,谢谢。

3 个答案:

答案 0 :(得分:3)

您需要保持循环,直到所有数字都被打印出来, 比如像这样:

int total = amount;
counter = often - 1;
while (total > 0) {
    for(x=0; x<amount; x++){
        if(array[x]==1)
            counter++;
        if(counter == often){
            printf("#%d\n", x);
            array[x]=0;
            counter=0;
            total--;
        }    
    }
}

编辑:整个程序:

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

int main (void) {
  int amount=0, often=0, counter=0, x;

  printf("Size of Array? ");
  scanf("%d", &amount);
  printf("iteration size? ");
  scanf("%d", &often);

  // sets the array (1 means it exists)
  int array[amount];  // Fixed typo in declaration
  for(x=0; x<amount; x++)
    array[x] = 1;

  // the part that I'm confused on
  // supposed to iterate through everything
  int total = amount;
  counter = often - 1;
  while (total > 0) {
    for(x=0; x<amount; x++){
      if(array[x]==1)
        counter++;
      if(counter == often){
        printf("#%d\n", x);
        array[x]=0;
        counter=0;
        total--;
      }
    }
  }
  return 0;
}

汇编:

 gcc -std=c99 -Wall a.c -o a

运行程序:

Size of Array? 10
iteration size? 3
#0
#3
#6
#9
#4
#8
#5
#2
#7
#1

答案 1 :(得分:1)

让我们从一个跳过每三个数字的循环开始:

for(int i = 0; i < amount; i += 3)
{
    print(i);

    array[i] = 0;
}

现在,这似乎仅适用于0,3,6,9。

我们希望能够从第一个现有值开始,并重复此过程直到没有任何剩余。

因此,让我们在外面放置另一个循环,以计算剩余的项目数:

int total = amount;

while(total > 0)
{
    for(int i = 0; i < amount; i += 3)
    {
        print(i);

        array[i] = 0;
        total--;
    }
}

到目前为止很好,但我们每次仍然从0开始。我们希望从特定值开始,并跳到第3个数字。

int total = amount;

while(total > 0)
{
    for(int i = getStartingIndex(array, 3); i < amount; i += 3)
    {
        while(array[i] == 0 && i < amount)
            i++;

        print(i);

        array[i] = 0;
        total--;
    }
}

让我们定义getStartingIndex函数:

int getStartingIndex(int array[], int skipCount)
{
    int index = 0;

    for(int i = 0; i < skipCount; i++)
    {
        while(array[index] == 0)
            index++;

        index++;
    }

    return index - 1;
}

现在,我们从指定的值开始,打印数字,直到达到amount。然后我们回到开头,但是我们从第三个未使用的数字开始。

答案 2 :(得分:0)

我们需要保持当前步长,它将从零运行到所需的步长,每次我们访问索引并将其标记为已访问时,我们会将该计数器重置为零。我们的主循环将逐个遍历数组,直到没有未访问的索引为止。我们确保索引不会超出数组的范围,因此当index达到数组的长度时,我们将其重置为零。

如果您不想打印最后一个元素,只需将while循环更改为while (visited_count < total_length - 1)

int main() {
    int array[10] = { 0 };
    int total_length = 10;
    int visited_count = 0;
    int index = 0;
    int step_size = 3;
    int current_step = 3;
    while (visited_count != total_length) /* while there are unvisited elements */
    {
        if (!array[index] && current_step == step_size) /* array[index] has value zero, and we are at the desired step count, so print that element and mark it as visited */
        {
            array[index] = 1;
            visited_count++;
            printf("%d\n", index);
            current_step = 0; /* resetting the step counter */
        }
        index++; /* this is how we iterate over the array, incrementing it at each iteration */
        if (index == total_length) /* checking for out-of-bounds of the array, if we hit the total length, the index should be reset. */
        {
            index = 0;
        }
        if (!array[index]) /* now that we have stepped through the array, we increment the step counter if that element is not visited. */
        {
            current_step++;
        }
    }
    return 0;
}