C忽略增量

时间:2015-06-10 22:18:49

标签: c++ c visual-studio compilation increment

我尝试了这个但是我的编译器(Visual Studio 2013)一直在搞乱事情。 我有一个从9开始的9乘9矩阵。在beginig处它是0。从元素1:1开始,我开始递增矩阵中的值或递增x,y,基本上移动到下一个矩阵元素。

但是,程序忽略了我的增量以及x,y最初设置为1的事实。 它也忽略了一个函数调用。 代码在下面评论。

我确信这是我编译的来源! 重新启动笔记本电脑和Visual Studio但仍然无法正常工作。 打开新项目,同样的事情。 提前谢谢。

#include<stdio.h>
#include<stdlib.h>

unsigned int Matrix[10][10], x, y;

// Ignore this..
int checkLine()
{
    unsigned int i, j, k;
    for (k = 1; k <= 9; k++){
        if (Matrix[k][1] == 0) break;
        for (i = 1; i <= 9; i++)
            for (j = 1; j <= 9; j++)
                if (Matrix[k][i] == Matrix[k][j] && i!=j)
                    return 0;
    }
    return 1;
}

//Ignore this..
int checkColumn()
{
    unsigned int i, j, k;
    for (k = 1; k <= 9; k++){
        if (Matrix[1][k] == 0) break;
        for (i = 1; i <= 9; i++)
            for (j = 1; j <= 9; j++)
                if (Matrix[i][k] == Matrix[j][k] && i!=j)
                    return 0;
    }
    return 1;
}

//Ignore this..
int checkSquare()
{
    unsigned int i, j, k,l,m,n;
    for (m = 1; m <= 7; m = m + 3)
    for (n = 1; n <= 7; n = n + 3)

    for (k = m; k <= m + 2; k++)
    for (l = n; l <= n + 2; l++)
    for (i = m; i <= m + 2; i++)
    for (j = n; j <= n + 2; j++)
        if (Matrix[k][l] == Matrix[i][j] && !(k==i && l==j))
            return 0;
    return 1;
}

void increment()
{
    if (y == 9)
    {
        x++;
        y = 1;
    }
    else y++;
}

void decrement()
{
    if (y == 1)
    {
        x--;
        y = 9;
    }
    else
        y--;
}

void print_Matrix(){
    unsigned int i, j;

    for (i = 1; i <= 9; i++){
        for (j = 1; j <= 9; j++)
            printf("%u ", Matrix[i][j]);
        printf("\n");
    }
}

//
// MAIN. PROBLEM BELOW
//**
void main()
{
    unsigned int i, j;
    for (i = 1; i <= 9;i++)
    for (j = 1; j <= 9; j++)
        Matrix[i][j] = 0;

    print_Matrix(); // Function call is ignored here. Don't know why.***

    x = 1; 
    y = 1;
    // X and Y are OBVIOUSLY 1***

    while (x < 10) //Condition OBVIOUSLY true***
    {
        printf("%u, %u", x, y); //Keeps printing 0,3 and eventually 0,2***
        printf("\n");

        Matrix[x][y]++; //Incrementation...*** 

        print_Matrix(); // Always prints a blank Matrix consisting of only 0's***


        if (checkLine() && checkColumn() && checkSquare())
        {
            increment();
        }

        if (Matrix[x][y] == 10){
            Matrix[x][y] = 0;
            decrement();
        }



    }

    print_Matrix();

}

4 个答案:

答案 0 :(得分:0)

您认为{ detail = "More easily refresh a subscription or playlist."; icon = "Pull to Refresh"; title = "Pull to Refresh"; } 被忽略,因为increment函数有问题。它从未返回1,因此checkSquare函数从未被调用过。

答案 1 :(得分:0)

自输出行

以来,您的输出有点混乱
coalesce

进入

的输出
printf("%u, %u", x, y);

通过在第一行的输出中添加换行符,即使用

print_Matrix();

您会注意到,某些时候printf("%u, %u\n", x, y); 会递减到x并且永远不会再次递增。由于您从不打印0,因此您永远不会看到非零值。

除了更改为Matrix[0][y]之外,如果您将printf更改为:

print_Matrix

你会看到非零值。

请参阅http://ideone.com/HlQ4xp处的工作代码。

答案 2 :(得分:0)

你正在增加由x和y标记的位置,即位置[1] [1]。直到它达到10没有任何有趣的事情发生,你实际上可以看到矩阵的左上角增加到10,但随后减少的条件变为真,你减少。

自己看(打印),

while (x < 10) //Condition OBVIOUSLY true***
{
    printf("%u, %u", x, y); //Keeps printing 0,3 and eventually 0,2***
    printf("\n");

    Matrix[x][y]++; //Incrementation...*** 

    print_Matrix(); // Always prints a blank Matrix consisting of only 0's***


    if (checkLine() && checkColumn() && checkSquare())
    {
        increment();
    }

    if (Matrix[x][y] == 10){
        Matrix[x][y] = 0;
        decrement();
    }

    printf( "Enter to continue\n" );
    getchar();

}

它变为Y = 9,X = 0且[1] [1]位置变为0,因此您只看到零,因为您没有打印零索引。

此过程重复直到Y = 1且X = 0,您将位置增加到10,以便减量再次起作用。

当Y = 1,X = 0且位置[0] [1]为10时,减量调用将执行x--。由于X是无符号整数,它将下溢并变为42亿,大于10并且循环结束。

你想在这里实现什么目标?

编辑:当您使用x和y整数而不是无符号整数时会发生更令人惊奇的事情。

而不是x下溢它将变为-1。当我运行代码时,Matrix [-1] [9] ++奇怪地将x增加了1,因此x返回到0.这意味着程序在此时永远循环。

从未调用增量函数。

答案 3 :(得分:0)

在线测试时显示矩阵和增量,这里是结果

1)for C compiler

http://ideone.com/KRLO8w

    #include<stdio.h>
#include<stdlib.h>

unsigned int Matrix[10][10], x, y;

// Ignore this..
int checkLine()
{
    unsigned int i, j, k;
    for (k = 1; k <= 9; k++){
        if (Matrix[k][1] == 0) break;
        for (i = 1; i <= 9; i++)
            for (j = 1; j <= 9; j++)
                if (Matrix[k][i] == Matrix[k][j] && i!=j)
                    return 0;
    }
    return 1;
}

//Ignore this..
int checkColumn()
{
    unsigned int i, j, k;
    for (k = 1; k <= 9; k++){
        if (Matrix[1][k] == 0) break;
        for (i = 1; i <= 9; i++)
            for (j = 1; j <= 9; j++)
                if (Matrix[i][k] == Matrix[j][k] && i!=j)
                    return 0;
    }
    return 1;
}

//Ignore this..
int checkSquare()
{
    unsigned int i, j, k,l,m,n;
    for (m = 1; m <= 7; m = m + 3)
    for (n = 1; n <= 7; n = n + 3)

    for (k = m; k <= m + 2; k++)
    for (l = n; l <= n + 2; l++)
    for (i = m; i <= m + 2; i++)
    for (j = n; j <= n + 2; j++)
        if (Matrix[k][l] == Matrix[i][j] && !(k==i && l==j))
            return 0;
    return 1;
}

void increment()
{
    if (y == 9)
    {
        x++;
        y = 1;
    }
    else y++;
}

void decrement()
{
    if (y == 1)
    {
        x--;
        y = 9;
    }
    else
        y--;
}

void print_Matrix(){
    unsigned int i, j;

    for (i = 1; i <= 9; i++){
        for (j = 1; j <= 9; j++)
            printf("%u ", Matrix[i][j]);
        printf("\n");
    }
}

//
// MAIN. PROBLEM BELOW
//**
void main()
{
    unsigned int i, j;
    for (i = 1; i <= 9;i++)
    for (j = 1; j <= 9; j++)
        Matrix[i][j] = 0;

    print_Matrix(); // Function call is ignored here. Don't know why.***

    x = 1; 
    y = 1;
    // X and Y are OBVIOUSLY 1***

    while (x < 10) //Condition OBVIOUSLY true***
    {
        printf("%u, %u", x, y); //Keeps printing 0,3 and eventually 0,2***
        printf("\n");

        Matrix[x][y]++; //Incrementation...*** 

        print_Matrix(); // Always prints a blank Matrix consisting of only 0's***


        if (checkLine() && checkColumn() && checkSquare())
        {
            increment();
        }

        if (Matrix[x][y] == 10){
            Matrix[x][y] = 0;
            decrement();
        }



    }

    print_Matrix();

}

2)对于c ++编译器C ++ 4.9.2(将main的返回类型更改为int)

http://ideone.com/Ey5nG1

在图像起始值为0时,3是由命令提示符的缓冲区限制引起的。由于程序永远不会结束,所以它会突然终止,最新的几个字节存储在缓冲区中,并且只显示很多。要查看完整输出,请将其重定向到文件并打开它。