C忽略增量

C ignoring incrementation

本文关键字:      更新时间:2023-10-16

我试过这个,但我的编译器(Visual Studio 2013)一直搞砸的东西。我有一个从1开始的9 × 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();
}

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

实际情况是,你正在增加x和y标记的位置,即位置[1][1]。在它达到10之前,没有什么有趣的事情发生,您实际上可以看到矩阵的左上角增加到10,但随后减量的条件变为真,并且您进行减量。

See for yourself (prints),

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 continuen" );
    getchar();
}

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

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

当Y = 1, X = 0,位置[0][1]为10时,递减调用将做X——。由于X是unsigned int,它将下溢并变成42亿,大于10,循环结束。

你想达到什么目的?


编辑:当你把x和y变成整型而不是无符号整型时,会发生更神奇的事情。

将变为-1,而不是x下流。当我运行代码时,矩阵[-1][9]++奇怪地使x增加了1,所以x回到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();
}

http://ideone.com/Ey5nG1

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

您的输出有点混乱,因为

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

输出

print_Matrix();

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

printf("%u, %un", 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");
   }
}

您将看到非零值。

相关文章:
  • 没有找到相关文章