手动解决此程序时,我得到不同的输出

时间:2017-09-12 06:02:27

标签: c++ arrays string loops output

作为一项任务,我必须推测该计划的输出:

#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

代替。

我在某处犯了错误,但在哪里?

2 个答案:

答案 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。这就是为什么印刷的单词最终成为对称的单词