为标题道歉,但我找不到已经提出的类似问题。隐含地,我的问题是如何实现一个从初始值开始并向上递增直到达到特定点的计数器,然后递减回原始值。请允许我提供一个示例,以更好地建议我的意思
kk_points_alive<-read.table("kk_alive.txt", stringsAsFactors = F, sep="\t", header=T)
kk_given<-read.table("kk_given.txt", stringsAsFactors = F, sep="\t", header=T)
kk_expired<-read.table("kk_expired.txt", stringsAsFactors = F, sep="\t", header=T)
list.data<-list()
for(i in 1:length(R_24_back)) {
print(paste("Calculating point alive in month (24 months)","--->", R_24_back[i]))
alive <- kk_points_alive[which(kk_points_alive$Month %in% R_24_back[(i+1):length(R_24_back)] & kk_points_alive$Saldo_Vivo > 0), ]
given <- kk_given[which(kk_given$Month %in% R_24_back[1:i] & kk_given$MODAT_R_MES %in% R_24_back[(i+1):length(R_24_back)]), ]
expired <- kk_expired[which(kk_expired$Month %in% R_24_back[1:i] & kk_expired$AMes_emision %in% R_24_back[(i+1):length(R_24_back)]), ]
list.data[[R_24_back[i]]] <- bind_rows(alive, given, expired)
list.data[[R_24_back[i]]]$Month <- R_24_back[i]
}
Total<- do.call(rbind.data.frame, list.data)
运行时,程序将为#include <stdio.h>
int main(void) {
int i = 0;
for(i = 0; i <= 10; i++) {
printf("i = %d\n", i);
if(i == 5) {
int j = i;
for(j = i; j >= 0; j--) {
printf("j = %d\n", j);
}
}
}
return 0;
}
打印0-5值,然后为i
打印5-0,然后为j
打印6-10。取而代之的是,我只想让程序为i
打印0-5,然后为i
打印5-0(如果需要另一个变量,则打印i
)。
答案 0 :(得分:3)
您可以在建议的注释中使用两个独立的循环,例如Rafalon。
如果您想要一个循环,则可以执行以下操作(使用OPs注释中的信息对其进行修改):
int ctr_dir = 80;
int upper_value = 500;
for(int i = 0; i >= 0; i += ctr_dir)
{
printf("%d", i);
if (i > upper_value)
ctr_dir = -80;
}
答案 1 :(得分:2)
您正在使这不必要地复杂。
for(int i=0; i<6; i++) // print 0 to 5
{
printf("%d\n", i);
}
for(int i=0; i<6; i++) // print 5 to 0
{
printf("%d\n", 5-i);
}
答案 2 :(得分:0)
虽然我不完全了解编写代码的原因,但其中缺少的内容是break
语句中的if
,它将退出循环而不是继续并打印出6到10。
for(i = 0; i <= 10; i++) {
printf("i = %d\n", i);
if(i == 5) {
int j = i;
for(j = i; j >= 0; j--) {
printf("j = %d\n", j);
}
break; // Exit the loop
}
}
答案 3 :(得分:0)
我认为简单是最好的,但是您说“我的问题更复杂”(我不知道还有多少!?),我写了一个更“复杂”的版本...
您可以这样做,
但是此代码的问题是过冲。也就是说,如果步长大于1,则可以传递最大值。 :)
#include <stdio.h>
void WaveGenerator(int start, int step, int max, int times)
{
int value = start;
times *= 2;
printf("%d", value);
while(times)
{
value += step;
if ((value <= start) || (value >= max))
{
step *= -1;
times--;
}
printf("%d", value);
}
}
int main()
{
int i;
WaveGenerator(1, 1, 5, 2);
return 0;
}
答案 4 :(得分:0)
这里有很多不同的解决方案,包括我已经发表的评论。
让我在这里添加另一个,类似于@izlin的但又有所不同:
int i=0;
int j=0;
int max=10;
for(i=0;i<=max;i++)
{
printf("%d\n", j);
if(i<max/2)
j++;
else
j--;
}
// max=10 > 0 1 2 3 4 5 4 3 2 1 0
// max=11 > 0 1 2 3 4 5 4 3 2 1 0 -1
请注意,根据max
的奇偶性,该值将降为0
或-1
。
可以通过以下方式进行调整:
int i=0;
int j=0;
int max=10;
for(i=0;i<=max;i++)
{
Console.WriteLine(j);
if(i<max/2)
j++;
else if(i>(max-1)/2)
j--;
}
// max=10 > 0 1 2 3 4 5 4 3 2 1 0
// max=11 > 0 1 2 3 4 5 5 4 3 2 1 0
因此,如果max
为奇数,它将两次写入最高数字;如果偶数为偶数,则将其写入最高数字,但始终以0
开始和结束。
但是,正如我在评论中所建议的那样,我仍将使用2个循环:
int i=0;
int max=5;
for(i=0;i<=max;i++)
{
printf("%d\n", i);
}
// 0 1 2 3 4 5
for(i=max;i>=0;i--)
{
printf("%d\n", i);
}
// 5 4 3 2 1 0
答案 5 :(得分:0)
由于无论要上升还是下降,您要执行的工作都是相同的,因此您不希望使用单独的循环,因为您会重复自己。
您可以使用一个标志来指示您是否已达到上限,从而在一个循环中完成此操作。如果未设置该标志,则递增;如果您未递减,则递减。
int increment = 5, limit = 50;
int i = 0, go_back = 0;
while (i>=0) {
printf("%d\n", i);
if (i >= limit) {
go_back = 1;
}
if (go_back) {
i -= increment;
} else {
i += increment;
}
}