打印出2D阵列中的某些元素

时间:2016-03-13 23:21:28

标签: c arrays matrix 2d

我对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。

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

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

我将c设置为零,并在循环中递增,但它不起作用。 另外,我想在矩阵中打印元素。 所以,如果我打印出正确的“三角形”,我想如果这些元素按照它们在矩阵中排列,并且不是这样的: Example of incorrect output

我只是喜欢镜像这些数字,所以他们就在他们的位置。 所以,是的,这是我的问题。 我确信有更简单的解决方案,但我是一个C菜鸟,可能会让事情变得更加复杂。 无论如何,任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

如何

当您需要打印阵列时,您需要两个条件才能避免那些不是黄色的条件。第一个条件很明显。

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;
}