作为一项任务,我必须推测该计划的输出:
#include <iostream>
#include <ctype.h>
#include <string.h>
void change (char* state, int &s)
{
int b = s;
for (int x = 0; s>=0; x++, s--)
if ((x+s)%2)
*(state+x) = toupper(*(state+b-x));
}
int main ( )
{
char s[] = "Punjab";
int b = strlen(s) - 1;
change (s, b);
std::cout<<s<<"#"<<b;
}
根据我的书,在编译和执行时,该程序应输出:
BAJJAB#-1
问题在于,我的猜测,在我脑海中执行代码,将是
BAJNUP#-1
代替。
我在某处犯了错误,但在哪里?
答案 0 :(得分:2)
在纸上运行代码时,最好跟踪变量的值。
此int b = strlen(s) - 1;
给出5。
现在在change()
内,
b
保留s
的值,即5。
现在关注这里:
for (int x = 0; s>=0; x++, s--)
if ((x+s)%2)
*(state+x) = toupper(*(state+b-x));
x == 0, s == 5
,其总和不均匀,因此%2
不会导致0,导致if语句的主体执行并将state[5]
写入state[0]
}。
现在x
增加1,s
减少1,因为s >= 0
的计算结果为真。
依此类推......完成纸张运行后,您可能希望在程序的每一步(当您在计算机上实际运行它时)打印变量,并将它们与您的每一步进行比较用纸做的。
示例:
#include <iostream>
#include <ctype.h>
#include <string.h>
void change (char* state, int &s)
{
int b = s;
for (int x = 0; s>=0; x++, s--)
{
std::cout << "x = " << x << ", s = " << s << ", x + s = " << x + s << ", (x + s) % 2 = " << (x + s) % 2 << "\n";
if ((x+s)%2)
{
std::cout << "state[" << x << "] = state[" << b - x << "]\n";
*(state+x) = toupper(*(state+b-x));
}
std::cout << "state = \"" << state << "\"\n";
}
}
int main ( )
{
char s[] = "Punjab";
int b = strlen(s) - 1;
change (s, b);
std::cout<<s<<"#"<<b;
}
输出:
x = 0, s = 5, x + s = 5, (x + s) % 2 = 1
state[0] = state[5]
state = "Bunjab"
x = 1, s = 4, x + s = 5, (x + s) % 2 = 1
state[1] = state[4]
state = "BAnjab"
x = 2, s = 3, x + s = 5, (x + s) % 2 = 1
state[2] = state[3]
state = "BAJjab"
x = 3, s = 2, x + s = 5, (x + s) % 2 = 1
state[3] = state[2]
state = "BAJJab"
x = 4, s = 1, x + s = 5, (x + s) % 2 = 1
state[4] = state[1]
state = "BAJJAb"
x = 5, s = 0, x + s = 5, (x + s) % 2 = 1
state[5] = state[0]
state = "BAJJAB"
BAJJAB#-1
答案 1 :(得分:0)
你的书是对的。您的手动解决方案是错误的,因为您没有考虑在for循环中执行的内存分配。
在第3次迭代之后,在你的char
数组中有BAJJAB
,因为最后3个字母已经替换了第3个。现在在第4次迭代中,代码所做的是取第3个字母,J ,并取代第4个字母。然后用第2个字母替换第5个字母,依此类推。但看!现在1-3个字母不是PUN,但已经从之前的迭代更改为BAJ。这就是为什么印刷的单词最终成为对称的单词