为什么我不能用随机字母换出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 循环,你就是这样做的:
- 计算输出中每个字母的个数:
m
、d
、c
等以及n
也就是字母总数(以加法表示法)。
- 重复
n
次:
- 打印
M
、m
次。
- 打印
D
、d
次。
- 等等
结果是,如果没有修改 n
的内部循环,您将多次打印结果。
以加法表示法打印罗马数字的正确算法(4 是 IIII
,等等)是:
- 计算
m
、d
、c
等
- 打印
M
、m
次。
- 打印
D
、d
次。
- 等等
如果没有修改 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;
}
我正在写一个整数到罗马数字的转换器。这一次,妥妥的。
正在尝试解决打印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 循环,你就是这样做的:
- 计算输出中每个字母的个数:
m
、d
、c
等以及n
也就是字母总数(以加法表示法)。 - 重复
n
次:- 打印
M
、m
次。 - 打印
D
、d
次。 - 等等
- 打印
结果是,如果没有修改 n
的内部循环,您将多次打印结果。
以加法表示法打印罗马数字的正确算法(4 是 IIII
,等等)是:
- 计算
m
、d
、c
等 - 打印
M
、m
次。 - 打印
D
、d
次。 - 等等
如果没有修改 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;
}