如何在c中访问循环中的递增值

如何在c中访问循环中的递增值,c,C,我是编程新手,我对从输入中读取整数N并打印以下系列的前N个整数的代码很感兴趣: 1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6, 7, -7, ... 例如,如果N为4,则打印: 1, -1, -2, 2 我编写了我的代码,它包含一个while循环。我需要t和I的最后一个值,它们在循环中递增,在循环外递增,但不起作用 这是我的代码: #include <stdio.h> int main(void) { int n; print

我是编程新手,我对从输入中读取整数N并打印以下系列的前N个整数的代码很感兴趣:

1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6, 7, -7, ...
例如,如果N为4,则打印:

1, -1, -2, 2
我编写了我的代码,它包含一个
while
循环。我需要
t
I
的最后一个值,它们在循环中递增,在循环外递增,但不起作用

这是我的代码:

#include <stdio.h>

int main(void) {
    int n;
    printf("Enter your number: ");
    scanf("%d", &n);

    int i = 1;
    int t = 1;
    while (i <= (n / 2)) {
        int t = i;
        if (i % 2 == 0)
            t *= -1;

        printf("%d", t);
        printf(", %d, ", -t);
        i++;
    }
    if (n % 2 == 1) {
        printf("%d", -t / i * (n + 1) / 2);
    }
    return 0;
}
#包括
内部主(空){
int n;
printf(“输入您的号码:”);
scanf(“%d”和“&n”);
int i=1;
int t=1;

而(i你可以看到关于内部变量k的定义的回放隐藏了外部变量。我想说一下代码

在我看来,代码中有两种情况:第一种,你增加数字;第二种,你反转符号。另外,你在两种情况下都打印一个数字。因此,我认为,它可以实现得更清楚一些:

#include <stdio.h>

int main() {

    int n;
    printf("enter number:\n");
    scanf("%d",&n);

    for (int i = 0, sign = 1, j = 1; i < n; ++i) {
        if (i > 0)
            printf(", ");

        printf("%d",j*sign);

        if (i%2 == 0)
            sign = -sign;
        if (i%2 == 1)
            ++j;
    }

    putchar('\n');
    return 0;
}
#包括
int main(){
int n;
printf(“输入编号:\n”);
scanf(“%d”和“&n”);
对于(int i=0,sign=1,j=1;i0)
printf(“,”);
printf(“%d”,j*符号);
如果(i%2==0)
符号=-符号;
如果(i%2==1)
++j;
}
putchar('\n');
返回0;
}
关于代码的一些迭代改进 OP POST代码中至少有几个基本问题

int t=i
在循环内部对在循环外部定义的
t
进行阴影处理,退出循环时,该内部
t
将丢失。此时,表达式
-t/i*(n+1)/2中
t
的值
是1,即
t
在此范围内初始化为的值。可以通过在循环中更改
int t=i
-->
t=i
来解决此问题,方法是使用存在于循环外部的变量
t
,并允许在循环中更改该变量,但在循环退出后仍使用该变量

但是这里我们来讨论另一个问题。
t
在循环的顶部被设置为
i
的值,但是在循环退出之前,
i
被递增。这意味着当循环退出时
i
的值大于
t
的值。因此,
-t/i
在最终的打印语句中为零!1解决此问题的方法是将最终打印语句从
printf(“%d”、-t/i*(n+1)/2)
更改为
printf(“%d”、-t/(i-1)*(n+1)/2)
。请注意,当
i==1
时,此解决方案会出现严重问题;当
n==1
时会发生这种情况

由于我们实际上只在这里使用
-t
符号,因此使用以下符号可能更为清楚:

现在请注意,代码仍然存在一些重大问题。输入1会完全跳过循环,并导致不正确的输出
-1
。在系列结束后不会打印换行符(这只是一种糟糕的形式),但更糟糕的是,即使是输入也会导致打印一个末尾带有逗号和空格的系列!格式设置很重要,查看边缘大小写有助于避免错误。在这种情况下,只有一个术语的系列中的第一个数字是错误的。在以前的几个系列中(现在已删除)回答解决方案部分有效,但当输入为奇数(每秒钟奇数)时,在最后一个数字中给出了不正确的结果。课程:编写代码时调查边缘情况

当输入为1时,将永远不会进入循环,但我们只需要打印序列的第一个数字。处理此问题的简单方法是在循环之前显式处理该输入

if (n == 1) {           // n == 1: the loop is not entered
    printf("1\n");     // handle this special case
}
< P>处理格式化问题时,请考虑每个循环通过一对数字。在最后一次传递之后,当输入为奇数时,OP代码打印另一行。相反,显式地处理最后一个循环。如果循环在其最后迭代中,则在输入为奇数时打印三个数字,或在输入时打印两个数字。是偶数。否则,在典型情况下,像以前一样用逗号打印一对数字。这种编码方式允许将所有序列码(输入为
1
的特殊情况除外)带到循环内,包括允许在循环内定义
t
(进一步缩小
t
的范围)。下面是该代码的外观:

#include <stdio.h>

int main(void) {
    int n;
    printf("Enter your number: ");
    scanf("%d", &n);

    if (n == 1) {           // n == 1: the loop is not entered
        printf("1\n");     // handle this special case
    }

    for (int i = 1; i <= (n / 2); i++) {
        int t = i;         // reduced scope for `t`
        if (i % 2 == 0)
            t *= -1;

        if (i == n / 2) {  // print last numbers in the series
            if (n % 2) {   // n is odd: print 3 numbers
                printf("%d, %d, %d\n",
                       t,
                       -t,
                       (-t < 0 ? -1 : 1) * (n + 1) / 2);
            } else {       // n is even: print two numbers
                printf("%d, %d\n", t, -t);
            }
        } else {           // print typical pair in the series
            printf("%d, %d, ", t, -t);
        }
    }

    return 0;
}
运行示例:

$/a.out
输入要打印的最长序列:输入错误
输入要打印的最长系列:0
美元/年
输入要打印的最长系列:19
1.
1, -1
1, -1, -2
1, -1, -2, 2
1, -1, -2, 2, 3
1, -1, -2, 2, 3, -3
1, -1, -2, 2, 3, -3, -4
1, -1, -2, 2, 3, -3, -4, 4
1, -1, -2, 2, 3, -3, -4, 4, 5
1, -1, -2, 2, 3, -3, -4, 4, 5, -5
1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6
1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6
1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6, 7
1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6, 7, -7
1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6, 7, -7, -8
1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6, 7, -7, -8, 8
1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6, 7, -7, -8, 8, 9
1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6, 7, -7, -8, 8, 9, -9
1, -1, -2, 2, 3, -3, -4, 4, 5, -5, -6, 6, 7, -7, -8, 8, 9, -9, -10

您有两个不同的变量名为
t
,一个在
while
循环外声明,一个在循环内声明。当您在循环内修改
t
时,您只修改第二个副本。循环完成后,您将再次查看第一个变量,其值从未更改。我不认为您需要这样做有意的。另外,作为一个一般提示,始终正确缩进代码。如果编辑器不能帮助您完成此操作,请扔掉它,换一个更好的。Sam,请注意,除非您检查返回值,否则您无法正确使用任何输入函数——尽早养成良好习惯或违反(“您受到警告…”)。您需要检查
scanf
的返回值和
n>0
的值,例如
if(scanf(“%d”,&n)!=1 | | n<1){/*handle error--return
if (n == 1) {           // n == 1: the loop is not entered
    printf("1\n");     // handle this special case
}
#include <stdio.h>

int main(void) {
    int n;
    printf("Enter your number: ");
    scanf("%d", &n);

    if (n == 1) {           // n == 1: the loop is not entered
        printf("1\n");     // handle this special case
    }

    for (int i = 1; i <= (n / 2); i++) {
        int t = i;         // reduced scope for `t`
        if (i % 2 == 0)
            t *= -1;

        if (i == n / 2) {  // print last numbers in the series
            if (n % 2) {   // n is odd: print 3 numbers
                printf("%d, %d, %d\n",
                       t,
                       -t,
                       (-t < 0 ? -1 : 1) * (n + 1) / 2);
            } else {       // n is even: print two numbers
                printf("%d, %d\n", t, -t);
            }
        } else {           // print typical pair in the series
            printf("%d, %d, ", t, -t);
        }
    }

    return 0;
}
#include <stdio.h>

#define MAX_INPUT  1000

void print_series(int n);

int main(void) {
    char input[MAX_INPUT];
    int max;

    // get user input and do minimal validation
    do {
        printf("Enter longest series to print: ");
        if (fgets(input, sizeof input, stdin) == NULL) {
            puts("Input Failure");
            return 1;
        }
    } while (sscanf(input, "%d", &max) != 1);

    // printing loop
    putchar('\n');
    for (int n = 1; n <= max; n++) {
        print_series(n);
    }

    return 0;
}

void print_series(int n) {
    if (n == 1) {
        printf("1\n");
    }

    for (int i = 1; i <= (n / 2); i++) {
        int t = i;
        if (i % 2 == 0)
            t *= -1;

        if (i == n / 2) {
            if (n % 2) {
                printf("%d, %d, %d\n",
                       t,
                       -t,
                       (-t < 0 ? -1 : 1) * (n + 1) / 2);
            } else {
                printf("%d, %d\n", t, -t);
            }
        } else {
            printf("%d, %d, ", t, -t);
        }
    }
}