【问题标题】:C ignoring incrementationC 忽略增量
【发布时间】:2015-06-10 22:18:49
【问题描述】:

我试过这个,但我的编译器(Visual Studio 2013)总是把事情搞砸。 我有一个从 1 开始索引的 9 x 9 矩阵。它在开始时为 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();

}

【问题讨论】:

  • 您的示例甚至无法按原样编译。它应该是int main()
  • 你怎么知道第一个函数调用被“忽略”了?从给出的代码来看,这似乎是不可能的。
  • 打印从 0,3 开始,而不是空白矩阵
  • 因此在调用“decrement()”并将其转回零之前,您将位置 [1][1] 增加十次。减量调用应该使 Y = 9 和 X = 0,所以现在您正在编写您极力避免的 0 索引,但检查函数从不考虑这些索引。所以我猜你的程序会永远卡在那里?不要责怪编译器..

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


【解决方案1】:

你觉得increment 被忽略了,因为checkSquare 函数有问题。它从未返回 1,因此从未调用过 increment 函数。

【讨论】:

  • 对于x=1, y=1,指令Matrix[x][y]++正在生效。但是在它变为 10 之后,对 decrement 函数的调用发生了,其中 x 变为 0,y 变为 9。但是在print_matrix 函数中,您从未使用x=0 打印单元格。在checkLinecheckColumncheckSquare 函数中,您正在检查带有x&gt;1 的单元格。
  • 你是第二个这么说的人。在我的笔记本电脑上没有。除非我用 int 替换 unsigned int...不知道为什么
【解决方案2】:

发生的情况是您正在递增由 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】:

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

    1) 用于 C 编译器

    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 是由于命令提示符的缓冲区限制。由于程序永远不会结束,所以它会突然终止,最新的几个字节存储在缓冲区中,只显示那么多。要查看完整的输出,请将其重定向到文件并打开它。

    【讨论】:

      【解决方案4】:

      由于该行的输出,您的输出有点混乱

      printf("%u, %u", x, y);
      

      遇到

      的输出
      print_Matrix();
      

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

      printf("%u, %u\n", x, y);
      

      您会注意到在某些时候x 会递减到0 并且永远不会再递增。由于您从不打印 Matrix[0][y],因此您永远不会看到非零值。

      除了上面改成printf之外,如果把print_Matrix改成:

      void print_Matrix(){
         unsigned int i, j;
      
         for (i = 0; i <= 9; i++){
              // ^^^ Use 0 instead of 1
            for (j = 0; j <= 9; j++)
                 // ^^^ Use 0 instead of 1
               printf("%u ", Matrix[i][j]);
            printf("\n");
         }
      }
      

      您将看到非零值。

      查看工作代码http://ideone.com/HlQ4xp

      【讨论】:

      • 除非我将 unsigned int 替换为 int,否则您所说的一切都不会发生在我身上……为什么?我不明白..
      猜你喜欢
      • 1970-01-01
      • 2017-06-10
      • 2014-03-21
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2015-03-27
      相关资源
      最近更新 更多