打印出二维数组中的某些元素

Printing out certain elements in a 2D array

我对 C 编程有点陌生,我有一项学校作业需要帮助解决。 Assignment

因此,我应该在任意给定大小的数组中打印出这些黄色标记的元素。

所以,这是我到目前为止提出的代码:

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

int main()
{

int i,j,n;

printf("Matrix dimension: ");
scanf("%d",&n);

int matrix[n][n];

srand((unsigned)time(NULL));

for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        matrix[i][j]=100+(float)rand()/RAND_MAX*900; //filling out matrix with random integers
    }
}
for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        printf("%d\t",matrix[i][j]);    //printing out matrix itself
    }
    printf("\n");
}
printf("\nLeft:\n");    //elements below main diagonal, above secondary diagonal
for(i=1;i<n-1;i++)
{
    printf("\n");
    for(j=0;j<(n-1)/2;j++)
    {
       if((j<i) && (j+i!=n-1))printf("%d\t",matrix[i][j]);
        else printf("-\t");
    }

}
printf("\n\nRight:\n");     //elements above main diagonal, below secondary diagonal
for(i=1;i<n-1;i++)
{
    printf("\n");
    for(j=n-1;j>(n/2);j--)
    {
       if((j>i) &&(i+j!=n-1) )printf("%d\t",matrix[i][j]);
       else printf("-\t");
    }
}

printf("\n\nUp:\n");    //elements above main and secondary diagonal
for(i=0;i<(n-1)/2;i++)
{
    printf("\n");
    for(j=1;j<n-1;j++)
    {
       if((j>i) && (j+i!=n-1 && j+i!=n))printf("%d\t",matrix[i][j]);
       else printf("-\t");
    }
}
printf("\n\nDown:\n");     //elements below main and secondary diagonal
for(i=n-1;i>(n/2);i--)
{
    printf("\n");
    for(j=1;j<n-1;j++)
    {
       if((i>j) &&(i+j!=n-1) )printf("%d\t",matrix[i][j]);
       else printf("-\t");
    }
}
return 0;
}

此代码有效,但不适用于维度等于或大于 7 的矩阵。在那些情况下总有一个额外的元素。 我意识到我可以添加一些额外的语句来解决问题,但只是暂时的。 示例:

if((j<i) && (j+i!=n-1 && j+i!=n))

那么它将适用于最大 8x8 的矩阵。

然后我又加了一句

if((j<i) && (j+i!=n-1 && j+i!=n && j+i!=n+1))

然后它可以处理最大 10x10 的矩阵。

所以我注意到我需要每 2 次将 j+i 语句递增 1 "dimensions"。

但是,我真的不知道该怎么做。我尝试添加类似

的内容
j+i!=n-1+c

我会将 c 设置为零,并在循环中递增,但它不起作用。 另外,我想打印矩阵中的元素。 所以,如果我打印正确 "triangle",我希望元素按照矩阵中的方式排列,而不是像这样: Example of incorrect output

我只想反映这些数字,所以它们就在它们的位置上。 所以,是的,那是我的问题。 我确信对此有更简单的解决方案,但我是 C 菜鸟,可能会使事情变得比应有的更复杂。 无论如何,我们将不胜感激!

如何

当你需要打印数组时,你需要两个条件以避免那些不是黄色的。第一个条件很明显。

if(i==j){
 // do not print
}

第二个条件不太明显,但从未如此。

else if(i+j == maxCellSize-1){ //in your case maxCellSize=7
 //do not print
}

最后在检查了这两个条件(最好合并为一个 if 语句)之后,您就可以打印数组的单元格了。

else{
    printf("%d", matrix[i][j]);
}

整个代码

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

int main()
{

    int i,j,n;

    printf("Matrix dimension: ");
    scanf("%d",&n);

    int matrix[n][n];

    srand((unsigned)time(NULL));

    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            matrix[i][j]=100+(float)rand()/RAND_MAX*900;  //filling out matrix with random integers
        }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(!(i==j || i+j==n-1)){
             printf("%d\t",matrix[i][j]);    //printing out matrix itself
            }
            else{ printf("X\t");}
        }
        printf("\n");
    }
    printf("\n\n");

    //left
    printf("Left triangle: ");
    for(i=0; i <n; i++){
        for(j=0; j<n/2; j++){
            if(i+j<n && i>j && !(i+j==n-1))
            {
                printf("%d\t",matrix[i][j]); 
            }
        }
    }
    printf("\n");
    //right
    printf("Right triangle: ");
    for(i=1; i <n; i++){
        for(j=n/2; j<n; j++){
            if(!(i==j || i+j==n-1)){
                if(i+j>=n && i<j)
                {
                    printf("%d\t",matrix[i][j]); 
                }

            }
        }
    }

    //top
    printf("\n");
    printf("Top triangle: ");
    for(i=0; i < n/2; i++){
        for(j=1; j<n; j++){
            if(!(i==j || i+j==n-1)){
                if(i+j<n && i<j)
                {
                    printf("%d\t",matrix[i][j]); 
                }

            }
        }
    }

    return 0;
}