为什么我不能用随机字母换出for循环的变量?

Why can't I swap out the variable of the for loop with a random letter?

我正在写一个整数到罗马数字的转换器。这一次,妥妥的。

正在尝试解决打印900s、90s、9s的问题;我在 while 循环中写了一个 for 循环(只持续一个循环,因为它的目的是防止打印 CMCMCMCM 而不是 CM)。但是对于for循环的变量,我没注意就用了和while循环中的"n"一样的"n"。

运行 它,工作正常;然后注意到假定的错误。用 "A" 交换它,将 "A" 插入 int cd, cl,..... 列表。 AAAaa 结果是完全偏离轨道的数字混乱。

我不明白代码如何能正确使用重复使用的循环变量,但不能使用新循环变量。

#include<stdio.h>
int main()
{
    int num, m, c, d, l, x, v, i, n, cm, cd;
    printf("Enter Number: ");
    scanf_s("%d", &num);
        m = num / 1000;
        d = (num % 1000) / 500;
        c = (num % 500) / 100;
        l = (num % 100) / 50;
        x = (num % 50) / 10;
        v = (num % 10) / 5;
        i = (num % 5);
        n = m + d + c + l + x + v + i;
        while (n > 0)
        {
            {
                for (m; m > 0; m--)
                {
                    printf("M");
                }
            }
            {
                for (n=1; n>0; n--)
                {
                    if (num%1000>=900)
                    {
                        printf("CM");
                        d = d - 1;
                        c = c - 4;
                        num = num - 900;
                    }
                }
            }
            {
                for (d; d > 0; d--)
                    printf("D");
            }
            {
                for (n = 1; n > 0; n--)
                {
                    if (num % 500 >= 400)
                    {
                        printf("CD");
                        c = c - 4;
                    }
                }

            }
            {
                for (c; c > 0; c--)
                    printf("C");
            }
            {
                for (l; l > 0; l--)
                    printf("L");
            }
            {
                for (x; x > 0; x--)
                    printf("X");
            }
            {
                for (v; v > 0; v--)
                    printf("V");
            }
            {
                for (i; i > 0; i--)
                    printf("I");
            }
            n--;
        }
        return 0;
}

请记住,900、400 等的 for 循环尚未完成,因为我在编写 900 单循环后注意到了这一点。

首先,您计算输出中每个不同字母的数量。然后你有一个 while 循环 运行 n 减少到 0,即循环体运行 n 次。在循环内部,您有一系列 for 循环,每个循环对应一个不同的字母。如果你省略了使用 n 的 for 循环,你就是这样做的:

  • 计算输出中每个字母的个数:mdc等以及n也就是字母总数(以加法表示法)。
  • 重复n次:
    • 打印 Mm 次。
    • 打印 Dd 次。
    • 等等

结果是,如果没有修改 n 的内部循环,您将多次打印结果。

以加法表示法打印罗马数字的正确算法(4 是 IIII,等等)是:

  • 计算mdc
  • 打印 Mm 次。
  • 打印 Dd 次。
  • 等等

如果没有修改 n 的 for 循环,您将重复正确的算法 n 次:

while (n > 0) {
    … /* code that doesn't modify n and prints the desired output */
    n--;
}

对于修改 n 的 for 循环,您在 while 循环体内将 n 设置为 0,因此循环体末尾的 n-- 设置n 到 -1,while 循环在第一次迭代后终止。

while (n > 0) {
    … /* some code */
    for (n = 1; n > 0; n--) {
        … /* more core */
    }
    /* On exit of this for loop, the value of n is 0. */
    … /* more code that doesn't modify n */
    n--;
}

解决方法很简单:删除 while 循环,因为您总是希望只执行一次循环体。删除要打印的字母总数的计算:不需要。使用 n 的 for 循环也只执行一次它们的主体,因此它们也无用。这是结果(我已经统一了缩进并删除了无用的大括号,但除此之外我没有寻求改进程序):

#include<stdio.h>
int main()
{
    int num, m, c, d, l, x, v, i, cm, cd;
    printf("Enter Number: ");
    scanf("%d", &num);
    m = num / 1000;
    d = (num % 1000) / 500;
    c = (num % 500) / 100;
    l = (num % 100) / 50;
    x = (num % 50) / 10;
    v = (num % 10) / 5;
    i = (num % 5);
    for (m; m > 0; m--)
    {
        printf("M");
    }
    if (num%1000>=900)
    {
        printf("CM");
        d = d - 1;
        c = c - 4;
        num = num - 900;
    }
    for (d; d > 0; d--)
        printf("D");
    if (num % 500 >= 400)
    {
        printf("CD");
        c = c - 4;
    }
    for (c; c > 0; c--)
        printf("C");
    for (l; l > 0; l--)
        printf("L");
    for (x; x > 0; x--)
        printf("X");
    for (v; v > 0; v--)
        printf("V");
    for (i; i > 0; i--)
        printf("I");
    return 0;
}