我目前正在做家庭作业,我要做的就是询问数组的大小以及我想要循环播放的内容(我应该跳过多少内容)。示例(我加粗了用户的反应)
阵列有多大? 的 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
注意想要的输出如何循环通过它再次选择尚未被选中的第三个数字。这是我困惑的地方以及如何解决这个问题。任何指导或信息都会很棒,谢谢。
答案 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;
}